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 SUPPORTS_ALTER_COLUMN_NULLABILITY = 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.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 isascii_sql(self, expression: exp.IsAscii) -> str: 1428 return self.sql( 1429 exp.paren(expression.this.rlike(exp.Literal.string("^[\x00-\x7f]*$")), copy=False) 1430 ) 1431 1432 def jsonextractscalar_sql(self, expression: exp.JSONExtractScalar) -> str: 1433 json_type = expression.args.get("json_type") 1434 func_name = "JSON_EXTRACT_JSON" if json_type is None else f"JSON_EXTRACT_{json_type}" 1435 return json_extract_segments(func_name)(self, expression) 1436 1437 def jsonbextractscalar_sql(self, expression: exp.JSONBExtractScalar) -> str: 1438 json_type = expression.args.get("json_type") 1439 func_name = "BSON_EXTRACT_BSON" if json_type is None else f"BSON_EXTRACT_{json_type}" 1440 return json_extract_segments(func_name)(self, expression) 1441 1442 def jsonextractarray_sql(self, expression: exp.JSONExtractArray) -> str: 1443 self.unsupported("Arrays are not supported in SingleStore") 1444 return self.function_fallback_sql(expression) 1445 1446 def jsonvalue_sql(self, expression: exp.JSONValue) -> str: 1447 if expression.args.get("on_condition"): 1448 self.unsupported("JSON_VALUE does not support on_condition") 1449 res: exp.Expr = exp.JSONExtractScalar( 1450 this=expression.this, 1451 expression=expression.args.get("path"), 1452 json_type="STRING", 1453 ) 1454 1455 returning = expression.args.get("returning") 1456 if returning is not None: 1457 res = exp.Cast(this=res, to=returning) 1458 1459 return self.sql(res) 1460 1461 def withingroup_sql(self, expression: exp.WithinGroup) -> str: 1462 # SingleStore includes trailing NULLs in percentile calculations, so we sort them first 1463 if isinstance(expression.this, (exp.PercentileCont, exp.PercentileDisc)) and isinstance( 1464 expression.expression, exp.Order 1465 ): 1466 expression = expression.copy() 1467 for ordered in expression.expression.expressions: 1468 ordered.set("nulls_first", True) 1469 1470 return super().withingroup_sql(expression) 1471 1472 def all_sql(self, expression: exp.All) -> str: 1473 self.unsupported("ALL subquery predicate is not supported in SingleStore") 1474 return super().all_sql(expression) 1475 1476 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1477 json_type = expression.text("json_type").upper() 1478 1479 if json_type: 1480 return self.func( 1481 f"JSON_ARRAY_CONTAINS_{json_type}", expression.expression, expression.this 1482 ) 1483 1484 return self.func( 1485 "JSON_ARRAY_CONTAINS_JSON", 1486 expression.expression, 1487 self.func("TO_JSON", expression.this), 1488 ) 1489 1490 def datatype_sql(self, expression: exp.DataType) -> str: 1491 for arg_name in ("kind", "values"): 1492 if expression.args.get(arg_name): 1493 self.unsupported(f"DATATYPE does not support {arg_name}") 1494 if expression.args.get("nested") and not expression.is_type(exp.DType.STRUCT): 1495 self.unsupported( 1496 f"Argument 'nested' is not supported for representation of '{expression.this.value}' in SingleStore" 1497 ) 1498 1499 if expression.is_type(exp.DType.VARBINARY) and not expression.expressions: 1500 # `VARBINARY` must always have a size - if it doesn't, we always generate `BLOB` 1501 return "BLOB" 1502 if expression.is_type( 1503 exp.DType.DECIMAL32, 1504 exp.DType.DECIMAL64, 1505 exp.DType.DECIMAL128, 1506 exp.DType.DECIMAL256, 1507 ): 1508 scale = self.expressions(expression, flat=True) 1509 1510 if expression.is_type(exp.DType.DECIMAL32): 1511 precision = "9" 1512 elif expression.is_type(exp.DType.DECIMAL64): 1513 precision = "18" 1514 elif expression.is_type(exp.DType.DECIMAL128): 1515 precision = "38" 1516 else: 1517 # 65 is a maximum precision supported in SingleStore 1518 precision = "65" 1519 if scale is not None: 1520 return f"DECIMAL({precision}, {scale[0]})" 1521 else: 1522 return f"DECIMAL({precision})" 1523 if expression.is_type(exp.DType.VECTOR): 1524 expressions = expression.expressions 1525 if len(expressions) == 2: 1526 type_name = self.sql(expressions[0]) 1527 if type_name in self.dialect.INVERSE_VECTOR_TYPE_ALIASES: 1528 type_name = self.dialect.INVERSE_VECTOR_TYPE_ALIASES[type_name] 1529 1530 return f"VECTOR({self.sql(expressions[1])}, {type_name})" 1531 1532 return super().datatype_sql(expression) 1533 1534 def collate_sql(self, expression: exp.Collate) -> str: 1535 # SingleStore does not support setting a collation for column in the SELECT query, 1536 # so we cast column to a LONGTEXT type with specific collation. If the cast is 1537 # already there (e.g. when regenerating previously generated SQL), don't add 1538 # another one, so that generation stays idempotent. 1539 this = expression.this 1540 if isinstance(this, exp.Cast) and this.to.this == exp.DType.LONGTEXT: 1541 return self.binary(expression, "COLLATE") 1542 return self.binary(expression, ":> LONGTEXT COLLATE") 1543 1544 def currentdate_sql(self, expression: exp.CurrentDate) -> str: 1545 timezone = expression.this 1546 if timezone: 1547 if isinstance(timezone, exp.Literal) and timezone.name.lower() == "utc": 1548 return self.func("UTC_DATE") 1549 self.unsupported("CurrentDate with timezone is not supported in SingleStore") 1550 1551 return self.func("CURRENT_DATE") 1552 1553 def currenttime_sql(self, expression: exp.CurrentTime) -> str: 1554 arg = expression.this 1555 if arg: 1556 if isinstance(arg, exp.Literal) and arg.name.lower() == "utc": 1557 return self.func("UTC_TIME") 1558 if isinstance(arg, exp.Literal) and arg.is_number: 1559 return self.func("CURRENT_TIME", arg) 1560 self.unsupported("CurrentTime with timezone is not supported in SingleStore") 1561 1562 return self.func("CURRENT_TIME") 1563 1564 def currenttimestamp_sql(self, expression: exp.CurrentTimestamp) -> str: 1565 arg = expression.this 1566 if arg: 1567 if isinstance(arg, exp.Literal) and arg.name.lower() == "utc": 1568 return self.func("UTC_TIMESTAMP") 1569 if isinstance(arg, exp.Literal) and arg.is_number: 1570 return self.func("CURRENT_TIMESTAMP", arg) 1571 self.unsupported("CurrentTimestamp with timezone is not supported in SingleStore") 1572 1573 return self.func("CURRENT_TIMESTAMP") 1574 1575 def standardhash_sql(self, expression: exp.StandardHash) -> str: 1576 hash_function = expression.expression 1577 if hash_function is None: 1578 return self.func("SHA", expression.this) 1579 if isinstance(hash_function, exp.Literal): 1580 if hash_function.name.lower() == "sha": 1581 return self.func("SHA", expression.this) 1582 if hash_function.name.lower() == "md5": 1583 return self.func("MD5", expression.this) 1584 1585 self.unsupported(f"{hash_function.this} hash method is not supported in SingleStore") 1586 return self.func("SHA", expression.this) 1587 1588 self.unsupported("STANDARD_HASH function is not supported in SingleStore") 1589 return self.func("SHA", expression.this) 1590 1591 def truncatetable_sql(self, expression: exp.TruncateTable) -> str: 1592 for arg_name in ("is_database", "exists", "cluster", "identity", "option", "partition"): 1593 if expression.args.get(arg_name): 1594 self.unsupported(f"TRUNCATE TABLE does not support {arg_name}") 1595 statements = [] 1596 for table in expression.expressions: 1597 statements.append(f"TRUNCATE {self.sql(table)}") 1598 1599 return "; ".join(statements) 1600 1601 def renamecolumn_sql(self, expression: exp.RenameColumn) -> str: 1602 if expression.args.get("exists"): 1603 self.unsupported("RENAME COLUMN does not support exists") 1604 old_column = self.sql(expression, "this") 1605 new_column = self.sql(expression, "to") 1606 return f"CHANGE {old_column} {new_column}" 1607 1608 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1609 for arg_name in ("drop", "comment", "visible", "using"): 1610 if expression.args.get(arg_name): 1611 self.unsupported(f"ALTER COLUMN does not support {arg_name}") 1612 alter = super().altercolumn_sql(expression) 1613 1614 collate = self.sql(expression, "collate") 1615 collate = f" COLLATE {collate}" if collate else "" 1616 return f"{alter}{collate}" 1617 1618 def computedcolumnconstraint_sql(self, expression: exp.ComputedColumnConstraint) -> str: 1619 this = self.sql(expression, "this") 1620 not_null = " NOT NULL" if expression.args.get("not_null") else "" 1621 type = self.sql(expression, "data_type") or "AUTO" 1622 return f"AS {this} PERSISTED {type}{not_null}"
29class SingleStoreGenerator(MySQLGenerator): 30 SUPPORTS_UESCAPE = False 31 SUPPORTS_ALTER_COLUMN_NULLABILITY = False 32 NULL_ORDERING_SUPPORTED: bool | None = True 33 MATCH_AGAINST_TABLE_PREFIX: str | None = "TABLE " 34 STRUCT_DELIMITER = ("(", ")") 35 36 UNICODE_SUBSTITUTE: t.ClassVar[t.Any] = staticmethod(_unicode_substitute) 37 38 SUPPORTED_JSON_PATH_PARTS = { 39 exp.JSONPathKey, 40 exp.JSONPathRoot, 41 exp.JSONPathSubscript, 42 } 43 44 TRANSFORMS = { 45 **{ 46 k: v 47 for k, v in MySQLGenerator.TRANSFORMS.items() 48 if k not in (exp.JSONExtractScalar, exp.CurrentDate) 49 }, 50 exp.TsOrDsToDate: lambda self, e: ( 51 self.func("TO_DATE", e.this, self.format_time(e)) 52 if e.args.get("format") 53 else self.func("DATE", e.this) 54 ), 55 exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)), 56 exp.ToChar: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)), 57 exp.StrToDate: lambda self, e: self.func( 58 "STR_TO_DATE", 59 e.this, 60 self.format_time( 61 e, 62 inverse_time_mapping=self.dialect.MYSQL_INVERSE_TIME_MAPPING, 63 inverse_time_trie=self.dialect.MYSQL_INVERSE_TIME_TRIE, 64 ), 65 ), 66 exp.TimeToStr: lambda self, e: self.func( 67 "DATE_FORMAT", 68 e.this, 69 self.format_time( 70 e, 71 inverse_time_mapping=self.dialect.MYSQL_INVERSE_TIME_MAPPING, 72 inverse_time_trie=self.dialect.MYSQL_INVERSE_TIME_TRIE, 73 ), 74 ), 75 exp.Date: unsupported_args("zone", "expressions")(rename_func("DATE")), 76 exp.Cast: unsupported_args("format", "action", "default")( 77 lambda self, e: f"{self.sql(e, 'this')} :> {self.sql(e, 'to')}" 78 ), 79 exp.TryCast: unsupported_args("format", "action", "default")( 80 lambda self, e: f"{self.sql(e, 'this')} !:> {self.sql(e, 'to')}" 81 ), 82 exp.CastToStrType: lambda self, e: self.sql( 83 exp.cast(e.this, DataType.from_str(e.args["to"].name)) 84 ), 85 exp.StrToUnix: unsupported_args("format")(rename_func("UNIX_TIMESTAMP")), 86 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 87 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 88 exp.UnixSeconds: rename_func("UNIX_TIMESTAMP"), 89 exp.UnixToStr: lambda self, e: self.func( 90 "FROM_UNIXTIME", 91 e.this, 92 self.format_time( 93 e, 94 inverse_time_mapping=self.dialect.MYSQL_INVERSE_TIME_MAPPING, 95 inverse_time_trie=self.dialect.MYSQL_INVERSE_TIME_TRIE, 96 ), 97 ), 98 exp.UnixToTime: unsupported_args("scale", "zone", "hours", "minutes")( 99 lambda self, e: self.func( 100 "FROM_UNIXTIME", 101 e.this, 102 self.format_time( 103 e, 104 inverse_time_mapping=self.dialect.MYSQL_INVERSE_TIME_MAPPING, 105 inverse_time_trie=self.dialect.MYSQL_INVERSE_TIME_TRIE, 106 ), 107 ), 108 ), 109 exp.UnixToTimeStr: lambda self, e: f"FROM_UNIXTIME({self.sql(e, 'this')}) :> TEXT", 110 exp.DateBin: unsupported_args("unit", "zone")( 111 lambda self, e: self.func("TIME_BUCKET", e.this, e.expression, e.args.get("origin")) 112 ), 113 exp.TimeStrToDate: lambda self, e: self.sql(exp.cast(e.this, exp.DType.DATE)), 114 exp.FromTimeZone: lambda self, e: self.func( 115 "CONVERT_TZ", e.this, e.args.get("zone"), "'UTC'" 116 ), 117 exp.DiToDate: lambda self, e: ( 118 f"STR_TO_DATE({self.sql(e, 'this')}, {self.dialect.DATEINT_FORMAT})" 119 ), 120 exp.DateToDi: lambda self, e: ( 121 f"(DATE_FORMAT({self.sql(e, 'this')}, {self.dialect.DATEINT_FORMAT}) :> INT)" 122 ), 123 exp.TsOrDiToDi: lambda self, e: ( 124 f"(DATE_FORMAT({self.sql(e, 'this')}, {self.dialect.DATEINT_FORMAT}) :> INT)" 125 ), 126 exp.Time: unsupported_args("zone")(lambda self, e: f"{self.sql(e, 'this')} :> TIME"), 127 exp.DatetimeAdd: remove_ts_or_ds_to_date(date_add_sql("ADD")), 128 exp.DatetimeTrunc: unsupported_args("zone")(timestamptrunc_sql()), 129 exp.DatetimeSub: date_add_interval_sql("DATE", "SUB"), 130 exp.DatetimeDiff: timestampdiff_sql, 131 exp.DateTrunc: unsupported_args("zone")(timestamptrunc_sql()), 132 exp.DateDiff: unsupported_args("zone")( 133 lambda self, e: ( 134 timestampdiff_sql(self, e) 135 if e.unit is not None 136 else self.func("DATEDIFF", e.this, e.expression) 137 ) 138 ), 139 exp.TsOrDsDiff: lambda self, e: ( 140 timestampdiff_sql(self, e) 141 if e.unit is not None 142 else self.func("DATEDIFF", e.this, e.expression) 143 ), 144 exp.TimestampTrunc: unsupported_args("zone")(timestamptrunc_sql()), 145 exp.CurrentDatetime: lambda self, e: self.sql( 146 self.dialect.CAST_TO_TIME6( 147 exp.CurrentTimestamp(this=exp.Literal.number(6)), exp.DType.DATETIME 148 ) 149 ), 150 exp.JSONExtract: unsupported_args( 151 "only_json_types", 152 "expressions", 153 "variant_extract", 154 "json_query", 155 "option", 156 "quote", 157 "on_condition", 158 "requires_json", 159 )(json_extract_segments("JSON_EXTRACT_JSON")), 160 exp.JSONBExtract: json_extract_segments("BSON_EXTRACT_BSON"), 161 exp.JSONPathKey: json_path_key_only_name, 162 exp.JSONPathSubscript: lambda self, e: self.json_path_part(e.this), 163 exp.JSONPathRoot: lambda *_: "", 164 exp.JSONFormat: unsupported_args("options", "is_json")(rename_func("JSON_PRETTY")), 165 exp.JSONArrayAgg: unsupported_args("null_handling", "return_type", "strict")( 166 lambda self, e: self.func("JSON_AGG", e.this, suffix=f"{self.sql(e, 'order')})") 167 ), 168 exp.JSONArray: unsupported_args("null_handling", "return_type", "strict")( 169 rename_func("JSON_BUILD_ARRAY") 170 ), 171 exp.JSONBExists: lambda self, e: self.func( 172 "BSON_MATCH_ANY_EXISTS", e.this, e.args.get("path") 173 ), 174 exp.JSONExists: lambda self, e: ( 175 f"{self.sql(e.this)}::?{self.sql(e.args.get('path'))}" 176 if e.args.get("from_dcolonqmark") 177 else self.func("JSON_MATCH_ANY_EXISTS", e.this, e.args.get("path")) 178 ), 179 exp.JSONObject: unsupported_args("null_handling", "unique_keys", "return_type", "encoding")( 180 rename_func("JSON_BUILD_OBJECT") 181 ), 182 exp.DayOfWeekIso: lambda self, e: f"(({self.func('DAYOFWEEK', e.this)} % 7) + 1)", 183 exp.DayOfMonth: rename_func("DAY"), 184 exp.Hll: rename_func("APPROX_COUNT_DISTINCT"), 185 exp.ApproxDistinct: rename_func("APPROX_COUNT_DISTINCT"), 186 exp.CountIf: count_if_to_sum, 187 exp.LogicalOr: lambda self, e: f"MAX(ABS({self.sql(e, 'this')}))", 188 exp.LogicalAnd: lambda self, e: f"MIN(ABS({self.sql(e, 'this')}))", 189 exp.ApproxQuantile: unsupported_args("accuracy", "weight")( 190 lambda self, e: self.func( 191 "APPROX_PERCENTILE", 192 e.this, 193 e.args.get("quantile"), 194 e.args.get("error_tolerance"), 195 ) 196 ), 197 exp.Variance: rename_func("VAR_SAMP"), 198 exp.VariancePop: rename_func("VAR_POP"), 199 exp.Xor: bool_xor_sql, 200 exp.Cbrt: lambda self, e: self.sql( 201 exp.Pow(this=e.this, expression=exp.Literal.number(1) / exp.Literal.number(3)) 202 ), 203 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 204 exp.Repeat: lambda self, e: self.func( 205 "LPAD", 206 exp.Literal.string(""), 207 exp.Mul(this=self.func("LENGTH", e.this), expression=e.args.get("times")), 208 e.this, 209 ), 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 isascii_sql(self, expression: exp.IsAscii) -> str: 1429 return self.sql( 1430 exp.paren(expression.this.rlike(exp.Literal.string("^[\x00-\x7f]*$")), copy=False) 1431 ) 1432 1433 def jsonextractscalar_sql(self, expression: exp.JSONExtractScalar) -> str: 1434 json_type = expression.args.get("json_type") 1435 func_name = "JSON_EXTRACT_JSON" if json_type is None else f"JSON_EXTRACT_{json_type}" 1436 return json_extract_segments(func_name)(self, expression) 1437 1438 def jsonbextractscalar_sql(self, expression: exp.JSONBExtractScalar) -> str: 1439 json_type = expression.args.get("json_type") 1440 func_name = "BSON_EXTRACT_BSON" if json_type is None else f"BSON_EXTRACT_{json_type}" 1441 return json_extract_segments(func_name)(self, expression) 1442 1443 def jsonextractarray_sql(self, expression: exp.JSONExtractArray) -> str: 1444 self.unsupported("Arrays are not supported in SingleStore") 1445 return self.function_fallback_sql(expression) 1446 1447 def jsonvalue_sql(self, expression: exp.JSONValue) -> str: 1448 if expression.args.get("on_condition"): 1449 self.unsupported("JSON_VALUE does not support on_condition") 1450 res: exp.Expr = exp.JSONExtractScalar( 1451 this=expression.this, 1452 expression=expression.args.get("path"), 1453 json_type="STRING", 1454 ) 1455 1456 returning = expression.args.get("returning") 1457 if returning is not None: 1458 res = exp.Cast(this=res, to=returning) 1459 1460 return self.sql(res) 1461 1462 def withingroup_sql(self, expression: exp.WithinGroup) -> str: 1463 # SingleStore includes trailing NULLs in percentile calculations, so we sort them first 1464 if isinstance(expression.this, (exp.PercentileCont, exp.PercentileDisc)) and isinstance( 1465 expression.expression, exp.Order 1466 ): 1467 expression = expression.copy() 1468 for ordered in expression.expression.expressions: 1469 ordered.set("nulls_first", True) 1470 1471 return super().withingroup_sql(expression) 1472 1473 def all_sql(self, expression: exp.All) -> str: 1474 self.unsupported("ALL subquery predicate is not supported in SingleStore") 1475 return super().all_sql(expression) 1476 1477 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1478 json_type = expression.text("json_type").upper() 1479 1480 if json_type: 1481 return self.func( 1482 f"JSON_ARRAY_CONTAINS_{json_type}", expression.expression, expression.this 1483 ) 1484 1485 return self.func( 1486 "JSON_ARRAY_CONTAINS_JSON", 1487 expression.expression, 1488 self.func("TO_JSON", expression.this), 1489 ) 1490 1491 def datatype_sql(self, expression: exp.DataType) -> str: 1492 for arg_name in ("kind", "values"): 1493 if expression.args.get(arg_name): 1494 self.unsupported(f"DATATYPE does not support {arg_name}") 1495 if expression.args.get("nested") and not expression.is_type(exp.DType.STRUCT): 1496 self.unsupported( 1497 f"Argument 'nested' is not supported for representation of '{expression.this.value}' in SingleStore" 1498 ) 1499 1500 if expression.is_type(exp.DType.VARBINARY) and not expression.expressions: 1501 # `VARBINARY` must always have a size - if it doesn't, we always generate `BLOB` 1502 return "BLOB" 1503 if expression.is_type( 1504 exp.DType.DECIMAL32, 1505 exp.DType.DECIMAL64, 1506 exp.DType.DECIMAL128, 1507 exp.DType.DECIMAL256, 1508 ): 1509 scale = self.expressions(expression, flat=True) 1510 1511 if expression.is_type(exp.DType.DECIMAL32): 1512 precision = "9" 1513 elif expression.is_type(exp.DType.DECIMAL64): 1514 precision = "18" 1515 elif expression.is_type(exp.DType.DECIMAL128): 1516 precision = "38" 1517 else: 1518 # 65 is a maximum precision supported in SingleStore 1519 precision = "65" 1520 if scale is not None: 1521 return f"DECIMAL({precision}, {scale[0]})" 1522 else: 1523 return f"DECIMAL({precision})" 1524 if expression.is_type(exp.DType.VECTOR): 1525 expressions = expression.expressions 1526 if len(expressions) == 2: 1527 type_name = self.sql(expressions[0]) 1528 if type_name in self.dialect.INVERSE_VECTOR_TYPE_ALIASES: 1529 type_name = self.dialect.INVERSE_VECTOR_TYPE_ALIASES[type_name] 1530 1531 return f"VECTOR({self.sql(expressions[1])}, {type_name})" 1532 1533 return super().datatype_sql(expression) 1534 1535 def collate_sql(self, expression: exp.Collate) -> str: 1536 # SingleStore does not support setting a collation for column in the SELECT query, 1537 # so we cast column to a LONGTEXT type with specific collation. If the cast is 1538 # already there (e.g. when regenerating previously generated SQL), don't add 1539 # another one, so that generation stays idempotent. 1540 this = expression.this 1541 if isinstance(this, exp.Cast) and this.to.this == exp.DType.LONGTEXT: 1542 return self.binary(expression, "COLLATE") 1543 return self.binary(expression, ":> LONGTEXT COLLATE") 1544 1545 def currentdate_sql(self, expression: exp.CurrentDate) -> str: 1546 timezone = expression.this 1547 if timezone: 1548 if isinstance(timezone, exp.Literal) and timezone.name.lower() == "utc": 1549 return self.func("UTC_DATE") 1550 self.unsupported("CurrentDate with timezone is not supported in SingleStore") 1551 1552 return self.func("CURRENT_DATE") 1553 1554 def currenttime_sql(self, expression: exp.CurrentTime) -> str: 1555 arg = expression.this 1556 if arg: 1557 if isinstance(arg, exp.Literal) and arg.name.lower() == "utc": 1558 return self.func("UTC_TIME") 1559 if isinstance(arg, exp.Literal) and arg.is_number: 1560 return self.func("CURRENT_TIME", arg) 1561 self.unsupported("CurrentTime with timezone is not supported in SingleStore") 1562 1563 return self.func("CURRENT_TIME") 1564 1565 def currenttimestamp_sql(self, expression: exp.CurrentTimestamp) -> str: 1566 arg = expression.this 1567 if arg: 1568 if isinstance(arg, exp.Literal) and arg.name.lower() == "utc": 1569 return self.func("UTC_TIMESTAMP") 1570 if isinstance(arg, exp.Literal) and arg.is_number: 1571 return self.func("CURRENT_TIMESTAMP", arg) 1572 self.unsupported("CurrentTimestamp with timezone is not supported in SingleStore") 1573 1574 return self.func("CURRENT_TIMESTAMP") 1575 1576 def standardhash_sql(self, expression: exp.StandardHash) -> str: 1577 hash_function = expression.expression 1578 if hash_function is None: 1579 return self.func("SHA", expression.this) 1580 if isinstance(hash_function, exp.Literal): 1581 if hash_function.name.lower() == "sha": 1582 return self.func("SHA", expression.this) 1583 if hash_function.name.lower() == "md5": 1584 return self.func("MD5", expression.this) 1585 1586 self.unsupported(f"{hash_function.this} hash method is not supported in SingleStore") 1587 return self.func("SHA", expression.this) 1588 1589 self.unsupported("STANDARD_HASH function is not supported in SingleStore") 1590 return self.func("SHA", expression.this) 1591 1592 def truncatetable_sql(self, expression: exp.TruncateTable) -> str: 1593 for arg_name in ("is_database", "exists", "cluster", "identity", "option", "partition"): 1594 if expression.args.get(arg_name): 1595 self.unsupported(f"TRUNCATE TABLE does not support {arg_name}") 1596 statements = [] 1597 for table in expression.expressions: 1598 statements.append(f"TRUNCATE {self.sql(table)}") 1599 1600 return "; ".join(statements) 1601 1602 def renamecolumn_sql(self, expression: exp.RenameColumn) -> str: 1603 if expression.args.get("exists"): 1604 self.unsupported("RENAME COLUMN does not support exists") 1605 old_column = self.sql(expression, "this") 1606 new_column = self.sql(expression, "to") 1607 return f"CHANGE {old_column} {new_column}" 1608 1609 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1610 for arg_name in ("drop", "comment", "visible", "using"): 1611 if expression.args.get(arg_name): 1612 self.unsupported(f"ALTER COLUMN does not support {arg_name}") 1613 alter = super().altercolumn_sql(expression) 1614 1615 collate = self.sql(expression, "collate") 1616 collate = f" COLLATE {collate}" if collate else "" 1617 return f"{alter}{collate}" 1618 1619 def computedcolumnconstraint_sql(self, expression: exp.ComputedColumnConstraint) -> str: 1620 this = self.sql(expression, "this") 1621 not_null = " NOT NULL" if expression.args.get("not_null") else "" 1622 type = self.sql(expression, "data_type") or "AUTO" 1623 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.JSONPathRoot'>, <class 'sqlglot.expressions.query.JSONPathSubscript'>, <class 'sqlglot.expressions.query.JSONPathKey'>}
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.BinaryColumnConstraint'>: <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.JSONBContainsTopKey'>: <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 date_add_sql.<locals>.func>, <class 'sqlglot.expressions.temporal.DateStrToDate'>: <function datestrtodate_sql>, <class 'sqlglot.expressions.temporal.DateSub'>: <function date_add_sql.<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.functions.If'>: <function if_sql.<locals>._if_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.aggregate.Stddev'>: <function rename_func.<locals>.<lambda>>, <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 MySQLGenerator.<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.aggregate.Variance'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.aggregate.VariancePop'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.temporal.Week'>: <function remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.temporal.WeekOfYear'>: <function remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.temporal.Year'>: <function remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.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.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.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.DYNAMIC: 'DYNAMIC'>, <DType.SMALLSERIAL: 'SMALLSERIAL'>, <DType.XML: 'XML'>, <DType.INET: 'INET'>, <DType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <DType.INT8RANGE: 'INT8RANGE'>, <DType.SERIAL: 'SERIAL'>, <DType.IPADDRESS: 'IPADDRESS'>, <DType.BIGSERIAL: 'BIGSERIAL'>, <DType.TIMETZ: 'TIMETZ'>, <DType.NULL: 'NULL'>, <DType.TSRANGE: 'TSRANGE'>, <DType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <DType.INT256: 'INT256'>, <DType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <DType.LIST: 'LIST'>, <DType.UINT128: 'UINT128'>, <DType.TDIGEST: 'TDIGEST'>, <DType.IPPREFIX: 'IPPREFIX'>, <DType.RANGE: 'RANGE'>, <DType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <DType.OBJECT: 'OBJECT'>, <DType.SMALLMONEY: 'SMALLMONEY'>, <DType.INTERVAL: 'INTERVAL'>, <DType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <DType.TSMULTIRANGE: 'TSMULTIRANGE'>, <DType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <DType.UNION: 'UNION'>, <DType.IPV6: 'IPV6'>, <DType.VARIANT: 'VARIANT'>, <DType.HSTORE: 'HSTORE'>, <DType.IPV4: 'IPV4'>, <DType.USERDEFINED: 'USER-DEFINED'>, <DType.NAME: 'NAME'>, <DType.UUID: 'UUID'>, <DType.TSTZRANGE: 'TSTZRANGE'>, <DType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <DType.IMAGE: 'IMAGE'>, <DType.HLLSKETCH: 'HLLSKETCH'>, <DType.MAP: 'MAP'>, <DType.MONEY: 'MONEY'>, <DType.ROWVERSION: 'ROWVERSION'>, <DType.INT4RANGE: 'INT4RANGE'>, <DType.MULTILINESTRING: 'MULTILINESTRING'>, <DType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <DType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <DType.DATERANGE: 'DATERANGE'>, <DType.NESTED: 'NESTED'>, <DType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <DType.NUMRANGE: 'NUMRANGE'>, <DType.ARRAY: 'ARRAY'>, <DType.LOWCARDINALITY: 'LOWCARDINALITY'>, <DType.INT128: 'INT128'>, <DType.NOTHING: 'NOTHING'>, <DType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <DType.SUPER: 'SUPER'>, <DType.UINT256: 'UINT256'>, <DType.UNKNOWN: 'UNKNOWN'>, <DType.BPCHAR: 'BPCHAR'>}
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 =
{'memsql', 'reverse', 'tinyint', 'returns', 'where', 'yes', 'pow', 'current_security_groups', '_memsql_table_id_lookup', 'numeric', 'undo', 'rebalance', 'metadata', 'geography_latitude', 'fs', 'wait', 'semi_join', 'trailing', 'except', 'owner', 'by', 'curdate', '_sync_snapshot', 'cross', 'session_user', 'natural', 'privileges', 'extractors', 'aggregator_plan_hash', 'substring', 'input', 'ntile', 'last_value', 'day_second', 'lpad', 'constraint', 'kafka', 'extra_join', 'loop', 'min_rows', 'sysid', 'traditional', 'variance', 'no_write_to_binlog', 'backup_history', 'degrees', 'domain', 'series', 'to_char', 'asymmetric', 'count', 'day_hour', 'asensitive', 'max_retries_per_batch_partition', 'int1', 'memory', 'vacuum', 'require', 'bit_xor', 'global', 'configuration', 'credentials', 'databases', 'time', 'add', 'execute', '_global_version_timestamp', 'update', 'avg_row_length', '_gcx', 'sqlstate', 'volatile', 'external', '_checksum', 'analyze', 'minus', 'byte', 'processlist', 'sql', '_sync2', 'json', 'authorization', 'call', 'primary', 'last', 'else', 'treat', 'algorithm', 'parser', 'minute', 'password', 'right_straight_join', 'byte_length', 'case', 'longtext', 'split', 'instance', 'conversion', 'two_phase', 'server', 'geometry_intersects', 'large', 'current', 'admin', 'management', 'substr', 'inet6_ntoa', 'test', 'dayofyear', 'exclude', 'recursive', 'elseif', 'profile', 'role', 'roles', 'gzip', 'real', 'explain', 'sha1', 'options', 'ucase', 'adddate', 'security', 'sql_no_cache', 'auto', 'optionally', 'view', 'killall', 'grant', 'day_microsecond', 'deferrable', 'geography_within_distance', 'stop', 'bit_and', 'unencrypted', 'asc', 'highlight', 'autostats_sampling', 'periodic', 'substring_index', '_fsync', 'index', 'addtime', 'utc_date', 'sync_snapshot', 'greatest', 'stddev_samp', '_send_threads', 'tags', 'last_insert_id', 'merge', 'nchar', 'describe', 'mediumtext', 'running', 'initcap', 'pool', 'ln', 'char_length', 'min', 'stats', 'end', 'delimiters', 'implicit', 'none', 'start', '_snapshot', 'to_json', 'deallocate', 'subdate', 'voting', 'drop', 'memsql_serialize', 'lcase', 'decimal', 'double', 'fixed', 'ltrim', 'serializable', 'label', 'float4', 'defaults', 'between', 'position', 'dense_rank', 'pi', 'percentile_disc', 'overlay', 'date_sub', 'grants', 'discard', 'mod', 'reassign', 'ceiling', 'reads', 'catalog', 'avro', 'decode', 'has_temp_tables', 'election', 'refresh', 'monthname', 'str_to_date', 'local', 'isnull', 'no', 'sum', 'median', 'checksum', 'force_compiled_mode', 'varbinary', 'password_lock_time', 'current_security_roles', 'write', 'hard_cpu_limit_percentage', 'offline', 'sin', 'flush', 'unlisten', 'bucket_count', 'optimizer', 'cost', 'bin', 'leaves', 'dec', 'to_date', 'differential', '_commit_log_tail', 'json_delete_key', 'serial', 'named', 'timezone', 'analyse', 'bit', 'save', 'standalone', 'unhex', 'member', 'transform', 'blob', 'insert', 'for', 'max_errors', 'owned', 'to_seconds', 'called', 'preserve', 'truncate', 'setof', 'inout', 'coalesce', 'columns', '_background_threads_for_cleanup', 'extension', 'offset', 'alter', 'remote', 'valid', 'result', 'right', 'separator', 'lateral', 'encrypted', 'ordered_serialize', 'aes_decrypt', 'cycle', 'iterate', '_ls', 'sql_cache', 'tan', 'geometry_distance', 'workload', '_core', 'geography', 'orphan', '_failover', 'savepoint', 'unix_timestamp', 'trusted', 'escaped', 'table_checksum', 'datetime', 'optimize', 'validate', 'outfile', 'sequence', 'check', 'current_role', 'curtime', 'row_count', 'committed', 'dayname', 'group', 'asm', 'replication', 'using', 'delete', 'json_extract_string', '_management_thread', 'show', '_drop_profile', 'unsigned', 'arghistory', 'mode', 'log10', 'date', 'encoding', 'lock', 'escape', 'hosts', 'geometry', 'minute_microsecond', 'resource', 'approx_count_distinct', 'acos', 'scalar', 'pack_keys', 'to_number', 'share', 'within', 'json_array_contains_json', 'geometry_within_distance', '_repair_table', 'trigger', 'overlaps', 'not', 'declare', 'percent_rank', 'user', 'exit', 'approx_percentile', 'always', 'model', 'procedural', 'upper', 'string', 'approx_geography_intersects', 'duplicate', 'fill', 'master', 'column', '_read', 'then', 'simple', 'batch_interval', 'weekofyear', 'middleint', 'security_lists_intersect', 'int8', 'following', 'max_rows', 'service_user', 'conv', 'force_interpreter_mode', 'ssl', 'concurrent', 'mediumblob', 'class', 'verbose', 'symmetric', 'commit', 'disable', 'enclosed', 'delimiter', 'sleep', 'extended', 'months_between', 'materialized', 'client_found_rows', 'bit_count', 'round', 'auto_increment', 'geography_longitude', 'intersect', 'pipeline', 'quarter', 'quote', 'float', 'geography_distance', 'database', 'rollback', 'failed_login_attempts', 'csv', '_load', 'now', 'batch', 'mapping', 'row_number', 'national', 'variables', 'storage', 'compression', 'lead', 'rtrim', 'usage', 'lc_collate', 'order', 'localtimestamp', 'timestampdiff', 'validator', 'dual', 'concat_ws', 'users', 'abs', 'timestamp', 'schema_binding', 'any', 'nulls', 'do', 'restrict', 'account', 'date_format', 'inherits', 'wrapper', 'timediff', 'mpl', 'nowait', 'redundant', 'ast', 'condition', 'purge', 'errors', 'least', 'maxvalue', 'of', 'timeout', 'strip', 'license', 'query', 'from_unixtime', 'without', 'mediumint', 'super', 'batches', 'inline', 'lines', 'rename', '_sleep', 'loaddata_where', 'value', 'option', 'persisted', 'json_get_type', 'also', 'tablespace', 'immutable', 'pools', 'to', 'specific', 'external_port', 'geographypoint', 'sql_buffer_result', 'json_array_push_double', 'over', 's3', 'replica', 'stdin', 'open', 'geometrypoint', 'like', 'shutdown', 'soname', '_unittest', 'compile', 'procedure', 'geography_contains', 'lower', 'spatial_check_index', 'template', 'foreground', 'plan', 'table', 'status', 'lc_ctype', 'schema', 'second', 'hex', 'signed', 'sec_to_time', 'second_microsecond', 'instr', 'skip', 'minute_second', 'from_base64', 'geometry_area', 'gcs', 'length', 'true', 'memory_percentage', 'revoke', 'interpreter_mode', 'inet_ntoa', 'cascaded', 'process', 'chain', 'synchronize', 'rollup', 'lz4', 'varying', 'delay_key_write', 'rpad', 'extract', 'preceding', 'geography_length', '_transactions_experimental', 'no_query_rewrite', 'identity', 'sqlwarning', 'asin', 'redundancy', 'json_array_push_json', 'dot_product', 'after', 'floor', 'placing', 'default', 'profiles', 'having', 'cache', 'rlike', 'detach', 'tinyblob', 'state', 'get_format', 'file', 'ref', 'external_host', 'replace', 'location', 'atan', 'spatial', 'exclusive', 'queries', 'query_timeout', 'modifies', '_pause_replay', 'percentile_cont', 'snapshot', 'backward', 'config', 'join', 'long', 'week', 'low_priority', 'geography_intersects', 'language', 'ignore', 'soft_cpu_limit_percentage', 'repeatable', 'sql_mode', 'sharded', 'distinct', 'last_day', 'null', 'date_add', 'key', 'shard', 'hash', 'ascii', 'pipelines', 'repair', 'norely', 'bool', 'found_rows', 'unlock', 'json_splice_string', 'level', 'online', 'dayofmonth', 'date_trunc', 'high_priority', 'site', 'dump', 'sql_small_result', 'triggers', 'event', 'json_length', 'scroll', 'time_to_sec', 'xact_id', 'geometry_filter', 'hour_minute', 'groups', 'modify', 'capture', 'load', 'engine', 'localtime', 'sensitive', 'columnstore_segment_rows', 'json_array_push_string', 'background', 'precision', 'is', 'transaction', 'approx_count_distinct_combine', 'int4', 'coercibility', 'indexes', 'stable', 'ifnull', 'json_splice_double', 'files', 'events', 'time_bucket', 'if', 'json_array_contains_double', 'with', 'geometry_y', 'statement', 'names', 'each', 'std', 'autostats_cardinality_mode', 'continue', '_init_profile', 'handler', 'smallint', 'clustered', 'grouping', 'assignment', 'var_samp', 'right_anti_join', 'binary', 'radians', 'warnings', 'log', 'rand', 'from_days', 'max', 'delayed', 'unpivot', 'fulltext', 'row_format', 'avg', 'cluster', 'month', 'comments', 'hdfs', 'insert_method', 'aes_encrypt', 'next', 'sql_big_result', 'columnar', 'listen', 'clear', 'availability', 'sigmoid', 'both', '_unload', 'variadic', 'optimizer_state', 'or', 'nullcols', '_binary', 'deterministic', 'current_timestamp', 'generate', 'current_user', 'including', 'collect', '_rpc', 'backup_id', 'sql_no_logging', 'max_concurrency', 'prior', 'optimization', '_repl', 'autostats_histogram_mode', 'weekday', 'promote', 'granted', 'range', 'cascade', 'safe', '_batch_size_limit', 'operator', 'out', 'types', 'recheck', 'leaf', 'varcharacter', 'char', 'cot', 'current_catalog', 'stddev', 'distinctrow', 'regexp', 'functions', '_internal_dynamic_typecast', 'geometry_point', 'json_splice_json', 'and', 'absolute', 'on', 'inject', 'when', 'connection', 'plans', 'reload', 'pivot', 'memsql_deserialize', 'mbc', 'program', 'format', 'year_month', 'connections', 'set', 'version', 'integer', 'power', 'arrange', 'ceil', 'charset', 'pause', 'undefined', 'work', 'current_date', '_utf8', 'int2', 'queue', 'before', 'partition', 'current_schema', 'aggregate', 'reference', 'partition_id', 'node', 'off', '_resurrect', 'minvalue', 'while', 'in', 'port', 'field', 'move', 'into', 'some', 'release', 'resource_pool', 'unlogged', 'rely', 'boolean', 'int3', 'durability', 'rows', 'backup', 'attribute', 'stddev_pop', 'varchar', 'infile', 'rank', 'fetch', 'header', 'collation', 'enum', 'inner', 'leading', 'copy', 'sign', 'search', 'increment', 'prepared', 'current_time', 'inet_aton', 'skipped_batches', 'columnstore', 'collate', 'notify', 'unique', 'values', 'max_partitions_per_batch', 'attach', 'cursor', 'oids', 'strict', 'insensitive', 'returning', 'geometry_x', '_sync', 'dayofweek', 'partitioning', 'lag', 'straight_join', 'rg_pool', '_wake', 'data', 'exp', 'kill', 'estimate', 'var_pop', 'cume_dist', 'json_agg', 'row', 'vector_sub', 'routine', 'unbounded', 'characteristics', '_term_bump', 'async', 'year', 'to_timestamp', 'geometry_length', 'plancache', 'replicate', 'immediate', 'system', 'int', 'record', 'character', 'btree', 'document', 'fix_alter', 'json_array_contains_string', 'log2', 'temptable', 'close', '_sync_partitions', 'enable', 'foreign', 'character_length', 'earliest', 'rowstore', 'union', 'failure', 'as', 'connection_id', 'hour_second', 'latest', 'unenforced', 'concurrently', 'hold', 'tracelogs', '_twopcid', 'hour_microsecond', 'json_set_double', 'schemas', 'unknown', 'isolation', 'json_extract_double', 'euclidean_distance', 'cube', 'window', 'nvarchar', 'object', 'passing', 'unhold', 'use', 'holding', 'initialize', 'family', 'geometry_contains', 'concat', 'reset', 'until', 'statistics', 'sync', 'anti_join', 'against', 'directory', 'aggregators', 'terminate', 'excluding', 'match', 'replicating', 'access', 'keys', '_wm_heartbeat', 'defined', 'procedures', 'at', 'sequences', 'cnf', 'definer', 'llvm', 'extractor', 'proxy', 'sparse', 'terminated', 'div', 'false', 'reindex', 'right_semi_join', 'auto_reprovision', 'whitespace', 'assertion', '_reprovisioning', 'json_extract_json', 'prepare', 'unicode', 'convert_tz', 'left', 'compact', 'deferred', 'instead', 'elt', 'time_format', 'desc', 'all', 'md5', 'partial', 'success', 'aggregates', 'limit', 'create', 'longblob', 'function', 'noparam', 'distributed_joins', '_check_can_connect', 'trunc', 'tinytext', 'first_value', 'fault', 'day', 'rule', '_continue_replay', 'signal', 'exists', 'remove', 'references', 'bit_or', 'identified', '_gc', 'geography_area', 'upgrade', 'repeat', 'outer', 'sqrt', 'cast', 'leakproof', 'starting', 'sha2', 'locate', 'azure', 'read', 'restart', 'trim', 'dictionary', 'microsecond', 'import', 'incremental', 'arrangement', 'constraints', 'temp', 'compressed', 'temporary', 'json_set_string', 'initially', 'text', 'stdout', 'full', 'forward', 'atan2', 'xor', 'cos', 'memsql_imitating_kafka', 'out_of_order', 'only', 'zerofill', 'array', 'partitions', 'geography_point', 'echo', 'init', 'interval', 'content', 'handle', 'restore', 'relative', 'gc', 'approx_count_distinct_estimate', 'change', 'aggregator', 'return', 'first', 'host', 'client', '_disconnect', '_check_consistency', 'approx_count_distinct_accumulate', '_bt', 'bigint', 'json_extract_bigint', 'begin', 'namespace', 'action', 'to_base64', '_snapshots', 'autostats', 'void', 'aggregator_id', 'nullif', 'target_size', 'checkpoint', 'freeze', 'inherit', 'nth_value', 'to_days', 'octet_length', 'utc_time', 'comment', 'uncommitted', 'leave', 'zone', 'plugins', 'type', 'hour', 'ilike', 'call_for_pipeline', 'parquet', 'datediff', 'paired', 'heartbeat_no_logging', 'day_minute', 'sha', 'sqlexception', 'similar', 'group_concat', 'json_set_json', 'from', 'select', 'timestampadd', 'tables', 'sharded_id', 'disk', 'float8', 'retry', 'task', 'utc_timestamp', 'convert', 'key_block_size', 'inet6_aton', 'session', 'engines', 'dynamic', 'sql_calc_found_rows', 'autostats_enabled', 'invoker', 'max_queue_depth', 'offsets', 'bootstrap', 'fields', 'nothing', 'force', 'any_value'}
1447 def jsonvalue_sql(self, expression: exp.JSONValue) -> str: 1448 if expression.args.get("on_condition"): 1449 self.unsupported("JSON_VALUE does not support on_condition") 1450 res: exp.Expr = exp.JSONExtractScalar( 1451 this=expression.this, 1452 expression=expression.args.get("path"), 1453 json_type="STRING", 1454 ) 1455 1456 returning = expression.args.get("returning") 1457 if returning is not None: 1458 res = exp.Cast(this=res, to=returning) 1459 1460 return self.sql(res)
1462 def withingroup_sql(self, expression: exp.WithinGroup) -> str: 1463 # SingleStore includes trailing NULLs in percentile calculations, so we sort them first 1464 if isinstance(expression.this, (exp.PercentileCont, exp.PercentileDisc)) and isinstance( 1465 expression.expression, exp.Order 1466 ): 1467 expression = expression.copy() 1468 for ordered in expression.expression.expressions: 1469 ordered.set("nulls_first", True) 1470 1471 return super().withingroup_sql(expression)
1477 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1478 json_type = expression.text("json_type").upper() 1479 1480 if json_type: 1481 return self.func( 1482 f"JSON_ARRAY_CONTAINS_{json_type}", expression.expression, expression.this 1483 ) 1484 1485 return self.func( 1486 "JSON_ARRAY_CONTAINS_JSON", 1487 expression.expression, 1488 self.func("TO_JSON", expression.this), 1489 )
1491 def datatype_sql(self, expression: exp.DataType) -> str: 1492 for arg_name in ("kind", "values"): 1493 if expression.args.get(arg_name): 1494 self.unsupported(f"DATATYPE does not support {arg_name}") 1495 if expression.args.get("nested") and not expression.is_type(exp.DType.STRUCT): 1496 self.unsupported( 1497 f"Argument 'nested' is not supported for representation of '{expression.this.value}' in SingleStore" 1498 ) 1499 1500 if expression.is_type(exp.DType.VARBINARY) and not expression.expressions: 1501 # `VARBINARY` must always have a size - if it doesn't, we always generate `BLOB` 1502 return "BLOB" 1503 if expression.is_type( 1504 exp.DType.DECIMAL32, 1505 exp.DType.DECIMAL64, 1506 exp.DType.DECIMAL128, 1507 exp.DType.DECIMAL256, 1508 ): 1509 scale = self.expressions(expression, flat=True) 1510 1511 if expression.is_type(exp.DType.DECIMAL32): 1512 precision = "9" 1513 elif expression.is_type(exp.DType.DECIMAL64): 1514 precision = "18" 1515 elif expression.is_type(exp.DType.DECIMAL128): 1516 precision = "38" 1517 else: 1518 # 65 is a maximum precision supported in SingleStore 1519 precision = "65" 1520 if scale is not None: 1521 return f"DECIMAL({precision}, {scale[0]})" 1522 else: 1523 return f"DECIMAL({precision})" 1524 if expression.is_type(exp.DType.VECTOR): 1525 expressions = expression.expressions 1526 if len(expressions) == 2: 1527 type_name = self.sql(expressions[0]) 1528 if type_name in self.dialect.INVERSE_VECTOR_TYPE_ALIASES: 1529 type_name = self.dialect.INVERSE_VECTOR_TYPE_ALIASES[type_name] 1530 1531 return f"VECTOR({self.sql(expressions[1])}, {type_name})" 1532 1533 return super().datatype_sql(expression)
1535 def collate_sql(self, expression: exp.Collate) -> str: 1536 # SingleStore does not support setting a collation for column in the SELECT query, 1537 # so we cast column to a LONGTEXT type with specific collation. If the cast is 1538 # already there (e.g. when regenerating previously generated SQL), don't add 1539 # another one, so that generation stays idempotent. 1540 this = expression.this 1541 if isinstance(this, exp.Cast) and this.to.this == exp.DType.LONGTEXT: 1542 return self.binary(expression, "COLLATE") 1543 return self.binary(expression, ":> LONGTEXT COLLATE")
1545 def currentdate_sql(self, expression: exp.CurrentDate) -> str: 1546 timezone = expression.this 1547 if timezone: 1548 if isinstance(timezone, exp.Literal) and timezone.name.lower() == "utc": 1549 return self.func("UTC_DATE") 1550 self.unsupported("CurrentDate with timezone is not supported in SingleStore") 1551 1552 return self.func("CURRENT_DATE")
1554 def currenttime_sql(self, expression: exp.CurrentTime) -> str: 1555 arg = expression.this 1556 if arg: 1557 if isinstance(arg, exp.Literal) and arg.name.lower() == "utc": 1558 return self.func("UTC_TIME") 1559 if isinstance(arg, exp.Literal) and arg.is_number: 1560 return self.func("CURRENT_TIME", arg) 1561 self.unsupported("CurrentTime with timezone is not supported in SingleStore") 1562 1563 return self.func("CURRENT_TIME")
1565 def currenttimestamp_sql(self, expression: exp.CurrentTimestamp) -> str: 1566 arg = expression.this 1567 if arg: 1568 if isinstance(arg, exp.Literal) and arg.name.lower() == "utc": 1569 return self.func("UTC_TIMESTAMP") 1570 if isinstance(arg, exp.Literal) and arg.is_number: 1571 return self.func("CURRENT_TIMESTAMP", arg) 1572 self.unsupported("CurrentTimestamp with timezone is not supported in SingleStore") 1573 1574 return self.func("CURRENT_TIMESTAMP")
1576 def standardhash_sql(self, expression: exp.StandardHash) -> str: 1577 hash_function = expression.expression 1578 if hash_function is None: 1579 return self.func("SHA", expression.this) 1580 if isinstance(hash_function, exp.Literal): 1581 if hash_function.name.lower() == "sha": 1582 return self.func("SHA", expression.this) 1583 if hash_function.name.lower() == "md5": 1584 return self.func("MD5", expression.this) 1585 1586 self.unsupported(f"{hash_function.this} hash method is not supported in SingleStore") 1587 return self.func("SHA", expression.this) 1588 1589 self.unsupported("STANDARD_HASH function is not supported in SingleStore") 1590 return self.func("SHA", expression.this)
1592 def truncatetable_sql(self, expression: exp.TruncateTable) -> str: 1593 for arg_name in ("is_database", "exists", "cluster", "identity", "option", "partition"): 1594 if expression.args.get(arg_name): 1595 self.unsupported(f"TRUNCATE TABLE does not support {arg_name}") 1596 statements = [] 1597 for table in expression.expressions: 1598 statements.append(f"TRUNCATE {self.sql(table)}") 1599 1600 return "; ".join(statements)
1602 def renamecolumn_sql(self, expression: exp.RenameColumn) -> str: 1603 if expression.args.get("exists"): 1604 self.unsupported("RENAME COLUMN does not support exists") 1605 old_column = self.sql(expression, "this") 1606 new_column = self.sql(expression, "to") 1607 return f"CHANGE {old_column} {new_column}"
1609 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1610 for arg_name in ("drop", "comment", "visible", "using"): 1611 if expression.args.get(arg_name): 1612 self.unsupported(f"ALTER COLUMN does not support {arg_name}") 1613 alter = super().altercolumn_sql(expression) 1614 1615 collate = self.sql(expression, "collate") 1616 collate = f" COLLATE {collate}" if collate else "" 1617 return f"{alter}{collate}"
def
computedcolumnconstraint_sql( self, expression: sqlglot.expressions.constraints.ComputedColumnConstraint) -> str:
1619 def computedcolumnconstraint_sql(self, expression: exp.ComputedColumnConstraint) -> str: 1620 this = self.sql(expression, "this") 1621 not_null = " NOT NULL" if expression.args.get("not_null") else "" 1622 type = self.sql(expression, "data_type") or "AUTO" 1623 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
- SUPPORTS_GROUPING_SETS_AS_SUFFIX
- INDEX_ON
- INOUT_SEPARATOR
- DIRECTED_JOINS
- QUERY_HINTS
- IS_BOOL_ALLOWED
- SAFE_INT_DIVISION
- LIMIT_IS_TOP
- RETURNING_END
- EXTRACT_ALLOWS_QUOTES
- TZ_TO_WITH_TIME_ZONE
- ALTER_TABLE_INCLUDE_COLUMN_KEYWORD
- UNNEST_WITH_ORDINALITY
- SEMI_ANTI_JOIN_WITH_SIDE
- COMPUTED_COLUMN_WITH_TYPE
- SUPPORTS_TABLE_COPY
- TABLESAMPLE_REQUIRES_PARENS
- TABLESAMPLE_SIZE_IS_ROWS
- TABLESAMPLE_KEYWORDS
- TABLESAMPLE_WITH_METHOD
- TABLESAMPLE_SEED_KEYWORD
- HISTORICAL_DATA_POST_ALIAS
- COLLATE_IS_FUNC
- DATA_TYPE_SPECIFIERS_ALLOWED
- ENSURE_BOOLS
- CTE_RECURSIVE_KEYWORD_REQUIRED
- SUPPORTS_SINGLE_ARG_CONCAT
- SUPPORTS_TABLE_ALIAS_COLUMNS
- SUPPORTS_NAMED_CTE_COLUMNS
- UNPIVOT_ALIASES_ARE_IDENTIFIERS
- PIVOT_ALIAS_WITH_AS
- INSERT_OVERWRITE
- SUPPORTS_SELECT_INTO
- SUPPORTS_UNLOGGED_TABLES
- SUPPORTS_CREATE_TABLE_LIKE
- SUPPORTS_ALTER_COLUMN_IF_EXISTS
- LIKE_PROPERTY_INSIDE_SCHEMA
- MULTI_ARG_DISTINCT
- JSON_PATH_SINGLE_QUOTE_ESCAPE
- JSON_PATH_KEY_QUOTED_FORCES_BRACKETS
- CAN_IMPLEMENT_ARRAY_ANY
- SUPPORTS_WINDOW_EXCLUDE
- SET_OP_MODIFIERS
- SET_OP_LIMITS
- SET_OP_PARENTHESIZED_OPERANDS
- 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
- MOD_OPERATOR
- MOD_PAREN_PARENT_TYPES
- 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
- lockingstatement_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
- partitionbyexcluding_sql
- windowspec_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
- replacecolumns_sql
- addpartition_sql
- distinct_sql
- respectnulls_sql
- havingmax_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
- function_name
- 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
- aggregatekeyproperty_sql
- duplicatekeyproperty_sql
- uniquekeyproperty_sql
- distributedbyproperty_sql
- oncluster_sql
- clusteredbyproperty_sql
- anyvalue_sql
- querytransform_sql
- indexconstraintoption_sql
- checkcolumnconstraint_sql
- indexcolumnconstraint_sql
- nvl2_sql
- nthvalue_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
- arrayinsert_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
- arraysort_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
- liststage_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
- weightstring_sql
- block_sql
- functionspecification_sql
- storedprocedure_sql
- ifblock_sql
- casestatement_sql
- whileblock_sql
- loopblock_sql
- repeatblock_sql
- leave_sql
- iterate_sql
- execute_sql
- executesql_sql
- altermodifysqlsecurity_sql
- usingproperty_sql
- renameindex_sql
- sqlglot.generators.mysql.MySQLGenerator
- BYTE_STRING_FUNCTION
- SELECT_KINDS
- TRY_SUPPORTED
- SUPPORTS_DECODE_CASE
- SUPPORTS_MODIFY_COLUMN
- SUPPORTS_CHANGE_COLUMN
- AFTER_HAVING_MODIFIER_TRANSFORMS
- INTERVAL_ALLOWS_PLURAL_FORM
- LOCKING_READS_SUPPORTED
- CAST_TO_INT_ROUNDS
- 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
- ALTER_PARTITION_OPTIONS
- 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
- intdiv_sql
- extract_sql
- cast_sql
- show_sql
- alterrename_sql
- timestamptrunc_sql
- converttimezone_sql
- attimezone_sql
- ignorenulls_sql
- currentschema_sql
- partition_sql
- partitionbyrangeproperty_sql
- partitionbylistproperty_sql
- partitionlist_sql
- partitionrange_sql