sqlglot.generators.doris
1from __future__ import annotations 2 3from sqlglot import exp 4from sqlglot.dialects.dialect import ( 5 approx_count_distinct_sql, 6 property_sql, 7 rename_func, 8 time_format, 9 weekstart_unit_to_str, 10) 11from sqlglot.generators.mysql import MySQLGenerator 12 13 14def _lag_lead_sql(self, expression: exp.Lag | exp.Lead) -> str: 15 return self.func( 16 "LAG" if isinstance(expression, exp.Lag) else "LEAD", 17 expression.this, 18 expression.args.get("offset") or exp.Literal.number(1), 19 expression.args.get("default") or exp.null(), 20 ) 21 22 23class DorisGenerator(MySQLGenerator): 24 LAST_DAY_SUPPORTS_DATE_PART = False 25 VARCHAR_REQUIRES_SIZE = False 26 WITH_PROPERTIES_PREFIX = "PROPERTIES" 27 RENAME_TABLE_WITH_DB = False 28 UPDATE_STATEMENT_SUPPORTS_FROM = True 29 30 TYPE_MAPPING = { 31 **MySQLGenerator.TYPE_MAPPING, 32 exp.DType.TEXT: "STRING", 33 exp.DType.TIMESTAMP: "DATETIME", 34 exp.DType.TIMESTAMPTZ: "DATETIME", 35 } 36 37 PROPERTIES_LOCATION = { 38 **MySQLGenerator.PROPERTIES_LOCATION, 39 exp.UniqueKeyProperty: exp.Properties.Location.POST_SCHEMA, 40 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 41 exp.BuildProperty: exp.Properties.Location.POST_SCHEMA, 42 } 43 44 CAST_MAPPING = {} 45 TIMESTAMP_FUNC_TYPES = set() 46 47 TRANSFORMS = { 48 **MySQLGenerator.TRANSFORMS, 49 exp.AddMonths: rename_func("MONTHS_ADD"), 50 exp.ApproxDistinct: approx_count_distinct_sql, 51 exp.ArgMax: rename_func("MAX_BY"), 52 exp.ArgMin: rename_func("MIN_BY"), 53 exp.ArrayAgg: rename_func("COLLECT_LIST"), 54 exp.ArrayToString: rename_func("ARRAY_JOIN"), 55 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 56 exp.CurrentDate: lambda self, _: self.func("CURRENT_DATE"), 57 exp.CurrentTimestamp: lambda self, _: self.func("NOW"), 58 exp.DateTrunc: lambda self, e: self.func( 59 "DATE_TRUNC", e.this, weekstart_unit_to_str(self, e) 60 ), 61 exp.EuclideanDistance: rename_func("L2_DISTANCE"), 62 exp.GroupConcat: lambda self, e: self.func( 63 "GROUP_CONCAT", e.this, e.args.get("separator") or exp.Literal.string(",") 64 ), 65 exp.JSONExtractScalar: lambda self, e: self.func("JSON_EXTRACT", e.this, e.expression), 66 exp.Lag: _lag_lead_sql, 67 exp.Lead: _lag_lead_sql, 68 exp.Map: rename_func("ARRAY_MAP"), 69 exp.Property: property_sql, 70 exp.RegexpLike: rename_func("REGEXP"), 71 exp.RegexpSplit: rename_func("SPLIT_BY_STRING"), 72 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 73 exp.Split: rename_func("SPLIT_BY_STRING"), 74 exp.StringToArray: rename_func("SPLIT_BY_STRING"), 75 exp.StrToUnix: lambda self, e: self.func("UNIX_TIMESTAMP", e.this, self.format_time(e)), 76 exp.TimeStrToDate: rename_func("TO_DATE"), 77 exp.TsOrDsAdd: lambda self, e: self.func("DATE_ADD", e.this, e.expression), 78 exp.TsOrDsToDate: lambda self, e: self.func("TO_DATE", e.this), 79 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 80 exp.TimestampTrunc: lambda self, e: self.func( 81 "DATE_TRUNC", e.this, weekstart_unit_to_str(self, e) 82 ), 83 exp.UnixToStr: lambda self, e: self.func( 84 "FROM_UNIXTIME", e.this, time_format("doris")(self, e) 85 ), 86 exp.UnixToTime: rename_func("FROM_UNIXTIME"), 87 } 88 89 # https://github.com/apache/doris/blob/e4f41dbf1ec03f5937fdeba2ee1454a20254015b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4#L93 90 RESERVED_KEYWORDS = { 91 "account_lock", 92 "account_unlock", 93 "add", 94 "adddate", 95 "admin", 96 "after", 97 "agg_state", 98 "aggregate", 99 "alias", 100 "all", 101 "alter", 102 "analyze", 103 "analyzed", 104 "and", 105 "anti", 106 "append", 107 "array", 108 "array_range", 109 "as", 110 "asc", 111 "at", 112 "authors", 113 "auto", 114 "auto_increment", 115 "backend", 116 "backends", 117 "backup", 118 "begin", 119 "belong", 120 "between", 121 "bigint", 122 "bin", 123 "binary", 124 "binlog", 125 "bitand", 126 "bitmap", 127 "bitmap_union", 128 "bitor", 129 "bitxor", 130 "blob", 131 "boolean", 132 "brief", 133 "broker", 134 "buckets", 135 "build", 136 "builtin", 137 "bulk", 138 "by", 139 "cached", 140 "call", 141 "cancel", 142 "case", 143 "cast", 144 "catalog", 145 "catalogs", 146 "chain", 147 "char", 148 "character", 149 "charset", 150 "check", 151 "clean", 152 "cluster", 153 "clusters", 154 "collate", 155 "collation", 156 "collect", 157 "column", 158 "columns", 159 "comment", 160 "commit", 161 "committed", 162 "compact", 163 "complete", 164 "config", 165 "connection", 166 "connection_id", 167 "consistent", 168 "constraint", 169 "constraints", 170 "convert", 171 "copy", 172 "count", 173 "create", 174 "creation", 175 "cron", 176 "cross", 177 "cube", 178 "current", 179 "current_catalog", 180 "current_date", 181 "current_time", 182 "current_timestamp", 183 "current_user", 184 "data", 185 "database", 186 "databases", 187 "date", 188 "date_add", 189 "date_ceil", 190 "date_diff", 191 "date_floor", 192 "date_sub", 193 "dateadd", 194 "datediff", 195 "datetime", 196 "datetimev2", 197 "datev2", 198 "datetimev1", 199 "datev1", 200 "day", 201 "days_add", 202 "days_sub", 203 "decimal", 204 "decimalv2", 205 "decimalv3", 206 "decommission", 207 "default", 208 "deferred", 209 "delete", 210 "demand", 211 "desc", 212 "describe", 213 "diagnose", 214 "disk", 215 "distinct", 216 "distinctpc", 217 "distinctpcsa", 218 "distributed", 219 "distribution", 220 "div", 221 "do", 222 "doris_internal_table_id", 223 "double", 224 "drop", 225 "dropp", 226 "dual", 227 "duplicate", 228 "dynamic", 229 "else", 230 "enable", 231 "encryptkey", 232 "encryptkeys", 233 "end", 234 "ends", 235 "engine", 236 "engines", 237 "enter", 238 "errors", 239 "events", 240 "every", 241 "except", 242 "exclude", 243 "execute", 244 "exists", 245 "expired", 246 "explain", 247 "export", 248 "extended", 249 "external", 250 "extract", 251 "failed_login_attempts", 252 "false", 253 "fast", 254 "feature", 255 "fields", 256 "file", 257 "filter", 258 "first", 259 "float", 260 "follower", 261 "following", 262 "for", 263 "foreign", 264 "force", 265 "format", 266 "free", 267 "from", 268 "frontend", 269 "frontends", 270 "full", 271 "function", 272 "functions", 273 "generic", 274 "global", 275 "grant", 276 "grants", 277 "graph", 278 "group", 279 "grouping", 280 "groups", 281 "hash", 282 "having", 283 "hdfs", 284 "help", 285 "histogram", 286 "hll", 287 "hll_union", 288 "hostname", 289 "hour", 290 "hub", 291 "identified", 292 "if", 293 "ignore", 294 "immediate", 295 "in", 296 "incremental", 297 "index", 298 "indexes", 299 "infile", 300 "inner", 301 "insert", 302 "install", 303 "int", 304 "integer", 305 "intermediate", 306 "intersect", 307 "interval", 308 "into", 309 "inverted", 310 "ipv4", 311 "ipv6", 312 "is", 313 "is_not_null_pred", 314 "is_null_pred", 315 "isnull", 316 "isolation", 317 "job", 318 "jobs", 319 "join", 320 "json", 321 "jsonb", 322 "key", 323 "keys", 324 "kill", 325 "label", 326 "largeint", 327 "last", 328 "lateral", 329 "ldap", 330 "ldap_admin_password", 331 "left", 332 "less", 333 "level", 334 "like", 335 "limit", 336 "lines", 337 "link", 338 "list", 339 "load", 340 "local", 341 "localtime", 342 "localtimestamp", 343 "location", 344 "lock", 345 "logical", 346 "low_priority", 347 "manual", 348 "map", 349 "match", 350 "match_all", 351 "match_any", 352 "match_phrase", 353 "match_phrase_edge", 354 "match_phrase_prefix", 355 "match_regexp", 356 "materialized", 357 "max", 358 "maxvalue", 359 "memo", 360 "merge", 361 "migrate", 362 "migrations", 363 "min", 364 "minus", 365 "minute", 366 "modify", 367 "month", 368 "mtmv", 369 "name", 370 "names", 371 "natural", 372 "negative", 373 "never", 374 "next", 375 "ngram_bf", 376 "no", 377 "non_nullable", 378 "not", 379 "null", 380 "nulls", 381 "observer", 382 "of", 383 "offset", 384 "on", 385 "only", 386 "open", 387 "optimized", 388 "or", 389 "order", 390 "outer", 391 "outfile", 392 "over", 393 "overwrite", 394 "parameter", 395 "parsed", 396 "partition", 397 "partitions", 398 "password", 399 "password_expire", 400 "password_history", 401 "password_lock_time", 402 "password_reuse", 403 "path", 404 "pause", 405 "percent", 406 "period", 407 "permissive", 408 "physical", 409 "plan", 410 "process", 411 "plugin", 412 "plugins", 413 "policy", 414 "preceding", 415 "prepare", 416 "primary", 417 "proc", 418 "procedure", 419 "processlist", 420 "profile", 421 "properties", 422 "property", 423 "quantile_state", 424 "quantile_union", 425 "query", 426 "quota", 427 "random", 428 "range", 429 "read", 430 "real", 431 "rebalance", 432 "recover", 433 "recycle", 434 "refresh", 435 "references", 436 "regexp", 437 "release", 438 "rename", 439 "repair", 440 "repeatable", 441 "replace", 442 "replace_if_not_null", 443 "replica", 444 "repositories", 445 "repository", 446 "resource", 447 "resources", 448 "restore", 449 "restrictive", 450 "resume", 451 "returns", 452 "revoke", 453 "rewritten", 454 "right", 455 "rlike", 456 "role", 457 "roles", 458 "rollback", 459 "rollup", 460 "routine", 461 "row", 462 "rows", 463 "s3", 464 "sample", 465 "schedule", 466 "scheduler", 467 "schema", 468 "schemas", 469 "second", 470 "select", 471 "semi", 472 "sequence", 473 "serializable", 474 "session", 475 "set", 476 "sets", 477 "shape", 478 "show", 479 "signed", 480 "skew", 481 "smallint", 482 "snapshot", 483 "soname", 484 "split", 485 "sql_block_rule", 486 "start", 487 "starts", 488 "stats", 489 "status", 490 "stop", 491 "storage", 492 "stream", 493 "streaming", 494 "string", 495 "struct", 496 "subdate", 497 "sum", 498 "superuser", 499 "switch", 500 "sync", 501 "system", 502 "table", 503 "tables", 504 "tablesample", 505 "tablet", 506 "tablets", 507 "task", 508 "tasks", 509 "temporary", 510 "terminated", 511 "text", 512 "than", 513 "then", 514 "time", 515 "timestamp", 516 "timestampadd", 517 "timestampdiff", 518 "tinyint", 519 "to", 520 "transaction", 521 "trash", 522 "tree", 523 "triggers", 524 "trim", 525 "true", 526 "truncate", 527 "type", 528 "type_cast", 529 "types", 530 "unbounded", 531 "uncommitted", 532 "uninstall", 533 "union", 534 "unique", 535 "unlock", 536 "unsigned", 537 "update", 538 "use", 539 "user", 540 "using", 541 "value", 542 "values", 543 "varchar", 544 "variables", 545 "variant", 546 "vault", 547 "verbose", 548 "version", 549 "view", 550 "warnings", 551 "week", 552 "when", 553 "where", 554 "whitelist", 555 "with", 556 "work", 557 "workload", 558 "write", 559 "xor", 560 "year", 561 } 562 563 def uniquekeyproperty_sql( 564 self, expression: exp.UniqueKeyProperty, prefix: str = "UNIQUE KEY" 565 ) -> str: 566 create_stmt = expression.find_ancestor(exp.Create) 567 if create_stmt and create_stmt.args["properties"].find(exp.MaterializedProperty): 568 return super().uniquekeyproperty_sql(expression, prefix="KEY") 569 570 return super().uniquekeyproperty_sql(expression) 571 572 def partitionrange_sql(self, expression: exp.PartitionRange) -> str: 573 name = self.sql(expression, "this") 574 values = expression.expressions 575 576 if len(values) != 1: 577 # Multiple values: use VALUES [ ... ) 578 if values and isinstance(values[0], list): 579 values_sql = ", ".join( 580 f"({', '.join(self.sql(v) for v in inner)})" for inner in values 581 ) 582 else: 583 values_sql = ", ".join(f"({self.sql(v)})" for v in values) 584 585 return f"PARTITION {name} VALUES [{values_sql})" 586 587 return f"PARTITION {name} VALUES LESS THAN ({self.sql(values[0])})" 588 589 def partitionbyrangepropertydynamic_sql( 590 self, expression: exp.PartitionByRangePropertyDynamic 591 ) -> str: 592 # Generates: FROM ("start") TO ("end") INTERVAL N UNIT 593 start = self.sql(expression, "start") 594 end = self.sql(expression, "end") 595 every = expression.args.get("every") 596 597 if every: 598 number = self.sql(every, "this") 599 interval = f"INTERVAL {number} {self.sql(every, 'unit')}" 600 else: 601 interval = "" 602 603 return f"FROM ({start}) TO ({end}) {interval}" 604 605 def partitionedbyproperty_sql(self, expression: exp.PartitionedByProperty) -> str: 606 this = expression.this 607 if isinstance(this, exp.Schema): 608 return f"PARTITION BY ({self.expressions(this, flat=True)})" 609 return f"PARTITION BY ({self.sql(this)})" 610 611 def table_sql(self, expression: exp.Table, sep: str = " AS ") -> str: 612 """Override table_sql to avoid AS keyword in UPDATE and DELETE statements.""" 613 ancestor = expression.find_ancestor(exp.Update, exp.Delete, exp.Select) 614 if not isinstance(ancestor, exp.Select): 615 sep = " " 616 return super().table_sql(expression, sep=sep)
24class DorisGenerator(MySQLGenerator): 25 LAST_DAY_SUPPORTS_DATE_PART = False 26 VARCHAR_REQUIRES_SIZE = False 27 WITH_PROPERTIES_PREFIX = "PROPERTIES" 28 RENAME_TABLE_WITH_DB = False 29 UPDATE_STATEMENT_SUPPORTS_FROM = True 30 31 TYPE_MAPPING = { 32 **MySQLGenerator.TYPE_MAPPING, 33 exp.DType.TEXT: "STRING", 34 exp.DType.TIMESTAMP: "DATETIME", 35 exp.DType.TIMESTAMPTZ: "DATETIME", 36 } 37 38 PROPERTIES_LOCATION = { 39 **MySQLGenerator.PROPERTIES_LOCATION, 40 exp.UniqueKeyProperty: exp.Properties.Location.POST_SCHEMA, 41 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 42 exp.BuildProperty: exp.Properties.Location.POST_SCHEMA, 43 } 44 45 CAST_MAPPING = {} 46 TIMESTAMP_FUNC_TYPES = set() 47 48 TRANSFORMS = { 49 **MySQLGenerator.TRANSFORMS, 50 exp.AddMonths: rename_func("MONTHS_ADD"), 51 exp.ApproxDistinct: approx_count_distinct_sql, 52 exp.ArgMax: rename_func("MAX_BY"), 53 exp.ArgMin: rename_func("MIN_BY"), 54 exp.ArrayAgg: rename_func("COLLECT_LIST"), 55 exp.ArrayToString: rename_func("ARRAY_JOIN"), 56 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 57 exp.CurrentDate: lambda self, _: self.func("CURRENT_DATE"), 58 exp.CurrentTimestamp: lambda self, _: self.func("NOW"), 59 exp.DateTrunc: lambda self, e: self.func( 60 "DATE_TRUNC", e.this, weekstart_unit_to_str(self, e) 61 ), 62 exp.EuclideanDistance: rename_func("L2_DISTANCE"), 63 exp.GroupConcat: lambda self, e: self.func( 64 "GROUP_CONCAT", e.this, e.args.get("separator") or exp.Literal.string(",") 65 ), 66 exp.JSONExtractScalar: lambda self, e: self.func("JSON_EXTRACT", e.this, e.expression), 67 exp.Lag: _lag_lead_sql, 68 exp.Lead: _lag_lead_sql, 69 exp.Map: rename_func("ARRAY_MAP"), 70 exp.Property: property_sql, 71 exp.RegexpLike: rename_func("REGEXP"), 72 exp.RegexpSplit: rename_func("SPLIT_BY_STRING"), 73 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 74 exp.Split: rename_func("SPLIT_BY_STRING"), 75 exp.StringToArray: rename_func("SPLIT_BY_STRING"), 76 exp.StrToUnix: lambda self, e: self.func("UNIX_TIMESTAMP", e.this, self.format_time(e)), 77 exp.TimeStrToDate: rename_func("TO_DATE"), 78 exp.TsOrDsAdd: lambda self, e: self.func("DATE_ADD", e.this, e.expression), 79 exp.TsOrDsToDate: lambda self, e: self.func("TO_DATE", e.this), 80 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 81 exp.TimestampTrunc: lambda self, e: self.func( 82 "DATE_TRUNC", e.this, weekstart_unit_to_str(self, e) 83 ), 84 exp.UnixToStr: lambda self, e: self.func( 85 "FROM_UNIXTIME", e.this, time_format("doris")(self, e) 86 ), 87 exp.UnixToTime: rename_func("FROM_UNIXTIME"), 88 } 89 90 # https://github.com/apache/doris/blob/e4f41dbf1ec03f5937fdeba2ee1454a20254015b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4#L93 91 RESERVED_KEYWORDS = { 92 "account_lock", 93 "account_unlock", 94 "add", 95 "adddate", 96 "admin", 97 "after", 98 "agg_state", 99 "aggregate", 100 "alias", 101 "all", 102 "alter", 103 "analyze", 104 "analyzed", 105 "and", 106 "anti", 107 "append", 108 "array", 109 "array_range", 110 "as", 111 "asc", 112 "at", 113 "authors", 114 "auto", 115 "auto_increment", 116 "backend", 117 "backends", 118 "backup", 119 "begin", 120 "belong", 121 "between", 122 "bigint", 123 "bin", 124 "binary", 125 "binlog", 126 "bitand", 127 "bitmap", 128 "bitmap_union", 129 "bitor", 130 "bitxor", 131 "blob", 132 "boolean", 133 "brief", 134 "broker", 135 "buckets", 136 "build", 137 "builtin", 138 "bulk", 139 "by", 140 "cached", 141 "call", 142 "cancel", 143 "case", 144 "cast", 145 "catalog", 146 "catalogs", 147 "chain", 148 "char", 149 "character", 150 "charset", 151 "check", 152 "clean", 153 "cluster", 154 "clusters", 155 "collate", 156 "collation", 157 "collect", 158 "column", 159 "columns", 160 "comment", 161 "commit", 162 "committed", 163 "compact", 164 "complete", 165 "config", 166 "connection", 167 "connection_id", 168 "consistent", 169 "constraint", 170 "constraints", 171 "convert", 172 "copy", 173 "count", 174 "create", 175 "creation", 176 "cron", 177 "cross", 178 "cube", 179 "current", 180 "current_catalog", 181 "current_date", 182 "current_time", 183 "current_timestamp", 184 "current_user", 185 "data", 186 "database", 187 "databases", 188 "date", 189 "date_add", 190 "date_ceil", 191 "date_diff", 192 "date_floor", 193 "date_sub", 194 "dateadd", 195 "datediff", 196 "datetime", 197 "datetimev2", 198 "datev2", 199 "datetimev1", 200 "datev1", 201 "day", 202 "days_add", 203 "days_sub", 204 "decimal", 205 "decimalv2", 206 "decimalv3", 207 "decommission", 208 "default", 209 "deferred", 210 "delete", 211 "demand", 212 "desc", 213 "describe", 214 "diagnose", 215 "disk", 216 "distinct", 217 "distinctpc", 218 "distinctpcsa", 219 "distributed", 220 "distribution", 221 "div", 222 "do", 223 "doris_internal_table_id", 224 "double", 225 "drop", 226 "dropp", 227 "dual", 228 "duplicate", 229 "dynamic", 230 "else", 231 "enable", 232 "encryptkey", 233 "encryptkeys", 234 "end", 235 "ends", 236 "engine", 237 "engines", 238 "enter", 239 "errors", 240 "events", 241 "every", 242 "except", 243 "exclude", 244 "execute", 245 "exists", 246 "expired", 247 "explain", 248 "export", 249 "extended", 250 "external", 251 "extract", 252 "failed_login_attempts", 253 "false", 254 "fast", 255 "feature", 256 "fields", 257 "file", 258 "filter", 259 "first", 260 "float", 261 "follower", 262 "following", 263 "for", 264 "foreign", 265 "force", 266 "format", 267 "free", 268 "from", 269 "frontend", 270 "frontends", 271 "full", 272 "function", 273 "functions", 274 "generic", 275 "global", 276 "grant", 277 "grants", 278 "graph", 279 "group", 280 "grouping", 281 "groups", 282 "hash", 283 "having", 284 "hdfs", 285 "help", 286 "histogram", 287 "hll", 288 "hll_union", 289 "hostname", 290 "hour", 291 "hub", 292 "identified", 293 "if", 294 "ignore", 295 "immediate", 296 "in", 297 "incremental", 298 "index", 299 "indexes", 300 "infile", 301 "inner", 302 "insert", 303 "install", 304 "int", 305 "integer", 306 "intermediate", 307 "intersect", 308 "interval", 309 "into", 310 "inverted", 311 "ipv4", 312 "ipv6", 313 "is", 314 "is_not_null_pred", 315 "is_null_pred", 316 "isnull", 317 "isolation", 318 "job", 319 "jobs", 320 "join", 321 "json", 322 "jsonb", 323 "key", 324 "keys", 325 "kill", 326 "label", 327 "largeint", 328 "last", 329 "lateral", 330 "ldap", 331 "ldap_admin_password", 332 "left", 333 "less", 334 "level", 335 "like", 336 "limit", 337 "lines", 338 "link", 339 "list", 340 "load", 341 "local", 342 "localtime", 343 "localtimestamp", 344 "location", 345 "lock", 346 "logical", 347 "low_priority", 348 "manual", 349 "map", 350 "match", 351 "match_all", 352 "match_any", 353 "match_phrase", 354 "match_phrase_edge", 355 "match_phrase_prefix", 356 "match_regexp", 357 "materialized", 358 "max", 359 "maxvalue", 360 "memo", 361 "merge", 362 "migrate", 363 "migrations", 364 "min", 365 "minus", 366 "minute", 367 "modify", 368 "month", 369 "mtmv", 370 "name", 371 "names", 372 "natural", 373 "negative", 374 "never", 375 "next", 376 "ngram_bf", 377 "no", 378 "non_nullable", 379 "not", 380 "null", 381 "nulls", 382 "observer", 383 "of", 384 "offset", 385 "on", 386 "only", 387 "open", 388 "optimized", 389 "or", 390 "order", 391 "outer", 392 "outfile", 393 "over", 394 "overwrite", 395 "parameter", 396 "parsed", 397 "partition", 398 "partitions", 399 "password", 400 "password_expire", 401 "password_history", 402 "password_lock_time", 403 "password_reuse", 404 "path", 405 "pause", 406 "percent", 407 "period", 408 "permissive", 409 "physical", 410 "plan", 411 "process", 412 "plugin", 413 "plugins", 414 "policy", 415 "preceding", 416 "prepare", 417 "primary", 418 "proc", 419 "procedure", 420 "processlist", 421 "profile", 422 "properties", 423 "property", 424 "quantile_state", 425 "quantile_union", 426 "query", 427 "quota", 428 "random", 429 "range", 430 "read", 431 "real", 432 "rebalance", 433 "recover", 434 "recycle", 435 "refresh", 436 "references", 437 "regexp", 438 "release", 439 "rename", 440 "repair", 441 "repeatable", 442 "replace", 443 "replace_if_not_null", 444 "replica", 445 "repositories", 446 "repository", 447 "resource", 448 "resources", 449 "restore", 450 "restrictive", 451 "resume", 452 "returns", 453 "revoke", 454 "rewritten", 455 "right", 456 "rlike", 457 "role", 458 "roles", 459 "rollback", 460 "rollup", 461 "routine", 462 "row", 463 "rows", 464 "s3", 465 "sample", 466 "schedule", 467 "scheduler", 468 "schema", 469 "schemas", 470 "second", 471 "select", 472 "semi", 473 "sequence", 474 "serializable", 475 "session", 476 "set", 477 "sets", 478 "shape", 479 "show", 480 "signed", 481 "skew", 482 "smallint", 483 "snapshot", 484 "soname", 485 "split", 486 "sql_block_rule", 487 "start", 488 "starts", 489 "stats", 490 "status", 491 "stop", 492 "storage", 493 "stream", 494 "streaming", 495 "string", 496 "struct", 497 "subdate", 498 "sum", 499 "superuser", 500 "switch", 501 "sync", 502 "system", 503 "table", 504 "tables", 505 "tablesample", 506 "tablet", 507 "tablets", 508 "task", 509 "tasks", 510 "temporary", 511 "terminated", 512 "text", 513 "than", 514 "then", 515 "time", 516 "timestamp", 517 "timestampadd", 518 "timestampdiff", 519 "tinyint", 520 "to", 521 "transaction", 522 "trash", 523 "tree", 524 "triggers", 525 "trim", 526 "true", 527 "truncate", 528 "type", 529 "type_cast", 530 "types", 531 "unbounded", 532 "uncommitted", 533 "uninstall", 534 "union", 535 "unique", 536 "unlock", 537 "unsigned", 538 "update", 539 "use", 540 "user", 541 "using", 542 "value", 543 "values", 544 "varchar", 545 "variables", 546 "variant", 547 "vault", 548 "verbose", 549 "version", 550 "view", 551 "warnings", 552 "week", 553 "when", 554 "where", 555 "whitelist", 556 "with", 557 "work", 558 "workload", 559 "write", 560 "xor", 561 "year", 562 } 563 564 def uniquekeyproperty_sql( 565 self, expression: exp.UniqueKeyProperty, prefix: str = "UNIQUE KEY" 566 ) -> str: 567 create_stmt = expression.find_ancestor(exp.Create) 568 if create_stmt and create_stmt.args["properties"].find(exp.MaterializedProperty): 569 return super().uniquekeyproperty_sql(expression, prefix="KEY") 570 571 return super().uniquekeyproperty_sql(expression) 572 573 def partitionrange_sql(self, expression: exp.PartitionRange) -> str: 574 name = self.sql(expression, "this") 575 values = expression.expressions 576 577 if len(values) != 1: 578 # Multiple values: use VALUES [ ... ) 579 if values and isinstance(values[0], list): 580 values_sql = ", ".join( 581 f"({', '.join(self.sql(v) for v in inner)})" for inner in values 582 ) 583 else: 584 values_sql = ", ".join(f"({self.sql(v)})" for v in values) 585 586 return f"PARTITION {name} VALUES [{values_sql})" 587 588 return f"PARTITION {name} VALUES LESS THAN ({self.sql(values[0])})" 589 590 def partitionbyrangepropertydynamic_sql( 591 self, expression: exp.PartitionByRangePropertyDynamic 592 ) -> str: 593 # Generates: FROM ("start") TO ("end") INTERVAL N UNIT 594 start = self.sql(expression, "start") 595 end = self.sql(expression, "end") 596 every = expression.args.get("every") 597 598 if every: 599 number = self.sql(every, "this") 600 interval = f"INTERVAL {number} {self.sql(every, 'unit')}" 601 else: 602 interval = "" 603 604 return f"FROM ({start}) TO ({end}) {interval}" 605 606 def partitionedbyproperty_sql(self, expression: exp.PartitionedByProperty) -> str: 607 this = expression.this 608 if isinstance(this, exp.Schema): 609 return f"PARTITION BY ({self.expressions(this, flat=True)})" 610 return f"PARTITION BY ({self.sql(this)})" 611 612 def table_sql(self, expression: exp.Table, sep: str = " AS ") -> str: 613 """Override table_sql to avoid AS keyword in UPDATE and DELETE statements.""" 614 ancestor = expression.find_ancestor(exp.Update, exp.Delete, exp.Select) 615 if not isinstance(ancestor, exp.Select): 616 sep = " " 617 return super().table_sql(expression, sep=sep)
Generator converts a given syntax tree to the corresponding SQL string.
Arguments:
- pretty: Whether to format the produced SQL string. Default: False.
- identify: Determines when an identifier should be quoted. Possible values are: False (default): Never quote, except in cases where it's mandatory by the dialect. True: Always quote except for specials cases. 'safe': Only quote identifiers that are case insensitive.
- normalize: Whether to normalize identifiers to lowercase. Default: False.
- pad: The pad size in a formatted string. For example, this affects the indentation of a projection in a query, relative to its nesting level. Default: 2.
- indent: The indentation size in a formatted string. For example, this affects the
indentation of subqueries and filters under a
WHEREclause. Default: 2. - normalize_functions: How to normalize function names. Possible values are: "upper" or True (default): Convert names to uppercase. "lower": Convert names to lowercase. False: Disables function name normalization.
- unsupported_level: Determines the generator's behavior when it encounters unsupported expressions. Default ErrorLevel.WARN.
- max_unsupported: Maximum number of unsupported messages to include in a raised UnsupportedError. This is only relevant if unsupported_level is ErrorLevel.RAISE. Default: 3
- leading_comma: Whether the comma is leading or trailing in select expressions. This is only relevant when generating in pretty mode. Default: False
- max_text_width: The max number of characters in a segment before creating new lines in pretty mode. The default is on the smaller end because the length only represents a segment and not the true line length. Default: 80
- comments: Whether to preserve comments in the output SQL code. Default: True
TYPE_MAPPING =
{<DType.NCHAR: 'NCHAR'>: 'CHAR', <DType.NVARCHAR: 'NVARCHAR'>: 'VARCHAR', <DType.INET: 'INET'>: 'INET', <DType.ROWVERSION: 'ROWVERSION'>: 'VARBINARY', <DType.UBIGINT: 'UBIGINT'>: 'BIGINT', <DType.UINT: 'UINT'>: 'INT', <DType.UMEDIUMINT: 'UMEDIUMINT'>: 'MEDIUMINT', <DType.USMALLINT: 'USMALLINT'>: 'SMALLINT', <DType.UTINYINT: 'UTINYINT'>: 'TINYINT', <DType.UDECIMAL: 'UDECIMAL'>: 'DECIMAL', <DType.UDOUBLE: 'UDOUBLE'>: 'DOUBLE', <DType.DATETIME2: 'DATETIME2'>: 'DATETIME', <DType.SMALLDATETIME: 'SMALLDATETIME'>: 'DATETIME', <DType.TIMESTAMP: 'TIMESTAMP'>: 'DATETIME', <DType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>: 'DATETIME', <DType.TIMESTAMPTZ: 'TIMESTAMPTZ'>: 'DATETIME', <DType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>: 'TIMESTAMP', <DType.TEXT: 'TEXT'>: 'STRING'}
PROPERTIES_LOCATION =
{<class 'sqlglot.expressions.properties.AllowedValuesProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.AlgorithmProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.ApiProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.ApplicationProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.AutoIncrementProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.AutoRefreshProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.BackupProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.BlockCompressionProperty'>: <PropertiesLocation.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.properties.CalledOnNullInputProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.CatalogProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.CharacterSetProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.ChecksumProperty'>: <PropertiesLocation.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.properties.CollateProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.ComputeProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.CopyGrantsProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.query.Cluster'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.ClusteredByProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.ClusterProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.DistributedByProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.DuplicateKeyProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.DataBlocksizeProperty'>: <PropertiesLocation.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.properties.DatabaseProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.DataDeletionProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.DefinerProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.DictRange'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.DictProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.DynamicProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.DistKeyProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.DistStyleProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.EmptyProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.EncodeProperty'>: <PropertiesLocation.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.properties.EngineProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.EnviromentProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.HandlerProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.ParameterStyleProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.ExecuteAsProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.ExternalProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.FallbackProperty'>: <PropertiesLocation.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.properties.FileFormatProperty'>: <PropertiesLocation.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.properties.FreespaceProperty'>: <PropertiesLocation.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.properties.GlobalProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.HeapProperty'>: <PropertiesLocation.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.properties.HybridProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.InheritsProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.IcebergProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.IncludeProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.InputModelProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.IsolatedLoadingProperty'>: <PropertiesLocation.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.properties.JournalProperty'>: <PropertiesLocation.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.properties.LanguageProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.LikeProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.LocationProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.LockProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.LockingProperty'>: <PropertiesLocation.POST_ALIAS: 'POST_ALIAS'>, <class 'sqlglot.expressions.properties.LogProperty'>: <PropertiesLocation.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.properties.MaskingProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.MaterializedProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.MergeBlockRatioProperty'>: <PropertiesLocation.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.properties.ModuleProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.NetworkProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.NoPrimaryIndexProperty'>: <PropertiesLocation.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.properties.OnProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.OnCommitProperty'>: <PropertiesLocation.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.query.Order'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.OutputModelProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.PartitionedByProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.PartitionedOfProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.constraints.PrimaryKey'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.Property'>: <PropertiesLocation.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.properties.RefreshTriggerProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.RemoteWithConnectionModelProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.ReturnsProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.RollupProperty'>: <PropertiesLocation.UNSUPPORTED: 'UNSUPPORTED'>, <class 'sqlglot.expressions.properties.RowAccessProperty'>: <PropertiesLocation.UNSUPPORTED: 'UNSUPPORTED'>, <class 'sqlglot.expressions.properties.RowFormatProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.RowFormatDelimitedProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.RowFormatSerdeProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.SampleProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.SchemaCommentProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.SecureProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.SecurityIntegrationProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.SerdeProperties'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ddl.Set'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.SettingsProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.SetProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.SetConfigProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.SharingProperty'>: <PropertiesLocation.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.ddl.SequenceProperties'>: <PropertiesLocation.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.ddl.TriggerProperties'>: <PropertiesLocation.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.properties.SortKeyProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.SqlReadWriteProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.SqlSecurityProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.StabilityProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.StorageHandlerProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.StreamingTableProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.StrictProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.Tags'>: <PropertiesLocation.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.properties.TemporaryProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.ToTableProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.TransientProperty'>: <PropertiesLocation.UNSUPPORTED: 'UNSUPPORTED'>, <class 'sqlglot.expressions.properties.TransformModelProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ddl.MergeTreeTTL'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.UnloggedProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.UsingProperty'>: <PropertiesLocation.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.properties.UsingTemplateProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.ViewAttributeProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.VirtualProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.VolatileProperty'>: <PropertiesLocation.UNSUPPORTED: 'UNSUPPORTED'>, <class 'sqlglot.expressions.properties.WithDataProperty'>: <PropertiesLocation.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.properties.WithJournalTableProperty'>: <PropertiesLocation.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.properties.WithProcedureOptions'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.WithSchemaBindingProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.WithSystemVersioningProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.ForceProperty'>: <PropertiesLocation.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.properties.PartitionByRangeProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.PartitionByListProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.UniqueKeyProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.properties.BuildProperty'>: <PropertiesLocation.POST_SCHEMA: 'POST_SCHEMA'>}
TRANSFORMS =
{<class 'sqlglot.expressions.query.JSONPathFilter'>: <function <lambda>>, <class 'sqlglot.expressions.query.JSONPathKey'>: <function <lambda>>, <class 'sqlglot.expressions.query.JSONPathRecursive'>: <function <lambda>>, <class 'sqlglot.expressions.query.JSONPathRoot'>: <function <lambda>>, <class 'sqlglot.expressions.query.JSONPathScript'>: <function <lambda>>, <class 'sqlglot.expressions.query.JSONPathSelector'>: <function <lambda>>, <class 'sqlglot.expressions.query.JSONPathSlice'>: <function <lambda>>, <class 'sqlglot.expressions.query.JSONPathSubscript'>: <function <lambda>>, <class 'sqlglot.expressions.query.JSONPathUnion'>: <function <lambda>>, <class 'sqlglot.expressions.query.JSONPathWildcard'>: <function <lambda>>, <class 'sqlglot.expressions.core.Adjacent'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.AllowedValuesProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.query.AnalyzeColumns'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.query.AnalyzeWith'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.array.ArrayContainedBy'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.array.ArrayContainsAll'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.array.ArrayOverlaps'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.AssumeColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.AutoRefreshProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.BackupProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.CaseSpecificColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.CalledOnNullInputProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.math.Ceil'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.CharacterSetColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.CharacterSetProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.ClusteredColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.CollateColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.CommentColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.functions.ConnectByRoot'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.string.ConvertToCharset'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.CopyGrantsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.CredentialsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.functions.CurrentCatalog'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.functions.SessionUser'>: <function MySQLGenerator.<lambda>>, <class 'sqlglot.expressions.constraints.DateFormatColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.DefaultColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.ApiProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.ApplicationProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.CatalogProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.ComputeProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.DatabaseProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.DynamicProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.EmptyProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.EncodeColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.query.EndStatement'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.EnviromentProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.HandlerProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.ParameterStyleProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.EphemeralColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.ExcludeColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.ExecuteAsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.query.Except'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.ExternalProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.math.Floor'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.query.Get'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.GlobalProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.HeapProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.HybridProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.IcebergProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.InheritsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.InlineLengthColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.InputModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.query.Intersect'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.datatypes.IntervalSpan'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.functions.Int64'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.json.JSONBContainsAnyTopKeys'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.json.JSONBContainsAllTopKeys'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.json.JSONBDeleteAtPath'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.json.JSONBPathExists'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.json.JSONObject'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.json.JSONObjectAgg'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.LanguageProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.LocationProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.LogProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.MaskingProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.MaterializedProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.functions.NetFunc'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.NetworkProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.NonClusteredColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.NoPrimaryIndexProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.NotForReplicationColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.OnCommitProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.OnProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.OnUpdateColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.core.Operator'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.OutputModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.core.ExtendsLeft'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.core.ExtendsRight'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.PathColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.PartitionedByBucket'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.PartitionByTruncate'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.core.PivotAny'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.array.PositionalColumn'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.ProjectionPolicyColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.InvisibleColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.ZeroFillColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.query.Put'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.RemoteWithConnectionModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.ReturnsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.RowAccessProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.core.SafeFunc'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.SampleProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.SecureProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.SecurityIntegrationProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.SetConfigProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.SetProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.SettingsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.SharingProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.SqlReadWriteProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.SqlSecurityProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.StabilityProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.query.Stream'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.StreamingTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.StrictProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ddl.SwapTable'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.query.TableColumn'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.Tags'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.TemporaryProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.TitleColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.array.ToMap'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.ToTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.TransformModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.TransientProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.VirtualProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ddl.TriggerExecute'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.query.Union'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.UnloggedProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.UsingTemplateProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.query.UsingData'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.UppercaseColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.temporal.UtcDate'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.temporal.UtcTime'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.temporal.UtcTimestamp'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.query.Variadic'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.array.VarMap'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.ViewAttributeProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.VolatileProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.WithJournalTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.WithProcedureOptions'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.WithSchemaBindingProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.constraints.WithOperator'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.properties.ForceProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.aggregate.ArrayAgg'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.math.BitwiseAndAgg'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.math.BitwiseOrAgg'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.math.BitwiseXorAgg'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.math.BitwiseCount'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.string.Chr'>: <function MySQLGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.CurrentDate'>: <function DorisGenerator.<lambda>>, <class 'sqlglot.expressions.functions.CurrentVersion'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.temporal.DateDiff'>: <function remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.temporal.DateAdd'>: <function remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.temporal.DateStrToDate'>: <function datestrtodate_sql>, <class 'sqlglot.expressions.temporal.DateSub'>: <function remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.temporal.DateTrunc'>: <function DorisGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.Day'>: <function remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.temporal.DayOfMonth'>: <function remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.temporal.DayOfWeek'>: <function remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.temporal.DayOfYear'>: <function remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.aggregate.GroupConcat'>: <function DorisGenerator.<lambda>>, <class 'sqlglot.expressions.core.ILike'>: <function no_ilike_sql>, <class 'sqlglot.expressions.json.JSONExtractScalar'>: <function DorisGenerator.<lambda>>, <class 'sqlglot.expressions.string.Length'>: <function length_or_char_length_sql>, <class 'sqlglot.expressions.aggregate.LogicalOr'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.aggregate.LogicalAnd'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.aggregate.Max'>: <function max_or_greatest>, <class 'sqlglot.expressions.aggregate.Min'>: <function min_or_least>, <class 'sqlglot.expressions.temporal.Month'>: <function remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.core.NullSafeEQ'>: <function MySQLGenerator.<lambda>>, <class 'sqlglot.expressions.core.NullSafeNEQ'>: <function MySQLGenerator.<lambda>>, <class 'sqlglot.expressions.string.NumberToStr'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.query.Pivot'>: <function no_pivot_sql>, <class 'sqlglot.expressions.query.Select'>: <function preprocess.<locals>._to_sql>, <class 'sqlglot.expressions.string.StrPosition'>: <function MySQLGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.StrToDate'>: <function _str_to_date_sql>, <class 'sqlglot.expressions.temporal.StrToTime'>: <function _str_to_date_sql>, <class 'sqlglot.expressions.string.Stuff'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.query.TableSample'>: <function no_tablesample_sql>, <class 'sqlglot.expressions.temporal.TimeFromParts'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.temporal.TimestampAdd'>: <function date_add_interval_sql.<locals>.func>, <class 'sqlglot.expressions.temporal.TimestampDiff'>: <function MySQLGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.TimestampSub'>: <function date_add_interval_sql.<locals>.func>, <class 'sqlglot.expressions.temporal.TimeStrToUnix'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.temporal.TimeStrToTime'>: <function MySQLGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.TimeToStr'>: <function remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.string.Trim'>: <function trim_sql>, <class 'sqlglot.expressions.math.Trunc'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.functions.TryCast'>: <function no_trycast_sql>, <class 'sqlglot.expressions.temporal.TsOrDsAdd'>: <function DorisGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.TsOrDsDiff'>: <function MySQLGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.TsOrDsToDate'>: <function DorisGenerator.<lambda>>, <class 'sqlglot.expressions.string.Unicode'>: <function MySQLGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.UnixToTime'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.temporal.Week'>: <function remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.temporal.WeekOfYear'>: <function remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.temporal.Year'>: <function remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.temporal.AddMonths'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.core.ApproxDistinct'>: <function approx_count_distinct_sql>, <class 'sqlglot.expressions.aggregate.ArgMax'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.aggregate.ArgMin'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.array.ArrayToString'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.aggregate.ArrayUniqueAgg'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.temporal.CurrentTimestamp'>: <function DorisGenerator.<lambda>>, <class 'sqlglot.expressions.math.EuclideanDistance'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.aggregate.Lag'>: <function _lag_lead_sql>, <class 'sqlglot.expressions.aggregate.Lead'>: <function _lag_lead_sql>, <class 'sqlglot.expressions.array.Map'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.properties.Property'>: <function property_sql>, <class 'sqlglot.expressions.core.RegexpLike'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.string.RegexpSplit'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.properties.SchemaCommentProperty'>: <function DorisGenerator.<lambda>>, <class 'sqlglot.expressions.string.Split'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.array.StringToArray'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.temporal.StrToUnix'>: <function DorisGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.TimeStrToDate'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.temporal.TimeToUnix'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.temporal.TimestampTrunc'>: <function DorisGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.UnixToStr'>: <function DorisGenerator.<lambda>>}
RESERVED_KEYWORDS =
{'policy', 'from', 'isolation', 'returns', 'and', 'graph', 'builtin', 'variant', 'unique', 'write', 'between', 'repositories', 'expired', 'never', 'brief', 'procedure', 'datev1', 'match_phrase_prefix', 'clean', 'identified', 'not', 'distributed', 'extract', 'localtime', 'char', 'text', 'binary', 'if', 'install', 'belong', 'add', 'join', 'workload', 'less', 'references', 'last', 'ldap', 'unbounded', 'partition', 'boolean', 'match_all', 'datetimev2', 'after', 'cube', 'compact', 'quantile_union', 'soname', 'failed_login_attempts', 'datev2', 'rebalance', 'by', 'every', 'range', 'having', 'bitand', 'dropp', 'auto_increment', 'refresh', 'sql_block_rule', 'enter', 'agg_state', 'match_phrase_edge', 'desc', 'enable', 'decimalv3', 'temporary', 'connection_id', 'migrations', 'rlike', 'check', 'profile', 'do', 'convert', 'lock', 'sum', 'triggers', 'memo', 'end', 'start', 'columns', 'next', 'localtimestamp', 'when', 'is_null_pred', 'day', 'array', 'backends', 'distinct', 'ignore', 'account_unlock', 'properties', 'repeatable', 'full', 'schemas', 'split', 'immediate', 'demand', 'sets', 'modify', 'parsed', 'user', 'largeint', 'outfile', 'snapshot', 'extended', 'tablet', 'disk', 'load', 'type', 'storage', 'varchar', 'asc', 'stream', 'mtmv', 'unsigned', 'column', 'list', 'materialized', 'revoke', 'incremental', 'for', 'left', 'plan', 'in', 'float', 'hdfs', 'follower', 'file', 'uninstall', 'ipv6', 'starts', 'kill', 'semi', 'uncommitted', 'tasks', 'hash', 'switch', 'regexp', 'at', 'limit', 'processlist', 'cancel', 'call', 'show', 'count', 'distinctpcsa', 'year', 'decimalv2', 'set', 'complete', 'datetimev1', 'inverted', 'default', 'insert', 'copy', 'recycle', 'dynamic', 'low_priority', 'cluster', 'double', 'routine', 'update', 'union', 'bin', 'lines', 'verbose', 'first', 'real', 'second', 'minute', 'replace', 'xor', 'date_diff', 'true', 'comment', 'location', 'quota', 'index', 'bitmap_union', 'negative', 'time', 'smallint', 'charset', 'delete', 'signed', 'rename', 'variables', 'week', 'order', 'map', 'right', 'trash', 'role', 'is_not_null_pred', 'data', 'clusters', 'collect', 'ends', 'jobs', 'restore', 'rollback', 'ngram_bf', 'month', 'over', 'distinctpc', 'engines', 'optimized', 'hour', 'config', 'null', 'global', 'hub', 'match_phrase', 'is', 'events', 'intersect', 'blob', 'decommission', 'hll', 'execute', 'password_expire', 'name', 'help', 'grants', 'migrate', 'filter', 'table', 'committed', 'observer', 'buckets', 'infile', 'truncate', 'days_add', 'cached', 'jsonb', 'version', 'date_ceil', 'then', 'link', 'password', 'or', 'build', 'resume', 'select', 'keys', 'encryptkeys', 'subdate', 'proc', 'feature', 'stop', 'unlock', 'timestamp', 'tablesample', 'commit', 'drop', 'bitor', 'exclude', 'encryptkey', 'than', 'false', 'password_history', 'skew', 'alter', 'tables', 'password_lock_time', 'repository', 'timestampadd', 'bigint', 'hostname', 'logical', 'backup', 'open', 'resources', 'binlog', 'following', 'date_floor', 'vault', 'system', 'values', 'of', 'work', 'primary', 'stats', 's3', 'analyze', 'scheduler', 'int', 'constraints', 'fast', 'anti', 'current', 'all', 'grant', 'parameter', 'current_user', 'free', 'date', 'begin', 'div', 'intermediate', 'view', 'schema', 'session', 'except', 'path', 'databases', 'string', 'replica', 'terminated', 'collation', 'offset', 'grouping', 'plugins', 'restrictive', 'prepare', 'database', 'integer', 'analyzed', 'catalog', 'constraint', 'random', 'match_any', 'sample', 'chain', 'read', 'generic', 'non_nullable', 'dateadd', 'on', 'manual', 'json', 'plugin', 'errors', 'auto', 'fields', 'catalogs', 'property', 'functions', 'current_catalog', 'diagnose', 'period', 'release', 'collate', 'explain', 'format', 'alias', 'date_sub', 'into', 'no', 'nulls', 'only', 'pause', 'roles', 'whitelist', 'sync', 'rewritten', 'local', 'match', 'backend', 'adddate', 'using', 'process', 'max', 'min', 'names', 'authors', 'datetime', 'interval', 'force', 'transaction', 'group', 'status', 'natural', 'array_range', 'cast', 'maxvalue', 'trim', 'row', 'level', 'warnings', 'query', 'frontend', 'superuser', 'rows', 'duplicate', 'cron', 'isnull', 'outer', 'quantile_state', 'value', 'exists', 'job', 'describe', 'create', 'preceding', 'ldap_admin_password', 'doris_internal_table_id', 'cross', 'datediff', 'where', 'admin', 'broker', 'sequence', 'bulk', 'hll_union', 'frontends', 'minus', 'bitmap', 'distribution', 'types', 'date_add', 'export', 'resource', 'type_cast', 'account_lock', 'days_sub', 'indexes', 'match_regexp', 'merge', 'inner', 'current_date', 'dual', 'histogram', 'external', 'label', 'replace_if_not_null', 'password_reuse', 'else', 'tinyint', 'ipv4', 'use', 'rollup', 'decimal', 'as', 'repair', 'streaming', 'deferred', 'foreign', 'connection', 'tree', 'recover', 'current_timestamp', 'shape', 'key', 'creation', 'function', 'to', 'struct', 'overwrite', 'aggregate', 'character', 'lateral', 'physical', 'serializable', 'timestampdiff', 'tablets', 'current_time', 'task', 'case', 'with', 'consistent', 'percent', 'like', 'permissive', 'schedule', 'bitxor', 'groups', 'partitions', 'engine', 'append'}
def
uniquekeyproperty_sql( self, expression: sqlglot.expressions.properties.UniqueKeyProperty, prefix: str = 'UNIQUE KEY') -> str:
564 def uniquekeyproperty_sql( 565 self, expression: exp.UniqueKeyProperty, prefix: str = "UNIQUE KEY" 566 ) -> str: 567 create_stmt = expression.find_ancestor(exp.Create) 568 if create_stmt and create_stmt.args["properties"].find(exp.MaterializedProperty): 569 return super().uniquekeyproperty_sql(expression, prefix="KEY") 570 571 return super().uniquekeyproperty_sql(expression)
573 def partitionrange_sql(self, expression: exp.PartitionRange) -> str: 574 name = self.sql(expression, "this") 575 values = expression.expressions 576 577 if len(values) != 1: 578 # Multiple values: use VALUES [ ... ) 579 if values and isinstance(values[0], list): 580 values_sql = ", ".join( 581 f"({', '.join(self.sql(v) for v in inner)})" for inner in values 582 ) 583 else: 584 values_sql = ", ".join(f"({self.sql(v)})" for v in values) 585 586 return f"PARTITION {name} VALUES [{values_sql})" 587 588 return f"PARTITION {name} VALUES LESS THAN ({self.sql(values[0])})"
def
partitionbyrangepropertydynamic_sql( self, expression: sqlglot.expressions.properties.PartitionByRangePropertyDynamic) -> str:
590 def partitionbyrangepropertydynamic_sql( 591 self, expression: exp.PartitionByRangePropertyDynamic 592 ) -> str: 593 # Generates: FROM ("start") TO ("end") INTERVAL N UNIT 594 start = self.sql(expression, "start") 595 end = self.sql(expression, "end") 596 every = expression.args.get("every") 597 598 if every: 599 number = self.sql(every, "this") 600 interval = f"INTERVAL {number} {self.sql(every, 'unit')}" 601 else: 602 interval = "" 603 604 return f"FROM ({start}) TO ({end}) {interval}"
def
partitionedbyproperty_sql( self, expression: sqlglot.expressions.properties.PartitionedByProperty) -> str:
612 def table_sql(self, expression: exp.Table, sep: str = " AS ") -> str: 613 """Override table_sql to avoid AS keyword in UPDATE and DELETE statements.""" 614 ancestor = expression.find_ancestor(exp.Update, exp.Delete, exp.Select) 615 if not isinstance(ancestor, exp.Select): 616 sep = " " 617 return super().table_sql(expression, sep=sep)
Override table_sql to avoid AS keyword in UPDATE and DELETE statements.
Inherited Members
- sqlglot.generator.Generator
- Generator
- WINDOW_FUNCS_WITH_NULL_ORDERING
- IGNORE_NULLS_IN_FUNC
- IGNORE_NULLS_BEFORE_ORDER
- EXCEPT_INTERSECT_SUPPORT_ALL_CLAUSE
- CREATE_FUNCTION_RETURN_AS
- MATCHED_BY_SOURCE
- SUPPORTS_MERGE_WHERE
- SINGLE_STRING_INTERVAL
- AUTO_REFRESH_BARE_INTERVALS
- GROUPINGS_SEP
- INDEX_ON
- INOUT_SEPARATOR
- DIRECTED_JOINS
- QUERY_HINTS
- IS_BOOL_ALLOWED
- LIMIT_IS_TOP
- RETURNING_END
- EXTRACT_ALLOWS_QUOTES
- TZ_TO_WITH_TIME_ZONE
- ALTER_TABLE_INCLUDE_COLUMN_KEYWORD
- UNNEST_WITH_ORDINALITY
- SEMI_ANTI_JOIN_WITH_SIDE
- COMPUTED_COLUMN_WITH_TYPE
- SUPPORTS_TABLE_COPY
- TABLESAMPLE_REQUIRES_PARENS
- TABLESAMPLE_SIZE_IS_ROWS
- TABLESAMPLE_KEYWORDS
- TABLESAMPLE_WITH_METHOD
- TABLESAMPLE_SEED_KEYWORD
- HISTORICAL_DATA_POST_ALIAS
- COLLATE_IS_FUNC
- DATA_TYPE_SPECIFIERS_ALLOWED
- ENSURE_BOOLS
- CTE_RECURSIVE_KEYWORD_REQUIRED
- SUPPORTS_SINGLE_ARG_CONCAT
- SUPPORTS_TABLE_ALIAS_COLUMNS
- SUPPORTS_NAMED_CTE_COLUMNS
- UNPIVOT_ALIASES_ARE_IDENTIFIERS
- PIVOT_ALIAS_WITH_AS
- INSERT_OVERWRITE
- SUPPORTS_SELECT_INTO
- SUPPORTS_UNLOGGED_TABLES
- SUPPORTS_CREATE_TABLE_LIKE
- LIKE_PROPERTY_INSIDE_SCHEMA
- MULTI_ARG_DISTINCT
- JSON_PATH_SINGLE_QUOTE_ESCAPE
- JSON_PATH_KEY_QUOTED_FORCES_BRACKETS
- SUPPORTED_JSON_PATH_PARTS
- CAN_IMPLEMENT_ARRAY_ANY
- SUPPORTS_WINDOW_EXCLUDE
- SET_OP_MODIFIERS
- COPY_PARAMS_ARE_WRAPPED
- COPY_PARAMS_EQ_REQUIRED
- COPY_HAS_INTO_KEYWORD
- UNICODE_SUBSTITUTE
- STAR_EXCEPT
- HEX_FUNC
- QUOTE_JSON_PATH
- SUPPORTS_EXPLODING_PROJECTIONS
- ARRAY_CONCAT_IS_VAR_LEN
- SUPPORTS_CONVERT_TIMEZONE
- SUPPORTS_UNIX_SECONDS
- ALTER_SET_WRAPPED
- NORMALIZE_EXTRACT_DATE_PARTS
- ARRAY_SIZE_NAME
- ALTER_SET_TYPE
- ARRAY_SIZE_DIM_REQUIRED
- SUPPORTS_BETWEEN_FLAGS
- SUPPORTS_LIKE_QUANTIFIERS
- MATCH_AGAINST_TABLE_PREFIX
- SET_ASSIGNMENT_REQUIRES_VARIABLE_KEYWORD
- DECLARE_DEFAULT_ASSIGNMENT
- STAR_EXCLUDE_REQUIRES_DERIVED_TABLE
- SUPPORTS_DROP_ALTER_ICEBERG_PROPERTY
- UNSUPPORTED_TYPES
- TYPE_PARAM_SETTINGS
- TIME_PART_SINGULARS
- TOKEN_MAPPING
- STRUCT_DELIMITER
- PARAMETER_TOKEN
- NAMED_PLACEHOLDER_TOKEN
- EXPRESSION_PRECEDES_PROPERTIES_CREATABLES
- WITH_SEPARATED_COMMENTS
- EXCLUDE_COMMENTS
- UNWRAPPED_INTERVAL_VALUES
- PARAMETERIZABLE_TEXT_TYPES
- EXPRESSIONS_WITHOUT_NESTED_CTES
- RESPECT_IGNORE_NULLS_UNSUPPORTED_EXPRESSIONS
- SAFE_JSON_PATH_KEY_RE
- SENTINEL_LINE_BREAK
- pretty
- identify
- normalize
- pad
- unsupported_level
- max_unsupported
- leading_comma
- max_text_width
- comments
- dialect
- normalize_functions
- unsupported_messages
- generate
- preprocess
- unsupported
- sep
- seg
- sanitize_comment
- maybe_comment
- wrap
- no_identify
- normalize_func
- indent
- sql
- uncache_sql
- cache_sql
- characterset_sql
- column_parts
- column_sql
- pseudocolumn_sql
- columnposition_sql
- columndef_sql
- columnconstraint_sql
- autoincrementcolumnconstraint_sql
- compresscolumnconstraint_sql
- generatedasidentitycolumnconstraint_sql
- generatedasrowcolumnconstraint_sql
- periodforsystemtimeconstraint_sql
- notnullcolumnconstraint_sql
- primarykeycolumnconstraint_sql
- uniquecolumnconstraint_sql
- inoutcolumnconstraint_sql
- createable_sql
- create_sql
- sequenceproperties_sql
- triggerproperties_sql
- triggerreferencing_sql
- triggerevent_sql
- clone_sql
- describe_sql
- heredoc_sql
- prepend_ctes
- with_sql
- cte_sql
- tablealias_sql
- bitstring_sql
- hexstring_sql
- bytestring_sql
- unicodestring_sql
- rawstring_sql
- datatypeparam_sql
- datatype_param_bound_limiter
- directory_sql
- delete_sql
- drop_sql
- set_operation
- set_operations
- fetch_sql
- limitoptions_sql
- filter_sql
- hint_sql
- indexparameters_sql
- index_sql
- dynamicidentifier_sql
- identifier_sql
- hex_sql
- lowerhex_sql
- inputoutputformat_sql
- national_sql
- properties_sql
- root_properties
- properties
- with_properties
- property_name
- property_sql
- uuidproperty_sql
- likeproperty_sql
- fallbackproperty_sql
- journalproperty_sql
- freespaceproperty_sql
- checksumproperty_sql
- mergeblockratioproperty_sql
- moduleproperty_sql
- datablocksizeproperty_sql
- blockcompressionproperty_sql
- isolatedloadingproperty_sql
- partitionboundspec_sql
- partitionedofproperty_sql
- lockingproperty_sql
- withdataproperty_sql
- withsystemversioningproperty_sql
- insert_sql
- introducer_sql
- kill_sql
- pseudotype_sql
- objectidentifier_sql
- onconflict_sql
- returning_sql
- rowformatdelimitedproperty_sql
- withtablehint_sql
- indextablehint_sql
- historicaldata_sql
- table_parts
- tablefromrows_sql
- tablesample_sql
- pivot_sql
- version_sql
- tuple_sql
- update_sql
- values_sql
- var_sql
- into_sql
- from_sql
- groupingsets_sql
- rollup_sql
- rollupindex_sql
- rollupproperty_sql
- cube_sql
- group_sql
- having_sql
- connect_sql
- prior_sql
- join_sql
- lambda_sql
- lateral_op
- lateral_sql
- limit_sql
- offset_sql
- setitem_sql
- set_sql
- queryband_sql
- pragma_sql
- lock_sql
- literal_sql
- escape_str
- loaddata_sql
- null_sql
- boolean_sql
- booland_sql
- boolor_sql
- order_sql
- withfill_sql
- cluster_sql
- clusterproperty_sql
- distribute_sql
- sort_sql
- ordered_sql
- matchrecognizemeasure_sql
- matchrecognize_sql
- query_modifiers
- options_modifier
- forclause_sql
- queryoption_sql
- offset_limit_modifiers
- after_limit_modifiers
- select_sql
- schema_sql
- schema_columns_sql
- star_sql
- parameter_sql
- sessionparameter_sql
- placeholder_sql
- subquery_sql
- qualify_sql
- unnest_sql
- prewhere_sql
- where_sql
- window_sql
- partition_by_sql
- windowspec_sql
- withingroup_sql
- between_sql
- bracket_offset_expressions
- bracket_sql
- all_sql
- any_sql
- exists_sql
- case_sql
- constraint_sql
- nextvaluefor_sql
- trim_sql
- convert_concat_args
- concat_sql
- concatws_sql
- check_sql
- foreignkey_sql
- primarykey_sql
- timeserieskey_sql
- if_sql
- matchagainst_sql
- jsonkeyvalue_sql
- jsonpath_sql
- json_path_part
- formatjson_sql
- formatphrase_sql
- jsonarray_sql
- jsonarrayagg_sql
- jsoncolumndef_sql
- jsonschema_sql
- jsontable_sql
- openjsoncolumndef_sql
- openjson_sql
- in_sql
- in_unnest_op
- interval_sql
- return_sql
- reference_sql
- anonymous_sql
- paren_sql
- neg_sql
- not_sql
- alias_sql
- pivotalias_sql
- aliases_sql
- atindex_sql
- fromtimezone_sql
- fromiso8601date_sql
- fromiso8601timestamp_sql
- fromiso8601timestampnanos_sql
- add_sql
- and_sql
- or_sql
- xor_sql
- connector_sql
- bitwiseand_sql
- bitwiseleftshift_sql
- bitwisenot_sql
- bitwiseor_sql
- bitwiserightshift_sql
- bitwisexor_sql
- strtotime_sql
- strtodate_sql
- parsedatetime_sql
- currentdate_sql
- collate_sql
- command_sql
- comment_sql
- mergetreettlaction_sql
- mergetreettl_sql
- transaction_sql
- commit_sql
- rollback_sql
- modifycolumn_sql
- alterindex_sql
- alterdiststyle_sql
- altersortkey_sql
- renamecolumn_sql
- alterset_sql
- alter_sql
- altersession_sql
- add_column_sql
- droppartition_sql
- dropprimarykey_sql
- addconstraint_sql
- addpartition_sql
- distinct_sql
- respectnulls_sql
- havingmax_sql
- intdiv_sql
- div_sql
- safedivide_sql
- overlaps_sql
- distance_sql
- distancend_sql
- dot_sql
- eq_sql
- propertyeq_sql
- escape_sql
- glob_sql
- gt_sql
- gte_sql
- is_sql
- like_sql
- ilike_sql
- match_sql
- similarto_sql
- lt_sql
- lte_sql
- mod_sql
- mul_sql
- neq_sql
- nullsafeeq_sql
- nullsafeneq_sql
- sub_sql
- trycast_sql
- jsoncast_sql
- try_sql
- log_sql
- use_sql
- binary
- ceil_floor
- function_fallback_sql
- func
- format_args
- too_wide
- format_time
- expressions
- op_expressions
- naked_property
- tag_sql
- token_sql
- userdefinedfunction_sql
- macrooverloads_sql
- macrooverload_sql
- joinhint_sql
- kwarg_sql
- when_sql
- whens_sql
- merge_sql
- tochar_sql
- tonumber_sql
- dictproperty_sql
- dictrange_sql
- dictsubproperty_sql
- duplicatekeyproperty_sql
- distributedbyproperty_sql
- oncluster_sql
- clusteredbyproperty_sql
- anyvalue_sql
- querytransform_sql
- indexconstraintoption_sql
- checkcolumnconstraint_sql
- indexcolumnconstraint_sql
- nvl2_sql
- comprehension_sql
- columnprefix_sql
- opclass_sql
- predict_sql
- generateembedding_sql
- generatetext_sql
- generatetable_sql
- generatebool_sql
- generateint_sql
- generatedouble_sql
- mltranslate_sql
- mlforecast_sql
- aiforecast_sql
- featuresattime_sql
- vectorsearch_sql
- forin_sql
- refresh_sql
- toarray_sql
- tsordstotime_sql
- tsordstotimestamp_sql
- tsordstodatetime_sql
- tsordstodate_sql
- unixdate_sql
- lastday_sql
- dateadd_sql
- arrayany_sql
- struct_sql
- truncatetable_sql
- convert_sql
- copyparameter_sql
- credentials_sql
- copy_sql
- semicolon_sql
- datadeletionproperty_sql
- maskingpolicycolumnconstraint_sql
- gapfill_sql
- scope_resolution
- scoperesolution_sql
- parsejson_sql
- rand_sql
- changes_sql
- pad_sql
- summarize_sql
- explodinggenerateseries_sql
- json_sql
- jsonvalue_sql
- skipjsoncolumn_sql
- conditionalinsert_sql
- multitableinserts_sql
- oncondition_sql
- jsonextractquote_sql
- jsonexists_sql
- arrayagg_sql
- slice_sql
- apply_sql
- grant_sql
- revoke_sql
- grantprivilege_sql
- grantprincipal_sql
- columns_sql
- overlay_sql
- todouble_sql
- string_sql
- median_sql
- overflowtruncatebehavior_sql
- unixseconds_sql
- arraysize_sql
- attach_sql
- detach_sql
- attachoption_sql
- watermarkcolumnconstraint_sql
- encodeproperty_sql
- includeproperty_sql
- xmlelement_sql
- xmlkeyvalueoption_sql
- unpivotcolumns_sql
- analyzesample_sql
- analyzestatistics_sql
- analyzehistogram_sql
- analyzedelete_sql
- analyzelistchainedrows_sql
- analyzevalidate_sql
- analyze_sql
- xmltable_sql
- xmlnamespace_sql
- export_sql
- declare_sql
- declareitem_sql
- recursivewithsearch_sql
- parameterizedagg_sql
- anonymousaggfunc_sql
- combinedaggfunc_sql
- combinedparameterizedagg_sql
- install_sql
- get_put_sql
- translatecharacters_sql
- decodecase_sql
- semanticview_sql
- getextract_sql
- datefromunixdate_sql
- space_sql
- buildproperty_sql
- refreshtriggerproperty_sql
- modelattribute_sql
- directorystage_sql
- uuid_sql
- initcap_sql
- localtime_sql
- localtimestamp_sql
- weekstart_name
- weekstart_sql
- chr_sql
- block_sql
- functionspecification_sql
- storedprocedure_sql
- ifblock_sql
- whileblock_sql
- execute_sql
- executesql_sql
- altermodifysqlsecurity_sql
- usingproperty_sql
- renameindex_sql
- sqlglot.generators.mysql.MySQLGenerator
- SELECT_KINDS
- TRY_SUPPORTED
- SUPPORTS_UESCAPE
- SUPPORTS_DECODE_CASE
- SUPPORTS_MODIFY_COLUMN
- SUPPORTS_CHANGE_COLUMN
- AFTER_HAVING_MODIFIER_TRANSFORMS
- INTERVAL_ALLOWS_PLURAL_FORM
- LOCKING_READS_SUPPORTED
- NULL_ORDERING_SUPPORTED
- JOIN_HINTS
- TABLE_HINTS
- DUPLICATE_KEY_UPDATE_WITH_SET
- QUERY_HINT_SEP
- VALUES_AS_TABLE
- NVL2_SUPPORTED
- JSON_TYPE_REQUIRED_FOR_EXTRACTION
- JSON_PATH_BRACKETED_KEY_SUPPORTED
- JSON_KEY_VALUE_PAIR_SEP
- SUPPORTS_TO_NUMBER
- PARSE_JSON_NAME
- PAD_FILL_PATTERN_IS_REQUIRED
- WRAP_DERIVED_VALUES
- SUPPORTS_MEDIAN
- UNSIGNED_TYPE_MAPPING
- TIMESTAMP_TYPE_MAPPING
- LIMIT_FETCH
- LIMIT_ONLY_LITERALS
- CHAR_CAST_MAPPING
- SIGNED_CAST_MAPPING
- SQL_SECURITY_VIEW_LOCATION
- makeinterval_sql
- locate_properties
- computedcolumnconstraint_sql
- array_sql
- arraycontainsall_sql
- arraycontainedby_sql
- dpipe_sql
- extract_sql
- datatype_sql
- jsonarraycontains_sql
- cast_sql
- show_sql
- alterrename_sql
- altercolumn_sql
- timestamptrunc_sql
- converttimezone_sql
- attimezone_sql
- isascii_sql
- ignorenulls_sql
- currentschema_sql
- partition_sql
- partitionbyrangeproperty_sql
- partitionbylistproperty_sql
- partitionlist_sql