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