sqlglot.generators.doris
1from __future__ import annotations 2 3import typing as t 4 5from sqlglot import exp 6from sqlglot.dialects.dialect import ( 7 approx_count_distinct_sql, 8 property_sql, 9 rename_func, 10 time_format, 11 weekstart_unit_to_str, 12) 13from sqlglot.generators.mysql import MySQLGenerator 14 15 16def _lag_lead_sql(self, expression: exp.Lag | exp.Lead) -> str: 17 return self.func( 18 "LAG" if isinstance(expression, exp.Lag) else "LEAD", 19 expression.this, 20 expression.args.get("offset") or exp.Literal.number(1), 21 expression.args.get("default") or exp.null(), 22 ) 23 24 25class DorisGenerator(MySQLGenerator): 26 LAST_DAY_SUPPORTS_DATE_PART = False 27 SUPPORTS_ALTER_COLUMN_NULLABILITY = False 28 VARCHAR_REQUIRES_SIZE = False 29 WITH_PROPERTIES_PREFIX = "PROPERTIES" 30 RENAME_TABLE_WITH_DB = False 31 UPDATE_STATEMENT_SUPPORTS_FROM = True 32 33 TYPE_MAPPING = { 34 **MySQLGenerator.TYPE_MAPPING, 35 exp.DType.TEXT: "STRING", 36 exp.DType.TIMESTAMP: "DATETIME", 37 exp.DType.TIMESTAMPTZ: "DATETIME", 38 } 39 40 PROPERTIES_LOCATION = { 41 **MySQLGenerator.PROPERTIES_LOCATION, 42 exp.UniqueKeyProperty: exp.Properties.Location.POST_SCHEMA, 43 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 44 exp.BuildProperty: exp.Properties.Location.POST_SCHEMA, 45 } 46 47 CAST_MAPPING: t.ClassVar[dict[exp.DType, str]] = {} 48 TIMESTAMP_FUNC_TYPES: t.ClassVar[set[exp.DType]] = set() 49 50 TRANSFORMS = { 51 **MySQLGenerator.TRANSFORMS, 52 exp.AddMonths: rename_func("MONTHS_ADD"), 53 exp.ApproxDistinct: approx_count_distinct_sql, 54 exp.ArgMax: rename_func("MAX_BY"), 55 exp.ArgMin: rename_func("MIN_BY"), 56 exp.ArrayAgg: rename_func("COLLECT_LIST"), 57 exp.ArrayToString: rename_func("ARRAY_JOIN"), 58 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 59 exp.CurrentDate: lambda self, _: self.func("CURRENT_DATE"), 60 exp.CurrentTimestamp: lambda self, _: self.func("NOW"), 61 exp.DateTrunc: lambda self, e: self.func( 62 "DATE_TRUNC", e.this, weekstart_unit_to_str(self, e) 63 ), 64 exp.EuclideanDistance: rename_func("L2_DISTANCE"), 65 exp.GroupConcat: lambda self, e: self.func( 66 "GROUP_CONCAT", e.this, e.args.get("separator") or exp.Literal.string(",") 67 ), 68 exp.JSONExtractScalar: lambda self, e: self.func("JSON_EXTRACT", e.this, e.expression), 69 exp.Lag: _lag_lead_sql, 70 exp.Lead: _lag_lead_sql, 71 exp.Map: rename_func("ARRAY_MAP"), 72 exp.Property: property_sql, 73 exp.RegexpLike: rename_func("REGEXP"), 74 exp.RegexpSplit: rename_func("SPLIT_BY_STRING"), 75 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 76 exp.Split: rename_func("SPLIT_BY_STRING"), 77 exp.StringToArray: rename_func("SPLIT_BY_STRING"), 78 exp.StrToUnix: lambda self, e: self.func("UNIX_TIMESTAMP", e.this, self.format_time(e)), 79 exp.TimeStrToDate: rename_func("TO_DATE"), 80 exp.TsOrDsAdd: lambda self, e: self.func("DATE_ADD", e.this, e.expression), 81 exp.TsOrDsToDate: lambda self, e: self.func("TO_DATE", e.this), 82 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 83 exp.TimestampTrunc: lambda self, e: self.func( 84 "DATE_TRUNC", e.this, weekstart_unit_to_str(self, e) 85 ), 86 exp.UnixToStr: lambda self, e: self.func( 87 "FROM_UNIXTIME", e.this, time_format("doris")(self, e) 88 ), 89 exp.UnixToTime: rename_func("FROM_UNIXTIME"), 90 } 91 92 # https://github.com/apache/doris/blob/e4f41dbf1ec03f5937fdeba2ee1454a20254015b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4#L93 93 RESERVED_KEYWORDS = { 94 "account_lock", 95 "account_unlock", 96 "add", 97 "adddate", 98 "admin", 99 "after", 100 "agg_state", 101 "aggregate", 102 "alias", 103 "all", 104 "alter", 105 "analyze", 106 "analyzed", 107 "and", 108 "anti", 109 "append", 110 "array", 111 "array_range", 112 "as", 113 "asc", 114 "at", 115 "authors", 116 "auto", 117 "auto_increment", 118 "backend", 119 "backends", 120 "backup", 121 "begin", 122 "belong", 123 "between", 124 "bigint", 125 "bin", 126 "binary", 127 "binlog", 128 "bitand", 129 "bitmap", 130 "bitmap_union", 131 "bitor", 132 "bitxor", 133 "blob", 134 "boolean", 135 "brief", 136 "broker", 137 "buckets", 138 "build", 139 "builtin", 140 "bulk", 141 "by", 142 "cached", 143 "call", 144 "cancel", 145 "case", 146 "cast", 147 "catalog", 148 "catalogs", 149 "chain", 150 "char", 151 "character", 152 "charset", 153 "check", 154 "clean", 155 "cluster", 156 "clusters", 157 "collate", 158 "collation", 159 "collect", 160 "column", 161 "columns", 162 "comment", 163 "commit", 164 "committed", 165 "compact", 166 "complete", 167 "config", 168 "connection", 169 "connection_id", 170 "consistent", 171 "constraint", 172 "constraints", 173 "convert", 174 "copy", 175 "count", 176 "create", 177 "creation", 178 "cron", 179 "cross", 180 "cube", 181 "current", 182 "current_catalog", 183 "current_date", 184 "current_time", 185 "current_timestamp", 186 "current_user", 187 "data", 188 "database", 189 "databases", 190 "date", 191 "date_add", 192 "date_ceil", 193 "date_diff", 194 "date_floor", 195 "date_sub", 196 "dateadd", 197 "datediff", 198 "datetime", 199 "datetimev2", 200 "datev2", 201 "datetimev1", 202 "datev1", 203 "day", 204 "days_add", 205 "days_sub", 206 "decimal", 207 "decimalv2", 208 "decimalv3", 209 "decommission", 210 "default", 211 "deferred", 212 "delete", 213 "demand", 214 "desc", 215 "describe", 216 "diagnose", 217 "disk", 218 "distinct", 219 "distinctpc", 220 "distinctpcsa", 221 "distributed", 222 "distribution", 223 "div", 224 "do", 225 "doris_internal_table_id", 226 "double", 227 "drop", 228 "dropp", 229 "dual", 230 "duplicate", 231 "dynamic", 232 "else", 233 "enable", 234 "encryptkey", 235 "encryptkeys", 236 "end", 237 "ends", 238 "engine", 239 "engines", 240 "enter", 241 "errors", 242 "events", 243 "every", 244 "except", 245 "exclude", 246 "execute", 247 "exists", 248 "expired", 249 "explain", 250 "export", 251 "extended", 252 "external", 253 "extract", 254 "failed_login_attempts", 255 "false", 256 "fast", 257 "feature", 258 "fields", 259 "file", 260 "filter", 261 "first", 262 "float", 263 "follower", 264 "following", 265 "for", 266 "foreign", 267 "force", 268 "format", 269 "free", 270 "from", 271 "frontend", 272 "frontends", 273 "full", 274 "function", 275 "functions", 276 "generic", 277 "global", 278 "grant", 279 "grants", 280 "graph", 281 "group", 282 "grouping", 283 "groups", 284 "hash", 285 "having", 286 "hdfs", 287 "help", 288 "histogram", 289 "hll", 290 "hll_union", 291 "hostname", 292 "hour", 293 "hub", 294 "identified", 295 "if", 296 "ignore", 297 "immediate", 298 "in", 299 "incremental", 300 "index", 301 "indexes", 302 "infile", 303 "inner", 304 "insert", 305 "install", 306 "int", 307 "integer", 308 "intermediate", 309 "intersect", 310 "interval", 311 "into", 312 "inverted", 313 "ipv4", 314 "ipv6", 315 "is", 316 "is_not_null_pred", 317 "is_null_pred", 318 "isnull", 319 "isolation", 320 "job", 321 "jobs", 322 "join", 323 "json", 324 "jsonb", 325 "key", 326 "keys", 327 "kill", 328 "label", 329 "largeint", 330 "last", 331 "lateral", 332 "ldap", 333 "ldap_admin_password", 334 "left", 335 "less", 336 "level", 337 "like", 338 "limit", 339 "lines", 340 "link", 341 "list", 342 "load", 343 "local", 344 "localtime", 345 "localtimestamp", 346 "location", 347 "lock", 348 "logical", 349 "low_priority", 350 "manual", 351 "map", 352 "match", 353 "match_all", 354 "match_any", 355 "match_phrase", 356 "match_phrase_edge", 357 "match_phrase_prefix", 358 "match_regexp", 359 "materialized", 360 "max", 361 "maxvalue", 362 "memo", 363 "merge", 364 "migrate", 365 "migrations", 366 "min", 367 "minus", 368 "minute", 369 "modify", 370 "month", 371 "mtmv", 372 "name", 373 "names", 374 "natural", 375 "negative", 376 "never", 377 "next", 378 "ngram_bf", 379 "no", 380 "non_nullable", 381 "not", 382 "null", 383 "nulls", 384 "observer", 385 "of", 386 "offset", 387 "on", 388 "only", 389 "open", 390 "optimized", 391 "or", 392 "order", 393 "outer", 394 "outfile", 395 "over", 396 "overwrite", 397 "parameter", 398 "parsed", 399 "partition", 400 "partitions", 401 "password", 402 "password_expire", 403 "password_history", 404 "password_lock_time", 405 "password_reuse", 406 "path", 407 "pause", 408 "percent", 409 "period", 410 "permissive", 411 "physical", 412 "plan", 413 "process", 414 "plugin", 415 "plugins", 416 "policy", 417 "preceding", 418 "prepare", 419 "primary", 420 "proc", 421 "procedure", 422 "processlist", 423 "profile", 424 "properties", 425 "property", 426 "quantile_state", 427 "quantile_union", 428 "query", 429 "quota", 430 "random", 431 "range", 432 "read", 433 "real", 434 "rebalance", 435 "recover", 436 "recycle", 437 "refresh", 438 "references", 439 "regexp", 440 "release", 441 "rename", 442 "repair", 443 "repeatable", 444 "replace", 445 "replace_if_not_null", 446 "replica", 447 "repositories", 448 "repository", 449 "resource", 450 "resources", 451 "restore", 452 "restrictive", 453 "resume", 454 "returns", 455 "revoke", 456 "rewritten", 457 "right", 458 "rlike", 459 "role", 460 "roles", 461 "rollback", 462 "rollup", 463 "routine", 464 "row", 465 "rows", 466 "s3", 467 "sample", 468 "schedule", 469 "scheduler", 470 "schema", 471 "schemas", 472 "second", 473 "select", 474 "semi", 475 "sequence", 476 "serializable", 477 "session", 478 "set", 479 "sets", 480 "shape", 481 "show", 482 "signed", 483 "skew", 484 "smallint", 485 "snapshot", 486 "soname", 487 "split", 488 "sql_block_rule", 489 "start", 490 "starts", 491 "stats", 492 "status", 493 "stop", 494 "storage", 495 "stream", 496 "streaming", 497 "string", 498 "struct", 499 "subdate", 500 "sum", 501 "superuser", 502 "switch", 503 "sync", 504 "system", 505 "table", 506 "tables", 507 "tablesample", 508 "tablet", 509 "tablets", 510 "task", 511 "tasks", 512 "temporary", 513 "terminated", 514 "text", 515 "than", 516 "then", 517 "time", 518 "timestamp", 519 "timestampadd", 520 "timestampdiff", 521 "tinyint", 522 "to", 523 "transaction", 524 "trash", 525 "tree", 526 "triggers", 527 "trim", 528 "true", 529 "truncate", 530 "type", 531 "type_cast", 532 "types", 533 "unbounded", 534 "uncommitted", 535 "uninstall", 536 "union", 537 "unique", 538 "unlock", 539 "unsigned", 540 "update", 541 "use", 542 "user", 543 "using", 544 "value", 545 "values", 546 "varchar", 547 "variables", 548 "variant", 549 "vault", 550 "verbose", 551 "version", 552 "view", 553 "warnings", 554 "week", 555 "when", 556 "where", 557 "whitelist", 558 "with", 559 "work", 560 "workload", 561 "write", 562 "xor", 563 "year", 564 } 565 566 def uniquekeyproperty_sql( 567 self, expression: exp.UniqueKeyProperty, prefix: str = "UNIQUE KEY" 568 ) -> str: 569 create_stmt = expression.find_ancestor(exp.Create) 570 if create_stmt and create_stmt.args["properties"].find(exp.MaterializedProperty): 571 return super().uniquekeyproperty_sql(expression, prefix="KEY") 572 573 return super().uniquekeyproperty_sql(expression) 574 575 def partitionrange_sql(self, expression: exp.PartitionRange) -> str: 576 name = self.sql(expression, "this") 577 values = expression.expressions 578 579 if len(values) != 1: 580 # Multiple values: use VALUES [ ... ) 581 if values and isinstance(values[0], list): 582 values_sql = ", ".join( 583 f"({', '.join(self.sql(v) for v in inner)})" for inner in values 584 ) 585 else: 586 values_sql = ", ".join(f"({self.sql(v)})" for v in values) 587 588 return f"PARTITION {name} VALUES [{values_sql})" 589 590 return f"PARTITION {name} VALUES LESS THAN ({self.sql(values[0])})" 591 592 def partitionbyrangepropertydynamic_sql( 593 self, expression: exp.PartitionByRangePropertyDynamic 594 ) -> str: 595 # Generates: FROM ("start") TO ("end") INTERVAL N UNIT 596 start = self.sql(expression, "start") 597 end = self.sql(expression, "end") 598 every = expression.args.get("every") 599 600 if every: 601 number = self.sql(every, "this") 602 interval = f"INTERVAL {number} {self.sql(every, 'unit')}" 603 else: 604 interval = "" 605 606 return f"FROM ({start}) TO ({end}) {interval}" 607 608 def partitionedbyproperty_sql(self, expression: exp.PartitionedByProperty) -> str: 609 this = expression.this 610 if isinstance(this, exp.Schema): 611 return f"PARTITION BY ({self.expressions(this, flat=True)})" 612 return f"PARTITION BY ({self.sql(this)})" 613 614 def table_sql(self, expression: exp.Table, sep: str = " AS ") -> str: 615 """Override table_sql to avoid AS keyword in UPDATE and DELETE statements.""" 616 ancestor = expression.find_ancestor(exp.Update, exp.Delete, exp.Select) 617 if not isinstance(ancestor, exp.Select): 618 sep = " " 619 return super().table_sql(expression, sep=sep)
26class DorisGenerator(MySQLGenerator): 27 LAST_DAY_SUPPORTS_DATE_PART = False 28 SUPPORTS_ALTER_COLUMN_NULLABILITY = False 29 VARCHAR_REQUIRES_SIZE = False 30 WITH_PROPERTIES_PREFIX = "PROPERTIES" 31 RENAME_TABLE_WITH_DB = False 32 UPDATE_STATEMENT_SUPPORTS_FROM = True 33 34 TYPE_MAPPING = { 35 **MySQLGenerator.TYPE_MAPPING, 36 exp.DType.TEXT: "STRING", 37 exp.DType.TIMESTAMP: "DATETIME", 38 exp.DType.TIMESTAMPTZ: "DATETIME", 39 } 40 41 PROPERTIES_LOCATION = { 42 **MySQLGenerator.PROPERTIES_LOCATION, 43 exp.UniqueKeyProperty: exp.Properties.Location.POST_SCHEMA, 44 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 45 exp.BuildProperty: exp.Properties.Location.POST_SCHEMA, 46 } 47 48 CAST_MAPPING: t.ClassVar[dict[exp.DType, str]] = {} 49 TIMESTAMP_FUNC_TYPES: t.ClassVar[set[exp.DType]] = set() 50 51 TRANSFORMS = { 52 **MySQLGenerator.TRANSFORMS, 53 exp.AddMonths: rename_func("MONTHS_ADD"), 54 exp.ApproxDistinct: approx_count_distinct_sql, 55 exp.ArgMax: rename_func("MAX_BY"), 56 exp.ArgMin: rename_func("MIN_BY"), 57 exp.ArrayAgg: rename_func("COLLECT_LIST"), 58 exp.ArrayToString: rename_func("ARRAY_JOIN"), 59 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 60 exp.CurrentDate: lambda self, _: self.func("CURRENT_DATE"), 61 exp.CurrentTimestamp: lambda self, _: self.func("NOW"), 62 exp.DateTrunc: lambda self, e: self.func( 63 "DATE_TRUNC", e.this, weekstart_unit_to_str(self, e) 64 ), 65 exp.EuclideanDistance: rename_func("L2_DISTANCE"), 66 exp.GroupConcat: lambda self, e: self.func( 67 "GROUP_CONCAT", e.this, e.args.get("separator") or exp.Literal.string(",") 68 ), 69 exp.JSONExtractScalar: lambda self, e: self.func("JSON_EXTRACT", e.this, e.expression), 70 exp.Lag: _lag_lead_sql, 71 exp.Lead: _lag_lead_sql, 72 exp.Map: rename_func("ARRAY_MAP"), 73 exp.Property: property_sql, 74 exp.RegexpLike: rename_func("REGEXP"), 75 exp.RegexpSplit: rename_func("SPLIT_BY_STRING"), 76 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 77 exp.Split: rename_func("SPLIT_BY_STRING"), 78 exp.StringToArray: rename_func("SPLIT_BY_STRING"), 79 exp.StrToUnix: lambda self, e: self.func("UNIX_TIMESTAMP", e.this, self.format_time(e)), 80 exp.TimeStrToDate: rename_func("TO_DATE"), 81 exp.TsOrDsAdd: lambda self, e: self.func("DATE_ADD", e.this, e.expression), 82 exp.TsOrDsToDate: lambda self, e: self.func("TO_DATE", e.this), 83 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 84 exp.TimestampTrunc: lambda self, e: self.func( 85 "DATE_TRUNC", e.this, weekstart_unit_to_str(self, e) 86 ), 87 exp.UnixToStr: lambda self, e: self.func( 88 "FROM_UNIXTIME", e.this, time_format("doris")(self, e) 89 ), 90 exp.UnixToTime: rename_func("FROM_UNIXTIME"), 91 } 92 93 # https://github.com/apache/doris/blob/e4f41dbf1ec03f5937fdeba2ee1454a20254015b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4#L93 94 RESERVED_KEYWORDS = { 95 "account_lock", 96 "account_unlock", 97 "add", 98 "adddate", 99 "admin", 100 "after", 101 "agg_state", 102 "aggregate", 103 "alias", 104 "all", 105 "alter", 106 "analyze", 107 "analyzed", 108 "and", 109 "anti", 110 "append", 111 "array", 112 "array_range", 113 "as", 114 "asc", 115 "at", 116 "authors", 117 "auto", 118 "auto_increment", 119 "backend", 120 "backends", 121 "backup", 122 "begin", 123 "belong", 124 "between", 125 "bigint", 126 "bin", 127 "binary", 128 "binlog", 129 "bitand", 130 "bitmap", 131 "bitmap_union", 132 "bitor", 133 "bitxor", 134 "blob", 135 "boolean", 136 "brief", 137 "broker", 138 "buckets", 139 "build", 140 "builtin", 141 "bulk", 142 "by", 143 "cached", 144 "call", 145 "cancel", 146 "case", 147 "cast", 148 "catalog", 149 "catalogs", 150 "chain", 151 "char", 152 "character", 153 "charset", 154 "check", 155 "clean", 156 "cluster", 157 "clusters", 158 "collate", 159 "collation", 160 "collect", 161 "column", 162 "columns", 163 "comment", 164 "commit", 165 "committed", 166 "compact", 167 "complete", 168 "config", 169 "connection", 170 "connection_id", 171 "consistent", 172 "constraint", 173 "constraints", 174 "convert", 175 "copy", 176 "count", 177 "create", 178 "creation", 179 "cron", 180 "cross", 181 "cube", 182 "current", 183 "current_catalog", 184 "current_date", 185 "current_time", 186 "current_timestamp", 187 "current_user", 188 "data", 189 "database", 190 "databases", 191 "date", 192 "date_add", 193 "date_ceil", 194 "date_diff", 195 "date_floor", 196 "date_sub", 197 "dateadd", 198 "datediff", 199 "datetime", 200 "datetimev2", 201 "datev2", 202 "datetimev1", 203 "datev1", 204 "day", 205 "days_add", 206 "days_sub", 207 "decimal", 208 "decimalv2", 209 "decimalv3", 210 "decommission", 211 "default", 212 "deferred", 213 "delete", 214 "demand", 215 "desc", 216 "describe", 217 "diagnose", 218 "disk", 219 "distinct", 220 "distinctpc", 221 "distinctpcsa", 222 "distributed", 223 "distribution", 224 "div", 225 "do", 226 "doris_internal_table_id", 227 "double", 228 "drop", 229 "dropp", 230 "dual", 231 "duplicate", 232 "dynamic", 233 "else", 234 "enable", 235 "encryptkey", 236 "encryptkeys", 237 "end", 238 "ends", 239 "engine", 240 "engines", 241 "enter", 242 "errors", 243 "events", 244 "every", 245 "except", 246 "exclude", 247 "execute", 248 "exists", 249 "expired", 250 "explain", 251 "export", 252 "extended", 253 "external", 254 "extract", 255 "failed_login_attempts", 256 "false", 257 "fast", 258 "feature", 259 "fields", 260 "file", 261 "filter", 262 "first", 263 "float", 264 "follower", 265 "following", 266 "for", 267 "foreign", 268 "force", 269 "format", 270 "free", 271 "from", 272 "frontend", 273 "frontends", 274 "full", 275 "function", 276 "functions", 277 "generic", 278 "global", 279 "grant", 280 "grants", 281 "graph", 282 "group", 283 "grouping", 284 "groups", 285 "hash", 286 "having", 287 "hdfs", 288 "help", 289 "histogram", 290 "hll", 291 "hll_union", 292 "hostname", 293 "hour", 294 "hub", 295 "identified", 296 "if", 297 "ignore", 298 "immediate", 299 "in", 300 "incremental", 301 "index", 302 "indexes", 303 "infile", 304 "inner", 305 "insert", 306 "install", 307 "int", 308 "integer", 309 "intermediate", 310 "intersect", 311 "interval", 312 "into", 313 "inverted", 314 "ipv4", 315 "ipv6", 316 "is", 317 "is_not_null_pred", 318 "is_null_pred", 319 "isnull", 320 "isolation", 321 "job", 322 "jobs", 323 "join", 324 "json", 325 "jsonb", 326 "key", 327 "keys", 328 "kill", 329 "label", 330 "largeint", 331 "last", 332 "lateral", 333 "ldap", 334 "ldap_admin_password", 335 "left", 336 "less", 337 "level", 338 "like", 339 "limit", 340 "lines", 341 "link", 342 "list", 343 "load", 344 "local", 345 "localtime", 346 "localtimestamp", 347 "location", 348 "lock", 349 "logical", 350 "low_priority", 351 "manual", 352 "map", 353 "match", 354 "match_all", 355 "match_any", 356 "match_phrase", 357 "match_phrase_edge", 358 "match_phrase_prefix", 359 "match_regexp", 360 "materialized", 361 "max", 362 "maxvalue", 363 "memo", 364 "merge", 365 "migrate", 366 "migrations", 367 "min", 368 "minus", 369 "minute", 370 "modify", 371 "month", 372 "mtmv", 373 "name", 374 "names", 375 "natural", 376 "negative", 377 "never", 378 "next", 379 "ngram_bf", 380 "no", 381 "non_nullable", 382 "not", 383 "null", 384 "nulls", 385 "observer", 386 "of", 387 "offset", 388 "on", 389 "only", 390 "open", 391 "optimized", 392 "or", 393 "order", 394 "outer", 395 "outfile", 396 "over", 397 "overwrite", 398 "parameter", 399 "parsed", 400 "partition", 401 "partitions", 402 "password", 403 "password_expire", 404 "password_history", 405 "password_lock_time", 406 "password_reuse", 407 "path", 408 "pause", 409 "percent", 410 "period", 411 "permissive", 412 "physical", 413 "plan", 414 "process", 415 "plugin", 416 "plugins", 417 "policy", 418 "preceding", 419 "prepare", 420 "primary", 421 "proc", 422 "procedure", 423 "processlist", 424 "profile", 425 "properties", 426 "property", 427 "quantile_state", 428 "quantile_union", 429 "query", 430 "quota", 431 "random", 432 "range", 433 "read", 434 "real", 435 "rebalance", 436 "recover", 437 "recycle", 438 "refresh", 439 "references", 440 "regexp", 441 "release", 442 "rename", 443 "repair", 444 "repeatable", 445 "replace", 446 "replace_if_not_null", 447 "replica", 448 "repositories", 449 "repository", 450 "resource", 451 "resources", 452 "restore", 453 "restrictive", 454 "resume", 455 "returns", 456 "revoke", 457 "rewritten", 458 "right", 459 "rlike", 460 "role", 461 "roles", 462 "rollback", 463 "rollup", 464 "routine", 465 "row", 466 "rows", 467 "s3", 468 "sample", 469 "schedule", 470 "scheduler", 471 "schema", 472 "schemas", 473 "second", 474 "select", 475 "semi", 476 "sequence", 477 "serializable", 478 "session", 479 "set", 480 "sets", 481 "shape", 482 "show", 483 "signed", 484 "skew", 485 "smallint", 486 "snapshot", 487 "soname", 488 "split", 489 "sql_block_rule", 490 "start", 491 "starts", 492 "stats", 493 "status", 494 "stop", 495 "storage", 496 "stream", 497 "streaming", 498 "string", 499 "struct", 500 "subdate", 501 "sum", 502 "superuser", 503 "switch", 504 "sync", 505 "system", 506 "table", 507 "tables", 508 "tablesample", 509 "tablet", 510 "tablets", 511 "task", 512 "tasks", 513 "temporary", 514 "terminated", 515 "text", 516 "than", 517 "then", 518 "time", 519 "timestamp", 520 "timestampadd", 521 "timestampdiff", 522 "tinyint", 523 "to", 524 "transaction", 525 "trash", 526 "tree", 527 "triggers", 528 "trim", 529 "true", 530 "truncate", 531 "type", 532 "type_cast", 533 "types", 534 "unbounded", 535 "uncommitted", 536 "uninstall", 537 "union", 538 "unique", 539 "unlock", 540 "unsigned", 541 "update", 542 "use", 543 "user", 544 "using", 545 "value", 546 "values", 547 "varchar", 548 "variables", 549 "variant", 550 "vault", 551 "verbose", 552 "version", 553 "view", 554 "warnings", 555 "week", 556 "when", 557 "where", 558 "whitelist", 559 "with", 560 "work", 561 "workload", 562 "write", 563 "xor", 564 "year", 565 } 566 567 def uniquekeyproperty_sql( 568 self, expression: exp.UniqueKeyProperty, prefix: str = "UNIQUE KEY" 569 ) -> str: 570 create_stmt = expression.find_ancestor(exp.Create) 571 if create_stmt and create_stmt.args["properties"].find(exp.MaterializedProperty): 572 return super().uniquekeyproperty_sql(expression, prefix="KEY") 573 574 return super().uniquekeyproperty_sql(expression) 575 576 def partitionrange_sql(self, expression: exp.PartitionRange) -> str: 577 name = self.sql(expression, "this") 578 values = expression.expressions 579 580 if len(values) != 1: 581 # Multiple values: use VALUES [ ... ) 582 if values and isinstance(values[0], list): 583 values_sql = ", ".join( 584 f"({', '.join(self.sql(v) for v in inner)})" for inner in values 585 ) 586 else: 587 values_sql = ", ".join(f"({self.sql(v)})" for v in values) 588 589 return f"PARTITION {name} VALUES [{values_sql})" 590 591 return f"PARTITION {name} VALUES LESS THAN ({self.sql(values[0])})" 592 593 def partitionbyrangepropertydynamic_sql( 594 self, expression: exp.PartitionByRangePropertyDynamic 595 ) -> str: 596 # Generates: FROM ("start") TO ("end") INTERVAL N UNIT 597 start = self.sql(expression, "start") 598 end = self.sql(expression, "end") 599 every = expression.args.get("every") 600 601 if every: 602 number = self.sql(every, "this") 603 interval = f"INTERVAL {number} {self.sql(every, 'unit')}" 604 else: 605 interval = "" 606 607 return f"FROM ({start}) TO ({end}) {interval}" 608 609 def partitionedbyproperty_sql(self, expression: exp.PartitionedByProperty) -> str: 610 this = expression.this 611 if isinstance(this, exp.Schema): 612 return f"PARTITION BY ({self.expressions(this, flat=True)})" 613 return f"PARTITION BY ({self.sql(this)})" 614 615 def table_sql(self, expression: exp.Table, sep: str = " AS ") -> str: 616 """Override table_sql to avoid AS keyword in UPDATE and DELETE statements.""" 617 ancestor = expression.find_ancestor(exp.Update, exp.Delete, exp.Select) 618 if not isinstance(ancestor, exp.Select): 619 sep = " " 620 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 =
{'non_nullable', 'connection', 'describe', 'duplicate', 'execute', 'regexp', 'by', 'quota', 'auto', 'profile', 'map', 'enter', 'plugins', 'rebalance', 'histogram', 'repair', 'routine', 'stats', 'following', 'dynamic', 'resource', 'skew', 'limit', 'explain', 'semi', 'select', 'mtmv', 'null', 'stream', 'ngram_bf', 'aggregate', 'bin', 'feature', 'install', 'builtin', 'days_add', 'delete', 'blob', 'max', 'then', 'fast', 'backends', 'variables', 'match_regexp', 'storage', 'resources', 'migrations', 'schedule', 'label', 'preceding', 'real', 'immediate', 'offset', 'extract', 'repeatable', 'parameter', 'type', 'index', 'data', 'days_sub', 'collect', 'intermediate', 'integer', 'key', 'graph', 'schemas', 'demand', 'datetimev1', 'except', 'binary', 'date', 'is', 'password_history', 'returns', 'datev2', 'materialized', 'drop', 'build', 'fields', 'groups', 'analyze', 'full', 'consistent', 'merge', 'account_lock', 'interval', 'task', 'char', 'bitxor', 'creation', 'chain', 'if', 'json', 'is_not_null_pred', 'hub', 'cube', 'at', 'restore', 'permissive', 'case', 'proc', 'version', 'keys', 'lateral', 'encryptkeys', 'create', 'match', 'infile', 'alias', 'having', 'name', 'switch', 'tables', 'varchar', 'percent', 'date_diff', 'current_date', 'observer', 'after', 'connection_id', 'workload', 'only', 'anti', 'over', 'clean', 'bitand', 'rlike', 'encryptkey', 'open', 'struct', 'sql_block_rule', 'group', 'restrictive', 'buckets', 'use', 'force', 'decimal', 'external', 'right', 'between', 'types', 'processlist', 'compact', 'manual', 'show', 'append', 'plan', 'sync', 'random', 'frontend', 'day', 'double', 'match_phrase_edge', 'not', 'row', 'charset', 'resume', 'recover', 'warnings', 'hdfs', 'no', 'uncommitted', 'partitions', 'decimalv3', 'refresh', 'tasks', 'doris_internal_table_id', 'isolation', 'password', 'grant', 'smallint', 'config', 'exists', 'hll', 'commit', 'roles', 'ldap', 'negative', 'natural', 'rename', 'lock', 'grouping', 'identified', 'binlog', 'replace_if_not_null', 'rollup', 'uninstall', 'array_range', 'location', 'set', 'migrate', 'auto_increment', 'timestampdiff', 'superuser', 'broker', 'add', 'intersect', 'format', 'lines', 'collate', 'second', 'pause', 'truncate', 'maxvalue', 'ipv4', 'starts', 'cluster', 'datev1', 'property', 'write', 'outfile', 'overwrite', 'in', 'schema', 'dropp', 'decimalv2', 'range', 'rollback', 'year', 'alter', 'admin', 'character', 'ldap_admin_password', 'job', 'array', 'read', 'update', 'account_unlock', 'link', 'database', 'terminated', 'hll_union', 'work', 'distinctpcsa', 'bitmap_union', 'unsigned', 'prepare', 'never', 'else', 'engines', 'subdate', 'authors', 'hash', 'count', 'follower', 'match_any', 'local', 'user', 'with', 'call', 'default', 'constraints', 'free', 'timestamp', 'datetimev2', 'complete', 'modify', 'cancel', 'minus', 'inverted', 'false', 'load', 'sum', 'view', 'brief', 'enable', 'all', 'boolean', 'distinctpc', 'distribution', 'join', 'week', 'when', 'logical', 'password_expire', 'of', 'replace', 'diagnose', 'nulls', 'policy', 'float', 'shape', 'month', 'verbose', 'as', 'inner', 'table', 'tablets', 'kill', 'match_all', 'cast', 'div', 'exclude', 'whitelist', 'committed', 'decommission', 'datetime', 'min', 'revoke', 'rows', 'memo', 'status', 'ends', 'than', 'copy', 'for', 'and', 'timestampadd', 'global', 'optimized', 'begin', 'export', 'tablesample', 'comment', 'unbounded', 'cached', 'belong', 'every', 'quantile_state', 'catalogs', 'string', 'split', 'check', 'failed_login_attempts', 'references', 'sets', 'distinct', 'into', 'minute', 'quantile_union', 'unlock', 'release', 'sample', 'indexes', 'replica', 'snapshot', 'bulk', 'adddate', 'deferred', 'end', 'xor', 'date_add', 'where', 'backend', 'system', 'variant', 's3', 'streaming', 'grants', 'jobs', 'clusters', 'collation', 'session', 'union', 'date_sub', 'last', 'int', 'datediff', 'physical', 'next', 'generic', 'first', 'do', 'tree', 'password_reuse', 'frontends', 'function', 'current_timestamp', 'process', 'localtimestamp', 'stop', 'plugin', 'to', 'signed', 'dual', 'dateadd', 'properties', 'hostname', 'largeint', 'repositories', 'level', 'expired', 'ipv6', 'temporary', 'hour', 'sequence', 'date_ceil', 'constraint', 'convert', 'order', 'trim', 'text', 'date_floor', 'password_lock_time', 'databases', 'tinyint', 'backup', 'events', 'primary', 'disk', 'role', 'start', 'vault', 'current_time', 'ignore', 'engine', 'parsed', 'current', 'left', 'names', 'period', 'incremental', 'time', 'isnull', 'asc', 'scheduler', 'or', 'match_phrase', 'file', 'cron', 'current_user', 'localtime', 'foreign', 'using', 'jsonb', 'catalog', 'type_cast', 'extended', 'serializable', 'partition', 'cross', 'bitor', 'list', 'query', 'rewritten', 'path', 'help', 'from', 'trash', 'errors', 'column', 'insert', 'values', 'triggers', 'procedure', 'filter', 'distributed', 'is_null_pred', 'repository', 'outer', 'current_catalog', 'like', 'low_priority', 'functions', 'match_phrase_prefix', 'bigint', 'on', 'value', 'recycle', 'soname', 'transaction', 'desc', 'bitmap', 'agg_state', 'analyzed', 'tablet', 'less', 'unique', 'true', 'columns'}
def
uniquekeyproperty_sql( self, expression: sqlglot.expressions.properties.UniqueKeyProperty, prefix: str = 'UNIQUE KEY') -> str:
567 def uniquekeyproperty_sql( 568 self, expression: exp.UniqueKeyProperty, prefix: str = "UNIQUE KEY" 569 ) -> str: 570 create_stmt = expression.find_ancestor(exp.Create) 571 if create_stmt and create_stmt.args["properties"].find(exp.MaterializedProperty): 572 return super().uniquekeyproperty_sql(expression, prefix="KEY") 573 574 return super().uniquekeyproperty_sql(expression)
576 def partitionrange_sql(self, expression: exp.PartitionRange) -> str: 577 name = self.sql(expression, "this") 578 values = expression.expressions 579 580 if len(values) != 1: 581 # Multiple values: use VALUES [ ... ) 582 if values and isinstance(values[0], list): 583 values_sql = ", ".join( 584 f"({', '.join(self.sql(v) for v in inner)})" for inner in values 585 ) 586 else: 587 values_sql = ", ".join(f"({self.sql(v)})" for v in values) 588 589 return f"PARTITION {name} VALUES [{values_sql})" 590 591 return f"PARTITION {name} VALUES LESS THAN ({self.sql(values[0])})"
def
partitionbyrangepropertydynamic_sql( self, expression: sqlglot.expressions.properties.PartitionByRangePropertyDynamic) -> str:
593 def partitionbyrangepropertydynamic_sql( 594 self, expression: exp.PartitionByRangePropertyDynamic 595 ) -> str: 596 # Generates: FROM ("start") TO ("end") INTERVAL N UNIT 597 start = self.sql(expression, "start") 598 end = self.sql(expression, "end") 599 every = expression.args.get("every") 600 601 if every: 602 number = self.sql(every, "this") 603 interval = f"INTERVAL {number} {self.sql(every, 'unit')}" 604 else: 605 interval = "" 606 607 return f"FROM ({start}) TO ({end}) {interval}"
def
partitionedbyproperty_sql( self, expression: sqlglot.expressions.properties.PartitionedByProperty) -> str:
615 def table_sql(self, expression: exp.Table, sep: str = " AS ") -> str: 616 """Override table_sql to avoid AS keyword in UPDATE and DELETE statements.""" 617 ancestor = expression.find_ancestor(exp.Update, exp.Delete, exp.Select) 618 if not isinstance(ancestor, exp.Select): 619 sep = " " 620 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
- SUPPORTS_ALTER_COLUMN_IF_EXISTS
- 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
- casestatement_sql
- whileblock_sql
- loopblock_sql
- repeatblock_sql
- leave_sql
- iterate_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