sqlglot.generators.singlestore
1from __future__ import annotations 2 3import re 4import typing as t 5 6from sqlglot import exp 7from sqlglot.dialects.dialect import ( 8 json_extract_segments, 9 json_path_key_only_name, 10 rename_func, 11 bool_xor_sql, 12 count_if_to_sum, 13 timestamptrunc_sql, 14 date_add_interval_sql, 15 timestampdiff_sql, 16 remove_ts_or_ds_to_date, 17) 18from sqlglot.expressions import DataType 19from sqlglot import generator 20from sqlglot.generator import unsupported_args 21from sqlglot.generators.mysql import MySQLGenerator, date_add_sql 22 23 24def _unicode_substitute(m: re.Match[str]) -> str: 25 return chr(int(m.group(1), 16)) 26 27 28class SingleStoreGenerator(MySQLGenerator): 29 SUPPORTS_UESCAPE = False 30 NULL_ORDERING_SUPPORTED: bool | None = True 31 MATCH_AGAINST_TABLE_PREFIX: str | None = "TABLE " 32 STRUCT_DELIMITER = ("(", ")") 33 34 UNICODE_SUBSTITUTE: t.ClassVar[t.Any] = staticmethod(_unicode_substitute) 35 36 SUPPORTED_JSON_PATH_PARTS = { 37 exp.JSONPathKey, 38 exp.JSONPathRoot, 39 exp.JSONPathSubscript, 40 } 41 42 TRANSFORMS = { 43 **{ 44 k: v 45 for k, v in MySQLGenerator.TRANSFORMS.items() 46 if k not in (exp.JSONExtractScalar, exp.CurrentDate) 47 }, 48 exp.TsOrDsToDate: lambda self, e: ( 49 self.func("TO_DATE", e.this, self.format_time(e)) 50 if e.args.get("format") 51 else self.func("DATE", e.this) 52 ), 53 exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)), 54 exp.ToChar: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)), 55 exp.StrToDate: lambda self, e: self.func( 56 "STR_TO_DATE", 57 e.this, 58 self.format_time( 59 e, 60 inverse_time_mapping=self.dialect.MYSQL_INVERSE_TIME_MAPPING, 61 inverse_time_trie=self.dialect.MYSQL_INVERSE_TIME_TRIE, 62 ), 63 ), 64 exp.TimeToStr: lambda self, e: self.func( 65 "DATE_FORMAT", 66 e.this, 67 self.format_time( 68 e, 69 inverse_time_mapping=self.dialect.MYSQL_INVERSE_TIME_MAPPING, 70 inverse_time_trie=self.dialect.MYSQL_INVERSE_TIME_TRIE, 71 ), 72 ), 73 exp.Date: unsupported_args("zone", "expressions")(rename_func("DATE")), 74 exp.Cast: unsupported_args("format", "action", "default")( 75 lambda self, e: f"{self.sql(e, 'this')} :> {self.sql(e, 'to')}" 76 ), 77 exp.TryCast: unsupported_args("format", "action", "default")( 78 lambda self, e: f"{self.sql(e, 'this')} !:> {self.sql(e, 'to')}" 79 ), 80 exp.CastToStrType: lambda self, e: self.sql( 81 exp.cast(e.this, DataType.from_str(e.args["to"].name)) 82 ), 83 exp.StrToUnix: unsupported_args("format")(rename_func("UNIX_TIMESTAMP")), 84 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 85 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 86 exp.UnixSeconds: rename_func("UNIX_TIMESTAMP"), 87 exp.UnixToStr: lambda self, e: self.func( 88 "FROM_UNIXTIME", 89 e.this, 90 self.format_time( 91 e, 92 inverse_time_mapping=self.dialect.MYSQL_INVERSE_TIME_MAPPING, 93 inverse_time_trie=self.dialect.MYSQL_INVERSE_TIME_TRIE, 94 ), 95 ), 96 exp.UnixToTime: unsupported_args("scale", "zone", "hours", "minutes")( 97 lambda self, e: self.func( 98 "FROM_UNIXTIME", 99 e.this, 100 self.format_time( 101 e, 102 inverse_time_mapping=self.dialect.MYSQL_INVERSE_TIME_MAPPING, 103 inverse_time_trie=self.dialect.MYSQL_INVERSE_TIME_TRIE, 104 ), 105 ), 106 ), 107 exp.UnixToTimeStr: lambda self, e: f"FROM_UNIXTIME({self.sql(e, 'this')}) :> TEXT", 108 exp.DateBin: unsupported_args("unit", "zone")( 109 lambda self, e: self.func("TIME_BUCKET", e.this, e.expression, e.args.get("origin")) 110 ), 111 exp.TimeStrToDate: lambda self, e: self.sql(exp.cast(e.this, exp.DType.DATE)), 112 exp.FromTimeZone: lambda self, e: self.func( 113 "CONVERT_TZ", e.this, e.args.get("zone"), "'UTC'" 114 ), 115 exp.DiToDate: lambda self, e: ( 116 f"STR_TO_DATE({self.sql(e, 'this')}, {self.dialect.DATEINT_FORMAT})" 117 ), 118 exp.DateToDi: lambda self, e: ( 119 f"(DATE_FORMAT({self.sql(e, 'this')}, {self.dialect.DATEINT_FORMAT}) :> INT)" 120 ), 121 exp.TsOrDiToDi: lambda self, e: ( 122 f"(DATE_FORMAT({self.sql(e, 'this')}, {self.dialect.DATEINT_FORMAT}) :> INT)" 123 ), 124 exp.Time: unsupported_args("zone")(lambda self, e: f"{self.sql(e, 'this')} :> TIME"), 125 exp.DatetimeAdd: remove_ts_or_ds_to_date(date_add_sql("ADD")), 126 exp.DatetimeTrunc: unsupported_args("zone")(timestamptrunc_sql()), 127 exp.DatetimeSub: date_add_interval_sql("DATE", "SUB"), 128 exp.DatetimeDiff: timestampdiff_sql, 129 exp.DateTrunc: unsupported_args("zone")(timestamptrunc_sql()), 130 exp.DateDiff: unsupported_args("zone")( 131 lambda self, e: ( 132 timestampdiff_sql(self, e) 133 if e.unit is not None 134 else self.func("DATEDIFF", e.this, e.expression) 135 ) 136 ), 137 exp.TsOrDsDiff: lambda self, e: ( 138 timestampdiff_sql(self, e) 139 if e.unit is not None 140 else self.func("DATEDIFF", e.this, e.expression) 141 ), 142 exp.TimestampTrunc: unsupported_args("zone")(timestamptrunc_sql()), 143 exp.CurrentDatetime: lambda self, e: self.sql( 144 self.dialect.CAST_TO_TIME6( 145 exp.CurrentTimestamp(this=exp.Literal.number(6)), exp.DType.DATETIME 146 ) 147 ), 148 exp.JSONExtract: unsupported_args( 149 "only_json_types", 150 "expressions", 151 "variant_extract", 152 "json_query", 153 "option", 154 "quote", 155 "on_condition", 156 "requires_json", 157 )(json_extract_segments("JSON_EXTRACT_JSON")), 158 exp.JSONBExtract: json_extract_segments("BSON_EXTRACT_BSON"), 159 exp.JSONPathKey: json_path_key_only_name, 160 exp.JSONPathSubscript: lambda self, e: self.json_path_part(e.this), 161 exp.JSONPathRoot: lambda *_: "", 162 exp.JSONFormat: unsupported_args("options", "is_json")(rename_func("JSON_PRETTY")), 163 exp.JSONArrayAgg: unsupported_args("null_handling", "return_type", "strict")( 164 lambda self, e: self.func("JSON_AGG", e.this, suffix=f"{self.sql(e, 'order')})") 165 ), 166 exp.JSONArray: unsupported_args("null_handling", "return_type", "strict")( 167 rename_func("JSON_BUILD_ARRAY") 168 ), 169 exp.JSONBExists: lambda self, e: self.func( 170 "BSON_MATCH_ANY_EXISTS", e.this, e.args.get("path") 171 ), 172 exp.JSONExists: lambda self, e: ( 173 f"{self.sql(e.this)}::?{self.sql(e.args.get('path'))}" 174 if e.args.get("from_dcolonqmark") 175 else self.func("JSON_MATCH_ANY_EXISTS", e.this, e.args.get("path")) 176 ), 177 exp.JSONObject: unsupported_args("null_handling", "unique_keys", "return_type", "encoding")( 178 rename_func("JSON_BUILD_OBJECT") 179 ), 180 exp.DayOfWeekIso: lambda self, e: f"(({self.func('DAYOFWEEK', e.this)} % 7) + 1)", 181 exp.DayOfMonth: rename_func("DAY"), 182 exp.Hll: rename_func("APPROX_COUNT_DISTINCT"), 183 exp.ApproxDistinct: rename_func("APPROX_COUNT_DISTINCT"), 184 exp.CountIf: count_if_to_sum, 185 exp.LogicalOr: lambda self, e: f"MAX(ABS({self.sql(e, 'this')}))", 186 exp.LogicalAnd: lambda self, e: f"MIN(ABS({self.sql(e, 'this')}))", 187 exp.ApproxQuantile: unsupported_args("accuracy", "weight")( 188 lambda self, e: self.func( 189 "APPROX_PERCENTILE", 190 e.this, 191 e.args.get("quantile"), 192 e.args.get("error_tolerance"), 193 ) 194 ), 195 exp.Variance: rename_func("VAR_SAMP"), 196 exp.VariancePop: rename_func("VAR_POP"), 197 exp.Xor: bool_xor_sql, 198 exp.Cbrt: lambda self, e: self.sql( 199 exp.Pow(this=e.this, expression=exp.Literal.number(1) / exp.Literal.number(3)) 200 ), 201 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 202 exp.Repeat: lambda self, e: self.func( 203 "LPAD", 204 exp.Literal.string(""), 205 exp.Mul(this=self.func("LENGTH", e.this), expression=e.args.get("times")), 206 e.this, 207 ), 208 exp.IsAscii: lambda self, e: f"({self.sql(e, 'this')} RLIKE '^[\x00-\x7f]*$')", 209 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 210 exp.Contains: rename_func("INSTR"), 211 exp.RegexpExtractAll: unsupported_args("position", "occurrence", "group")( 212 lambda self, e: self.func( 213 "REGEXP_MATCH", 214 e.this, 215 e.expression, 216 e.args.get("parameters"), 217 ) 218 ), 219 exp.RegexpExtract: unsupported_args("group")( 220 lambda self, e: self.func( 221 "REGEXP_SUBSTR", 222 e.this, 223 e.expression, 224 e.args.get("position"), 225 e.args.get("occurrence"), 226 e.args.get("parameters"), 227 ) 228 ), 229 exp.StartsWith: lambda self, e: self.func( 230 "REGEXP_INSTR", e.this, self.func("CONCAT", exp.Literal.string("^"), e.expression) 231 ), 232 exp.FromBase: lambda self, e: self.func( 233 "CONV", e.this, e.expression, exp.Literal.number(10) 234 ), 235 exp.RegexpILike: lambda self, e: self.binary( 236 exp.RegexpLike( 237 this=exp.Lower(this=e.this), 238 expression=exp.Lower(this=e.expression), 239 ), 240 "RLIKE", 241 ), 242 exp.Stuff: lambda self, e: self.func( 243 "CONCAT", 244 self.func("SUBSTRING", e.this, exp.Literal.number(1), e.args.get("start") - 1), 245 e.expression, 246 self.func("SUBSTRING", e.this, e.args.get("start") + e.args.get("length")), 247 ), 248 exp.National: lambda self, e: self.national_sql(e, prefix=""), 249 exp.Reduce: unsupported_args("finish")( 250 lambda self, e: self.func("REDUCE", e.args.get("initial"), e.this, e.args.get("merge")) 251 ), 252 exp.MatchAgainst: unsupported_args("modifier")( 253 lambda self, e: generator.Generator.matchagainst_sql(self, e) 254 ), 255 exp.Show: unsupported_args( 256 "history", 257 "terse", 258 "offset", 259 "starts_with", 260 "limit", 261 "from_", 262 "scope", 263 "scope_kind", 264 "mutex", 265 "query", 266 "channel", 267 "log", 268 "types", 269 "privileges", 270 )(lambda self, e: MySQLGenerator.show_sql(self, e)), 271 exp.Describe: unsupported_args( 272 "style", 273 "kind", 274 "expressions", 275 "partition", 276 "format", 277 )(lambda self, e: generator.Generator.describe_sql(self, e)), 278 } 279 280 UNSUPPORTED_TYPES = { 281 exp.DType.ARRAY, 282 exp.DType.AGGREGATEFUNCTION, 283 exp.DType.SIMPLEAGGREGATEFUNCTION, 284 exp.DType.BIGSERIAL, 285 exp.DType.BPCHAR, 286 exp.DType.DATEMULTIRANGE, 287 exp.DType.DATERANGE, 288 exp.DType.DYNAMIC, 289 exp.DType.HLLSKETCH, 290 exp.DType.HSTORE, 291 exp.DType.IMAGE, 292 exp.DType.INET, 293 exp.DType.INT128, 294 exp.DType.INT256, 295 exp.DType.INT4MULTIRANGE, 296 exp.DType.INT4RANGE, 297 exp.DType.INT8MULTIRANGE, 298 exp.DType.INT8RANGE, 299 exp.DType.INTERVAL, 300 exp.DType.IPADDRESS, 301 exp.DType.IPPREFIX, 302 exp.DType.IPV4, 303 exp.DType.IPV6, 304 exp.DType.LIST, 305 exp.DType.MAP, 306 exp.DType.LOWCARDINALITY, 307 exp.DType.MONEY, 308 exp.DType.MULTILINESTRING, 309 exp.DType.NAME, 310 exp.DType.NESTED, 311 exp.DType.NOTHING, 312 exp.DType.NULL, 313 exp.DType.NUMMULTIRANGE, 314 exp.DType.NUMRANGE, 315 exp.DType.OBJECT, 316 exp.DType.RANGE, 317 exp.DType.ROWVERSION, 318 exp.DType.SERIAL, 319 exp.DType.SMALLSERIAL, 320 exp.DType.SMALLMONEY, 321 exp.DType.SUPER, 322 exp.DType.TIMETZ, 323 exp.DType.TIMESTAMPNTZ, 324 exp.DType.TIMESTAMPLTZ, 325 exp.DType.TIMESTAMPTZ, 326 exp.DType.TIMESTAMP_NS, 327 exp.DType.TSMULTIRANGE, 328 exp.DType.TSRANGE, 329 exp.DType.TSTZMULTIRANGE, 330 exp.DType.TSTZRANGE, 331 exp.DType.UINT128, 332 exp.DType.UINT256, 333 exp.DType.UNION, 334 exp.DType.UNKNOWN, 335 exp.DType.USERDEFINED, 336 exp.DType.UUID, 337 exp.DType.VARIANT, 338 exp.DType.XML, 339 exp.DType.TDIGEST, 340 } 341 342 TYPE_MAPPING = { 343 **MySQLGenerator.TYPE_MAPPING, 344 exp.DType.BIGDECIMAL: "DECIMAL", 345 exp.DType.BIT: "BOOLEAN", 346 exp.DType.DATE32: "DATE", 347 exp.DType.DATETIME64: "DATETIME", 348 exp.DType.DECIMAL32: "DECIMAL", 349 exp.DType.DECIMAL64: "DECIMAL", 350 exp.DType.DECIMAL128: "DECIMAL", 351 exp.DType.DECIMAL256: "DECIMAL", 352 exp.DType.ENUM8: "ENUM", 353 exp.DType.ENUM16: "ENUM", 354 exp.DType.FIXEDSTRING: "TEXT", 355 exp.DType.GEOMETRY: "GEOGRAPHY", 356 exp.DType.POINT: "GEOGRAPHYPOINT", 357 exp.DType.RING: "GEOGRAPHY", 358 exp.DType.LINESTRING: "GEOGRAPHY", 359 exp.DType.POLYGON: "GEOGRAPHY", 360 exp.DType.MULTIPOLYGON: "GEOGRAPHY", 361 exp.DType.STRUCT: "RECORD", 362 exp.DType.JSONB: "BSON", 363 exp.DType.TIMESTAMP: "TIMESTAMP", 364 exp.DType.TIMESTAMP_S: "TIMESTAMP", 365 exp.DType.TIMESTAMP_MS: "TIMESTAMP", 366 } 367 368 TYPE_PARAM_SETTINGS = { 369 **MySQLGenerator.TYPE_PARAM_SETTINGS, 370 exp.DType.TIMESTAMP_MS: ((6,), ()), 371 } 372 373 # https://docs.singlestore.com/cloud/reference/sql-reference/restricted-keywords/list-of-restricted-keywords/ 374 RESERVED_KEYWORDS = { 375 "abs", 376 "absolute", 377 "access", 378 "account", 379 "acos", 380 "action", 381 "add", 382 "adddate", 383 "addtime", 384 "admin", 385 "aes_decrypt", 386 "aes_encrypt", 387 "after", 388 "against", 389 "aggregate", 390 "aggregates", 391 "aggregator", 392 "aggregator_id", 393 "aggregator_plan_hash", 394 "aggregators", 395 "algorithm", 396 "all", 397 "also", 398 "alter", 399 "always", 400 "analyse", 401 "analyze", 402 "and", 403 "anti_join", 404 "any", 405 "any_value", 406 "approx_count_distinct", 407 "approx_count_distinct_accumulate", 408 "approx_count_distinct_combine", 409 "approx_count_distinct_estimate", 410 "approx_geography_intersects", 411 "approx_percentile", 412 "arghistory", 413 "arrange", 414 "arrangement", 415 "array", 416 "as", 417 "asc", 418 "ascii", 419 "asensitive", 420 "asin", 421 "asm", 422 "assertion", 423 "assignment", 424 "ast", 425 "asymmetric", 426 "async", 427 "at", 428 "atan", 429 "atan2", 430 "attach", 431 "attribute", 432 "authorization", 433 "auto", 434 "auto_increment", 435 "auto_reprovision", 436 "autostats", 437 "autostats_cardinality_mode", 438 "autostats_enabled", 439 "autostats_histogram_mode", 440 "autostats_sampling", 441 "availability", 442 "avg", 443 "avg_row_length", 444 "avro", 445 "azure", 446 "background", 447 "_background_threads_for_cleanup", 448 "backup", 449 "backup_history", 450 "backup_id", 451 "backward", 452 "batch", 453 "batches", 454 "batch_interval", 455 "_batch_size_limit", 456 "before", 457 "begin", 458 "between", 459 "bigint", 460 "bin", 461 "binary", 462 "_binary", 463 "bit", 464 "bit_and", 465 "bit_count", 466 "bit_or", 467 "bit_xor", 468 "blob", 469 "bool", 470 "boolean", 471 "bootstrap", 472 "both", 473 "_bt", 474 "btree", 475 "bucket_count", 476 "by", 477 "byte", 478 "byte_length", 479 "cache", 480 "call", 481 "call_for_pipeline", 482 "called", 483 "capture", 484 "cascade", 485 "cascaded", 486 "case", 487 "cast", 488 "catalog", 489 "ceil", 490 "ceiling", 491 "chain", 492 "change", 493 "char", 494 "character", 495 "characteristics", 496 "character_length", 497 "char_length", 498 "charset", 499 "check", 500 "checkpoint", 501 "_check_can_connect", 502 "_check_consistency", 503 "checksum", 504 "_checksum", 505 "class", 506 "clear", 507 "client", 508 "client_found_rows", 509 "close", 510 "cluster", 511 "clustered", 512 "cnf", 513 "coalesce", 514 "coercibility", 515 "collate", 516 "collation", 517 "collect", 518 "column", 519 "columnar", 520 "columns", 521 "columnstore", 522 "columnstore_segment_rows", 523 "comment", 524 "comments", 525 "commit", 526 "committed", 527 "_commit_log_tail", 528 "committed", 529 "compact", 530 "compile", 531 "compressed", 532 "compression", 533 "concat", 534 "concat_ws", 535 "concurrent", 536 "concurrently", 537 "condition", 538 "configuration", 539 "connection", 540 "connection_id", 541 "connections", 542 "config", 543 "constraint", 544 "constraints", 545 "content", 546 "continue", 547 "_continue_replay", 548 "conv", 549 "conversion", 550 "convert", 551 "convert_tz", 552 "copy", 553 "_core", 554 "cos", 555 "cost", 556 "cot", 557 "count", 558 "create", 559 "credentials", 560 "cross", 561 "cube", 562 "csv", 563 "cume_dist", 564 "curdate", 565 "current", 566 "current_catalog", 567 "current_date", 568 "current_role", 569 "current_schema", 570 "current_security_groups", 571 "current_security_roles", 572 "current_time", 573 "current_timestamp", 574 "current_user", 575 "cursor", 576 "curtime", 577 "cycle", 578 "data", 579 "database", 580 "databases", 581 "date", 582 "date_add", 583 "datediff", 584 "date_format", 585 "date_sub", 586 "date_trunc", 587 "datetime", 588 "day", 589 "day_hour", 590 "day_microsecond", 591 "day_minute", 592 "dayname", 593 "dayofmonth", 594 "dayofweek", 595 "dayofyear", 596 "day_second", 597 "deallocate", 598 "dec", 599 "decimal", 600 "declare", 601 "decode", 602 "default", 603 "defaults", 604 "deferrable", 605 "deferred", 606 "defined", 607 "definer", 608 "degrees", 609 "delayed", 610 "delay_key_write", 611 "delete", 612 "delimiter", 613 "delimiters", 614 "dense_rank", 615 "desc", 616 "describe", 617 "detach", 618 "deterministic", 619 "dictionary", 620 "differential", 621 "directory", 622 "disable", 623 "discard", 624 "_disconnect", 625 "disk", 626 "distinct", 627 "distinctrow", 628 "distributed_joins", 629 "div", 630 "do", 631 "document", 632 "domain", 633 "dot_product", 634 "double", 635 "drop", 636 "_drop_profile", 637 "dual", 638 "dump", 639 "duplicate", 640 "dynamic", 641 "earliest", 642 "each", 643 "echo", 644 "election", 645 "else", 646 "elseif", 647 "elt", 648 "enable", 649 "enclosed", 650 "encoding", 651 "encrypted", 652 "end", 653 "engine", 654 "engines", 655 "enum", 656 "errors", 657 "escape", 658 "escaped", 659 "estimate", 660 "euclidean_distance", 661 "event", 662 "events", 663 "except", 664 "exclude", 665 "excluding", 666 "exclusive", 667 "execute", 668 "exists", 669 "exit", 670 "exp", 671 "explain", 672 "extended", 673 "extension", 674 "external", 675 "external_host", 676 "external_port", 677 "extract", 678 "extractor", 679 "extractors", 680 "extra_join", 681 "_failover", 682 "failed_login_attempts", 683 "failure", 684 "false", 685 "family", 686 "fault", 687 "fetch", 688 "field", 689 "fields", 690 "file", 691 "files", 692 "fill", 693 "first", 694 "first_value", 695 "fix_alter", 696 "fixed", 697 "float", 698 "float4", 699 "float8", 700 "floor", 701 "flush", 702 "following", 703 "for", 704 "force", 705 "force_compiled_mode", 706 "force_interpreter_mode", 707 "foreground", 708 "foreign", 709 "format", 710 "forward", 711 "found_rows", 712 "freeze", 713 "from", 714 "from_base64", 715 "from_days", 716 "from_unixtime", 717 "fs", 718 "_fsync", 719 "full", 720 "fulltext", 721 "function", 722 "functions", 723 "gc", 724 "gcs", 725 "get_format", 726 "_gc", 727 "_gcx", 728 "generate", 729 "geography", 730 "geography_area", 731 "geography_contains", 732 "geography_distance", 733 "geography_intersects", 734 "geography_latitude", 735 "geography_length", 736 "geography_longitude", 737 "geographypoint", 738 "geography_point", 739 "geography_within_distance", 740 "geometry", 741 "geometry_area", 742 "geometry_contains", 743 "geometry_distance", 744 "geometry_filter", 745 "geometry_intersects", 746 "geometry_length", 747 "geometrypoint", 748 "geometry_point", 749 "geometry_within_distance", 750 "geometry_x", 751 "geometry_y", 752 "global", 753 "_global_version_timestamp", 754 "grant", 755 "granted", 756 "grants", 757 "greatest", 758 "group", 759 "grouping", 760 "groups", 761 "group_concat", 762 "gzip", 763 "handle", 764 "handler", 765 "hard_cpu_limit_percentage", 766 "hash", 767 "has_temp_tables", 768 "having", 769 "hdfs", 770 "header", 771 "heartbeat_no_logging", 772 "hex", 773 "highlight", 774 "high_priority", 775 "hold", 776 "holding", 777 "host", 778 "hosts", 779 "hour", 780 "hour_microsecond", 781 "hour_minute", 782 "hour_second", 783 "identified", 784 "identity", 785 "if", 786 "ifnull", 787 "ignore", 788 "ilike", 789 "immediate", 790 "immutable", 791 "implicit", 792 "import", 793 "in", 794 "including", 795 "increment", 796 "incremental", 797 "index", 798 "indexes", 799 "inet_aton", 800 "inet_ntoa", 801 "inet6_aton", 802 "inet6_ntoa", 803 "infile", 804 "inherit", 805 "inherits", 806 "_init_profile", 807 "init", 808 "initcap", 809 "initialize", 810 "initially", 811 "inject", 812 "inline", 813 "inner", 814 "inout", 815 "input", 816 "insensitive", 817 "insert", 818 "insert_method", 819 "instance", 820 "instead", 821 "instr", 822 "int", 823 "int1", 824 "int2", 825 "int3", 826 "int4", 827 "int8", 828 "integer", 829 "_internal_dynamic_typecast", 830 "interpreter_mode", 831 "intersect", 832 "interval", 833 "into", 834 "invoker", 835 "is", 836 "isnull", 837 "isolation", 838 "iterate", 839 "join", 840 "json", 841 "json_agg", 842 "json_array_contains_double", 843 "json_array_contains_json", 844 "json_array_contains_string", 845 "json_array_push_double", 846 "json_array_push_json", 847 "json_array_push_string", 848 "json_delete_key", 849 "json_extract_double", 850 "json_extract_json", 851 "json_extract_string", 852 "json_extract_bigint", 853 "json_get_type", 854 "json_length", 855 "json_set_double", 856 "json_set_json", 857 "json_set_string", 858 "json_splice_double", 859 "json_splice_json", 860 "json_splice_string", 861 "kafka", 862 "key", 863 "key_block_size", 864 "keys", 865 "kill", 866 "killall", 867 "label", 868 "lag", 869 "language", 870 "large", 871 "last", 872 "last_day", 873 "last_insert_id", 874 "last_value", 875 "lateral", 876 "latest", 877 "lc_collate", 878 "lc_ctype", 879 "lcase", 880 "lead", 881 "leading", 882 "leaf", 883 "leakproof", 884 "least", 885 "leave", 886 "leaves", 887 "left", 888 "length", 889 "level", 890 "license", 891 "like", 892 "limit", 893 "lines", 894 "listen", 895 "llvm", 896 "ln", 897 "load", 898 "loaddata_where", 899 "_load", 900 "local", 901 "localtime", 902 "localtimestamp", 903 "locate", 904 "location", 905 "lock", 906 "log", 907 "log10", 908 "log2", 909 "long", 910 "longblob", 911 "longtext", 912 "loop", 913 "lower", 914 "low_priority", 915 "lpad", 916 "_ls", 917 "ltrim", 918 "lz4", 919 "management", 920 "_management_thread", 921 "mapping", 922 "master", 923 "match", 924 "materialized", 925 "max", 926 "maxvalue", 927 "max_concurrency", 928 "max_errors", 929 "max_partitions_per_batch", 930 "max_queue_depth", 931 "max_retries_per_batch_partition", 932 "max_rows", 933 "mbc", 934 "md5", 935 "mpl", 936 "median", 937 "mediumblob", 938 "mediumint", 939 "mediumtext", 940 "member", 941 "memory", 942 "memory_percentage", 943 "_memsql_table_id_lookup", 944 "memsql", 945 "memsql_deserialize", 946 "memsql_imitating_kafka", 947 "memsql_serialize", 948 "merge", 949 "metadata", 950 "microsecond", 951 "middleint", 952 "min", 953 "min_rows", 954 "minus", 955 "minute", 956 "minute_microsecond", 957 "minute_second", 958 "minvalue", 959 "mod", 960 "mode", 961 "model", 962 "modifies", 963 "modify", 964 "month", 965 "monthname", 966 "months_between", 967 "move", 968 "mpl", 969 "names", 970 "named", 971 "namespace", 972 "national", 973 "natural", 974 "nchar", 975 "next", 976 "no", 977 "node", 978 "none", 979 "no_query_rewrite", 980 "noparam", 981 "not", 982 "nothing", 983 "notify", 984 "now", 985 "nowait", 986 "no_write_to_binlog", 987 "no_query_rewrite", 988 "norely", 989 "nth_value", 990 "ntile", 991 "null", 992 "nullcols", 993 "nullif", 994 "nulls", 995 "numeric", 996 "nvarchar", 997 "object", 998 "octet_length", 999 "of", 1000 "off", 1001 "offline", 1002 "offset", 1003 "offsets", 1004 "oids", 1005 "on", 1006 "online", 1007 "only", 1008 "open", 1009 "operator", 1010 "optimization", 1011 "optimize", 1012 "optimizer", 1013 "optimizer_state", 1014 "option", 1015 "options", 1016 "optionally", 1017 "or", 1018 "order", 1019 "ordered_serialize", 1020 "orphan", 1021 "out", 1022 "out_of_order", 1023 "outer", 1024 "outfile", 1025 "over", 1026 "overlaps", 1027 "overlay", 1028 "owned", 1029 "owner", 1030 "pack_keys", 1031 "paired", 1032 "parser", 1033 "parquet", 1034 "partial", 1035 "partition", 1036 "partition_id", 1037 "partitioning", 1038 "partitions", 1039 "passing", 1040 "password", 1041 "password_lock_time", 1042 "parser", 1043 "pause", 1044 "_pause_replay", 1045 "percent_rank", 1046 "percentile_cont", 1047 "percentile_disc", 1048 "periodic", 1049 "persisted", 1050 "pi", 1051 "pipeline", 1052 "pipelines", 1053 "pivot", 1054 "placing", 1055 "plan", 1056 "plans", 1057 "plancache", 1058 "plugins", 1059 "pool", 1060 "pools", 1061 "port", 1062 "position", 1063 "pow", 1064 "power", 1065 "preceding", 1066 "precision", 1067 "prepare", 1068 "prepared", 1069 "preserve", 1070 "primary", 1071 "prior", 1072 "privileges", 1073 "procedural", 1074 "procedure", 1075 "procedures", 1076 "process", 1077 "processlist", 1078 "profile", 1079 "profiles", 1080 "program", 1081 "promote", 1082 "proxy", 1083 "purge", 1084 "quarter", 1085 "queries", 1086 "query", 1087 "query_timeout", 1088 "queue", 1089 "quote", 1090 "radians", 1091 "rand", 1092 "range", 1093 "rank", 1094 "read", 1095 "_read", 1096 "reads", 1097 "real", 1098 "reassign", 1099 "rebalance", 1100 "recheck", 1101 "record", 1102 "recursive", 1103 "redundancy", 1104 "redundant", 1105 "ref", 1106 "reference", 1107 "references", 1108 "refresh", 1109 "regexp", 1110 "reindex", 1111 "relative", 1112 "release", 1113 "reload", 1114 "rely", 1115 "remote", 1116 "remove", 1117 "rename", 1118 "repair", 1119 "_repair_table", 1120 "repeat", 1121 "repeatable", 1122 "_repl", 1123 "_reprovisioning", 1124 "replace", 1125 "replica", 1126 "replicate", 1127 "replicating", 1128 "replication", 1129 "durability", 1130 "require", 1131 "resource", 1132 "resource_pool", 1133 "reset", 1134 "restart", 1135 "restore", 1136 "restrict", 1137 "result", 1138 "_resurrect", 1139 "retry", 1140 "return", 1141 "returning", 1142 "returns", 1143 "reverse", 1144 "revoke", 1145 "rg_pool", 1146 "right", 1147 "right_anti_join", 1148 "right_semi_join", 1149 "right_straight_join", 1150 "rlike", 1151 "role", 1152 "roles", 1153 "rollback", 1154 "rollup", 1155 "round", 1156 "routine", 1157 "row", 1158 "row_count", 1159 "row_format", 1160 "row_number", 1161 "rows", 1162 "rowstore", 1163 "rule", 1164 "rpad", 1165 "_rpc", 1166 "rtrim", 1167 "running", 1168 "s3", 1169 "safe", 1170 "save", 1171 "savepoint", 1172 "scalar", 1173 "schema", 1174 "schemas", 1175 "schema_binding", 1176 "scroll", 1177 "search", 1178 "second", 1179 "second_microsecond", 1180 "sec_to_time", 1181 "security", 1182 "select", 1183 "semi_join", 1184 "_send_threads", 1185 "sensitive", 1186 "separator", 1187 "sequence", 1188 "sequences", 1189 "serial", 1190 "serializable", 1191 "series", 1192 "service_user", 1193 "server", 1194 "session", 1195 "session_user", 1196 "set", 1197 "setof", 1198 "security_lists_intersect", 1199 "sha", 1200 "sha1", 1201 "sha2", 1202 "shard", 1203 "sharded", 1204 "sharded_id", 1205 "share", 1206 "show", 1207 "shutdown", 1208 "sigmoid", 1209 "sign", 1210 "signal", 1211 "similar", 1212 "simple", 1213 "site", 1214 "signed", 1215 "sin", 1216 "skip", 1217 "skipped_batches", 1218 "sleep", 1219 "_sleep", 1220 "smallint", 1221 "snapshot", 1222 "_snapshot", 1223 "_snapshots", 1224 "soft_cpu_limit_percentage", 1225 "some", 1226 "soname", 1227 "sparse", 1228 "spatial", 1229 "spatial_check_index", 1230 "specific", 1231 "split", 1232 "sql", 1233 "sql_big_result", 1234 "sql_buffer_result", 1235 "sql_cache", 1236 "sql_calc_found_rows", 1237 "sqlexception", 1238 "sql_mode", 1239 "sql_no_cache", 1240 "sql_no_logging", 1241 "sql_small_result", 1242 "sqlstate", 1243 "sqlwarning", 1244 "sqrt", 1245 "ssl", 1246 "stable", 1247 "standalone", 1248 "start", 1249 "starting", 1250 "state", 1251 "statement", 1252 "statistics", 1253 "stats", 1254 "status", 1255 "std", 1256 "stddev", 1257 "stddev_pop", 1258 "stddev_samp", 1259 "stdin", 1260 "stdout", 1261 "stop", 1262 "storage", 1263 "str_to_date", 1264 "straight_join", 1265 "strict", 1266 "string", 1267 "strip", 1268 "subdate", 1269 "substr", 1270 "substring", 1271 "substring_index", 1272 "success", 1273 "sum", 1274 "super", 1275 "symmetric", 1276 "sync_snapshot", 1277 "sync", 1278 "_sync", 1279 "_sync2", 1280 "_sync_partitions", 1281 "_sync_snapshot", 1282 "synchronize", 1283 "sysid", 1284 "system", 1285 "table", 1286 "table_checksum", 1287 "tables", 1288 "tablespace", 1289 "tags", 1290 "tan", 1291 "target_size", 1292 "task", 1293 "temp", 1294 "template", 1295 "temporary", 1296 "temptable", 1297 "_term_bump", 1298 "terminate", 1299 "terminated", 1300 "test", 1301 "text", 1302 "then", 1303 "time", 1304 "timediff", 1305 "time_bucket", 1306 "time_format", 1307 "timeout", 1308 "timestamp", 1309 "timestampadd", 1310 "timestampdiff", 1311 "timezone", 1312 "time_to_sec", 1313 "tinyblob", 1314 "tinyint", 1315 "tinytext", 1316 "to", 1317 "to_base64", 1318 "to_char", 1319 "to_date", 1320 "to_days", 1321 "to_json", 1322 "to_number", 1323 "to_seconds", 1324 "to_timestamp", 1325 "tracelogs", 1326 "traditional", 1327 "trailing", 1328 "transform", 1329 "transaction", 1330 "_transactions_experimental", 1331 "treat", 1332 "trigger", 1333 "triggers", 1334 "trim", 1335 "true", 1336 "trunc", 1337 "truncate", 1338 "trusted", 1339 "two_phase", 1340 "_twopcid", 1341 "type", 1342 "types", 1343 "ucase", 1344 "unbounded", 1345 "uncommitted", 1346 "undefined", 1347 "undo", 1348 "unencrypted", 1349 "unenforced", 1350 "unhex", 1351 "unhold", 1352 "unicode", 1353 "union", 1354 "unique", 1355 "_unittest", 1356 "unix_timestamp", 1357 "unknown", 1358 "unlisten", 1359 "_unload", 1360 "unlock", 1361 "unlogged", 1362 "unpivot", 1363 "unsigned", 1364 "until", 1365 "update", 1366 "upgrade", 1367 "upper", 1368 "usage", 1369 "use", 1370 "user", 1371 "users", 1372 "using", 1373 "utc_date", 1374 "utc_time", 1375 "utc_timestamp", 1376 "_utf8", 1377 "vacuum", 1378 "valid", 1379 "validate", 1380 "validator", 1381 "value", 1382 "values", 1383 "varbinary", 1384 "varchar", 1385 "varcharacter", 1386 "variables", 1387 "variadic", 1388 "variance", 1389 "var_pop", 1390 "var_samp", 1391 "varying", 1392 "vector_sub", 1393 "verbose", 1394 "version", 1395 "view", 1396 "void", 1397 "volatile", 1398 "voting", 1399 "wait", 1400 "_wake", 1401 "warnings", 1402 "week", 1403 "weekday", 1404 "weekofyear", 1405 "when", 1406 "where", 1407 "while", 1408 "whitespace", 1409 "window", 1410 "with", 1411 "without", 1412 "within", 1413 "_wm_heartbeat", 1414 "work", 1415 "workload", 1416 "wrapper", 1417 "write", 1418 "xact_id", 1419 "xor", 1420 "year", 1421 "year_month", 1422 "yes", 1423 "zerofill", 1424 "zone", 1425 } 1426 1427 def jsonextractscalar_sql(self, expression: exp.JSONExtractScalar) -> str: 1428 json_type = expression.args.get("json_type") 1429 func_name = "JSON_EXTRACT_JSON" if json_type is None else f"JSON_EXTRACT_{json_type}" 1430 return json_extract_segments(func_name)(self, expression) 1431 1432 def jsonbextractscalar_sql(self, expression: exp.JSONBExtractScalar) -> str: 1433 json_type = expression.args.get("json_type") 1434 func_name = "BSON_EXTRACT_BSON" if json_type is None else f"BSON_EXTRACT_{json_type}" 1435 return json_extract_segments(func_name)(self, expression) 1436 1437 def jsonextractarray_sql(self, expression: exp.JSONExtractArray) -> str: 1438 self.unsupported("Arrays are not supported in SingleStore") 1439 return self.function_fallback_sql(expression) 1440 1441 def jsonvalue_sql(self, expression: exp.JSONValue) -> str: 1442 if expression.args.get("on_condition"): 1443 self.unsupported("JSON_VALUE does not support on_condition") 1444 res: exp.Expr = exp.JSONExtractScalar( 1445 this=expression.this, 1446 expression=expression.args.get("path"), 1447 json_type="STRING", 1448 ) 1449 1450 returning = expression.args.get("returning") 1451 if returning is not None: 1452 res = exp.Cast(this=res, to=returning) 1453 1454 return self.sql(res) 1455 1456 def all_sql(self, expression: exp.All) -> str: 1457 self.unsupported("ALL subquery predicate is not supported in SingleStore") 1458 return super().all_sql(expression) 1459 1460 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1461 json_type = expression.text("json_type").upper() 1462 1463 if json_type: 1464 return self.func( 1465 f"JSON_ARRAY_CONTAINS_{json_type}", expression.expression, expression.this 1466 ) 1467 1468 return self.func( 1469 "JSON_ARRAY_CONTAINS_JSON", 1470 expression.expression, 1471 self.func("TO_JSON", expression.this), 1472 ) 1473 1474 def datatype_sql(self, expression: exp.DataType) -> str: 1475 for arg_name in ("kind", "values"): 1476 if expression.args.get(arg_name): 1477 self.unsupported(f"DATATYPE does not support {arg_name}") 1478 if expression.args.get("nested") and not expression.is_type(exp.DType.STRUCT): 1479 self.unsupported( 1480 f"Argument 'nested' is not supported for representation of '{expression.this.value}' in SingleStore" 1481 ) 1482 1483 if expression.is_type(exp.DType.VARBINARY) and not expression.expressions: 1484 # `VARBINARY` must always have a size - if it doesn't, we always generate `BLOB` 1485 return "BLOB" 1486 if expression.is_type( 1487 exp.DType.DECIMAL32, 1488 exp.DType.DECIMAL64, 1489 exp.DType.DECIMAL128, 1490 exp.DType.DECIMAL256, 1491 ): 1492 scale = self.expressions(expression, flat=True) 1493 1494 if expression.is_type(exp.DType.DECIMAL32): 1495 precision = "9" 1496 elif expression.is_type(exp.DType.DECIMAL64): 1497 precision = "18" 1498 elif expression.is_type(exp.DType.DECIMAL128): 1499 precision = "38" 1500 else: 1501 # 65 is a maximum precision supported in SingleStore 1502 precision = "65" 1503 if scale is not None: 1504 return f"DECIMAL({precision}, {scale[0]})" 1505 else: 1506 return f"DECIMAL({precision})" 1507 if expression.is_type(exp.DType.VECTOR): 1508 expressions = expression.expressions 1509 if len(expressions) == 2: 1510 type_name = self.sql(expressions[0]) 1511 if type_name in self.dialect.INVERSE_VECTOR_TYPE_ALIASES: 1512 type_name = self.dialect.INVERSE_VECTOR_TYPE_ALIASES[type_name] 1513 1514 return f"VECTOR({self.sql(expressions[1])}, {type_name})" 1515 1516 return super().datatype_sql(expression) 1517 1518 def collate_sql(self, expression: exp.Collate) -> str: 1519 # SingleStore does not support setting a collation for column in the SELECT query, 1520 # so we cast column to a LONGTEXT type with specific collation 1521 return self.binary(expression, ":> LONGTEXT COLLATE") 1522 1523 def currentdate_sql(self, expression: exp.CurrentDate) -> str: 1524 timezone = expression.this 1525 if timezone: 1526 if isinstance(timezone, exp.Literal) and timezone.name.lower() == "utc": 1527 return self.func("UTC_DATE") 1528 self.unsupported("CurrentDate with timezone is not supported in SingleStore") 1529 1530 return self.func("CURRENT_DATE") 1531 1532 def currenttime_sql(self, expression: exp.CurrentTime) -> str: 1533 arg = expression.this 1534 if arg: 1535 if isinstance(arg, exp.Literal) and arg.name.lower() == "utc": 1536 return self.func("UTC_TIME") 1537 if isinstance(arg, exp.Literal) and arg.is_number: 1538 return self.func("CURRENT_TIME", arg) 1539 self.unsupported("CurrentTime with timezone is not supported in SingleStore") 1540 1541 return self.func("CURRENT_TIME") 1542 1543 def currenttimestamp_sql(self, expression: exp.CurrentTimestamp) -> str: 1544 arg = expression.this 1545 if arg: 1546 if isinstance(arg, exp.Literal) and arg.name.lower() == "utc": 1547 return self.func("UTC_TIMESTAMP") 1548 if isinstance(arg, exp.Literal) and arg.is_number: 1549 return self.func("CURRENT_TIMESTAMP", arg) 1550 self.unsupported("CurrentTimestamp with timezone is not supported in SingleStore") 1551 1552 return self.func("CURRENT_TIMESTAMP") 1553 1554 def standardhash_sql(self, expression: exp.StandardHash) -> str: 1555 hash_function = expression.expression 1556 if hash_function is None: 1557 return self.func("SHA", expression.this) 1558 if isinstance(hash_function, exp.Literal): 1559 if hash_function.name.lower() == "sha": 1560 return self.func("SHA", expression.this) 1561 if hash_function.name.lower() == "md5": 1562 return self.func("MD5", expression.this) 1563 1564 self.unsupported(f"{hash_function.this} hash method is not supported in SingleStore") 1565 return self.func("SHA", expression.this) 1566 1567 self.unsupported("STANDARD_HASH function is not supported in SingleStore") 1568 return self.func("SHA", expression.this) 1569 1570 def truncatetable_sql(self, expression: exp.TruncateTable) -> str: 1571 for arg_name in ("is_database", "exists", "cluster", "identity", "option", "partition"): 1572 if expression.args.get(arg_name): 1573 self.unsupported(f"TRUNCATE TABLE does not support {arg_name}") 1574 statements = [] 1575 for table in expression.expressions: 1576 statements.append(f"TRUNCATE {self.sql(table)}") 1577 1578 return "; ".join(statements) 1579 1580 def renamecolumn_sql(self, expression: exp.RenameColumn) -> str: 1581 if expression.args.get("exists"): 1582 self.unsupported("RENAME COLUMN does not support exists") 1583 old_column = self.sql(expression, "this") 1584 new_column = self.sql(expression, "to") 1585 return f"CHANGE {old_column} {new_column}" 1586 1587 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1588 for arg_name in ("drop", "comment", "allow_null", "visible", "using"): 1589 if expression.args.get(arg_name): 1590 self.unsupported(f"ALTER COLUMN does not support {arg_name}") 1591 alter = super().altercolumn_sql(expression) 1592 1593 collate = self.sql(expression, "collate") 1594 collate = f" COLLATE {collate}" if collate else "" 1595 return f"{alter}{collate}" 1596 1597 def computedcolumnconstraint_sql(self, expression: exp.ComputedColumnConstraint) -> str: 1598 this = self.sql(expression, "this") 1599 not_null = " NOT NULL" if expression.args.get("not_null") else "" 1600 type = self.sql(expression, "data_type") or "AUTO" 1601 return f"AS {this} PERSISTED {type}{not_null}"
29class SingleStoreGenerator(MySQLGenerator): 30 SUPPORTS_UESCAPE = False 31 NULL_ORDERING_SUPPORTED: bool | None = True 32 MATCH_AGAINST_TABLE_PREFIX: str | None = "TABLE " 33 STRUCT_DELIMITER = ("(", ")") 34 35 UNICODE_SUBSTITUTE: t.ClassVar[t.Any] = staticmethod(_unicode_substitute) 36 37 SUPPORTED_JSON_PATH_PARTS = { 38 exp.JSONPathKey, 39 exp.JSONPathRoot, 40 exp.JSONPathSubscript, 41 } 42 43 TRANSFORMS = { 44 **{ 45 k: v 46 for k, v in MySQLGenerator.TRANSFORMS.items() 47 if k not in (exp.JSONExtractScalar, exp.CurrentDate) 48 }, 49 exp.TsOrDsToDate: lambda self, e: ( 50 self.func("TO_DATE", e.this, self.format_time(e)) 51 if e.args.get("format") 52 else self.func("DATE", e.this) 53 ), 54 exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)), 55 exp.ToChar: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)), 56 exp.StrToDate: lambda self, e: self.func( 57 "STR_TO_DATE", 58 e.this, 59 self.format_time( 60 e, 61 inverse_time_mapping=self.dialect.MYSQL_INVERSE_TIME_MAPPING, 62 inverse_time_trie=self.dialect.MYSQL_INVERSE_TIME_TRIE, 63 ), 64 ), 65 exp.TimeToStr: lambda self, e: self.func( 66 "DATE_FORMAT", 67 e.this, 68 self.format_time( 69 e, 70 inverse_time_mapping=self.dialect.MYSQL_INVERSE_TIME_MAPPING, 71 inverse_time_trie=self.dialect.MYSQL_INVERSE_TIME_TRIE, 72 ), 73 ), 74 exp.Date: unsupported_args("zone", "expressions")(rename_func("DATE")), 75 exp.Cast: unsupported_args("format", "action", "default")( 76 lambda self, e: f"{self.sql(e, 'this')} :> {self.sql(e, 'to')}" 77 ), 78 exp.TryCast: unsupported_args("format", "action", "default")( 79 lambda self, e: f"{self.sql(e, 'this')} !:> {self.sql(e, 'to')}" 80 ), 81 exp.CastToStrType: lambda self, e: self.sql( 82 exp.cast(e.this, DataType.from_str(e.args["to"].name)) 83 ), 84 exp.StrToUnix: unsupported_args("format")(rename_func("UNIX_TIMESTAMP")), 85 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 86 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 87 exp.UnixSeconds: rename_func("UNIX_TIMESTAMP"), 88 exp.UnixToStr: lambda self, e: self.func( 89 "FROM_UNIXTIME", 90 e.this, 91 self.format_time( 92 e, 93 inverse_time_mapping=self.dialect.MYSQL_INVERSE_TIME_MAPPING, 94 inverse_time_trie=self.dialect.MYSQL_INVERSE_TIME_TRIE, 95 ), 96 ), 97 exp.UnixToTime: unsupported_args("scale", "zone", "hours", "minutes")( 98 lambda self, e: self.func( 99 "FROM_UNIXTIME", 100 e.this, 101 self.format_time( 102 e, 103 inverse_time_mapping=self.dialect.MYSQL_INVERSE_TIME_MAPPING, 104 inverse_time_trie=self.dialect.MYSQL_INVERSE_TIME_TRIE, 105 ), 106 ), 107 ), 108 exp.UnixToTimeStr: lambda self, e: f"FROM_UNIXTIME({self.sql(e, 'this')}) :> TEXT", 109 exp.DateBin: unsupported_args("unit", "zone")( 110 lambda self, e: self.func("TIME_BUCKET", e.this, e.expression, e.args.get("origin")) 111 ), 112 exp.TimeStrToDate: lambda self, e: self.sql(exp.cast(e.this, exp.DType.DATE)), 113 exp.FromTimeZone: lambda self, e: self.func( 114 "CONVERT_TZ", e.this, e.args.get("zone"), "'UTC'" 115 ), 116 exp.DiToDate: lambda self, e: ( 117 f"STR_TO_DATE({self.sql(e, 'this')}, {self.dialect.DATEINT_FORMAT})" 118 ), 119 exp.DateToDi: lambda self, e: ( 120 f"(DATE_FORMAT({self.sql(e, 'this')}, {self.dialect.DATEINT_FORMAT}) :> INT)" 121 ), 122 exp.TsOrDiToDi: lambda self, e: ( 123 f"(DATE_FORMAT({self.sql(e, 'this')}, {self.dialect.DATEINT_FORMAT}) :> INT)" 124 ), 125 exp.Time: unsupported_args("zone")(lambda self, e: f"{self.sql(e, 'this')} :> TIME"), 126 exp.DatetimeAdd: remove_ts_or_ds_to_date(date_add_sql("ADD")), 127 exp.DatetimeTrunc: unsupported_args("zone")(timestamptrunc_sql()), 128 exp.DatetimeSub: date_add_interval_sql("DATE", "SUB"), 129 exp.DatetimeDiff: timestampdiff_sql, 130 exp.DateTrunc: unsupported_args("zone")(timestamptrunc_sql()), 131 exp.DateDiff: unsupported_args("zone")( 132 lambda self, e: ( 133 timestampdiff_sql(self, e) 134 if e.unit is not None 135 else self.func("DATEDIFF", e.this, e.expression) 136 ) 137 ), 138 exp.TsOrDsDiff: lambda self, e: ( 139 timestampdiff_sql(self, e) 140 if e.unit is not None 141 else self.func("DATEDIFF", e.this, e.expression) 142 ), 143 exp.TimestampTrunc: unsupported_args("zone")(timestamptrunc_sql()), 144 exp.CurrentDatetime: lambda self, e: self.sql( 145 self.dialect.CAST_TO_TIME6( 146 exp.CurrentTimestamp(this=exp.Literal.number(6)), exp.DType.DATETIME 147 ) 148 ), 149 exp.JSONExtract: unsupported_args( 150 "only_json_types", 151 "expressions", 152 "variant_extract", 153 "json_query", 154 "option", 155 "quote", 156 "on_condition", 157 "requires_json", 158 )(json_extract_segments("JSON_EXTRACT_JSON")), 159 exp.JSONBExtract: json_extract_segments("BSON_EXTRACT_BSON"), 160 exp.JSONPathKey: json_path_key_only_name, 161 exp.JSONPathSubscript: lambda self, e: self.json_path_part(e.this), 162 exp.JSONPathRoot: lambda *_: "", 163 exp.JSONFormat: unsupported_args("options", "is_json")(rename_func("JSON_PRETTY")), 164 exp.JSONArrayAgg: unsupported_args("null_handling", "return_type", "strict")( 165 lambda self, e: self.func("JSON_AGG", e.this, suffix=f"{self.sql(e, 'order')})") 166 ), 167 exp.JSONArray: unsupported_args("null_handling", "return_type", "strict")( 168 rename_func("JSON_BUILD_ARRAY") 169 ), 170 exp.JSONBExists: lambda self, e: self.func( 171 "BSON_MATCH_ANY_EXISTS", e.this, e.args.get("path") 172 ), 173 exp.JSONExists: lambda self, e: ( 174 f"{self.sql(e.this)}::?{self.sql(e.args.get('path'))}" 175 if e.args.get("from_dcolonqmark") 176 else self.func("JSON_MATCH_ANY_EXISTS", e.this, e.args.get("path")) 177 ), 178 exp.JSONObject: unsupported_args("null_handling", "unique_keys", "return_type", "encoding")( 179 rename_func("JSON_BUILD_OBJECT") 180 ), 181 exp.DayOfWeekIso: lambda self, e: f"(({self.func('DAYOFWEEK', e.this)} % 7) + 1)", 182 exp.DayOfMonth: rename_func("DAY"), 183 exp.Hll: rename_func("APPROX_COUNT_DISTINCT"), 184 exp.ApproxDistinct: rename_func("APPROX_COUNT_DISTINCT"), 185 exp.CountIf: count_if_to_sum, 186 exp.LogicalOr: lambda self, e: f"MAX(ABS({self.sql(e, 'this')}))", 187 exp.LogicalAnd: lambda self, e: f"MIN(ABS({self.sql(e, 'this')}))", 188 exp.ApproxQuantile: unsupported_args("accuracy", "weight")( 189 lambda self, e: self.func( 190 "APPROX_PERCENTILE", 191 e.this, 192 e.args.get("quantile"), 193 e.args.get("error_tolerance"), 194 ) 195 ), 196 exp.Variance: rename_func("VAR_SAMP"), 197 exp.VariancePop: rename_func("VAR_POP"), 198 exp.Xor: bool_xor_sql, 199 exp.Cbrt: lambda self, e: self.sql( 200 exp.Pow(this=e.this, expression=exp.Literal.number(1) / exp.Literal.number(3)) 201 ), 202 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 203 exp.Repeat: lambda self, e: self.func( 204 "LPAD", 205 exp.Literal.string(""), 206 exp.Mul(this=self.func("LENGTH", e.this), expression=e.args.get("times")), 207 e.this, 208 ), 209 exp.IsAscii: lambda self, e: f"({self.sql(e, 'this')} RLIKE '^[\x00-\x7f]*$')", 210 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 211 exp.Contains: rename_func("INSTR"), 212 exp.RegexpExtractAll: unsupported_args("position", "occurrence", "group")( 213 lambda self, e: self.func( 214 "REGEXP_MATCH", 215 e.this, 216 e.expression, 217 e.args.get("parameters"), 218 ) 219 ), 220 exp.RegexpExtract: unsupported_args("group")( 221 lambda self, e: self.func( 222 "REGEXP_SUBSTR", 223 e.this, 224 e.expression, 225 e.args.get("position"), 226 e.args.get("occurrence"), 227 e.args.get("parameters"), 228 ) 229 ), 230 exp.StartsWith: lambda self, e: self.func( 231 "REGEXP_INSTR", e.this, self.func("CONCAT", exp.Literal.string("^"), e.expression) 232 ), 233 exp.FromBase: lambda self, e: self.func( 234 "CONV", e.this, e.expression, exp.Literal.number(10) 235 ), 236 exp.RegexpILike: lambda self, e: self.binary( 237 exp.RegexpLike( 238 this=exp.Lower(this=e.this), 239 expression=exp.Lower(this=e.expression), 240 ), 241 "RLIKE", 242 ), 243 exp.Stuff: lambda self, e: self.func( 244 "CONCAT", 245 self.func("SUBSTRING", e.this, exp.Literal.number(1), e.args.get("start") - 1), 246 e.expression, 247 self.func("SUBSTRING", e.this, e.args.get("start") + e.args.get("length")), 248 ), 249 exp.National: lambda self, e: self.national_sql(e, prefix=""), 250 exp.Reduce: unsupported_args("finish")( 251 lambda self, e: self.func("REDUCE", e.args.get("initial"), e.this, e.args.get("merge")) 252 ), 253 exp.MatchAgainst: unsupported_args("modifier")( 254 lambda self, e: generator.Generator.matchagainst_sql(self, e) 255 ), 256 exp.Show: unsupported_args( 257 "history", 258 "terse", 259 "offset", 260 "starts_with", 261 "limit", 262 "from_", 263 "scope", 264 "scope_kind", 265 "mutex", 266 "query", 267 "channel", 268 "log", 269 "types", 270 "privileges", 271 )(lambda self, e: MySQLGenerator.show_sql(self, e)), 272 exp.Describe: unsupported_args( 273 "style", 274 "kind", 275 "expressions", 276 "partition", 277 "format", 278 )(lambda self, e: generator.Generator.describe_sql(self, e)), 279 } 280 281 UNSUPPORTED_TYPES = { 282 exp.DType.ARRAY, 283 exp.DType.AGGREGATEFUNCTION, 284 exp.DType.SIMPLEAGGREGATEFUNCTION, 285 exp.DType.BIGSERIAL, 286 exp.DType.BPCHAR, 287 exp.DType.DATEMULTIRANGE, 288 exp.DType.DATERANGE, 289 exp.DType.DYNAMIC, 290 exp.DType.HLLSKETCH, 291 exp.DType.HSTORE, 292 exp.DType.IMAGE, 293 exp.DType.INET, 294 exp.DType.INT128, 295 exp.DType.INT256, 296 exp.DType.INT4MULTIRANGE, 297 exp.DType.INT4RANGE, 298 exp.DType.INT8MULTIRANGE, 299 exp.DType.INT8RANGE, 300 exp.DType.INTERVAL, 301 exp.DType.IPADDRESS, 302 exp.DType.IPPREFIX, 303 exp.DType.IPV4, 304 exp.DType.IPV6, 305 exp.DType.LIST, 306 exp.DType.MAP, 307 exp.DType.LOWCARDINALITY, 308 exp.DType.MONEY, 309 exp.DType.MULTILINESTRING, 310 exp.DType.NAME, 311 exp.DType.NESTED, 312 exp.DType.NOTHING, 313 exp.DType.NULL, 314 exp.DType.NUMMULTIRANGE, 315 exp.DType.NUMRANGE, 316 exp.DType.OBJECT, 317 exp.DType.RANGE, 318 exp.DType.ROWVERSION, 319 exp.DType.SERIAL, 320 exp.DType.SMALLSERIAL, 321 exp.DType.SMALLMONEY, 322 exp.DType.SUPER, 323 exp.DType.TIMETZ, 324 exp.DType.TIMESTAMPNTZ, 325 exp.DType.TIMESTAMPLTZ, 326 exp.DType.TIMESTAMPTZ, 327 exp.DType.TIMESTAMP_NS, 328 exp.DType.TSMULTIRANGE, 329 exp.DType.TSRANGE, 330 exp.DType.TSTZMULTIRANGE, 331 exp.DType.TSTZRANGE, 332 exp.DType.UINT128, 333 exp.DType.UINT256, 334 exp.DType.UNION, 335 exp.DType.UNKNOWN, 336 exp.DType.USERDEFINED, 337 exp.DType.UUID, 338 exp.DType.VARIANT, 339 exp.DType.XML, 340 exp.DType.TDIGEST, 341 } 342 343 TYPE_MAPPING = { 344 **MySQLGenerator.TYPE_MAPPING, 345 exp.DType.BIGDECIMAL: "DECIMAL", 346 exp.DType.BIT: "BOOLEAN", 347 exp.DType.DATE32: "DATE", 348 exp.DType.DATETIME64: "DATETIME", 349 exp.DType.DECIMAL32: "DECIMAL", 350 exp.DType.DECIMAL64: "DECIMAL", 351 exp.DType.DECIMAL128: "DECIMAL", 352 exp.DType.DECIMAL256: "DECIMAL", 353 exp.DType.ENUM8: "ENUM", 354 exp.DType.ENUM16: "ENUM", 355 exp.DType.FIXEDSTRING: "TEXT", 356 exp.DType.GEOMETRY: "GEOGRAPHY", 357 exp.DType.POINT: "GEOGRAPHYPOINT", 358 exp.DType.RING: "GEOGRAPHY", 359 exp.DType.LINESTRING: "GEOGRAPHY", 360 exp.DType.POLYGON: "GEOGRAPHY", 361 exp.DType.MULTIPOLYGON: "GEOGRAPHY", 362 exp.DType.STRUCT: "RECORD", 363 exp.DType.JSONB: "BSON", 364 exp.DType.TIMESTAMP: "TIMESTAMP", 365 exp.DType.TIMESTAMP_S: "TIMESTAMP", 366 exp.DType.TIMESTAMP_MS: "TIMESTAMP", 367 } 368 369 TYPE_PARAM_SETTINGS = { 370 **MySQLGenerator.TYPE_PARAM_SETTINGS, 371 exp.DType.TIMESTAMP_MS: ((6,), ()), 372 } 373 374 # https://docs.singlestore.com/cloud/reference/sql-reference/restricted-keywords/list-of-restricted-keywords/ 375 RESERVED_KEYWORDS = { 376 "abs", 377 "absolute", 378 "access", 379 "account", 380 "acos", 381 "action", 382 "add", 383 "adddate", 384 "addtime", 385 "admin", 386 "aes_decrypt", 387 "aes_encrypt", 388 "after", 389 "against", 390 "aggregate", 391 "aggregates", 392 "aggregator", 393 "aggregator_id", 394 "aggregator_plan_hash", 395 "aggregators", 396 "algorithm", 397 "all", 398 "also", 399 "alter", 400 "always", 401 "analyse", 402 "analyze", 403 "and", 404 "anti_join", 405 "any", 406 "any_value", 407 "approx_count_distinct", 408 "approx_count_distinct_accumulate", 409 "approx_count_distinct_combine", 410 "approx_count_distinct_estimate", 411 "approx_geography_intersects", 412 "approx_percentile", 413 "arghistory", 414 "arrange", 415 "arrangement", 416 "array", 417 "as", 418 "asc", 419 "ascii", 420 "asensitive", 421 "asin", 422 "asm", 423 "assertion", 424 "assignment", 425 "ast", 426 "asymmetric", 427 "async", 428 "at", 429 "atan", 430 "atan2", 431 "attach", 432 "attribute", 433 "authorization", 434 "auto", 435 "auto_increment", 436 "auto_reprovision", 437 "autostats", 438 "autostats_cardinality_mode", 439 "autostats_enabled", 440 "autostats_histogram_mode", 441 "autostats_sampling", 442 "availability", 443 "avg", 444 "avg_row_length", 445 "avro", 446 "azure", 447 "background", 448 "_background_threads_for_cleanup", 449 "backup", 450 "backup_history", 451 "backup_id", 452 "backward", 453 "batch", 454 "batches", 455 "batch_interval", 456 "_batch_size_limit", 457 "before", 458 "begin", 459 "between", 460 "bigint", 461 "bin", 462 "binary", 463 "_binary", 464 "bit", 465 "bit_and", 466 "bit_count", 467 "bit_or", 468 "bit_xor", 469 "blob", 470 "bool", 471 "boolean", 472 "bootstrap", 473 "both", 474 "_bt", 475 "btree", 476 "bucket_count", 477 "by", 478 "byte", 479 "byte_length", 480 "cache", 481 "call", 482 "call_for_pipeline", 483 "called", 484 "capture", 485 "cascade", 486 "cascaded", 487 "case", 488 "cast", 489 "catalog", 490 "ceil", 491 "ceiling", 492 "chain", 493 "change", 494 "char", 495 "character", 496 "characteristics", 497 "character_length", 498 "char_length", 499 "charset", 500 "check", 501 "checkpoint", 502 "_check_can_connect", 503 "_check_consistency", 504 "checksum", 505 "_checksum", 506 "class", 507 "clear", 508 "client", 509 "client_found_rows", 510 "close", 511 "cluster", 512 "clustered", 513 "cnf", 514 "coalesce", 515 "coercibility", 516 "collate", 517 "collation", 518 "collect", 519 "column", 520 "columnar", 521 "columns", 522 "columnstore", 523 "columnstore_segment_rows", 524 "comment", 525 "comments", 526 "commit", 527 "committed", 528 "_commit_log_tail", 529 "committed", 530 "compact", 531 "compile", 532 "compressed", 533 "compression", 534 "concat", 535 "concat_ws", 536 "concurrent", 537 "concurrently", 538 "condition", 539 "configuration", 540 "connection", 541 "connection_id", 542 "connections", 543 "config", 544 "constraint", 545 "constraints", 546 "content", 547 "continue", 548 "_continue_replay", 549 "conv", 550 "conversion", 551 "convert", 552 "convert_tz", 553 "copy", 554 "_core", 555 "cos", 556 "cost", 557 "cot", 558 "count", 559 "create", 560 "credentials", 561 "cross", 562 "cube", 563 "csv", 564 "cume_dist", 565 "curdate", 566 "current", 567 "current_catalog", 568 "current_date", 569 "current_role", 570 "current_schema", 571 "current_security_groups", 572 "current_security_roles", 573 "current_time", 574 "current_timestamp", 575 "current_user", 576 "cursor", 577 "curtime", 578 "cycle", 579 "data", 580 "database", 581 "databases", 582 "date", 583 "date_add", 584 "datediff", 585 "date_format", 586 "date_sub", 587 "date_trunc", 588 "datetime", 589 "day", 590 "day_hour", 591 "day_microsecond", 592 "day_minute", 593 "dayname", 594 "dayofmonth", 595 "dayofweek", 596 "dayofyear", 597 "day_second", 598 "deallocate", 599 "dec", 600 "decimal", 601 "declare", 602 "decode", 603 "default", 604 "defaults", 605 "deferrable", 606 "deferred", 607 "defined", 608 "definer", 609 "degrees", 610 "delayed", 611 "delay_key_write", 612 "delete", 613 "delimiter", 614 "delimiters", 615 "dense_rank", 616 "desc", 617 "describe", 618 "detach", 619 "deterministic", 620 "dictionary", 621 "differential", 622 "directory", 623 "disable", 624 "discard", 625 "_disconnect", 626 "disk", 627 "distinct", 628 "distinctrow", 629 "distributed_joins", 630 "div", 631 "do", 632 "document", 633 "domain", 634 "dot_product", 635 "double", 636 "drop", 637 "_drop_profile", 638 "dual", 639 "dump", 640 "duplicate", 641 "dynamic", 642 "earliest", 643 "each", 644 "echo", 645 "election", 646 "else", 647 "elseif", 648 "elt", 649 "enable", 650 "enclosed", 651 "encoding", 652 "encrypted", 653 "end", 654 "engine", 655 "engines", 656 "enum", 657 "errors", 658 "escape", 659 "escaped", 660 "estimate", 661 "euclidean_distance", 662 "event", 663 "events", 664 "except", 665 "exclude", 666 "excluding", 667 "exclusive", 668 "execute", 669 "exists", 670 "exit", 671 "exp", 672 "explain", 673 "extended", 674 "extension", 675 "external", 676 "external_host", 677 "external_port", 678 "extract", 679 "extractor", 680 "extractors", 681 "extra_join", 682 "_failover", 683 "failed_login_attempts", 684 "failure", 685 "false", 686 "family", 687 "fault", 688 "fetch", 689 "field", 690 "fields", 691 "file", 692 "files", 693 "fill", 694 "first", 695 "first_value", 696 "fix_alter", 697 "fixed", 698 "float", 699 "float4", 700 "float8", 701 "floor", 702 "flush", 703 "following", 704 "for", 705 "force", 706 "force_compiled_mode", 707 "force_interpreter_mode", 708 "foreground", 709 "foreign", 710 "format", 711 "forward", 712 "found_rows", 713 "freeze", 714 "from", 715 "from_base64", 716 "from_days", 717 "from_unixtime", 718 "fs", 719 "_fsync", 720 "full", 721 "fulltext", 722 "function", 723 "functions", 724 "gc", 725 "gcs", 726 "get_format", 727 "_gc", 728 "_gcx", 729 "generate", 730 "geography", 731 "geography_area", 732 "geography_contains", 733 "geography_distance", 734 "geography_intersects", 735 "geography_latitude", 736 "geography_length", 737 "geography_longitude", 738 "geographypoint", 739 "geography_point", 740 "geography_within_distance", 741 "geometry", 742 "geometry_area", 743 "geometry_contains", 744 "geometry_distance", 745 "geometry_filter", 746 "geometry_intersects", 747 "geometry_length", 748 "geometrypoint", 749 "geometry_point", 750 "geometry_within_distance", 751 "geometry_x", 752 "geometry_y", 753 "global", 754 "_global_version_timestamp", 755 "grant", 756 "granted", 757 "grants", 758 "greatest", 759 "group", 760 "grouping", 761 "groups", 762 "group_concat", 763 "gzip", 764 "handle", 765 "handler", 766 "hard_cpu_limit_percentage", 767 "hash", 768 "has_temp_tables", 769 "having", 770 "hdfs", 771 "header", 772 "heartbeat_no_logging", 773 "hex", 774 "highlight", 775 "high_priority", 776 "hold", 777 "holding", 778 "host", 779 "hosts", 780 "hour", 781 "hour_microsecond", 782 "hour_minute", 783 "hour_second", 784 "identified", 785 "identity", 786 "if", 787 "ifnull", 788 "ignore", 789 "ilike", 790 "immediate", 791 "immutable", 792 "implicit", 793 "import", 794 "in", 795 "including", 796 "increment", 797 "incremental", 798 "index", 799 "indexes", 800 "inet_aton", 801 "inet_ntoa", 802 "inet6_aton", 803 "inet6_ntoa", 804 "infile", 805 "inherit", 806 "inherits", 807 "_init_profile", 808 "init", 809 "initcap", 810 "initialize", 811 "initially", 812 "inject", 813 "inline", 814 "inner", 815 "inout", 816 "input", 817 "insensitive", 818 "insert", 819 "insert_method", 820 "instance", 821 "instead", 822 "instr", 823 "int", 824 "int1", 825 "int2", 826 "int3", 827 "int4", 828 "int8", 829 "integer", 830 "_internal_dynamic_typecast", 831 "interpreter_mode", 832 "intersect", 833 "interval", 834 "into", 835 "invoker", 836 "is", 837 "isnull", 838 "isolation", 839 "iterate", 840 "join", 841 "json", 842 "json_agg", 843 "json_array_contains_double", 844 "json_array_contains_json", 845 "json_array_contains_string", 846 "json_array_push_double", 847 "json_array_push_json", 848 "json_array_push_string", 849 "json_delete_key", 850 "json_extract_double", 851 "json_extract_json", 852 "json_extract_string", 853 "json_extract_bigint", 854 "json_get_type", 855 "json_length", 856 "json_set_double", 857 "json_set_json", 858 "json_set_string", 859 "json_splice_double", 860 "json_splice_json", 861 "json_splice_string", 862 "kafka", 863 "key", 864 "key_block_size", 865 "keys", 866 "kill", 867 "killall", 868 "label", 869 "lag", 870 "language", 871 "large", 872 "last", 873 "last_day", 874 "last_insert_id", 875 "last_value", 876 "lateral", 877 "latest", 878 "lc_collate", 879 "lc_ctype", 880 "lcase", 881 "lead", 882 "leading", 883 "leaf", 884 "leakproof", 885 "least", 886 "leave", 887 "leaves", 888 "left", 889 "length", 890 "level", 891 "license", 892 "like", 893 "limit", 894 "lines", 895 "listen", 896 "llvm", 897 "ln", 898 "load", 899 "loaddata_where", 900 "_load", 901 "local", 902 "localtime", 903 "localtimestamp", 904 "locate", 905 "location", 906 "lock", 907 "log", 908 "log10", 909 "log2", 910 "long", 911 "longblob", 912 "longtext", 913 "loop", 914 "lower", 915 "low_priority", 916 "lpad", 917 "_ls", 918 "ltrim", 919 "lz4", 920 "management", 921 "_management_thread", 922 "mapping", 923 "master", 924 "match", 925 "materialized", 926 "max", 927 "maxvalue", 928 "max_concurrency", 929 "max_errors", 930 "max_partitions_per_batch", 931 "max_queue_depth", 932 "max_retries_per_batch_partition", 933 "max_rows", 934 "mbc", 935 "md5", 936 "mpl", 937 "median", 938 "mediumblob", 939 "mediumint", 940 "mediumtext", 941 "member", 942 "memory", 943 "memory_percentage", 944 "_memsql_table_id_lookup", 945 "memsql", 946 "memsql_deserialize", 947 "memsql_imitating_kafka", 948 "memsql_serialize", 949 "merge", 950 "metadata", 951 "microsecond", 952 "middleint", 953 "min", 954 "min_rows", 955 "minus", 956 "minute", 957 "minute_microsecond", 958 "minute_second", 959 "minvalue", 960 "mod", 961 "mode", 962 "model", 963 "modifies", 964 "modify", 965 "month", 966 "monthname", 967 "months_between", 968 "move", 969 "mpl", 970 "names", 971 "named", 972 "namespace", 973 "national", 974 "natural", 975 "nchar", 976 "next", 977 "no", 978 "node", 979 "none", 980 "no_query_rewrite", 981 "noparam", 982 "not", 983 "nothing", 984 "notify", 985 "now", 986 "nowait", 987 "no_write_to_binlog", 988 "no_query_rewrite", 989 "norely", 990 "nth_value", 991 "ntile", 992 "null", 993 "nullcols", 994 "nullif", 995 "nulls", 996 "numeric", 997 "nvarchar", 998 "object", 999 "octet_length", 1000 "of", 1001 "off", 1002 "offline", 1003 "offset", 1004 "offsets", 1005 "oids", 1006 "on", 1007 "online", 1008 "only", 1009 "open", 1010 "operator", 1011 "optimization", 1012 "optimize", 1013 "optimizer", 1014 "optimizer_state", 1015 "option", 1016 "options", 1017 "optionally", 1018 "or", 1019 "order", 1020 "ordered_serialize", 1021 "orphan", 1022 "out", 1023 "out_of_order", 1024 "outer", 1025 "outfile", 1026 "over", 1027 "overlaps", 1028 "overlay", 1029 "owned", 1030 "owner", 1031 "pack_keys", 1032 "paired", 1033 "parser", 1034 "parquet", 1035 "partial", 1036 "partition", 1037 "partition_id", 1038 "partitioning", 1039 "partitions", 1040 "passing", 1041 "password", 1042 "password_lock_time", 1043 "parser", 1044 "pause", 1045 "_pause_replay", 1046 "percent_rank", 1047 "percentile_cont", 1048 "percentile_disc", 1049 "periodic", 1050 "persisted", 1051 "pi", 1052 "pipeline", 1053 "pipelines", 1054 "pivot", 1055 "placing", 1056 "plan", 1057 "plans", 1058 "plancache", 1059 "plugins", 1060 "pool", 1061 "pools", 1062 "port", 1063 "position", 1064 "pow", 1065 "power", 1066 "preceding", 1067 "precision", 1068 "prepare", 1069 "prepared", 1070 "preserve", 1071 "primary", 1072 "prior", 1073 "privileges", 1074 "procedural", 1075 "procedure", 1076 "procedures", 1077 "process", 1078 "processlist", 1079 "profile", 1080 "profiles", 1081 "program", 1082 "promote", 1083 "proxy", 1084 "purge", 1085 "quarter", 1086 "queries", 1087 "query", 1088 "query_timeout", 1089 "queue", 1090 "quote", 1091 "radians", 1092 "rand", 1093 "range", 1094 "rank", 1095 "read", 1096 "_read", 1097 "reads", 1098 "real", 1099 "reassign", 1100 "rebalance", 1101 "recheck", 1102 "record", 1103 "recursive", 1104 "redundancy", 1105 "redundant", 1106 "ref", 1107 "reference", 1108 "references", 1109 "refresh", 1110 "regexp", 1111 "reindex", 1112 "relative", 1113 "release", 1114 "reload", 1115 "rely", 1116 "remote", 1117 "remove", 1118 "rename", 1119 "repair", 1120 "_repair_table", 1121 "repeat", 1122 "repeatable", 1123 "_repl", 1124 "_reprovisioning", 1125 "replace", 1126 "replica", 1127 "replicate", 1128 "replicating", 1129 "replication", 1130 "durability", 1131 "require", 1132 "resource", 1133 "resource_pool", 1134 "reset", 1135 "restart", 1136 "restore", 1137 "restrict", 1138 "result", 1139 "_resurrect", 1140 "retry", 1141 "return", 1142 "returning", 1143 "returns", 1144 "reverse", 1145 "revoke", 1146 "rg_pool", 1147 "right", 1148 "right_anti_join", 1149 "right_semi_join", 1150 "right_straight_join", 1151 "rlike", 1152 "role", 1153 "roles", 1154 "rollback", 1155 "rollup", 1156 "round", 1157 "routine", 1158 "row", 1159 "row_count", 1160 "row_format", 1161 "row_number", 1162 "rows", 1163 "rowstore", 1164 "rule", 1165 "rpad", 1166 "_rpc", 1167 "rtrim", 1168 "running", 1169 "s3", 1170 "safe", 1171 "save", 1172 "savepoint", 1173 "scalar", 1174 "schema", 1175 "schemas", 1176 "schema_binding", 1177 "scroll", 1178 "search", 1179 "second", 1180 "second_microsecond", 1181 "sec_to_time", 1182 "security", 1183 "select", 1184 "semi_join", 1185 "_send_threads", 1186 "sensitive", 1187 "separator", 1188 "sequence", 1189 "sequences", 1190 "serial", 1191 "serializable", 1192 "series", 1193 "service_user", 1194 "server", 1195 "session", 1196 "session_user", 1197 "set", 1198 "setof", 1199 "security_lists_intersect", 1200 "sha", 1201 "sha1", 1202 "sha2", 1203 "shard", 1204 "sharded", 1205 "sharded_id", 1206 "share", 1207 "show", 1208 "shutdown", 1209 "sigmoid", 1210 "sign", 1211 "signal", 1212 "similar", 1213 "simple", 1214 "site", 1215 "signed", 1216 "sin", 1217 "skip", 1218 "skipped_batches", 1219 "sleep", 1220 "_sleep", 1221 "smallint", 1222 "snapshot", 1223 "_snapshot", 1224 "_snapshots", 1225 "soft_cpu_limit_percentage", 1226 "some", 1227 "soname", 1228 "sparse", 1229 "spatial", 1230 "spatial_check_index", 1231 "specific", 1232 "split", 1233 "sql", 1234 "sql_big_result", 1235 "sql_buffer_result", 1236 "sql_cache", 1237 "sql_calc_found_rows", 1238 "sqlexception", 1239 "sql_mode", 1240 "sql_no_cache", 1241 "sql_no_logging", 1242 "sql_small_result", 1243 "sqlstate", 1244 "sqlwarning", 1245 "sqrt", 1246 "ssl", 1247 "stable", 1248 "standalone", 1249 "start", 1250 "starting", 1251 "state", 1252 "statement", 1253 "statistics", 1254 "stats", 1255 "status", 1256 "std", 1257 "stddev", 1258 "stddev_pop", 1259 "stddev_samp", 1260 "stdin", 1261 "stdout", 1262 "stop", 1263 "storage", 1264 "str_to_date", 1265 "straight_join", 1266 "strict", 1267 "string", 1268 "strip", 1269 "subdate", 1270 "substr", 1271 "substring", 1272 "substring_index", 1273 "success", 1274 "sum", 1275 "super", 1276 "symmetric", 1277 "sync_snapshot", 1278 "sync", 1279 "_sync", 1280 "_sync2", 1281 "_sync_partitions", 1282 "_sync_snapshot", 1283 "synchronize", 1284 "sysid", 1285 "system", 1286 "table", 1287 "table_checksum", 1288 "tables", 1289 "tablespace", 1290 "tags", 1291 "tan", 1292 "target_size", 1293 "task", 1294 "temp", 1295 "template", 1296 "temporary", 1297 "temptable", 1298 "_term_bump", 1299 "terminate", 1300 "terminated", 1301 "test", 1302 "text", 1303 "then", 1304 "time", 1305 "timediff", 1306 "time_bucket", 1307 "time_format", 1308 "timeout", 1309 "timestamp", 1310 "timestampadd", 1311 "timestampdiff", 1312 "timezone", 1313 "time_to_sec", 1314 "tinyblob", 1315 "tinyint", 1316 "tinytext", 1317 "to", 1318 "to_base64", 1319 "to_char", 1320 "to_date", 1321 "to_days", 1322 "to_json", 1323 "to_number", 1324 "to_seconds", 1325 "to_timestamp", 1326 "tracelogs", 1327 "traditional", 1328 "trailing", 1329 "transform", 1330 "transaction", 1331 "_transactions_experimental", 1332 "treat", 1333 "trigger", 1334 "triggers", 1335 "trim", 1336 "true", 1337 "trunc", 1338 "truncate", 1339 "trusted", 1340 "two_phase", 1341 "_twopcid", 1342 "type", 1343 "types", 1344 "ucase", 1345 "unbounded", 1346 "uncommitted", 1347 "undefined", 1348 "undo", 1349 "unencrypted", 1350 "unenforced", 1351 "unhex", 1352 "unhold", 1353 "unicode", 1354 "union", 1355 "unique", 1356 "_unittest", 1357 "unix_timestamp", 1358 "unknown", 1359 "unlisten", 1360 "_unload", 1361 "unlock", 1362 "unlogged", 1363 "unpivot", 1364 "unsigned", 1365 "until", 1366 "update", 1367 "upgrade", 1368 "upper", 1369 "usage", 1370 "use", 1371 "user", 1372 "users", 1373 "using", 1374 "utc_date", 1375 "utc_time", 1376 "utc_timestamp", 1377 "_utf8", 1378 "vacuum", 1379 "valid", 1380 "validate", 1381 "validator", 1382 "value", 1383 "values", 1384 "varbinary", 1385 "varchar", 1386 "varcharacter", 1387 "variables", 1388 "variadic", 1389 "variance", 1390 "var_pop", 1391 "var_samp", 1392 "varying", 1393 "vector_sub", 1394 "verbose", 1395 "version", 1396 "view", 1397 "void", 1398 "volatile", 1399 "voting", 1400 "wait", 1401 "_wake", 1402 "warnings", 1403 "week", 1404 "weekday", 1405 "weekofyear", 1406 "when", 1407 "where", 1408 "while", 1409 "whitespace", 1410 "window", 1411 "with", 1412 "without", 1413 "within", 1414 "_wm_heartbeat", 1415 "work", 1416 "workload", 1417 "wrapper", 1418 "write", 1419 "xact_id", 1420 "xor", 1421 "year", 1422 "year_month", 1423 "yes", 1424 "zerofill", 1425 "zone", 1426 } 1427 1428 def jsonextractscalar_sql(self, expression: exp.JSONExtractScalar) -> str: 1429 json_type = expression.args.get("json_type") 1430 func_name = "JSON_EXTRACT_JSON" if json_type is None else f"JSON_EXTRACT_{json_type}" 1431 return json_extract_segments(func_name)(self, expression) 1432 1433 def jsonbextractscalar_sql(self, expression: exp.JSONBExtractScalar) -> str: 1434 json_type = expression.args.get("json_type") 1435 func_name = "BSON_EXTRACT_BSON" if json_type is None else f"BSON_EXTRACT_{json_type}" 1436 return json_extract_segments(func_name)(self, expression) 1437 1438 def jsonextractarray_sql(self, expression: exp.JSONExtractArray) -> str: 1439 self.unsupported("Arrays are not supported in SingleStore") 1440 return self.function_fallback_sql(expression) 1441 1442 def jsonvalue_sql(self, expression: exp.JSONValue) -> str: 1443 if expression.args.get("on_condition"): 1444 self.unsupported("JSON_VALUE does not support on_condition") 1445 res: exp.Expr = exp.JSONExtractScalar( 1446 this=expression.this, 1447 expression=expression.args.get("path"), 1448 json_type="STRING", 1449 ) 1450 1451 returning = expression.args.get("returning") 1452 if returning is not None: 1453 res = exp.Cast(this=res, to=returning) 1454 1455 return self.sql(res) 1456 1457 def all_sql(self, expression: exp.All) -> str: 1458 self.unsupported("ALL subquery predicate is not supported in SingleStore") 1459 return super().all_sql(expression) 1460 1461 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1462 json_type = expression.text("json_type").upper() 1463 1464 if json_type: 1465 return self.func( 1466 f"JSON_ARRAY_CONTAINS_{json_type}", expression.expression, expression.this 1467 ) 1468 1469 return self.func( 1470 "JSON_ARRAY_CONTAINS_JSON", 1471 expression.expression, 1472 self.func("TO_JSON", expression.this), 1473 ) 1474 1475 def datatype_sql(self, expression: exp.DataType) -> str: 1476 for arg_name in ("kind", "values"): 1477 if expression.args.get(arg_name): 1478 self.unsupported(f"DATATYPE does not support {arg_name}") 1479 if expression.args.get("nested") and not expression.is_type(exp.DType.STRUCT): 1480 self.unsupported( 1481 f"Argument 'nested' is not supported for representation of '{expression.this.value}' in SingleStore" 1482 ) 1483 1484 if expression.is_type(exp.DType.VARBINARY) and not expression.expressions: 1485 # `VARBINARY` must always have a size - if it doesn't, we always generate `BLOB` 1486 return "BLOB" 1487 if expression.is_type( 1488 exp.DType.DECIMAL32, 1489 exp.DType.DECIMAL64, 1490 exp.DType.DECIMAL128, 1491 exp.DType.DECIMAL256, 1492 ): 1493 scale = self.expressions(expression, flat=True) 1494 1495 if expression.is_type(exp.DType.DECIMAL32): 1496 precision = "9" 1497 elif expression.is_type(exp.DType.DECIMAL64): 1498 precision = "18" 1499 elif expression.is_type(exp.DType.DECIMAL128): 1500 precision = "38" 1501 else: 1502 # 65 is a maximum precision supported in SingleStore 1503 precision = "65" 1504 if scale is not None: 1505 return f"DECIMAL({precision}, {scale[0]})" 1506 else: 1507 return f"DECIMAL({precision})" 1508 if expression.is_type(exp.DType.VECTOR): 1509 expressions = expression.expressions 1510 if len(expressions) == 2: 1511 type_name = self.sql(expressions[0]) 1512 if type_name in self.dialect.INVERSE_VECTOR_TYPE_ALIASES: 1513 type_name = self.dialect.INVERSE_VECTOR_TYPE_ALIASES[type_name] 1514 1515 return f"VECTOR({self.sql(expressions[1])}, {type_name})" 1516 1517 return super().datatype_sql(expression) 1518 1519 def collate_sql(self, expression: exp.Collate) -> str: 1520 # SingleStore does not support setting a collation for column in the SELECT query, 1521 # so we cast column to a LONGTEXT type with specific collation 1522 return self.binary(expression, ":> LONGTEXT COLLATE") 1523 1524 def currentdate_sql(self, expression: exp.CurrentDate) -> str: 1525 timezone = expression.this 1526 if timezone: 1527 if isinstance(timezone, exp.Literal) and timezone.name.lower() == "utc": 1528 return self.func("UTC_DATE") 1529 self.unsupported("CurrentDate with timezone is not supported in SingleStore") 1530 1531 return self.func("CURRENT_DATE") 1532 1533 def currenttime_sql(self, expression: exp.CurrentTime) -> str: 1534 arg = expression.this 1535 if arg: 1536 if isinstance(arg, exp.Literal) and arg.name.lower() == "utc": 1537 return self.func("UTC_TIME") 1538 if isinstance(arg, exp.Literal) and arg.is_number: 1539 return self.func("CURRENT_TIME", arg) 1540 self.unsupported("CurrentTime with timezone is not supported in SingleStore") 1541 1542 return self.func("CURRENT_TIME") 1543 1544 def currenttimestamp_sql(self, expression: exp.CurrentTimestamp) -> str: 1545 arg = expression.this 1546 if arg: 1547 if isinstance(arg, exp.Literal) and arg.name.lower() == "utc": 1548 return self.func("UTC_TIMESTAMP") 1549 if isinstance(arg, exp.Literal) and arg.is_number: 1550 return self.func("CURRENT_TIMESTAMP", arg) 1551 self.unsupported("CurrentTimestamp with timezone is not supported in SingleStore") 1552 1553 return self.func("CURRENT_TIMESTAMP") 1554 1555 def standardhash_sql(self, expression: exp.StandardHash) -> str: 1556 hash_function = expression.expression 1557 if hash_function is None: 1558 return self.func("SHA", expression.this) 1559 if isinstance(hash_function, exp.Literal): 1560 if hash_function.name.lower() == "sha": 1561 return self.func("SHA", expression.this) 1562 if hash_function.name.lower() == "md5": 1563 return self.func("MD5", expression.this) 1564 1565 self.unsupported(f"{hash_function.this} hash method is not supported in SingleStore") 1566 return self.func("SHA", expression.this) 1567 1568 self.unsupported("STANDARD_HASH function is not supported in SingleStore") 1569 return self.func("SHA", expression.this) 1570 1571 def truncatetable_sql(self, expression: exp.TruncateTable) -> str: 1572 for arg_name in ("is_database", "exists", "cluster", "identity", "option", "partition"): 1573 if expression.args.get(arg_name): 1574 self.unsupported(f"TRUNCATE TABLE does not support {arg_name}") 1575 statements = [] 1576 for table in expression.expressions: 1577 statements.append(f"TRUNCATE {self.sql(table)}") 1578 1579 return "; ".join(statements) 1580 1581 def renamecolumn_sql(self, expression: exp.RenameColumn) -> str: 1582 if expression.args.get("exists"): 1583 self.unsupported("RENAME COLUMN does not support exists") 1584 old_column = self.sql(expression, "this") 1585 new_column = self.sql(expression, "to") 1586 return f"CHANGE {old_column} {new_column}" 1587 1588 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1589 for arg_name in ("drop", "comment", "allow_null", "visible", "using"): 1590 if expression.args.get(arg_name): 1591 self.unsupported(f"ALTER COLUMN does not support {arg_name}") 1592 alter = super().altercolumn_sql(expression) 1593 1594 collate = self.sql(expression, "collate") 1595 collate = f" COLLATE {collate}" if collate else "" 1596 return f"{alter}{collate}" 1597 1598 def computedcolumnconstraint_sql(self, expression: exp.ComputedColumnConstraint) -> str: 1599 this = self.sql(expression, "this") 1600 not_null = " NOT NULL" if expression.args.get("not_null") else "" 1601 type = self.sql(expression, "data_type") or "AUTO" 1602 return f"AS {this} PERSISTED {type}{not_null}"
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
SUPPORTED_JSON_PATH_PARTS =
{<class 'sqlglot.expressions.query.JSONPathKey'>, <class 'sqlglot.expressions.query.JSONPathRoot'>, <class 'sqlglot.expressions.query.JSONPathSubscript'>}
TRANSFORMS =
{<class 'sqlglot.expressions.query.JSONPathKey'>: <function json_path_key_only_name>, <class 'sqlglot.expressions.query.JSONPathRoot'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.query.JSONPathSubscript'>: <function SingleStoreGenerator.<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 rename_func.<locals>.<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.functions.CurrentVersion'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.temporal.DateDiff'>: <function SingleStoreGenerator.<lambda>>, <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 timestamptrunc_sql.<locals>._timestamptrunc_sql>, <class 'sqlglot.expressions.temporal.Day'>: <function remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.temporal.DayOfMonth'>: <function rename_func.<locals>.<lambda>>, <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 MySQLGenerator.<lambda>>, <class 'sqlglot.expressions.core.ILike'>: <function no_ilike_sql>, <class 'sqlglot.expressions.string.Length'>: <function length_or_char_length_sql>, <class 'sqlglot.expressions.aggregate.LogicalOr'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.aggregate.LogicalAnd'>: <function SingleStoreGenerator.<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 SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.StrToTime'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.string.Stuff'>: <function SingleStoreGenerator.<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 SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.string.Trim'>: <function trim_sql>, <class 'sqlglot.expressions.math.Trunc'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.functions.TryCast'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.TsOrDsAdd'>: <function date_add_sql.<locals>.func>, <class 'sqlglot.expressions.temporal.TsOrDsDiff'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.TsOrDsToDate'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.string.Unicode'>: <function MySQLGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.UnixToTime'>: <function SingleStoreGenerator.<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.string.ToChar'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.Date'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.functions.Cast'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.functions.CastToStrType'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.StrToUnix'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.temporal.TimeToUnix'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.temporal.UnixSeconds'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.temporal.UnixToStr'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.UnixToTimeStr'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.DateBin'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.TimeStrToDate'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.core.FromTimeZone'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.DiToDate'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.DateToDi'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.TsOrDiToDi'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.Time'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.DatetimeAdd'>: <function remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.temporal.DatetimeTrunc'>: <function timestamptrunc_sql.<locals>._timestamptrunc_sql>, <class 'sqlglot.expressions.temporal.DatetimeSub'>: <function date_add_interval_sql.<locals>.func>, <class 'sqlglot.expressions.temporal.DatetimeDiff'>: <function timestampdiff_sql>, <class 'sqlglot.expressions.temporal.TimestampTrunc'>: <function timestamptrunc_sql.<locals>._timestamptrunc_sql>, <class 'sqlglot.expressions.temporal.CurrentDatetime'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.json.JSONExtract'>: <function json_extract_segments.<locals>._json_extract_segments>, <class 'sqlglot.expressions.json.JSONBExtract'>: <function json_extract_segments.<locals>._json_extract_segments>, <class 'sqlglot.expressions.json.JSONFormat'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.json.JSONArrayAgg'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.json.JSONArray'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.json.JSONBExists'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.json.JSONExists'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.temporal.DayOfWeekIso'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.core.Hll'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.core.ApproxDistinct'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.aggregate.CountIf'>: <function count_if_to_sum>, <class 'sqlglot.expressions.aggregate.ApproxQuantile'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.aggregate.Variance'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.aggregate.VariancePop'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.core.Xor'>: <function bool_xor_sql>, <class 'sqlglot.expressions.math.Cbrt'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.core.RegexpLike'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.string.Repeat'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.string.IsAscii'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.string.MD5Digest'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.string.Contains'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.string.RegexpExtractAll'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.string.RegexpExtract'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.string.StartsWith'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.string.FromBase'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.string.RegexpILike'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.query.National'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.array.Reduce'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.string.MatchAgainst'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.ddl.Show'>: <function SingleStoreGenerator.<lambda>>, <class 'sqlglot.expressions.ddl.Describe'>: <function SingleStoreGenerator.<lambda>>}
UNSUPPORTED_TYPES =
{<DType.BIGSERIAL: 'BIGSERIAL'>, <DType.MULTILINESTRING: 'MULTILINESTRING'>, <DType.IPPREFIX: 'IPPREFIX'>, <DType.MAP: 'MAP'>, <DType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <DType.VARIANT: 'VARIANT'>, <DType.INT128: 'INT128'>, <DType.SERIAL: 'SERIAL'>, <DType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <DType.UNION: 'UNION'>, <DType.NUMRANGE: 'NUMRANGE'>, <DType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <DType.IMAGE: 'IMAGE'>, <DType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <DType.HSTORE: 'HSTORE'>, <DType.INTERVAL: 'INTERVAL'>, <DType.HLLSKETCH: 'HLLSKETCH'>, <DType.NOTHING: 'NOTHING'>, <DType.IPADDRESS: 'IPADDRESS'>, <DType.INET: 'INET'>, <DType.NULL: 'NULL'>, <DType.TSRANGE: 'TSRANGE'>, <DType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <DType.XML: 'XML'>, <DType.DATERANGE: 'DATERANGE'>, <DType.NESTED: 'NESTED'>, <DType.TIMETZ: 'TIMETZ'>, <DType.NAME: 'NAME'>, <DType.UNKNOWN: 'UNKNOWN'>, <DType.IPV6: 'IPV6'>, <DType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <DType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <DType.INT8RANGE: 'INT8RANGE'>, <DType.TSMULTIRANGE: 'TSMULTIRANGE'>, <DType.TDIGEST: 'TDIGEST'>, <DType.RANGE: 'RANGE'>, <DType.MONEY: 'MONEY'>, <DType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <DType.DYNAMIC: 'DYNAMIC'>, <DType.IPV4: 'IPV4'>, <DType.SUPER: 'SUPER'>, <DType.SMALLMONEY: 'SMALLMONEY'>, <DType.INT4RANGE: 'INT4RANGE'>, <DType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <DType.LOWCARDINALITY: 'LOWCARDINALITY'>, <DType.BPCHAR: 'BPCHAR'>, <DType.INT256: 'INT256'>, <DType.SMALLSERIAL: 'SMALLSERIAL'>, <DType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <DType.TSTZRANGE: 'TSTZRANGE'>, <DType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <DType.ROWVERSION: 'ROWVERSION'>, <DType.OBJECT: 'OBJECT'>, <DType.USERDEFINED: 'USER-DEFINED'>, <DType.UINT256: 'UINT256'>, <DType.UINT128: 'UINT128'>, <DType.ARRAY: 'ARRAY'>, <DType.UUID: 'UUID'>, <DType.LIST: 'LIST'>}
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'>: 'TIMESTAMP', <DType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>: 'DATETIME', <DType.TIMESTAMPTZ: 'TIMESTAMPTZ'>: 'TIMESTAMP', <DType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>: 'TIMESTAMP', <DType.BIGDECIMAL: 'BIGDECIMAL'>: 'DECIMAL', <DType.BIT: 'BIT'>: 'BOOLEAN', <DType.DATE32: 'DATE32'>: 'DATE', <DType.DATETIME64: 'DATETIME64'>: 'DATETIME', <DType.DECIMAL32: 'DECIMAL32'>: 'DECIMAL', <DType.DECIMAL64: 'DECIMAL64'>: 'DECIMAL', <DType.DECIMAL128: 'DECIMAL128'>: 'DECIMAL', <DType.DECIMAL256: 'DECIMAL256'>: 'DECIMAL', <DType.ENUM8: 'ENUM8'>: 'ENUM', <DType.ENUM16: 'ENUM16'>: 'ENUM', <DType.FIXEDSTRING: 'FIXEDSTRING'>: 'TEXT', <DType.GEOMETRY: 'GEOMETRY'>: 'GEOGRAPHY', <DType.POINT: 'POINT'>: 'GEOGRAPHYPOINT', <DType.RING: 'RING'>: 'GEOGRAPHY', <DType.LINESTRING: 'LINESTRING'>: 'GEOGRAPHY', <DType.POLYGON: 'POLYGON'>: 'GEOGRAPHY', <DType.MULTIPOLYGON: 'MULTIPOLYGON'>: 'GEOGRAPHY', <DType.STRUCT: 'STRUCT'>: 'RECORD', <DType.JSONB: 'JSONB'>: 'BSON', <DType.TIMESTAMP_S: 'TIMESTAMP_S'>: 'TIMESTAMP', <DType.TIMESTAMP_MS: 'TIMESTAMP_MS'>: 'TIMESTAMP'}
RESERVED_KEYWORDS =
{'recheck', 'from', '_management_thread', 'window', 'log10', 'definer', 'localtime', 'binary', 'if', 'replicate', 'geography_contains', 'int3', 'join', 'references', 'any', 'autostats_histogram_mode', 'soname', 'byte_length', 'failed_login_attempts', 'result', 'sql_no_logging', 'addtime', 'absolute', 'relative', 'auto_increment', 'refresh', 'test', 'ntile', 'durability', 'desc', 'insert_method', 'lock', 'parser', 'triggers', 'start', 'immutable', '_sync', '_binary', 'day', 'fetch', 'array', 'distinct', 'unlisten', 'split', 'date_format', 'listen', 'dictionary', 'license', 'modifies', 'from_base64', 'close', 'redundant', 'lcase', 'inout', 'zerofill', 'longblob', 'revoke', 'bit_count', 'out', 'detach', 'geography', 'hdfs', 'file', 'coalesce', 'uncommitted', 'regexp', 'current_schema', 'sqlstate', 'tinyblob', 'anti_join', 'discard', 'geography_within_distance', 'program', 'persisted', 'usage', 'dynamic', 'field', 'low_priority', 'paired', 'any_value', 'asm', 'union', 'memory', 'bin', 'day_microsecond', 'lines', 'unpivot', 'killall', 'geometrypoint', 'replace', 'varbinary', 'xor', 'arrange', 'instr', 'index', '_unittest', 'now', 'variadic', 'variables', 'order', 'greatest', 'role', 'delay_key_write', 'plans', 'collect', 'optimizer_state', 'rely', 'over', 'hour', 'options', 'volatile', 'median', 'option', 'table_checksum', 'checkpoint', 'json_length', 'table', 'committed', 'nvarchar', 'from_days', 'sqlexception', 'temp', 'notify', 'sensitive', 'tinytext', 'time_format', 'assertion', 'timestamp', 'safe', 'backup_history', 'optionally', 'ascii', 'fixed', 'exclude', 'configuration', 'tables', 'call_for_pipeline', 'timestampadd', 'conversion', 'also', 'coercibility', 'work', 'primary', 'char_length', 'position', 'zone', 'analyze', 'day_second', 'strict', 'force_compiled_mode', 'granted', 'unlogged', 'nullif', 'standalone', 'invoker', 'degrees', 'collation', '_fsync', 'concat_ws', 'lower', 'inet_aton', 'spatial_check_index', 'catalog', 'sql_buffer_result', 'unhex', 'sequences', 'transform', 'on', 'json', 'operator', 'extension', 'dump', 'distributed_joins', 'monthname', 'date_sub', 'nchar', 'no', 'convert_tz', 'memsql_deserialize', '_sync_partitions', 'pause', 'roles', 'declare', '_twopcid', 'backup_id', 'max', 'datetime', 'delimiters', 'transaction', 'host', 'escaped', 'to_json', 'row', 'initially', 'level', 'geography_distance', 'election', 'geometry_area', 'query', 'state', 'rows', 'connections', 'max_queue_depth', 'ifnull', 'value', 'describe', 'geometry_filter', 'create', 'vacuum', '_gc', 'preceding', 'admin', 'success', 'sequence', 'gcs', '_checksum', 'approx_percentile', 'types', 'specific', 'geography_longitude', 'hard_cpu_limit_percentage', 'approx_count_distinct', 'resource', 'columnstore', 'deallocate', 'get_format', 'right_semi_join', 'external', 'delayed', 'label', '_continue_replay', 'tinyint', 'rollup', 'decimal', 'group_concat', 'foreign', 'escape', 'connection', 'memsql_imitating_kafka', 'right_straight_join', 'key', 'aggregate', 'lateral', 'time_to_sec', 'fulltext', 'timestampdiff', 'enclosed', 'concurrent', 'earliest', '_resurrect', '_memsql_table_id_lookup', '_ls', 'fault', 'purge', 'autostats_sampling', 'autostats', 'procedures', 'mpl', 'groups', '_read', 'interpreter_mode', 'pipeline', 'isolation', 'returns', 'account', 'unique', 'between', 'input', '_gcx', 'utc_date', 'wait', 'procedure', 'identified', 'not', '_reprovisioning', 'instead', 'extract', 'lead', 'iterate', 'power', 'attach', 'text', 'none', 'json_delete_key', 'distinctrow', 'last', 'holding', 'partition', 'event', 'require', 'series', 'stdin', 'microsecond', 'cube', 'until', 'cnf', 'hold', '_core', 'by', 'resource_pool', 'having', 'tracelogs', 'similar', 'asin', 'decode', 'connection_id', 'rlike', 'sin', 'locate', 'recursive', 'do', 'sum', 'availability', 'end', 'family', 'geometry_contains', 'byte', 'voting', 'geometry_x', 'next', 'var_samp', 'localtimestamp', 'wrapper', 'abs', 'immediate', 'minute_second', 'rule', 'varying', 'modify', 'nothing', 'approx_count_distinct_accumulate', 'outfile', 'increment', 'dayofmonth', 'inject', 'snapshot', 'avro', '_drop_profile', 'files', 'lz4', 'fill', 'md5', 'handler', 'restrict', 'compressed', 'plan', 'left', 'in', 'delimiter', 'metadata', 'weekofyear', 'unknown', 'json_array_contains_string', 'cascaded', '_global_version_timestamp', 'template', 'void', 'year', 'found_rows', 'sqrt', 'xact_id', 'insert', 'redundancy', 'generate', 'update', 'geometry_length', 'verbose', 'first', 'second', 'before', 'straight_join', 'action', 'atan2', 'dayofweek', 'comment', 'compile', 'norely', 'optimize', 'json_extract_json', 'validator', 'server', 'data', 'restore', 'force_interpreter_mode', 'yes', 'config', 'lc_ctype', 'day_minute', 'current_security_groups', 'is', 'execute', '_term_bump', 'capture', '_repair_table', 'service_user', 'tablespace', 'float4', 'backward', 'dayofyear', 'echo', 'pipelines', 'vector_sub', 'pivot', 'keys', 'inet_ntoa', 'subdate', 'undo', 'ilike', 'geometry_y', 'owner', 'skipped_batches', 'exp', 'drop', 'false', 'inline', 'exclusive', '_disconnect', 'all', 'grant', 'current_user', 'date', 'div', '_sync_snapshot', 'called', 'out_of_order', 'each', '_snapshot', 'grouping', 'log', 'json_set_string', 'loaddata_where', 'constraint', 'geometry_intersects', 'no_write_to_binlog', 'credentials', 'read', 'ref', 'arghistory', 'aes_encrypt', 'functions', 'concat', 'comments', 'current_catalog', 'concurrently', 'format', 'autostats_enabled', 'months_between', 'nowait', 'fix_alter', 'sync', 'local', 'min', '_wm_heartbeat', 'int8', 'interval', 'euclidean_distance', 'varcharacter', 'clear', 'group', 'rg_pool', 'max_partitions_per_batch', 'cast', 'trim', 'geography_intersects', 'replication', 'noparam', 'batch_interval', 'parquet', 'outer', 'sql_cache', 'leading', 'json_array_push_double', 'cross', 'orphan', 'csv', 'oids', '_failover', 'record', 'minus', 'model', 'asensitive', 'checksum', 'date_add', 'unhold', 'content', 'batches', 'stddev_pop', 'search', 'plancache', 'merge', 'inner', 'named', '_utf8', 'ordered_serialize', 'traditional', 'approx_count_distinct_combine', 'return', 'no_query_rewrite', 'privileges', 'sign', 'shard', 'geographypoint', 'bucket_count', 'pack_keys', '_snapshots', 'character', 'aggregator_id', 'row_format', 'temptable', 'columnar', 'current_time', 'json_extract_bigint', 'prepared', 'sharded', 'defaults', 'freeze', 'class', 'header', 'longtext', 'row_number', '_send_threads', 'reads', 'current_role', 'mediumtext', 'promote', 'cume_dist', 'foreground', '_pause_replay', 'last_value', 'schema_binding', 'stable', 'super', 'cos', 'unenforced', 'heartbeat_no_logging', 'node', 'flush', 'hosts', 'starting', 'rank', 'workload', 'bit_or', 'unbounded', 'trunc', 'boolean', 'treat', '_init_profile', 'cycle', 'access', 'assignment', 'reindex', 'json_array_contains_double', 'rebalance', 'savepoint', 'llvm', 'highlight', 'sparse', 'ucase', 'passing', 'variance', 'undefined', 'temporary', 'check', 'terminate', 'bootstrap', 'convert', 'sql_big_result', 'extra_join', 'geometry_distance', 'sql_mode', 'domain', 'when', 'bit_xor', 'against', 'ignore', 'full', 'schemas', 'shutdown', 'json_array_push_json', '_transactions_experimental', 'valid', 'log2', 'disk', 'load', 'type', 'storage', 'varchar', 'asc', 'octet_length', 'mapping', 'defined', 'encrypted', 'off', 'unsigned', 'instance', 'autostats_cardinality_mode', 'curdate', 'percentile_cont', 'compression', 'identity', 'aes_decrypt', 'sqlwarning', 'kill', 'prior', 'hash', 'both', 'mbc', 'limit', 'show', 'spatial', 'day_hour', 'set', 'percent_rank', 'default', 'dense_rank', 'object', 'cluster', 'numeric', 'routine', 'geography_area', 'insensitive', 'estimate', 'minute', 'dayname', 'import', 'geometry', 'sharded_id', 'ln', 'deferrable', 'leaves', 'time', 'minute_microsecond', 'rename', 'radians', 'week', 'sleep', 'rowstore', 'right', 'sha1', 'to_days', 'to_number', 'reload', 'month', 'proxy', 'null', 'queue', 'right_anti_join', 'global', 'statement', 'extractor', 'intersect', 'trigger', 'blob', 'approx_count_distinct_estimate', 'int4', 'minvalue', 'grants', 'replicating', 'sysid', 'str_to_date', 'overlaps', 'then', 'inherit', 'or', 'time_bucket', 'weekday', 'validate', 'online', 'unlock', 'placing', 'within', 'rpad', 'upgrade', 'alter', 'client', 'password_lock_time', '_unload', 'bigint', 'reverse', 'to_date', 'backup', 'json_splice_json', 'open', 'following', 'mediumblob', 'pools', 'row_count', 'gzip', 'authorization', 'of', 'max_concurrency', 'stats', 'constraints', 'skip', 'continue', 'begin', 'view', 'session', 'databases', 'avg_row_length', 'security_lists_intersect', 'terminated', 'lag', 'json_get_type', 'leaf', 'reference', 'plugins', 'sql_small_result', 'json_extract_double', 'last_insert_id', 'rtrim', 'timediff', 'key_block_size', 'two_phase', 'loop', 'gc', 'int2', 'fields', 'geography_length', 'batch', 'floor', 'profiles', 'share', 'conv', 'setof', 'aggregators', 'condition', 'national', 'long', 'master', 'adddate', 'hour_microsecond', 'max_rows', 'process', 'sec_to_time', 'query_timeout', '_check_consistency', 'status', 'btree', 'hour_minute', 'natural', 'maxvalue', 'move', 'mode', 'json_splice_string', 'isnull', 'overlay', 'scroll', 'session_user', 'remove', 'serial', 'atan', 'clustered', 'language', 'std', '_sleep', 'substr', 'client_found_rows', 'columnstore_segment_rows', 'users', 'attribute', 'indexes', 'min_rows', 'current_date', 'pool', 'nullcols', 'else', 'handle', 'use', 'deferred', 'to_base64', 'partition_id', 'json_set_json', 'current_timestamp', 'round', 'function', 'stdout', 'characteristics', 'serializable', 'procedural', 'sync_snapshot', 'analyse', 'aggregator_plan_hash', 'task', 'trailing', 'like', 'save', 'deterministic', 'engine', 'and', 'tags', 'optimizer', 'sql', 'write', 'json_set_double', 'running', 'to_seconds', 'unicode', 'cursor', 'first_value', 'including', 'char', 'returning', 'add', 'async', 'lpad', 'int1', 'strip', 'ltrim', 'after', 'character_length', 'compact', 'max_errors', '_rpc', 'document', 'utc_time', '_wake', 'security', 'range', 'percentile_disc', 'fs', 'some', 'always', 'cascade', 'enable', 'profile', 'latest', 'cache', 'external_host', 'bool', 'columns', 'avg', 'float8', 'remote', 'json_extract_string', 'quote', 'tan', 'asymmetric', 'repeatable', 'utc_timestamp', 'directory', '_background_threads_for_cleanup', 'encoding', 'sha2', 'disable', 'user', 'extended', 'optimization', '_batch_size_limit', 'geometry_within_distance', 'without', 'curtime', 'last_day', 'substring', 'while', 'column', 'large', '_repl', 'repeat', 'separator', 'initialize', 'materialized', 'incremental', 'for', 'inherits', 'float', 'leakproof', 'at', 'synchronize', 'processlist', 'call', 'auto_reprovision', 'json_array_contains_json', '_check_can_connect', 'count', 'max_retries_per_batch_partition', 'implicit', 'copy', 'reset', 'double', 'quarter', 'real', 'trusted', 'true', 'var_pop', 'namespace', 'location', 'ssl', 'upper', 'memsql_serialize', 'sigmoid', 'scalar', 'smallint', 'charset', 'delete', 'signed', 'partial', 'offsets', 'nth_value', 'hour_second', 'rollback', '_bt', 'engines', 'date_trunc', 'differential', 'memsql', 'current_security_roles', 'json_agg', 'bit_and', '_internal_dynamic_typecast', 'events', 'json_array_push_string', 'middleint', 'infile', 'truncate', 'version', 'mod', 'password', 'inet6_ntoa', 'high_priority', 'signal', 'pi', 'select', 'stop', 'aggregator', 'port', 'offline', 'geography_point', 'commit', 'elt', 'bit', 'forward', 'lc_collate', 'exit', 'owned', 'system', 'values', 'approx_geography_intersects', 'background', 's3', 'int', 'current', '_sync2', 'ceil', 'ast', 'schema', 'except', 'string', 'dec', 'timeout', 'replica', 'initcap', 'offset', 'member', 'prepare', 'to_timestamp', 'extractors', 'periodic', 'database', 'integer', 'excluding', 'leave', 'external_port', 'chain', 'elseif', 'errors', 'init', 'auto', 'target_size', 'sql_calc_found_rows', 'geography_latitude', 'partitioning', 'release', 'collate', 'sql_no_cache', 'explain', 'into', 'nulls', 'json_splice_double', 'only', 'azure', 'timezone', 'match', 'using', 'preserve', 'names', 'mediumint', 'whitespace', 'stddev_samp', 'force', 'ceiling', 'warnings', 'duplicate', 'failure', 'enum', 'exists', 'kafka', 'hex', 'datediff', 'arrangement', 'where', 'change', 'soft_cpu_limit_percentage', 'memory_percentage', 'substring_index', 'management', 'rand', 'aggregates', 'precision', '_load', 'geometry_point', 'semi_join', 'acos', 'site', 'dual', 'second_microsecond', 'to_char', 'sha', 'has_temp_tables', 'as', 'length', 'unix_timestamp', 'repair', 'stddev', 'simple', '_commit_log_tail', 'cot', 'to', 'dot_product', 'pow', 'queries', 'retry', 'statistics', 'from_unixtime', 'unencrypted', 'symmetric', 'cost', 'algorithm', 'case', 'with', 'inet6_aton', 'restart', 'least', 'partitions', 'reassign', 'year_month'}
1442 def jsonvalue_sql(self, expression: exp.JSONValue) -> str: 1443 if expression.args.get("on_condition"): 1444 self.unsupported("JSON_VALUE does not support on_condition") 1445 res: exp.Expr = exp.JSONExtractScalar( 1446 this=expression.this, 1447 expression=expression.args.get("path"), 1448 json_type="STRING", 1449 ) 1450 1451 returning = expression.args.get("returning") 1452 if returning is not None: 1453 res = exp.Cast(this=res, to=returning) 1454 1455 return self.sql(res)
1461 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1462 json_type = expression.text("json_type").upper() 1463 1464 if json_type: 1465 return self.func( 1466 f"JSON_ARRAY_CONTAINS_{json_type}", expression.expression, expression.this 1467 ) 1468 1469 return self.func( 1470 "JSON_ARRAY_CONTAINS_JSON", 1471 expression.expression, 1472 self.func("TO_JSON", expression.this), 1473 )
1475 def datatype_sql(self, expression: exp.DataType) -> str: 1476 for arg_name in ("kind", "values"): 1477 if expression.args.get(arg_name): 1478 self.unsupported(f"DATATYPE does not support {arg_name}") 1479 if expression.args.get("nested") and not expression.is_type(exp.DType.STRUCT): 1480 self.unsupported( 1481 f"Argument 'nested' is not supported for representation of '{expression.this.value}' in SingleStore" 1482 ) 1483 1484 if expression.is_type(exp.DType.VARBINARY) and not expression.expressions: 1485 # `VARBINARY` must always have a size - if it doesn't, we always generate `BLOB` 1486 return "BLOB" 1487 if expression.is_type( 1488 exp.DType.DECIMAL32, 1489 exp.DType.DECIMAL64, 1490 exp.DType.DECIMAL128, 1491 exp.DType.DECIMAL256, 1492 ): 1493 scale = self.expressions(expression, flat=True) 1494 1495 if expression.is_type(exp.DType.DECIMAL32): 1496 precision = "9" 1497 elif expression.is_type(exp.DType.DECIMAL64): 1498 precision = "18" 1499 elif expression.is_type(exp.DType.DECIMAL128): 1500 precision = "38" 1501 else: 1502 # 65 is a maximum precision supported in SingleStore 1503 precision = "65" 1504 if scale is not None: 1505 return f"DECIMAL({precision}, {scale[0]})" 1506 else: 1507 return f"DECIMAL({precision})" 1508 if expression.is_type(exp.DType.VECTOR): 1509 expressions = expression.expressions 1510 if len(expressions) == 2: 1511 type_name = self.sql(expressions[0]) 1512 if type_name in self.dialect.INVERSE_VECTOR_TYPE_ALIASES: 1513 type_name = self.dialect.INVERSE_VECTOR_TYPE_ALIASES[type_name] 1514 1515 return f"VECTOR({self.sql(expressions[1])}, {type_name})" 1516 1517 return super().datatype_sql(expression)
1524 def currentdate_sql(self, expression: exp.CurrentDate) -> str: 1525 timezone = expression.this 1526 if timezone: 1527 if isinstance(timezone, exp.Literal) and timezone.name.lower() == "utc": 1528 return self.func("UTC_DATE") 1529 self.unsupported("CurrentDate with timezone is not supported in SingleStore") 1530 1531 return self.func("CURRENT_DATE")
1533 def currenttime_sql(self, expression: exp.CurrentTime) -> str: 1534 arg = expression.this 1535 if arg: 1536 if isinstance(arg, exp.Literal) and arg.name.lower() == "utc": 1537 return self.func("UTC_TIME") 1538 if isinstance(arg, exp.Literal) and arg.is_number: 1539 return self.func("CURRENT_TIME", arg) 1540 self.unsupported("CurrentTime with timezone is not supported in SingleStore") 1541 1542 return self.func("CURRENT_TIME")
1544 def currenttimestamp_sql(self, expression: exp.CurrentTimestamp) -> str: 1545 arg = expression.this 1546 if arg: 1547 if isinstance(arg, exp.Literal) and arg.name.lower() == "utc": 1548 return self.func("UTC_TIMESTAMP") 1549 if isinstance(arg, exp.Literal) and arg.is_number: 1550 return self.func("CURRENT_TIMESTAMP", arg) 1551 self.unsupported("CurrentTimestamp with timezone is not supported in SingleStore") 1552 1553 return self.func("CURRENT_TIMESTAMP")
1555 def standardhash_sql(self, expression: exp.StandardHash) -> str: 1556 hash_function = expression.expression 1557 if hash_function is None: 1558 return self.func("SHA", expression.this) 1559 if isinstance(hash_function, exp.Literal): 1560 if hash_function.name.lower() == "sha": 1561 return self.func("SHA", expression.this) 1562 if hash_function.name.lower() == "md5": 1563 return self.func("MD5", expression.this) 1564 1565 self.unsupported(f"{hash_function.this} hash method is not supported in SingleStore") 1566 return self.func("SHA", expression.this) 1567 1568 self.unsupported("STANDARD_HASH function is not supported in SingleStore") 1569 return self.func("SHA", expression.this)
1571 def truncatetable_sql(self, expression: exp.TruncateTable) -> str: 1572 for arg_name in ("is_database", "exists", "cluster", "identity", "option", "partition"): 1573 if expression.args.get(arg_name): 1574 self.unsupported(f"TRUNCATE TABLE does not support {arg_name}") 1575 statements = [] 1576 for table in expression.expressions: 1577 statements.append(f"TRUNCATE {self.sql(table)}") 1578 1579 return "; ".join(statements)
1581 def renamecolumn_sql(self, expression: exp.RenameColumn) -> str: 1582 if expression.args.get("exists"): 1583 self.unsupported("RENAME COLUMN does not support exists") 1584 old_column = self.sql(expression, "this") 1585 new_column = self.sql(expression, "to") 1586 return f"CHANGE {old_column} {new_column}"
1588 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1589 for arg_name in ("drop", "comment", "allow_null", "visible", "using"): 1590 if expression.args.get(arg_name): 1591 self.unsupported(f"ALTER COLUMN does not support {arg_name}") 1592 alter = super().altercolumn_sql(expression) 1593 1594 collate = self.sql(expression, "collate") 1595 collate = f" COLLATE {collate}" if collate else "" 1596 return f"{alter}{collate}"
def
computedcolumnconstraint_sql( self, expression: sqlglot.expressions.constraints.ComputedColumnConstraint) -> str:
1598 def computedcolumnconstraint_sql(self, expression: exp.ComputedColumnConstraint) -> str: 1599 this = self.sql(expression, "this") 1600 not_null = " NOT NULL" if expression.args.get("not_null") else "" 1601 type = self.sql(expression, "data_type") or "AUTO" 1602 return f"AS {this} PERSISTED {type}{not_null}"
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
- RENAME_TABLE_WITH_DB
- GROUPINGS_SEP
- INDEX_ON
- INOUT_SEPARATOR
- DIRECTED_JOINS
- QUERY_HINTS
- IS_BOOL_ALLOWED
- LIMIT_IS_TOP
- RETURNING_END
- EXTRACT_ALLOWS_QUOTES
- TZ_TO_WITH_TIME_ZONE
- ALTER_TABLE_INCLUDE_COLUMN_KEYWORD
- UNNEST_WITH_ORDINALITY
- SEMI_ANTI_JOIN_WITH_SIDE
- COMPUTED_COLUMN_WITH_TYPE
- SUPPORTS_TABLE_COPY
- TABLESAMPLE_REQUIRES_PARENS
- TABLESAMPLE_SIZE_IS_ROWS
- TABLESAMPLE_KEYWORDS
- TABLESAMPLE_WITH_METHOD
- TABLESAMPLE_SEED_KEYWORD
- HISTORICAL_DATA_POST_ALIAS
- COLLATE_IS_FUNC
- DATA_TYPE_SPECIFIERS_ALLOWED
- ENSURE_BOOLS
- CTE_RECURSIVE_KEYWORD_REQUIRED
- SUPPORTS_SINGLE_ARG_CONCAT
- SUPPORTS_TABLE_ALIAS_COLUMNS
- SUPPORTS_NAMED_CTE_COLUMNS
- UNPIVOT_ALIASES_ARE_IDENTIFIERS
- PIVOT_ALIAS_WITH_AS
- INSERT_OVERWRITE
- SUPPORTS_SELECT_INTO
- SUPPORTS_UNLOGGED_TABLES
- SUPPORTS_CREATE_TABLE_LIKE
- LIKE_PROPERTY_INSIDE_SCHEMA
- MULTI_ARG_DISTINCT
- JSON_PATH_SINGLE_QUOTE_ESCAPE
- JSON_PATH_KEY_QUOTED_FORCES_BRACKETS
- CAN_IMPLEMENT_ARRAY_ANY
- SUPPORTS_WINDOW_EXCLUDE
- SET_OP_MODIFIERS
- COPY_PARAMS_ARE_WRAPPED
- COPY_PARAMS_EQ_REQUIRED
- COPY_HAS_INTO_KEYWORD
- STAR_EXCEPT
- HEX_FUNC
- WITH_PROPERTIES_PREFIX
- 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
- SET_ASSIGNMENT_REQUIRES_VARIABLE_KEYWORD
- DECLARE_DEFAULT_ASSIGNMENT
- STAR_EXCLUDE_REQUIRES_DERIVED_TABLE
- SUPPORTS_DROP_ALTER_ICEBERG_PROPERTY
- TIME_PART_SINGULARS
- TOKEN_MAPPING
- 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
- table_sql
- 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
- 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
- command_sql
- comment_sql
- mergetreettlaction_sql
- mergetreettl_sql
- transaction_sql
- commit_sql
- rollback_sql
- modifycolumn_sql
- alterindex_sql
- alterdiststyle_sql
- altersortkey_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
- uniquekeyproperty_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
- 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
- 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
- partitionbyrangepropertydynamic_sql
- unpivotcolumns_sql
- analyzesample_sql
- analyzestatistics_sql
- analyzehistogram_sql
- analyzedelete_sql
- analyzelistchainedrows_sql
- analyzevalidate_sql
- analyze_sql
- xmltable_sql
- xmlnamespace_sql
- export_sql
- declare_sql
- declareitem_sql
- recursivewithsearch_sql
- parameterizedagg_sql
- anonymousaggfunc_sql
- combinedaggfunc_sql
- combinedparameterizedagg_sql
- install_sql
- get_put_sql
- translatecharacters_sql
- decodecase_sql
- semanticview_sql
- getextract_sql
- datefromunixdate_sql
- space_sql
- buildproperty_sql
- refreshtriggerproperty_sql
- modelattribute_sql
- directorystage_sql
- uuid_sql
- initcap_sql
- localtime_sql
- localtimestamp_sql
- weekstart_name
- weekstart_sql
- chr_sql
- block_sql
- functionspecification_sql
- storedprocedure_sql
- ifblock_sql
- whileblock_sql
- execute_sql
- executesql_sql
- altermodifysqlsecurity_sql
- usingproperty_sql
- renameindex_sql
- sqlglot.generators.mysql.MySQLGenerator
- SELECT_KINDS
- TRY_SUPPORTED
- SUPPORTS_DECODE_CASE
- SUPPORTS_MODIFY_COLUMN
- SUPPORTS_CHANGE_COLUMN
- AFTER_HAVING_MODIFIER_TRANSFORMS
- INTERVAL_ALLOWS_PLURAL_FORM
- LOCKING_READS_SUPPORTED
- JOIN_HINTS
- TABLE_HINTS
- DUPLICATE_KEY_UPDATE_WITH_SET
- QUERY_HINT_SEP
- VALUES_AS_TABLE
- NVL2_SUPPORTED
- LAST_DAY_SUPPORTS_DATE_PART
- 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
- VARCHAR_REQUIRES_SIZE
- SUPPORTS_MEDIAN
- UPDATE_STATEMENT_SUPPORTS_FROM
- UNSIGNED_TYPE_MAPPING
- TIMESTAMP_TYPE_MAPPING
- PROPERTIES_LOCATION
- LIMIT_FETCH
- LIMIT_ONLY_LITERALS
- CHAR_CAST_MAPPING
- SIGNED_CAST_MAPPING
- CAST_MAPPING
- TIMESTAMP_FUNC_TYPES
- SQL_SECURITY_VIEW_LOCATION
- makeinterval_sql
- locate_properties
- array_sql
- arraycontainsall_sql
- arraycontainedby_sql
- dpipe_sql
- extract_sql
- cast_sql
- show_sql
- alterrename_sql
- timestamptrunc_sql
- converttimezone_sql
- attimezone_sql
- isascii_sql
- ignorenulls_sql
- currentschema_sql
- partition_sql
- partitionbyrangeproperty_sql
- partitionbylistproperty_sql
- partitionlist_sql
- partitionrange_sql