Edit on GitHub

sqlglot.dialects.clickhouse

   1from __future__ import annotations
   2import typing as t
   3import datetime
   4from sqlglot import exp, generator, parser, tokens
   5from sqlglot._typing import E
   6from sqlglot.dialects.dialect import (
   7    Dialect,
   8    NormalizationStrategy,
   9    arg_max_or_min_no_count,
  10    build_date_delta,
  11    build_formatted_time,
  12    inline_array_sql,
  13    json_extract_segments,
  14    json_path_key_only_name,
  15    length_or_char_length_sql,
  16    no_pivot_sql,
  17    build_json_extract_path,
  18    rename_func,
  19    remove_from_array_using_filter,
  20    sha256_sql,
  21    strposition_sql,
  22    var_map_sql,
  23    timestamptrunc_sql,
  24    unit_to_var,
  25    trim_sql,
  26)
  27from sqlglot.generator import Generator
  28from sqlglot.helper import is_int, seq_get
  29from sqlglot.tokens import Token, TokenType
  30from sqlglot.generator import unsupported_args
  31
  32DATEΤΙΜΕ_DELTA = t.Union[exp.DateAdd, exp.DateDiff, exp.DateSub, exp.TimestampSub, exp.TimestampAdd]
  33
  34
  35def _build_datetime_format(
  36    expr_type: t.Type[E],
  37) -> t.Callable[[t.List], E]:
  38    def _builder(args: t.List) -> E:
  39        expr = build_formatted_time(expr_type, "clickhouse")(args)
  40
  41        timezone = seq_get(args, 2)
  42        if timezone:
  43            expr.set("zone", timezone)
  44
  45        return expr
  46
  47    return _builder
  48
  49
  50def _unix_to_time_sql(self: ClickHouse.Generator, expression: exp.UnixToTime) -> str:
  51    scale = expression.args.get("scale")
  52    timestamp = expression.this
  53
  54    if scale in (None, exp.UnixToTime.SECONDS):
  55        return self.func("fromUnixTimestamp", exp.cast(timestamp, exp.DataType.Type.BIGINT))
  56    if scale == exp.UnixToTime.MILLIS:
  57        return self.func("fromUnixTimestamp64Milli", exp.cast(timestamp, exp.DataType.Type.BIGINT))
  58    if scale == exp.UnixToTime.MICROS:
  59        return self.func("fromUnixTimestamp64Micro", exp.cast(timestamp, exp.DataType.Type.BIGINT))
  60    if scale == exp.UnixToTime.NANOS:
  61        return self.func("fromUnixTimestamp64Nano", exp.cast(timestamp, exp.DataType.Type.BIGINT))
  62
  63    return self.func(
  64        "fromUnixTimestamp",
  65        exp.cast(
  66            exp.Div(this=timestamp, expression=exp.func("POW", 10, scale)), exp.DataType.Type.BIGINT
  67        ),
  68    )
  69
  70
  71def _lower_func(sql: str) -> str:
  72    index = sql.index("(")
  73    return sql[:index].lower() + sql[index:]
  74
  75
  76def _quantile_sql(self: ClickHouse.Generator, expression: exp.Quantile) -> str:
  77    quantile = expression.args["quantile"]
  78    args = f"({self.sql(expression, 'this')})"
  79
  80    if isinstance(quantile, exp.Array):
  81        func = self.func("quantiles", *quantile)
  82    else:
  83        func = self.func("quantile", quantile)
  84
  85    return func + args
  86
  87
  88def _build_count_if(args: t.List) -> exp.CountIf | exp.CombinedAggFunc:
  89    if len(args) == 1:
  90        return exp.CountIf(this=seq_get(args, 0))
  91
  92    return exp.CombinedAggFunc(this="countIf", expressions=args)
  93
  94
  95def _build_str_to_date(args: t.List) -> exp.Cast | exp.Anonymous:
  96    if len(args) == 3:
  97        return exp.Anonymous(this="STR_TO_DATE", expressions=args)
  98
  99    strtodate = exp.StrToDate.from_arg_list(args)
 100    return exp.cast(strtodate, exp.DataType.build(exp.DataType.Type.DATETIME))
 101
 102
 103def _datetime_delta_sql(name: str) -> t.Callable[[Generator, DATEΤΙΜΕ_DELTA], str]:
 104    def _delta_sql(self: Generator, expression: DATEΤΙΜΕ_DELTA) -> str:
 105        if not expression.unit:
 106            return rename_func(name)(self, expression)
 107
 108        return self.func(
 109            name,
 110            unit_to_var(expression),
 111            expression.expression,
 112            expression.this,
 113            expression.args.get("zone"),
 114        )
 115
 116    return _delta_sql
 117
 118
 119def _timestrtotime_sql(self: ClickHouse.Generator, expression: exp.TimeStrToTime):
 120    ts = expression.this
 121
 122    tz = expression.args.get("zone")
 123    if tz and isinstance(ts, exp.Literal):
 124        # Clickhouse will not accept timestamps that include a UTC offset, so we must remove them.
 125        # The first step to removing is parsing the string with `datetime.datetime.fromisoformat`.
 126        #
 127        # In python <3.11, `fromisoformat()` can only parse timestamps of millisecond (3 digit)
 128        # or microsecond (6 digit) precision. It will error if passed any other number of fractional
 129        # digits, so we extract the fractional seconds and pad to 6 digits before parsing.
 130        ts_string = ts.name.strip()
 131
 132        # separate [date and time] from [fractional seconds and UTC offset]
 133        ts_parts = ts_string.split(".")
 134        if len(ts_parts) == 2:
 135            # separate fractional seconds and UTC offset
 136            offset_sep = "+" if "+" in ts_parts[1] else "-"
 137            ts_frac_parts = ts_parts[1].split(offset_sep)
 138            num_frac_parts = len(ts_frac_parts)
 139
 140            # pad to 6 digits if fractional seconds present
 141            ts_frac_parts[0] = ts_frac_parts[0].ljust(6, "0")
 142            ts_string = "".join(
 143                [
 144                    ts_parts[0],  # date and time
 145                    ".",
 146                    ts_frac_parts[0],  # fractional seconds
 147                    offset_sep if num_frac_parts > 1 else "",
 148                    ts_frac_parts[1] if num_frac_parts > 1 else "",  # utc offset (if present)
 149                ]
 150            )
 151
 152        # return literal with no timezone, eg turn '2020-01-01 12:13:14-08:00' into '2020-01-01 12:13:14'
 153        # this is because Clickhouse encodes the timezone as a data type parameter and throws an error if
 154        # it's part of the timestamp string
 155        ts_without_tz = (
 156            datetime.datetime.fromisoformat(ts_string).replace(tzinfo=None).isoformat(sep=" ")
 157        )
 158        ts = exp.Literal.string(ts_without_tz)
 159
 160    # Non-nullable DateTime64 with microsecond precision
 161    expressions = [exp.DataTypeParam(this=tz)] if tz else []
 162    datatype = exp.DataType.build(
 163        exp.DataType.Type.DATETIME64,
 164        expressions=[exp.DataTypeParam(this=exp.Literal.number(6)), *expressions],
 165        nullable=False,
 166    )
 167
 168    return self.sql(exp.cast(ts, datatype, dialect=self.dialect))
 169
 170
 171def _map_sql(self: ClickHouse.Generator, expression: exp.Map | exp.VarMap) -> str:
 172    if not (expression.parent and expression.parent.arg_key == "settings"):
 173        return _lower_func(var_map_sql(self, expression))
 174
 175    keys = expression.args.get("keys")
 176    values = expression.args.get("values")
 177
 178    if not isinstance(keys, exp.Array) or not isinstance(values, exp.Array):
 179        self.unsupported("Cannot convert array columns into map.")
 180        return ""
 181
 182    args = []
 183    for key, value in zip(keys.expressions, values.expressions):
 184        args.append(f"{self.sql(key)}: {self.sql(value)}")
 185
 186    csv_args = ", ".join(args)
 187
 188    return f"{{{csv_args}}}"
 189
 190
 191class ClickHouse(Dialect):
 192    INDEX_OFFSET = 1
 193    NORMALIZE_FUNCTIONS: bool | str = False
 194    NULL_ORDERING = "nulls_are_last"
 195    SUPPORTS_USER_DEFINED_TYPES = False
 196    SAFE_DIVISION = True
 197    LOG_BASE_FIRST: t.Optional[bool] = None
 198    FORCE_EARLY_ALIAS_REF_EXPANSION = True
 199    PRESERVE_ORIGINAL_NAMES = True
 200    NUMBERS_CAN_BE_UNDERSCORE_SEPARATED = True
 201    IDENTIFIERS_CAN_START_WITH_DIGIT = True
 202    HEX_STRING_IS_INTEGER_TYPE = True
 203
 204    # https://github.com/ClickHouse/ClickHouse/issues/33935#issue-1112165779
 205    NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_SENSITIVE
 206
 207    UNESCAPED_SEQUENCES = {
 208        "\\0": "\0",
 209    }
 210
 211    CREATABLE_KIND_MAPPING = {"DATABASE": "SCHEMA"}
 212
 213    SET_OP_DISTINCT_BY_DEFAULT: t.Dict[t.Type[exp.Expression], t.Optional[bool]] = {
 214        exp.Except: False,
 215        exp.Intersect: False,
 216        exp.Union: None,
 217    }
 218
 219    def generate_values_aliases(self, expression: exp.Values) -> t.List[exp.Identifier]:
 220        # Clickhouse allows VALUES to have an embedded structure e.g:
 221        # VALUES('person String, place String', ('Noah', 'Paris'), ...)
 222        # In this case, we don't want to qualify the columns
 223        values = expression.expressions[0].expressions
 224
 225        structure = (
 226            values[0]
 227            if (len(values) > 1 and values[0].is_string and isinstance(values[1], exp.Tuple))
 228            else None
 229        )
 230        if structure:
 231            # Split each column definition into the column name e.g:
 232            # 'person String, place String' -> ['person', 'place']
 233            structure_coldefs = [coldef.strip() for coldef in structure.name.split(",")]
 234            column_aliases = [
 235                exp.to_identifier(coldef.split(" ")[0]) for coldef in structure_coldefs
 236            ]
 237        else:
 238            # Default column aliases in CH are "c1", "c2", etc.
 239            column_aliases = [
 240                exp.to_identifier(f"c{i + 1}") for i in range(len(values[0].expressions))
 241            ]
 242
 243        return column_aliases
 244
 245    class Tokenizer(tokens.Tokenizer):
 246        COMMENTS = ["--", "#", "#!", ("/*", "*/")]
 247        IDENTIFIERS = ['"', "`"]
 248        IDENTIFIER_ESCAPES = ["\\"]
 249        STRING_ESCAPES = ["'", "\\"]
 250        BIT_STRINGS = [("0b", "")]
 251        HEX_STRINGS = [("0x", ""), ("0X", "")]
 252        HEREDOC_STRINGS = ["$"]
 253
 254        KEYWORDS = {
 255            **tokens.Tokenizer.KEYWORDS,
 256            ".:": TokenType.DOTCOLON,
 257            "ATTACH": TokenType.COMMAND,
 258            "DATE32": TokenType.DATE32,
 259            "DATETIME64": TokenType.DATETIME64,
 260            "DICTIONARY": TokenType.DICTIONARY,
 261            "DYNAMIC": TokenType.DYNAMIC,
 262            "ENUM8": TokenType.ENUM8,
 263            "ENUM16": TokenType.ENUM16,
 264            "EXCHANGE": TokenType.COMMAND,
 265            "FINAL": TokenType.FINAL,
 266            "FIXEDSTRING": TokenType.FIXEDSTRING,
 267            "FLOAT32": TokenType.FLOAT,
 268            "FLOAT64": TokenType.DOUBLE,
 269            "GLOBAL": TokenType.GLOBAL,
 270            "LOWCARDINALITY": TokenType.LOWCARDINALITY,
 271            "MAP": TokenType.MAP,
 272            "NESTED": TokenType.NESTED,
 273            "NOTHING": TokenType.NOTHING,
 274            "SAMPLE": TokenType.TABLE_SAMPLE,
 275            "TUPLE": TokenType.STRUCT,
 276            "UINT16": TokenType.USMALLINT,
 277            "UINT32": TokenType.UINT,
 278            "UINT64": TokenType.UBIGINT,
 279            "UINT8": TokenType.UTINYINT,
 280            "IPV4": TokenType.IPV4,
 281            "IPV6": TokenType.IPV6,
 282            "POINT": TokenType.POINT,
 283            "RING": TokenType.RING,
 284            "LINESTRING": TokenType.LINESTRING,
 285            "MULTILINESTRING": TokenType.MULTILINESTRING,
 286            "POLYGON": TokenType.POLYGON,
 287            "MULTIPOLYGON": TokenType.MULTIPOLYGON,
 288            "AGGREGATEFUNCTION": TokenType.AGGREGATEFUNCTION,
 289            "SIMPLEAGGREGATEFUNCTION": TokenType.SIMPLEAGGREGATEFUNCTION,
 290            "SYSTEM": TokenType.COMMAND,
 291            "PREWHERE": TokenType.PREWHERE,
 292        }
 293        KEYWORDS.pop("/*+")
 294
 295        SINGLE_TOKENS = {
 296            **tokens.Tokenizer.SINGLE_TOKENS,
 297            "$": TokenType.HEREDOC_STRING,
 298        }
 299
 300    class Parser(parser.Parser):
 301        # Tested in ClickHouse's playground, it seems that the following two queries do the same thing
 302        # * select x from t1 union all select x from t2 limit 1;
 303        # * select x from t1 union all (select x from t2 limit 1);
 304        MODIFIERS_ATTACHED_TO_SET_OP = False
 305        INTERVAL_SPANS = False
 306        OPTIONAL_ALIAS_TOKEN_CTE = False
 307        JOINS_HAVE_EQUAL_PRECEDENCE = True
 308
 309        FUNCTIONS = {
 310            **parser.Parser.FUNCTIONS,
 311            "ANY": exp.AnyValue.from_arg_list,
 312            "ARRAYSUM": exp.ArraySum.from_arg_list,
 313            "ARRAYREVERSE": exp.ArrayReverse.from_arg_list,
 314            "ARRAYSLICE": exp.ArraySlice.from_arg_list,
 315            "COUNTIF": _build_count_if,
 316            "COSINEDISTANCE": exp.CosineDistance.from_arg_list,
 317            "DATE_ADD": build_date_delta(exp.DateAdd, default_unit=None),
 318            "DATEADD": build_date_delta(exp.DateAdd, default_unit=None),
 319            "DATE_DIFF": build_date_delta(exp.DateDiff, default_unit=None, supports_timezone=True),
 320            "DATEDIFF": build_date_delta(exp.DateDiff, default_unit=None, supports_timezone=True),
 321            "DATE_FORMAT": _build_datetime_format(exp.TimeToStr),
 322            "DATE_SUB": build_date_delta(exp.DateSub, default_unit=None),
 323            "DATESUB": build_date_delta(exp.DateSub, default_unit=None),
 324            "FORMATDATETIME": _build_datetime_format(exp.TimeToStr),
 325            "JSONEXTRACTSTRING": build_json_extract_path(
 326                exp.JSONExtractScalar, zero_based_indexing=False
 327            ),
 328            "LENGTH": lambda args: exp.Length(this=seq_get(args, 0), binary=True),
 329            "L2Distance": exp.EuclideanDistance.from_arg_list,
 330            "MAP": parser.build_var_map,
 331            "MATCH": exp.RegexpLike.from_arg_list,
 332            "PARSEDATETIME": _build_datetime_format(exp.ParseDatetime),
 333            "RANDCANONICAL": exp.Rand.from_arg_list,
 334            "STR_TO_DATE": _build_str_to_date,
 335            "TUPLE": exp.Struct.from_arg_list,
 336            "TIMESTAMP_SUB": build_date_delta(exp.TimestampSub, default_unit=None),
 337            "TIMESTAMPSUB": build_date_delta(exp.TimestampSub, default_unit=None),
 338            "TIMESTAMP_ADD": build_date_delta(exp.TimestampAdd, default_unit=None),
 339            "TIMESTAMPADD": build_date_delta(exp.TimestampAdd, default_unit=None),
 340            "UNIQ": exp.ApproxDistinct.from_arg_list,
 341            "XOR": lambda args: exp.Xor(expressions=args),
 342            "MD5": exp.MD5Digest.from_arg_list,
 343            "SHA256": lambda args: exp.SHA2(this=seq_get(args, 0), length=exp.Literal.number(256)),
 344            "SHA512": lambda args: exp.SHA2(this=seq_get(args, 0), length=exp.Literal.number(512)),
 345            "SUBSTRINGINDEX": exp.SubstringIndex.from_arg_list,
 346            "TOTYPENAME": exp.Typeof.from_arg_list,
 347            "EDITDISTANCE": exp.Levenshtein.from_arg_list,
 348            "LEVENSHTEINDISTANCE": exp.Levenshtein.from_arg_list,
 349        }
 350        FUNCTIONS.pop("TRANSFORM")
 351        FUNCTIONS.pop("APPROX_TOP_SUM")
 352
 353        AGG_FUNCTIONS = {
 354            "count",
 355            "min",
 356            "max",
 357            "sum",
 358            "avg",
 359            "any",
 360            "stddevPop",
 361            "stddevSamp",
 362            "varPop",
 363            "varSamp",
 364            "corr",
 365            "covarPop",
 366            "covarSamp",
 367            "entropy",
 368            "exponentialMovingAverage",
 369            "intervalLengthSum",
 370            "kolmogorovSmirnovTest",
 371            "mannWhitneyUTest",
 372            "median",
 373            "rankCorr",
 374            "sumKahan",
 375            "studentTTest",
 376            "welchTTest",
 377            "anyHeavy",
 378            "anyLast",
 379            "boundingRatio",
 380            "first_value",
 381            "last_value",
 382            "argMin",
 383            "argMax",
 384            "avgWeighted",
 385            "topK",
 386            "approx_top_sum",
 387            "topKWeighted",
 388            "deltaSum",
 389            "deltaSumTimestamp",
 390            "groupArray",
 391            "groupArrayLast",
 392            "groupUniqArray",
 393            "groupArrayInsertAt",
 394            "groupArrayMovingAvg",
 395            "groupArrayMovingSum",
 396            "groupArraySample",
 397            "groupBitAnd",
 398            "groupBitOr",
 399            "groupBitXor",
 400            "groupBitmap",
 401            "groupBitmapAnd",
 402            "groupBitmapOr",
 403            "groupBitmapXor",
 404            "sumWithOverflow",
 405            "sumMap",
 406            "minMap",
 407            "maxMap",
 408            "skewSamp",
 409            "skewPop",
 410            "kurtSamp",
 411            "kurtPop",
 412            "uniq",
 413            "uniqExact",
 414            "uniqCombined",
 415            "uniqCombined64",
 416            "uniqHLL12",
 417            "uniqTheta",
 418            "quantile",
 419            "quantiles",
 420            "quantileExact",
 421            "quantilesExact",
 422            "quantileExactLow",
 423            "quantilesExactLow",
 424            "quantileExactHigh",
 425            "quantilesExactHigh",
 426            "quantileExactWeighted",
 427            "quantilesExactWeighted",
 428            "quantileTiming",
 429            "quantilesTiming",
 430            "quantileTimingWeighted",
 431            "quantilesTimingWeighted",
 432            "quantileDeterministic",
 433            "quantilesDeterministic",
 434            "quantileTDigest",
 435            "quantilesTDigest",
 436            "quantileTDigestWeighted",
 437            "quantilesTDigestWeighted",
 438            "quantileBFloat16",
 439            "quantilesBFloat16",
 440            "quantileBFloat16Weighted",
 441            "quantilesBFloat16Weighted",
 442            "simpleLinearRegression",
 443            "stochasticLinearRegression",
 444            "stochasticLogisticRegression",
 445            "categoricalInformationValue",
 446            "contingency",
 447            "cramersV",
 448            "cramersVBiasCorrected",
 449            "theilsU",
 450            "maxIntersections",
 451            "maxIntersectionsPosition",
 452            "meanZTest",
 453            "quantileInterpolatedWeighted",
 454            "quantilesInterpolatedWeighted",
 455            "quantileGK",
 456            "quantilesGK",
 457            "sparkBar",
 458            "sumCount",
 459            "largestTriangleThreeBuckets",
 460            "histogram",
 461            "sequenceMatch",
 462            "sequenceCount",
 463            "windowFunnel",
 464            "retention",
 465            "uniqUpTo",
 466            "sequenceNextNode",
 467            "exponentialTimeDecayedAvg",
 468        }
 469
 470        AGG_FUNCTIONS_SUFFIXES = [
 471            "If",
 472            "Array",
 473            "ArrayIf",
 474            "Map",
 475            "SimpleState",
 476            "State",
 477            "Merge",
 478            "MergeState",
 479            "ForEach",
 480            "Distinct",
 481            "OrDefault",
 482            "OrNull",
 483            "Resample",
 484            "ArgMin",
 485            "ArgMax",
 486        ]
 487
 488        FUNC_TOKENS = {
 489            *parser.Parser.FUNC_TOKENS,
 490            TokenType.AND,
 491            TokenType.OR,
 492            TokenType.SET,
 493        }
 494
 495        RESERVED_TOKENS = parser.Parser.RESERVED_TOKENS - {TokenType.SELECT}
 496
 497        ID_VAR_TOKENS = {
 498            *parser.Parser.ID_VAR_TOKENS,
 499            TokenType.LIKE,
 500        }
 501
 502        AGG_FUNC_MAPPING = (
 503            lambda functions, suffixes: {
 504                f"{f}{sfx}": (f, sfx) for sfx in (suffixes + [""]) for f in functions
 505            }
 506        )(AGG_FUNCTIONS, AGG_FUNCTIONS_SUFFIXES)
 507
 508        FUNCTIONS_WITH_ALIASED_ARGS = {*parser.Parser.FUNCTIONS_WITH_ALIASED_ARGS, "TUPLE"}
 509
 510        FUNCTION_PARSERS = {
 511            **parser.Parser.FUNCTION_PARSERS,
 512            "ARRAYJOIN": lambda self: self.expression(exp.Explode, this=self._parse_expression()),
 513            "QUANTILE": lambda self: self._parse_quantile(),
 514            "MEDIAN": lambda self: self._parse_quantile(),
 515            "COLUMNS": lambda self: self._parse_columns(),
 516        }
 517
 518        FUNCTION_PARSERS.pop("MATCH")
 519
 520        PROPERTY_PARSERS = {
 521            **parser.Parser.PROPERTY_PARSERS,
 522            "ENGINE": lambda self: self._parse_engine_property(),
 523        }
 524        PROPERTY_PARSERS.pop("DYNAMIC")
 525
 526        NO_PAREN_FUNCTION_PARSERS = parser.Parser.NO_PAREN_FUNCTION_PARSERS.copy()
 527        NO_PAREN_FUNCTION_PARSERS.pop("ANY")
 528
 529        NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy()
 530        NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIMESTAMP)
 531
 532        RANGE_PARSERS = {
 533            **parser.Parser.RANGE_PARSERS,
 534            TokenType.GLOBAL: lambda self, this: self._parse_global_in(this),
 535        }
 536
 537        # The PLACEHOLDER entry is popped because 1) it doesn't affect Clickhouse (it corresponds to
 538        # the postgres-specific JSONBContains parser) and 2) it makes parsing the ternary op simpler.
 539        COLUMN_OPERATORS = parser.Parser.COLUMN_OPERATORS.copy()
 540        COLUMN_OPERATORS.pop(TokenType.PLACEHOLDER)
 541
 542        JOIN_KINDS = {
 543            *parser.Parser.JOIN_KINDS,
 544            TokenType.ANY,
 545            TokenType.ASOF,
 546            TokenType.ARRAY,
 547        }
 548
 549        TABLE_ALIAS_TOKENS = parser.Parser.TABLE_ALIAS_TOKENS - {
 550            TokenType.ANY,
 551            TokenType.ARRAY,
 552            TokenType.FINAL,
 553            TokenType.FORMAT,
 554            TokenType.SETTINGS,
 555        }
 556
 557        ALIAS_TOKENS = parser.Parser.ALIAS_TOKENS - {
 558            TokenType.FORMAT,
 559        }
 560
 561        LOG_DEFAULTS_TO_LN = True
 562
 563        QUERY_MODIFIER_PARSERS = {
 564            **parser.Parser.QUERY_MODIFIER_PARSERS,
 565            TokenType.SETTINGS: lambda self: (
 566                "settings",
 567                self._advance() or self._parse_csv(self._parse_assignment),
 568            ),
 569            TokenType.FORMAT: lambda self: ("format", self._advance() or self._parse_id_var()),
 570        }
 571
 572        CONSTRAINT_PARSERS = {
 573            **parser.Parser.CONSTRAINT_PARSERS,
 574            "INDEX": lambda self: self._parse_index_constraint(),
 575            "CODEC": lambda self: self._parse_compress(),
 576        }
 577
 578        ALTER_PARSERS = {
 579            **parser.Parser.ALTER_PARSERS,
 580            "REPLACE": lambda self: self._parse_alter_table_replace(),
 581        }
 582
 583        SCHEMA_UNNAMED_CONSTRAINTS = {
 584            *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS,
 585            "INDEX",
 586        }
 587
 588        PLACEHOLDER_PARSERS = {
 589            **parser.Parser.PLACEHOLDER_PARSERS,
 590            TokenType.L_BRACE: lambda self: self._parse_query_parameter(),
 591        }
 592
 593        def _parse_engine_property(self) -> exp.EngineProperty:
 594            self._match(TokenType.EQ)
 595            return self.expression(
 596                exp.EngineProperty,
 597                this=self._parse_field(any_token=True, anonymous_func=True),
 598            )
 599
 600        # https://clickhouse.com/docs/en/sql-reference/statements/create/function
 601        def _parse_user_defined_function_expression(self) -> t.Optional[exp.Expression]:
 602            return self._parse_lambda()
 603
 604        def _parse_types(
 605            self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True
 606        ) -> t.Optional[exp.Expression]:
 607            dtype = super()._parse_types(
 608                check_func=check_func, schema=schema, allow_identifiers=allow_identifiers
 609            )
 610            if isinstance(dtype, exp.DataType) and dtype.args.get("nullable") is not True:
 611                # Mark every type as non-nullable which is ClickHouse's default, unless it's
 612                # already marked as nullable. This marker helps us transpile types from other
 613                # dialects to ClickHouse, so that we can e.g. produce `CAST(x AS Nullable(String))`
 614                # from `CAST(x AS TEXT)`. If there is a `NULL` value in `x`, the former would
 615                # fail in ClickHouse without the `Nullable` type constructor.
 616                dtype.set("nullable", False)
 617
 618            return dtype
 619
 620        def _parse_extract(self) -> exp.Extract | exp.Anonymous:
 621            index = self._index
 622            this = self._parse_bitwise()
 623            if self._match(TokenType.FROM):
 624                self._retreat(index)
 625                return super()._parse_extract()
 626
 627            # We return Anonymous here because extract and regexpExtract have different semantics,
 628            # so parsing extract(foo, bar) into RegexpExtract can potentially break queries. E.g.,
 629            # `extract('foobar', 'b')` works, but ClickHouse crashes for `regexpExtract('foobar', 'b')`.
 630            #
 631            # TODO: can we somehow convert the former into an equivalent `regexpExtract` call?
 632            self._match(TokenType.COMMA)
 633            return self.expression(
 634                exp.Anonymous, this="extract", expressions=[this, self._parse_bitwise()]
 635            )
 636
 637        def _parse_assignment(self) -> t.Optional[exp.Expression]:
 638            this = super()._parse_assignment()
 639
 640            if self._match(TokenType.PLACEHOLDER):
 641                return self.expression(
 642                    exp.If,
 643                    this=this,
 644                    true=self._parse_assignment(),
 645                    false=self._match(TokenType.COLON) and self._parse_assignment(),
 646                )
 647
 648            return this
 649
 650        def _parse_query_parameter(self) -> t.Optional[exp.Expression]:
 651            """
 652            Parse a placeholder expression like SELECT {abc: UInt32} or FROM {table: Identifier}
 653            https://clickhouse.com/docs/en/sql-reference/syntax#defining-and-using-query-parameters
 654            """
 655            index = self._index
 656
 657            this = self._parse_id_var()
 658            self._match(TokenType.COLON)
 659            kind = self._parse_types(check_func=False, allow_identifiers=False) or (
 660                self._match_text_seq("IDENTIFIER") and "Identifier"
 661            )
 662
 663            if not kind:
 664                self._retreat(index)
 665                return None
 666            elif not self._match(TokenType.R_BRACE):
 667                self.raise_error("Expecting }")
 668
 669            if isinstance(this, exp.Identifier) and not this.quoted:
 670                this = exp.var(this.name)
 671
 672            return self.expression(exp.Placeholder, this=this, kind=kind)
 673
 674        def _parse_bracket(
 675            self, this: t.Optional[exp.Expression] = None
 676        ) -> t.Optional[exp.Expression]:
 677            l_brace = self._match(TokenType.L_BRACE, advance=False)
 678            bracket = super()._parse_bracket(this)
 679
 680            if l_brace and isinstance(bracket, exp.Struct):
 681                varmap = exp.VarMap(keys=exp.Array(), values=exp.Array())
 682                for expression in bracket.expressions:
 683                    if not isinstance(expression, exp.PropertyEQ):
 684                        break
 685
 686                    varmap.args["keys"].append("expressions", exp.Literal.string(expression.name))
 687                    varmap.args["values"].append("expressions", expression.expression)
 688
 689                return varmap
 690
 691            return bracket
 692
 693        def _parse_in(self, this: t.Optional[exp.Expression], is_global: bool = False) -> exp.In:
 694            this = super()._parse_in(this)
 695            this.set("is_global", is_global)
 696            return this
 697
 698        def _parse_global_in(self, this: t.Optional[exp.Expression]) -> exp.Not | exp.In:
 699            is_negated = self._match(TokenType.NOT)
 700            this = self._match(TokenType.IN) and self._parse_in(this, is_global=True)
 701            return self.expression(exp.Not, this=this) if is_negated else this
 702
 703        def _parse_table(
 704            self,
 705            schema: bool = False,
 706            joins: bool = False,
 707            alias_tokens: t.Optional[t.Collection[TokenType]] = None,
 708            parse_bracket: bool = False,
 709            is_db_reference: bool = False,
 710            parse_partition: bool = False,
 711            consume_pipe: bool = False,
 712        ) -> t.Optional[exp.Expression]:
 713            this = super()._parse_table(
 714                schema=schema,
 715                joins=joins,
 716                alias_tokens=alias_tokens,
 717                parse_bracket=parse_bracket,
 718                is_db_reference=is_db_reference,
 719            )
 720
 721            if isinstance(this, exp.Table):
 722                inner = this.this
 723                alias = this.args.get("alias")
 724
 725                if isinstance(inner, exp.GenerateSeries) and alias and not alias.columns:
 726                    alias.set("columns", [exp.to_identifier("generate_series")])
 727
 728            if self._match(TokenType.FINAL):
 729                this = self.expression(exp.Final, this=this)
 730
 731            return this
 732
 733        def _parse_position(self, haystack_first: bool = False) -> exp.StrPosition:
 734            return super()._parse_position(haystack_first=True)
 735
 736        # https://clickhouse.com/docs/en/sql-reference/statements/select/with/
 737        def _parse_cte(self) -> t.Optional[exp.CTE]:
 738            # WITH <identifier> AS <subquery expression>
 739            cte: t.Optional[exp.CTE] = self._try_parse(super()._parse_cte)
 740
 741            if not cte:
 742                # WITH <expression> AS <identifier>
 743                cte = self.expression(
 744                    exp.CTE,
 745                    this=self._parse_assignment(),
 746                    alias=self._parse_table_alias(),
 747                    scalar=True,
 748                )
 749
 750            return cte
 751
 752        def _parse_join_parts(
 753            self,
 754        ) -> t.Tuple[t.Optional[Token], t.Optional[Token], t.Optional[Token]]:
 755            is_global = self._match(TokenType.GLOBAL) and self._prev
 756            kind_pre = self._match_set(self.JOIN_KINDS, advance=False) and self._prev
 757
 758            if kind_pre:
 759                kind = self._match_set(self.JOIN_KINDS) and self._prev
 760                side = self._match_set(self.JOIN_SIDES) and self._prev
 761                return is_global, side, kind
 762
 763            return (
 764                is_global,
 765                self._match_set(self.JOIN_SIDES) and self._prev,
 766                self._match_set(self.JOIN_KINDS) and self._prev,
 767            )
 768
 769        def _parse_join(
 770            self, skip_join_token: bool = False, parse_bracket: bool = False
 771        ) -> t.Optional[exp.Join]:
 772            join = super()._parse_join(skip_join_token=skip_join_token, parse_bracket=True)
 773            if join:
 774                join.set("global", join.args.pop("method", None))
 775
 776                # tbl ARRAY JOIN arr <-- this should be a `Column` reference, not a `Table`
 777                # https://clickhouse.com/docs/en/sql-reference/statements/select/array-join
 778                if join.kind == "ARRAY":
 779                    for table in join.find_all(exp.Table):
 780                        table.replace(table.to_column())
 781
 782            return join
 783
 784        def _parse_function(
 785            self,
 786            functions: t.Optional[t.Dict[str, t.Callable]] = None,
 787            anonymous: bool = False,
 788            optional_parens: bool = True,
 789            any_token: bool = False,
 790        ) -> t.Optional[exp.Expression]:
 791            expr = super()._parse_function(
 792                functions=functions,
 793                anonymous=anonymous,
 794                optional_parens=optional_parens,
 795                any_token=any_token,
 796            )
 797
 798            func = expr.this if isinstance(expr, exp.Window) else expr
 799
 800            # Aggregate functions can be split in 2 parts: <func_name><suffix>
 801            parts = (
 802                self.AGG_FUNC_MAPPING.get(func.this) if isinstance(func, exp.Anonymous) else None
 803            )
 804
 805            if parts:
 806                anon_func: exp.Anonymous = t.cast(exp.Anonymous, func)
 807                params = self._parse_func_params(anon_func)
 808
 809                kwargs = {
 810                    "this": anon_func.this,
 811                    "expressions": anon_func.expressions,
 812                }
 813                if parts[1]:
 814                    exp_class: t.Type[exp.Expression] = (
 815                        exp.CombinedParameterizedAgg if params else exp.CombinedAggFunc
 816                    )
 817                else:
 818                    exp_class = exp.ParameterizedAgg if params else exp.AnonymousAggFunc
 819
 820                kwargs["exp_class"] = exp_class
 821                if params:
 822                    kwargs["params"] = params
 823
 824                func = self.expression(**kwargs)
 825
 826                if isinstance(expr, exp.Window):
 827                    # The window's func was parsed as Anonymous in base parser, fix its
 828                    # type to be ClickHouse style CombinedAnonymousAggFunc / AnonymousAggFunc
 829                    expr.set("this", func)
 830                elif params:
 831                    # Params have blocked super()._parse_function() from parsing the following window
 832                    # (if that exists) as they're standing between the function call and the window spec
 833                    expr = self._parse_window(func)
 834                else:
 835                    expr = func
 836
 837            return expr
 838
 839        def _parse_func_params(
 840            self, this: t.Optional[exp.Func] = None
 841        ) -> t.Optional[t.List[exp.Expression]]:
 842            if self._match_pair(TokenType.R_PAREN, TokenType.L_PAREN):
 843                return self._parse_csv(self._parse_lambda)
 844
 845            if self._match(TokenType.L_PAREN):
 846                params = self._parse_csv(self._parse_lambda)
 847                self._match_r_paren(this)
 848                return params
 849
 850            return None
 851
 852        def _parse_quantile(self) -> exp.Quantile:
 853            this = self._parse_lambda()
 854            params = self._parse_func_params()
 855            if params:
 856                return self.expression(exp.Quantile, this=params[0], quantile=this)
 857            return self.expression(exp.Quantile, this=this, quantile=exp.Literal.number(0.5))
 858
 859        def _parse_wrapped_id_vars(self, optional: bool = False) -> t.List[exp.Expression]:
 860            return super()._parse_wrapped_id_vars(optional=True)
 861
 862        def _parse_primary_key(
 863            self, wrapped_optional: bool = False, in_props: bool = False
 864        ) -> exp.PrimaryKeyColumnConstraint | exp.PrimaryKey:
 865            return super()._parse_primary_key(
 866                wrapped_optional=wrapped_optional or in_props, in_props=in_props
 867            )
 868
 869        def _parse_on_property(self) -> t.Optional[exp.Expression]:
 870            index = self._index
 871            if self._match_text_seq("CLUSTER"):
 872                this = self._parse_string() or self._parse_id_var()
 873                if this:
 874                    return self.expression(exp.OnCluster, this=this)
 875                else:
 876                    self._retreat(index)
 877            return None
 878
 879        def _parse_index_constraint(
 880            self, kind: t.Optional[str] = None
 881        ) -> exp.IndexColumnConstraint:
 882            # INDEX name1 expr TYPE type1(args) GRANULARITY value
 883            this = self._parse_id_var()
 884            expression = self._parse_assignment()
 885
 886            index_type = self._match_text_seq("TYPE") and (
 887                self._parse_function() or self._parse_var()
 888            )
 889
 890            granularity = self._match_text_seq("GRANULARITY") and self._parse_term()
 891
 892            return self.expression(
 893                exp.IndexColumnConstraint,
 894                this=this,
 895                expression=expression,
 896                index_type=index_type,
 897                granularity=granularity,
 898            )
 899
 900        def _parse_partition(self) -> t.Optional[exp.Partition]:
 901            # https://clickhouse.com/docs/en/sql-reference/statements/alter/partition#how-to-set-partition-expression
 902            if not self._match(TokenType.PARTITION):
 903                return None
 904
 905            if self._match_text_seq("ID"):
 906                # Corresponds to the PARTITION ID <string_value> syntax
 907                expressions: t.List[exp.Expression] = [
 908                    self.expression(exp.PartitionId, this=self._parse_string())
 909                ]
 910            else:
 911                expressions = self._parse_expressions()
 912
 913            return self.expression(exp.Partition, expressions=expressions)
 914
 915        def _parse_alter_table_replace(self) -> t.Optional[exp.Expression]:
 916            partition = self._parse_partition()
 917
 918            if not partition or not self._match(TokenType.FROM):
 919                return None
 920
 921            return self.expression(
 922                exp.ReplacePartition, expression=partition, source=self._parse_table_parts()
 923            )
 924
 925        def _parse_projection_def(self) -> t.Optional[exp.ProjectionDef]:
 926            if not self._match_text_seq("PROJECTION"):
 927                return None
 928
 929            return self.expression(
 930                exp.ProjectionDef,
 931                this=self._parse_id_var(),
 932                expression=self._parse_wrapped(self._parse_statement),
 933            )
 934
 935        def _parse_constraint(self) -> t.Optional[exp.Expression]:
 936            return super()._parse_constraint() or self._parse_projection_def()
 937
 938        def _parse_alias(
 939            self, this: t.Optional[exp.Expression], explicit: bool = False
 940        ) -> t.Optional[exp.Expression]:
 941            # In clickhouse "SELECT <expr> APPLY(...)" is a query modifier,
 942            # so "APPLY" shouldn't be parsed as <expr>'s alias. However, "SELECT <expr> apply" is a valid alias
 943            if self._match_pair(TokenType.APPLY, TokenType.L_PAREN, advance=False):
 944                return this
 945
 946            return super()._parse_alias(this=this, explicit=explicit)
 947
 948        def _parse_expression(self) -> t.Optional[exp.Expression]:
 949            this = super()._parse_expression()
 950
 951            # Clickhouse allows "SELECT <expr> [APPLY(func)] [...]]" modifier
 952            while self._match_pair(TokenType.APPLY, TokenType.L_PAREN):
 953                this = exp.Apply(this=this, expression=self._parse_var(any_token=True))
 954                self._match(TokenType.R_PAREN)
 955
 956            return this
 957
 958        def _parse_columns(self) -> exp.Expression:
 959            this: exp.Expression = self.expression(exp.Columns, this=self._parse_lambda())
 960
 961            while self._next and self._match_text_seq(")", "APPLY", "("):
 962                self._match(TokenType.R_PAREN)
 963                this = exp.Apply(this=this, expression=self._parse_var(any_token=True))
 964            return this
 965
 966        def _parse_value(self, values: bool = True) -> t.Optional[exp.Tuple]:
 967            value = super()._parse_value(values=values)
 968            if not value:
 969                return None
 970
 971            # In Clickhouse "SELECT * FROM VALUES (1, 2, 3)" generates a table with a single column, in contrast
 972            # to other dialects. For this case, we canonicalize the values into a tuple-of-tuples AST if it's not already one.
 973            # In INSERT INTO statements the same clause actually references multiple columns (opposite semantics),
 974            # but the final result is not altered by the extra parentheses.
 975            # Note: Clickhouse allows VALUES([structure], value, ...) so the branch checks for the last expression
 976            expressions = value.expressions
 977            if values and not isinstance(expressions[-1], exp.Tuple):
 978                value.set(
 979                    "expressions",
 980                    [self.expression(exp.Tuple, expressions=[expr]) for expr in expressions],
 981                )
 982
 983            return value
 984
 985        def _parse_partitioned_by(self) -> exp.PartitionedByProperty:
 986            # ClickHouse allows custom expressions as partition key
 987            # https://clickhouse.com/docs/engines/table-engines/mergetree-family/custom-partitioning-key
 988            return self.expression(
 989                exp.PartitionedByProperty,
 990                this=self._parse_assignment(),
 991            )
 992
 993    class Generator(generator.Generator):
 994        QUERY_HINTS = False
 995        STRUCT_DELIMITER = ("(", ")")
 996        NVL2_SUPPORTED = False
 997        TABLESAMPLE_REQUIRES_PARENS = False
 998        TABLESAMPLE_SIZE_IS_ROWS = False
 999        TABLESAMPLE_KEYWORDS = "SAMPLE"
1000        LAST_DAY_SUPPORTS_DATE_PART = False
1001        CAN_IMPLEMENT_ARRAY_ANY = True
1002        SUPPORTS_TO_NUMBER = False
1003        JOIN_HINTS = False
1004        TABLE_HINTS = False
1005        GROUPINGS_SEP = ""
1006        SET_OP_MODIFIERS = False
1007        ARRAY_SIZE_NAME = "LENGTH"
1008        WRAP_DERIVED_VALUES = False
1009
1010        STRING_TYPE_MAPPING = {
1011            exp.DataType.Type.BLOB: "String",
1012            exp.DataType.Type.CHAR: "String",
1013            exp.DataType.Type.LONGBLOB: "String",
1014            exp.DataType.Type.LONGTEXT: "String",
1015            exp.DataType.Type.MEDIUMBLOB: "String",
1016            exp.DataType.Type.MEDIUMTEXT: "String",
1017            exp.DataType.Type.TINYBLOB: "String",
1018            exp.DataType.Type.TINYTEXT: "String",
1019            exp.DataType.Type.TEXT: "String",
1020            exp.DataType.Type.VARBINARY: "String",
1021            exp.DataType.Type.VARCHAR: "String",
1022        }
1023
1024        SUPPORTED_JSON_PATH_PARTS = {
1025            exp.JSONPathKey,
1026            exp.JSONPathRoot,
1027            exp.JSONPathSubscript,
1028        }
1029
1030        TYPE_MAPPING = {
1031            **generator.Generator.TYPE_MAPPING,
1032            **STRING_TYPE_MAPPING,
1033            exp.DataType.Type.ARRAY: "Array",
1034            exp.DataType.Type.BOOLEAN: "Bool",
1035            exp.DataType.Type.BIGINT: "Int64",
1036            exp.DataType.Type.DATE32: "Date32",
1037            exp.DataType.Type.DATETIME: "DateTime",
1038            exp.DataType.Type.DATETIME2: "DateTime",
1039            exp.DataType.Type.SMALLDATETIME: "DateTime",
1040            exp.DataType.Type.DATETIME64: "DateTime64",
1041            exp.DataType.Type.DECIMAL: "Decimal",
1042            exp.DataType.Type.DECIMAL32: "Decimal32",
1043            exp.DataType.Type.DECIMAL64: "Decimal64",
1044            exp.DataType.Type.DECIMAL128: "Decimal128",
1045            exp.DataType.Type.DECIMAL256: "Decimal256",
1046            exp.DataType.Type.TIMESTAMP: "DateTime",
1047            exp.DataType.Type.TIMESTAMPNTZ: "DateTime",
1048            exp.DataType.Type.TIMESTAMPTZ: "DateTime",
1049            exp.DataType.Type.DOUBLE: "Float64",
1050            exp.DataType.Type.ENUM: "Enum",
1051            exp.DataType.Type.ENUM8: "Enum8",
1052            exp.DataType.Type.ENUM16: "Enum16",
1053            exp.DataType.Type.FIXEDSTRING: "FixedString",
1054            exp.DataType.Type.FLOAT: "Float32",
1055            exp.DataType.Type.INT: "Int32",
1056            exp.DataType.Type.MEDIUMINT: "Int32",
1057            exp.DataType.Type.INT128: "Int128",
1058            exp.DataType.Type.INT256: "Int256",
1059            exp.DataType.Type.LOWCARDINALITY: "LowCardinality",
1060            exp.DataType.Type.MAP: "Map",
1061            exp.DataType.Type.NESTED: "Nested",
1062            exp.DataType.Type.NOTHING: "Nothing",
1063            exp.DataType.Type.SMALLINT: "Int16",
1064            exp.DataType.Type.STRUCT: "Tuple",
1065            exp.DataType.Type.TINYINT: "Int8",
1066            exp.DataType.Type.UBIGINT: "UInt64",
1067            exp.DataType.Type.UINT: "UInt32",
1068            exp.DataType.Type.UINT128: "UInt128",
1069            exp.DataType.Type.UINT256: "UInt256",
1070            exp.DataType.Type.USMALLINT: "UInt16",
1071            exp.DataType.Type.UTINYINT: "UInt8",
1072            exp.DataType.Type.IPV4: "IPv4",
1073            exp.DataType.Type.IPV6: "IPv6",
1074            exp.DataType.Type.POINT: "Point",
1075            exp.DataType.Type.RING: "Ring",
1076            exp.DataType.Type.LINESTRING: "LineString",
1077            exp.DataType.Type.MULTILINESTRING: "MultiLineString",
1078            exp.DataType.Type.POLYGON: "Polygon",
1079            exp.DataType.Type.MULTIPOLYGON: "MultiPolygon",
1080            exp.DataType.Type.AGGREGATEFUNCTION: "AggregateFunction",
1081            exp.DataType.Type.SIMPLEAGGREGATEFUNCTION: "SimpleAggregateFunction",
1082            exp.DataType.Type.DYNAMIC: "Dynamic",
1083        }
1084
1085        TRANSFORMS = {
1086            **generator.Generator.TRANSFORMS,
1087            exp.AnyValue: rename_func("any"),
1088            exp.ApproxDistinct: rename_func("uniq"),
1089            exp.ArrayConcat: rename_func("arrayConcat"),
1090            exp.ArrayFilter: lambda self, e: self.func("arrayFilter", e.expression, e.this),
1091            exp.ArrayRemove: remove_from_array_using_filter,
1092            exp.ArrayReverse: rename_func("arrayReverse"),
1093            exp.ArraySlice: rename_func("arraySlice"),
1094            exp.ArraySum: rename_func("arraySum"),
1095            exp.ArgMax: arg_max_or_min_no_count("argMax"),
1096            exp.ArgMin: arg_max_or_min_no_count("argMin"),
1097            exp.Array: inline_array_sql,
1098            exp.CastToStrType: rename_func("CAST"),
1099            exp.CountIf: rename_func("countIf"),
1100            exp.CosineDistance: rename_func("cosineDistance"),
1101            exp.CompressColumnConstraint: lambda self,
1102            e: f"CODEC({self.expressions(e, key='this', flat=True)})",
1103            exp.ComputedColumnConstraint: lambda self,
1104            e: f"{'MATERIALIZED' if e.args.get('persisted') else 'ALIAS'} {self.sql(e, 'this')}",
1105            exp.CurrentDate: lambda self, e: self.func("CURRENT_DATE"),
1106            exp.DateAdd: _datetime_delta_sql("DATE_ADD"),
1107            exp.DateDiff: _datetime_delta_sql("DATE_DIFF"),
1108            exp.DateStrToDate: rename_func("toDate"),
1109            exp.DateSub: _datetime_delta_sql("DATE_SUB"),
1110            exp.Explode: rename_func("arrayJoin"),
1111            exp.FarmFingerprint: rename_func("farmFingerprint64"),
1112            exp.Final: lambda self, e: f"{self.sql(e, 'this')} FINAL",
1113            exp.IsNan: rename_func("isNaN"),
1114            exp.JSONCast: lambda self, e: f"{self.sql(e, 'this')}.:{self.sql(e, 'to')}",
1115            exp.JSONExtract: json_extract_segments("JSONExtractString", quoted_index=False),
1116            exp.JSONExtractScalar: json_extract_segments("JSONExtractString", quoted_index=False),
1117            exp.JSONPathKey: json_path_key_only_name,
1118            exp.JSONPathRoot: lambda *_: "",
1119            exp.Length: length_or_char_length_sql,
1120            exp.Map: _map_sql,
1121            exp.Median: rename_func("median"),
1122            exp.Nullif: rename_func("nullIf"),
1123            exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}",
1124            exp.Pivot: no_pivot_sql,
1125            exp.Quantile: _quantile_sql,
1126            exp.RegexpLike: lambda self, e: self.func("match", e.this, e.expression),
1127            exp.Rand: rename_func("randCanonical"),
1128            exp.StartsWith: rename_func("startsWith"),
1129            exp.EndsWith: rename_func("endsWith"),
1130            exp.EuclideanDistance: rename_func("L2Distance"),
1131            exp.StrPosition: lambda self, e: strposition_sql(
1132                self,
1133                e,
1134                func_name="POSITION",
1135                supports_position=True,
1136                use_ansi_position=False,
1137            ),
1138            exp.TimeToStr: lambda self, e: self.func(
1139                "formatDateTime", e.this, self.format_time(e), e.args.get("zone")
1140            ),
1141            exp.TimeStrToTime: _timestrtotime_sql,
1142            exp.TimestampAdd: _datetime_delta_sql("TIMESTAMP_ADD"),
1143            exp.TimestampSub: _datetime_delta_sql("TIMESTAMP_SUB"),
1144            exp.Typeof: rename_func("toTypeName"),
1145            exp.VarMap: _map_sql,
1146            exp.Xor: lambda self, e: self.func("xor", e.this, e.expression, *e.expressions),
1147            exp.MD5Digest: rename_func("MD5"),
1148            exp.MD5: lambda self, e: self.func("LOWER", self.func("HEX", self.func("MD5", e.this))),
1149            exp.SHA: rename_func("SHA1"),
1150            exp.SHA2: sha256_sql,
1151            exp.UnixToTime: _unix_to_time_sql,
1152            exp.TimestampTrunc: timestamptrunc_sql(zone=True),
1153            exp.Trim: lambda self, e: trim_sql(self, e, default_trim_type="BOTH"),
1154            exp.Variance: rename_func("varSamp"),
1155            exp.SchemaCommentProperty: lambda self, e: self.naked_property(e),
1156            exp.Stddev: rename_func("stddevSamp"),
1157            exp.Chr: rename_func("CHAR"),
1158            exp.Lag: lambda self, e: self.func(
1159                "lagInFrame", e.this, e.args.get("offset"), e.args.get("default")
1160            ),
1161            exp.Lead: lambda self, e: self.func(
1162                "leadInFrame", e.this, e.args.get("offset"), e.args.get("default")
1163            ),
1164            exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")(
1165                rename_func("editDistance")
1166            ),
1167            exp.ParseDatetime: rename_func("parseDateTime"),
1168        }
1169
1170        PROPERTIES_LOCATION = {
1171            **generator.Generator.PROPERTIES_LOCATION,
1172            exp.OnCluster: exp.Properties.Location.POST_NAME,
1173            exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA,
1174            exp.ToTableProperty: exp.Properties.Location.POST_NAME,
1175            exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED,
1176        }
1177
1178        # There's no list in docs, but it can be found in Clickhouse code
1179        # see `ClickHouse/src/Parsers/ParserCreate*.cpp`
1180        ON_CLUSTER_TARGETS = {
1181            "SCHEMA",  # Transpiled CREATE SCHEMA may have OnCluster property set
1182            "DATABASE",
1183            "TABLE",
1184            "VIEW",
1185            "DICTIONARY",
1186            "INDEX",
1187            "FUNCTION",
1188            "NAMED COLLECTION",
1189        }
1190
1191        # https://clickhouse.com/docs/en/sql-reference/data-types/nullable
1192        NON_NULLABLE_TYPES = {
1193            exp.DataType.Type.ARRAY,
1194            exp.DataType.Type.MAP,
1195            exp.DataType.Type.STRUCT,
1196            exp.DataType.Type.POINT,
1197            exp.DataType.Type.RING,
1198            exp.DataType.Type.LINESTRING,
1199            exp.DataType.Type.MULTILINESTRING,
1200            exp.DataType.Type.POLYGON,
1201            exp.DataType.Type.MULTIPOLYGON,
1202        }
1203
1204        def offset_sql(self, expression: exp.Offset) -> str:
1205            offset = super().offset_sql(expression)
1206
1207            # OFFSET ... FETCH syntax requires a "ROW" or "ROWS" keyword
1208            # https://clickhouse.com/docs/sql-reference/statements/select/offset
1209            parent = expression.parent
1210            if isinstance(parent, exp.Select) and isinstance(parent.args.get("limit"), exp.Fetch):
1211                offset = f"{offset} ROWS"
1212
1213            return offset
1214
1215        def strtodate_sql(self, expression: exp.StrToDate) -> str:
1216            strtodate_sql = self.function_fallback_sql(expression)
1217
1218            if not isinstance(expression.parent, exp.Cast):
1219                # StrToDate returns DATEs in other dialects (eg. postgres), so
1220                # this branch aims to improve the transpilation to clickhouse
1221                return self.cast_sql(exp.cast(expression, "DATE"))
1222
1223            return strtodate_sql
1224
1225        def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str:
1226            this = expression.this
1227
1228            if isinstance(this, exp.StrToDate) and expression.to == exp.DataType.build("datetime"):
1229                return self.sql(this)
1230
1231            return super().cast_sql(expression, safe_prefix=safe_prefix)
1232
1233        def trycast_sql(self, expression: exp.TryCast) -> str:
1234            dtype = expression.to
1235            if not dtype.is_type(*self.NON_NULLABLE_TYPES, check_nullable=True):
1236                # Casting x into Nullable(T) appears to behave similarly to TRY_CAST(x AS T)
1237                dtype.set("nullable", True)
1238
1239            return super().cast_sql(expression)
1240
1241        def _jsonpathsubscript_sql(self, expression: exp.JSONPathSubscript) -> str:
1242            this = self.json_path_part(expression.this)
1243            return str(int(this) + 1) if is_int(this) else this
1244
1245        def likeproperty_sql(self, expression: exp.LikeProperty) -> str:
1246            return f"AS {self.sql(expression, 'this')}"
1247
1248        def _any_to_has(
1249            self,
1250            expression: exp.EQ | exp.NEQ,
1251            default: t.Callable[[t.Any], str],
1252            prefix: str = "",
1253        ) -> str:
1254            if isinstance(expression.left, exp.Any):
1255                arr = expression.left
1256                this = expression.right
1257            elif isinstance(expression.right, exp.Any):
1258                arr = expression.right
1259                this = expression.left
1260            else:
1261                return default(expression)
1262
1263            return prefix + self.func("has", arr.this.unnest(), this)
1264
1265        def eq_sql(self, expression: exp.EQ) -> str:
1266            return self._any_to_has(expression, super().eq_sql)
1267
1268        def neq_sql(self, expression: exp.NEQ) -> str:
1269            return self._any_to_has(expression, super().neq_sql, "NOT ")
1270
1271        def regexpilike_sql(self, expression: exp.RegexpILike) -> str:
1272            # Manually add a flag to make the search case-insensitive
1273            regex = self.func("CONCAT", "'(?i)'", expression.expression)
1274            return self.func("match", expression.this, regex)
1275
1276        def datatype_sql(self, expression: exp.DataType) -> str:
1277            # String is the standard ClickHouse type, every other variant is just an alias.
1278            # Additionally, any supplied length parameter will be ignored.
1279            #
1280            # https://clickhouse.com/docs/en/sql-reference/data-types/string
1281            if expression.this in self.STRING_TYPE_MAPPING:
1282                dtype = "String"
1283            else:
1284                dtype = super().datatype_sql(expression)
1285
1286            # This section changes the type to `Nullable(...)` if the following conditions hold:
1287            # - It's marked as nullable - this ensures we won't wrap ClickHouse types with `Nullable`
1288            #   and change their semantics
1289            # - It's not the key type of a `Map`. This is because ClickHouse enforces the following
1290            #   constraint: "Type of Map key must be a type, that can be represented by integer or
1291            #   String or FixedString (possibly LowCardinality) or UUID or IPv6"
1292            # - It's not a composite type, e.g. `Nullable(Array(...))` is not a valid type
1293            parent = expression.parent
1294            nullable = expression.args.get("nullable")
1295            if nullable is True or (
1296                nullable is None
1297                and not (
1298                    isinstance(parent, exp.DataType)
1299                    and parent.is_type(exp.DataType.Type.MAP, check_nullable=True)
1300                    and expression.index in (None, 0)
1301                )
1302                and not expression.is_type(*self.NON_NULLABLE_TYPES, check_nullable=True)
1303            ):
1304                dtype = f"Nullable({dtype})"
1305
1306            return dtype
1307
1308        def cte_sql(self, expression: exp.CTE) -> str:
1309            if expression.args.get("scalar"):
1310                this = self.sql(expression, "this")
1311                alias = self.sql(expression, "alias")
1312                return f"{this} AS {alias}"
1313
1314            return super().cte_sql(expression)
1315
1316        def after_limit_modifiers(self, expression: exp.Expression) -> t.List[str]:
1317            return super().after_limit_modifiers(expression) + [
1318                (
1319                    self.seg("SETTINGS ") + self.expressions(expression, key="settings", flat=True)
1320                    if expression.args.get("settings")
1321                    else ""
1322                ),
1323                (
1324                    self.seg("FORMAT ") + self.sql(expression, "format")
1325                    if expression.args.get("format")
1326                    else ""
1327                ),
1328            ]
1329
1330        def placeholder_sql(self, expression: exp.Placeholder) -> str:
1331            return f"{{{expression.name}: {self.sql(expression, 'kind')}}}"
1332
1333        def oncluster_sql(self, expression: exp.OnCluster) -> str:
1334            return f"ON CLUSTER {self.sql(expression, 'this')}"
1335
1336        def createable_sql(self, expression: exp.Create, locations: t.DefaultDict) -> str:
1337            if expression.kind in self.ON_CLUSTER_TARGETS and locations.get(
1338                exp.Properties.Location.POST_NAME
1339            ):
1340                this_name = self.sql(
1341                    expression.this if isinstance(expression.this, exp.Schema) else expression,
1342                    "this",
1343                )
1344                this_properties = " ".join(
1345                    [self.sql(prop) for prop in locations[exp.Properties.Location.POST_NAME]]
1346                )
1347                this_schema = self.schema_columns_sql(expression.this)
1348                this_schema = f"{self.sep()}{this_schema}" if this_schema else ""
1349
1350                return f"{this_name}{self.sep()}{this_properties}{this_schema}"
1351
1352            return super().createable_sql(expression, locations)
1353
1354        def create_sql(self, expression: exp.Create) -> str:
1355            # The comment property comes last in CTAS statements, i.e. after the query
1356            query = expression.expression
1357            if isinstance(query, exp.Query):
1358                comment_prop = expression.find(exp.SchemaCommentProperty)
1359                if comment_prop:
1360                    comment_prop.pop()
1361                    query.replace(exp.paren(query))
1362            else:
1363                comment_prop = None
1364
1365            create_sql = super().create_sql(expression)
1366
1367            comment_sql = self.sql(comment_prop)
1368            comment_sql = f" {comment_sql}" if comment_sql else ""
1369
1370            return f"{create_sql}{comment_sql}"
1371
1372        def prewhere_sql(self, expression: exp.PreWhere) -> str:
1373            this = self.indent(self.sql(expression, "this"))
1374            return f"{self.seg('PREWHERE')}{self.sep()}{this}"
1375
1376        def indexcolumnconstraint_sql(self, expression: exp.IndexColumnConstraint) -> str:
1377            this = self.sql(expression, "this")
1378            this = f" {this}" if this else ""
1379            expr = self.sql(expression, "expression")
1380            expr = f" {expr}" if expr else ""
1381            index_type = self.sql(expression, "index_type")
1382            index_type = f" TYPE {index_type}" if index_type else ""
1383            granularity = self.sql(expression, "granularity")
1384            granularity = f" GRANULARITY {granularity}" if granularity else ""
1385
1386            return f"INDEX{this}{expr}{index_type}{granularity}"
1387
1388        def partition_sql(self, expression: exp.Partition) -> str:
1389            return f"PARTITION {self.expressions(expression, flat=True)}"
1390
1391        def partitionid_sql(self, expression: exp.PartitionId) -> str:
1392            return f"ID {self.sql(expression.this)}"
1393
1394        def replacepartition_sql(self, expression: exp.ReplacePartition) -> str:
1395            return (
1396                f"REPLACE {self.sql(expression.expression)} FROM {self.sql(expression, 'source')}"
1397            )
1398
1399        def projectiondef_sql(self, expression: exp.ProjectionDef) -> str:
1400            return f"PROJECTION {self.sql(expression.this)} {self.wrap(expression.expression)}"
1401
1402        def is_sql(self, expression: exp.Is) -> str:
1403            is_sql = super().is_sql(expression)
1404
1405            if isinstance(expression.parent, exp.Not):
1406                # value IS NOT NULL -> NOT (value IS NULL)
1407                is_sql = self.wrap(is_sql)
1408
1409            return is_sql
1410
1411        def in_sql(self, expression: exp.In) -> str:
1412            in_sql = super().in_sql(expression)
1413
1414            if isinstance(expression.parent, exp.Not) and expression.args.get("is_global"):
1415                in_sql = in_sql.replace("GLOBAL IN", "GLOBAL NOT IN", 1)
1416
1417            return in_sql
1418
1419        def not_sql(self, expression: exp.Not) -> str:
1420            if isinstance(expression.this, exp.In) and expression.this.args.get("is_global"):
1421                # let `GLOBAL IN` child interpose `NOT`
1422                return self.sql(expression, "this")
1423
1424            return super().not_sql(expression)
1425
1426        def values_sql(self, expression: exp.Values, values_as_table: bool = True) -> str:
1427            # If the VALUES clause contains tuples of expressions, we need to treat it
1428            # as a table since Clickhouse will automatically alias it as such.
1429            alias = expression.args.get("alias")
1430
1431            if alias and alias.args.get("columns") and expression.expressions:
1432                values = expression.expressions[0].expressions
1433                values_as_table = any(isinstance(value, exp.Tuple) for value in values)
1434            else:
1435                values_as_table = True
1436
1437            return super().values_sql(expression, values_as_table=values_as_table)
class ClickHouse(sqlglot.dialects.dialect.Dialect):
 192class ClickHouse(Dialect):
 193    INDEX_OFFSET = 1
 194    NORMALIZE_FUNCTIONS: bool | str = False
 195    NULL_ORDERING = "nulls_are_last"
 196    SUPPORTS_USER_DEFINED_TYPES = False
 197    SAFE_DIVISION = True
 198    LOG_BASE_FIRST: t.Optional[bool] = None
 199    FORCE_EARLY_ALIAS_REF_EXPANSION = True
 200    PRESERVE_ORIGINAL_NAMES = True
 201    NUMBERS_CAN_BE_UNDERSCORE_SEPARATED = True
 202    IDENTIFIERS_CAN_START_WITH_DIGIT = True
 203    HEX_STRING_IS_INTEGER_TYPE = True
 204
 205    # https://github.com/ClickHouse/ClickHouse/issues/33935#issue-1112165779
 206    NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_SENSITIVE
 207
 208    UNESCAPED_SEQUENCES = {
 209        "\\0": "\0",
 210    }
 211
 212    CREATABLE_KIND_MAPPING = {"DATABASE": "SCHEMA"}
 213
 214    SET_OP_DISTINCT_BY_DEFAULT: t.Dict[t.Type[exp.Expression], t.Optional[bool]] = {
 215        exp.Except: False,
 216        exp.Intersect: False,
 217        exp.Union: None,
 218    }
 219
 220    def generate_values_aliases(self, expression: exp.Values) -> t.List[exp.Identifier]:
 221        # Clickhouse allows VALUES to have an embedded structure e.g:
 222        # VALUES('person String, place String', ('Noah', 'Paris'), ...)
 223        # In this case, we don't want to qualify the columns
 224        values = expression.expressions[0].expressions
 225
 226        structure = (
 227            values[0]
 228            if (len(values) > 1 and values[0].is_string and isinstance(values[1], exp.Tuple))
 229            else None
 230        )
 231        if structure:
 232            # Split each column definition into the column name e.g:
 233            # 'person String, place String' -> ['person', 'place']
 234            structure_coldefs = [coldef.strip() for coldef in structure.name.split(",")]
 235            column_aliases = [
 236                exp.to_identifier(coldef.split(" ")[0]) for coldef in structure_coldefs
 237            ]
 238        else:
 239            # Default column aliases in CH are "c1", "c2", etc.
 240            column_aliases = [
 241                exp.to_identifier(f"c{i + 1}") for i in range(len(values[0].expressions))
 242            ]
 243
 244        return column_aliases
 245
 246    class Tokenizer(tokens.Tokenizer):
 247        COMMENTS = ["--", "#", "#!", ("/*", "*/")]
 248        IDENTIFIERS = ['"', "`"]
 249        IDENTIFIER_ESCAPES = ["\\"]
 250        STRING_ESCAPES = ["'", "\\"]
 251        BIT_STRINGS = [("0b", "")]
 252        HEX_STRINGS = [("0x", ""), ("0X", "")]
 253        HEREDOC_STRINGS = ["$"]
 254
 255        KEYWORDS = {
 256            **tokens.Tokenizer.KEYWORDS,
 257            ".:": TokenType.DOTCOLON,
 258            "ATTACH": TokenType.COMMAND,
 259            "DATE32": TokenType.DATE32,
 260            "DATETIME64": TokenType.DATETIME64,
 261            "DICTIONARY": TokenType.DICTIONARY,
 262            "DYNAMIC": TokenType.DYNAMIC,
 263            "ENUM8": TokenType.ENUM8,
 264            "ENUM16": TokenType.ENUM16,
 265            "EXCHANGE": TokenType.COMMAND,
 266            "FINAL": TokenType.FINAL,
 267            "FIXEDSTRING": TokenType.FIXEDSTRING,
 268            "FLOAT32": TokenType.FLOAT,
 269            "FLOAT64": TokenType.DOUBLE,
 270            "GLOBAL": TokenType.GLOBAL,
 271            "LOWCARDINALITY": TokenType.LOWCARDINALITY,
 272            "MAP": TokenType.MAP,
 273            "NESTED": TokenType.NESTED,
 274            "NOTHING": TokenType.NOTHING,
 275            "SAMPLE": TokenType.TABLE_SAMPLE,
 276            "TUPLE": TokenType.STRUCT,
 277            "UINT16": TokenType.USMALLINT,
 278            "UINT32": TokenType.UINT,
 279            "UINT64": TokenType.UBIGINT,
 280            "UINT8": TokenType.UTINYINT,
 281            "IPV4": TokenType.IPV4,
 282            "IPV6": TokenType.IPV6,
 283            "POINT": TokenType.POINT,
 284            "RING": TokenType.RING,
 285            "LINESTRING": TokenType.LINESTRING,
 286            "MULTILINESTRING": TokenType.MULTILINESTRING,
 287            "POLYGON": TokenType.POLYGON,
 288            "MULTIPOLYGON": TokenType.MULTIPOLYGON,
 289            "AGGREGATEFUNCTION": TokenType.AGGREGATEFUNCTION,
 290            "SIMPLEAGGREGATEFUNCTION": TokenType.SIMPLEAGGREGATEFUNCTION,
 291            "SYSTEM": TokenType.COMMAND,
 292            "PREWHERE": TokenType.PREWHERE,
 293        }
 294        KEYWORDS.pop("/*+")
 295
 296        SINGLE_TOKENS = {
 297            **tokens.Tokenizer.SINGLE_TOKENS,
 298            "$": TokenType.HEREDOC_STRING,
 299        }
 300
 301    class Parser(parser.Parser):
 302        # Tested in ClickHouse's playground, it seems that the following two queries do the same thing
 303        # * select x from t1 union all select x from t2 limit 1;
 304        # * select x from t1 union all (select x from t2 limit 1);
 305        MODIFIERS_ATTACHED_TO_SET_OP = False
 306        INTERVAL_SPANS = False
 307        OPTIONAL_ALIAS_TOKEN_CTE = False
 308        JOINS_HAVE_EQUAL_PRECEDENCE = True
 309
 310        FUNCTIONS = {
 311            **parser.Parser.FUNCTIONS,
 312            "ANY": exp.AnyValue.from_arg_list,
 313            "ARRAYSUM": exp.ArraySum.from_arg_list,
 314            "ARRAYREVERSE": exp.ArrayReverse.from_arg_list,
 315            "ARRAYSLICE": exp.ArraySlice.from_arg_list,
 316            "COUNTIF": _build_count_if,
 317            "COSINEDISTANCE": exp.CosineDistance.from_arg_list,
 318            "DATE_ADD": build_date_delta(exp.DateAdd, default_unit=None),
 319            "DATEADD": build_date_delta(exp.DateAdd, default_unit=None),
 320            "DATE_DIFF": build_date_delta(exp.DateDiff, default_unit=None, supports_timezone=True),
 321            "DATEDIFF": build_date_delta(exp.DateDiff, default_unit=None, supports_timezone=True),
 322            "DATE_FORMAT": _build_datetime_format(exp.TimeToStr),
 323            "DATE_SUB": build_date_delta(exp.DateSub, default_unit=None),
 324            "DATESUB": build_date_delta(exp.DateSub, default_unit=None),
 325            "FORMATDATETIME": _build_datetime_format(exp.TimeToStr),
 326            "JSONEXTRACTSTRING": build_json_extract_path(
 327                exp.JSONExtractScalar, zero_based_indexing=False
 328            ),
 329            "LENGTH": lambda args: exp.Length(this=seq_get(args, 0), binary=True),
 330            "L2Distance": exp.EuclideanDistance.from_arg_list,
 331            "MAP": parser.build_var_map,
 332            "MATCH": exp.RegexpLike.from_arg_list,
 333            "PARSEDATETIME": _build_datetime_format(exp.ParseDatetime),
 334            "RANDCANONICAL": exp.Rand.from_arg_list,
 335            "STR_TO_DATE": _build_str_to_date,
 336            "TUPLE": exp.Struct.from_arg_list,
 337            "TIMESTAMP_SUB": build_date_delta(exp.TimestampSub, default_unit=None),
 338            "TIMESTAMPSUB": build_date_delta(exp.TimestampSub, default_unit=None),
 339            "TIMESTAMP_ADD": build_date_delta(exp.TimestampAdd, default_unit=None),
 340            "TIMESTAMPADD": build_date_delta(exp.TimestampAdd, default_unit=None),
 341            "UNIQ": exp.ApproxDistinct.from_arg_list,
 342            "XOR": lambda args: exp.Xor(expressions=args),
 343            "MD5": exp.MD5Digest.from_arg_list,
 344            "SHA256": lambda args: exp.SHA2(this=seq_get(args, 0), length=exp.Literal.number(256)),
 345            "SHA512": lambda args: exp.SHA2(this=seq_get(args, 0), length=exp.Literal.number(512)),
 346            "SUBSTRINGINDEX": exp.SubstringIndex.from_arg_list,
 347            "TOTYPENAME": exp.Typeof.from_arg_list,
 348            "EDITDISTANCE": exp.Levenshtein.from_arg_list,
 349            "LEVENSHTEINDISTANCE": exp.Levenshtein.from_arg_list,
 350        }
 351        FUNCTIONS.pop("TRANSFORM")
 352        FUNCTIONS.pop("APPROX_TOP_SUM")
 353
 354        AGG_FUNCTIONS = {
 355            "count",
 356            "min",
 357            "max",
 358            "sum",
 359            "avg",
 360            "any",
 361            "stddevPop",
 362            "stddevSamp",
 363            "varPop",
 364            "varSamp",
 365            "corr",
 366            "covarPop",
 367            "covarSamp",
 368            "entropy",
 369            "exponentialMovingAverage",
 370            "intervalLengthSum",
 371            "kolmogorovSmirnovTest",
 372            "mannWhitneyUTest",
 373            "median",
 374            "rankCorr",
 375            "sumKahan",
 376            "studentTTest",
 377            "welchTTest",
 378            "anyHeavy",
 379            "anyLast",
 380            "boundingRatio",
 381            "first_value",
 382            "last_value",
 383            "argMin",
 384            "argMax",
 385            "avgWeighted",
 386            "topK",
 387            "approx_top_sum",
 388            "topKWeighted",
 389            "deltaSum",
 390            "deltaSumTimestamp",
 391            "groupArray",
 392            "groupArrayLast",
 393            "groupUniqArray",
 394            "groupArrayInsertAt",
 395            "groupArrayMovingAvg",
 396            "groupArrayMovingSum",
 397            "groupArraySample",
 398            "groupBitAnd",
 399            "groupBitOr",
 400            "groupBitXor",
 401            "groupBitmap",
 402            "groupBitmapAnd",
 403            "groupBitmapOr",
 404            "groupBitmapXor",
 405            "sumWithOverflow",
 406            "sumMap",
 407            "minMap",
 408            "maxMap",
 409            "skewSamp",
 410            "skewPop",
 411            "kurtSamp",
 412            "kurtPop",
 413            "uniq",
 414            "uniqExact",
 415            "uniqCombined",
 416            "uniqCombined64",
 417            "uniqHLL12",
 418            "uniqTheta",
 419            "quantile",
 420            "quantiles",
 421            "quantileExact",
 422            "quantilesExact",
 423            "quantileExactLow",
 424            "quantilesExactLow",
 425            "quantileExactHigh",
 426            "quantilesExactHigh",
 427            "quantileExactWeighted",
 428            "quantilesExactWeighted",
 429            "quantileTiming",
 430            "quantilesTiming",
 431            "quantileTimingWeighted",
 432            "quantilesTimingWeighted",
 433            "quantileDeterministic",
 434            "quantilesDeterministic",
 435            "quantileTDigest",
 436            "quantilesTDigest",
 437            "quantileTDigestWeighted",
 438            "quantilesTDigestWeighted",
 439            "quantileBFloat16",
 440            "quantilesBFloat16",
 441            "quantileBFloat16Weighted",
 442            "quantilesBFloat16Weighted",
 443            "simpleLinearRegression",
 444            "stochasticLinearRegression",
 445            "stochasticLogisticRegression",
 446            "categoricalInformationValue",
 447            "contingency",
 448            "cramersV",
 449            "cramersVBiasCorrected",
 450            "theilsU",
 451            "maxIntersections",
 452            "maxIntersectionsPosition",
 453            "meanZTest",
 454            "quantileInterpolatedWeighted",
 455            "quantilesInterpolatedWeighted",
 456            "quantileGK",
 457            "quantilesGK",
 458            "sparkBar",
 459            "sumCount",
 460            "largestTriangleThreeBuckets",
 461            "histogram",
 462            "sequenceMatch",
 463            "sequenceCount",
 464            "windowFunnel",
 465            "retention",
 466            "uniqUpTo",
 467            "sequenceNextNode",
 468            "exponentialTimeDecayedAvg",
 469        }
 470
 471        AGG_FUNCTIONS_SUFFIXES = [
 472            "If",
 473            "Array",
 474            "ArrayIf",
 475            "Map",
 476            "SimpleState",
 477            "State",
 478            "Merge",
 479            "MergeState",
 480            "ForEach",
 481            "Distinct",
 482            "OrDefault",
 483            "OrNull",
 484            "Resample",
 485            "ArgMin",
 486            "ArgMax",
 487        ]
 488
 489        FUNC_TOKENS = {
 490            *parser.Parser.FUNC_TOKENS,
 491            TokenType.AND,
 492            TokenType.OR,
 493            TokenType.SET,
 494        }
 495
 496        RESERVED_TOKENS = parser.Parser.RESERVED_TOKENS - {TokenType.SELECT}
 497
 498        ID_VAR_TOKENS = {
 499            *parser.Parser.ID_VAR_TOKENS,
 500            TokenType.LIKE,
 501        }
 502
 503        AGG_FUNC_MAPPING = (
 504            lambda functions, suffixes: {
 505                f"{f}{sfx}": (f, sfx) for sfx in (suffixes + [""]) for f in functions
 506            }
 507        )(AGG_FUNCTIONS, AGG_FUNCTIONS_SUFFIXES)
 508
 509        FUNCTIONS_WITH_ALIASED_ARGS = {*parser.Parser.FUNCTIONS_WITH_ALIASED_ARGS, "TUPLE"}
 510
 511        FUNCTION_PARSERS = {
 512            **parser.Parser.FUNCTION_PARSERS,
 513            "ARRAYJOIN": lambda self: self.expression(exp.Explode, this=self._parse_expression()),
 514            "QUANTILE": lambda self: self._parse_quantile(),
 515            "MEDIAN": lambda self: self._parse_quantile(),
 516            "COLUMNS": lambda self: self._parse_columns(),
 517        }
 518
 519        FUNCTION_PARSERS.pop("MATCH")
 520
 521        PROPERTY_PARSERS = {
 522            **parser.Parser.PROPERTY_PARSERS,
 523            "ENGINE": lambda self: self._parse_engine_property(),
 524        }
 525        PROPERTY_PARSERS.pop("DYNAMIC")
 526
 527        NO_PAREN_FUNCTION_PARSERS = parser.Parser.NO_PAREN_FUNCTION_PARSERS.copy()
 528        NO_PAREN_FUNCTION_PARSERS.pop("ANY")
 529
 530        NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy()
 531        NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIMESTAMP)
 532
 533        RANGE_PARSERS = {
 534            **parser.Parser.RANGE_PARSERS,
 535            TokenType.GLOBAL: lambda self, this: self._parse_global_in(this),
 536        }
 537
 538        # The PLACEHOLDER entry is popped because 1) it doesn't affect Clickhouse (it corresponds to
 539        # the postgres-specific JSONBContains parser) and 2) it makes parsing the ternary op simpler.
 540        COLUMN_OPERATORS = parser.Parser.COLUMN_OPERATORS.copy()
 541        COLUMN_OPERATORS.pop(TokenType.PLACEHOLDER)
 542
 543        JOIN_KINDS = {
 544            *parser.Parser.JOIN_KINDS,
 545            TokenType.ANY,
 546            TokenType.ASOF,
 547            TokenType.ARRAY,
 548        }
 549
 550        TABLE_ALIAS_TOKENS = parser.Parser.TABLE_ALIAS_TOKENS - {
 551            TokenType.ANY,
 552            TokenType.ARRAY,
 553            TokenType.FINAL,
 554            TokenType.FORMAT,
 555            TokenType.SETTINGS,
 556        }
 557
 558        ALIAS_TOKENS = parser.Parser.ALIAS_TOKENS - {
 559            TokenType.FORMAT,
 560        }
 561
 562        LOG_DEFAULTS_TO_LN = True
 563
 564        QUERY_MODIFIER_PARSERS = {
 565            **parser.Parser.QUERY_MODIFIER_PARSERS,
 566            TokenType.SETTINGS: lambda self: (
 567                "settings",
 568                self._advance() or self._parse_csv(self._parse_assignment),
 569            ),
 570            TokenType.FORMAT: lambda self: ("format", self._advance() or self._parse_id_var()),
 571        }
 572
 573        CONSTRAINT_PARSERS = {
 574            **parser.Parser.CONSTRAINT_PARSERS,
 575            "INDEX": lambda self: self._parse_index_constraint(),
 576            "CODEC": lambda self: self._parse_compress(),
 577        }
 578
 579        ALTER_PARSERS = {
 580            **parser.Parser.ALTER_PARSERS,
 581            "REPLACE": lambda self: self._parse_alter_table_replace(),
 582        }
 583
 584        SCHEMA_UNNAMED_CONSTRAINTS = {
 585            *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS,
 586            "INDEX",
 587        }
 588
 589        PLACEHOLDER_PARSERS = {
 590            **parser.Parser.PLACEHOLDER_PARSERS,
 591            TokenType.L_BRACE: lambda self: self._parse_query_parameter(),
 592        }
 593
 594        def _parse_engine_property(self) -> exp.EngineProperty:
 595            self._match(TokenType.EQ)
 596            return self.expression(
 597                exp.EngineProperty,
 598                this=self._parse_field(any_token=True, anonymous_func=True),
 599            )
 600
 601        # https://clickhouse.com/docs/en/sql-reference/statements/create/function
 602        def _parse_user_defined_function_expression(self) -> t.Optional[exp.Expression]:
 603            return self._parse_lambda()
 604
 605        def _parse_types(
 606            self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True
 607        ) -> t.Optional[exp.Expression]:
 608            dtype = super()._parse_types(
 609                check_func=check_func, schema=schema, allow_identifiers=allow_identifiers
 610            )
 611            if isinstance(dtype, exp.DataType) and dtype.args.get("nullable") is not True:
 612                # Mark every type as non-nullable which is ClickHouse's default, unless it's
 613                # already marked as nullable. This marker helps us transpile types from other
 614                # dialects to ClickHouse, so that we can e.g. produce `CAST(x AS Nullable(String))`
 615                # from `CAST(x AS TEXT)`. If there is a `NULL` value in `x`, the former would
 616                # fail in ClickHouse without the `Nullable` type constructor.
 617                dtype.set("nullable", False)
 618
 619            return dtype
 620
 621        def _parse_extract(self) -> exp.Extract | exp.Anonymous:
 622            index = self._index
 623            this = self._parse_bitwise()
 624            if self._match(TokenType.FROM):
 625                self._retreat(index)
 626                return super()._parse_extract()
 627
 628            # We return Anonymous here because extract and regexpExtract have different semantics,
 629            # so parsing extract(foo, bar) into RegexpExtract can potentially break queries. E.g.,
 630            # `extract('foobar', 'b')` works, but ClickHouse crashes for `regexpExtract('foobar', 'b')`.
 631            #
 632            # TODO: can we somehow convert the former into an equivalent `regexpExtract` call?
 633            self._match(TokenType.COMMA)
 634            return self.expression(
 635                exp.Anonymous, this="extract", expressions=[this, self._parse_bitwise()]
 636            )
 637
 638        def _parse_assignment(self) -> t.Optional[exp.Expression]:
 639            this = super()._parse_assignment()
 640
 641            if self._match(TokenType.PLACEHOLDER):
 642                return self.expression(
 643                    exp.If,
 644                    this=this,
 645                    true=self._parse_assignment(),
 646                    false=self._match(TokenType.COLON) and self._parse_assignment(),
 647                )
 648
 649            return this
 650
 651        def _parse_query_parameter(self) -> t.Optional[exp.Expression]:
 652            """
 653            Parse a placeholder expression like SELECT {abc: UInt32} or FROM {table: Identifier}
 654            https://clickhouse.com/docs/en/sql-reference/syntax#defining-and-using-query-parameters
 655            """
 656            index = self._index
 657
 658            this = self._parse_id_var()
 659            self._match(TokenType.COLON)
 660            kind = self._parse_types(check_func=False, allow_identifiers=False) or (
 661                self._match_text_seq("IDENTIFIER") and "Identifier"
 662            )
 663
 664            if not kind:
 665                self._retreat(index)
 666                return None
 667            elif not self._match(TokenType.R_BRACE):
 668                self.raise_error("Expecting }")
 669
 670            if isinstance(this, exp.Identifier) and not this.quoted:
 671                this = exp.var(this.name)
 672
 673            return self.expression(exp.Placeholder, this=this, kind=kind)
 674
 675        def _parse_bracket(
 676            self, this: t.Optional[exp.Expression] = None
 677        ) -> t.Optional[exp.Expression]:
 678            l_brace = self._match(TokenType.L_BRACE, advance=False)
 679            bracket = super()._parse_bracket(this)
 680
 681            if l_brace and isinstance(bracket, exp.Struct):
 682                varmap = exp.VarMap(keys=exp.Array(), values=exp.Array())
 683                for expression in bracket.expressions:
 684                    if not isinstance(expression, exp.PropertyEQ):
 685                        break
 686
 687                    varmap.args["keys"].append("expressions", exp.Literal.string(expression.name))
 688                    varmap.args["values"].append("expressions", expression.expression)
 689
 690                return varmap
 691
 692            return bracket
 693
 694        def _parse_in(self, this: t.Optional[exp.Expression], is_global: bool = False) -> exp.In:
 695            this = super()._parse_in(this)
 696            this.set("is_global", is_global)
 697            return this
 698
 699        def _parse_global_in(self, this: t.Optional[exp.Expression]) -> exp.Not | exp.In:
 700            is_negated = self._match(TokenType.NOT)
 701            this = self._match(TokenType.IN) and self._parse_in(this, is_global=True)
 702            return self.expression(exp.Not, this=this) if is_negated else this
 703
 704        def _parse_table(
 705            self,
 706            schema: bool = False,
 707            joins: bool = False,
 708            alias_tokens: t.Optional[t.Collection[TokenType]] = None,
 709            parse_bracket: bool = False,
 710            is_db_reference: bool = False,
 711            parse_partition: bool = False,
 712            consume_pipe: bool = False,
 713        ) -> t.Optional[exp.Expression]:
 714            this = super()._parse_table(
 715                schema=schema,
 716                joins=joins,
 717                alias_tokens=alias_tokens,
 718                parse_bracket=parse_bracket,
 719                is_db_reference=is_db_reference,
 720            )
 721
 722            if isinstance(this, exp.Table):
 723                inner = this.this
 724                alias = this.args.get("alias")
 725
 726                if isinstance(inner, exp.GenerateSeries) and alias and not alias.columns:
 727                    alias.set("columns", [exp.to_identifier("generate_series")])
 728
 729            if self._match(TokenType.FINAL):
 730                this = self.expression(exp.Final, this=this)
 731
 732            return this
 733
 734        def _parse_position(self, haystack_first: bool = False) -> exp.StrPosition:
 735            return super()._parse_position(haystack_first=True)
 736
 737        # https://clickhouse.com/docs/en/sql-reference/statements/select/with/
 738        def _parse_cte(self) -> t.Optional[exp.CTE]:
 739            # WITH <identifier> AS <subquery expression>
 740            cte: t.Optional[exp.CTE] = self._try_parse(super()._parse_cte)
 741
 742            if not cte:
 743                # WITH <expression> AS <identifier>
 744                cte = self.expression(
 745                    exp.CTE,
 746                    this=self._parse_assignment(),
 747                    alias=self._parse_table_alias(),
 748                    scalar=True,
 749                )
 750
 751            return cte
 752
 753        def _parse_join_parts(
 754            self,
 755        ) -> t.Tuple[t.Optional[Token], t.Optional[Token], t.Optional[Token]]:
 756            is_global = self._match(TokenType.GLOBAL) and self._prev
 757            kind_pre = self._match_set(self.JOIN_KINDS, advance=False) and self._prev
 758
 759            if kind_pre:
 760                kind = self._match_set(self.JOIN_KINDS) and self._prev
 761                side = self._match_set(self.JOIN_SIDES) and self._prev
 762                return is_global, side, kind
 763
 764            return (
 765                is_global,
 766                self._match_set(self.JOIN_SIDES) and self._prev,
 767                self._match_set(self.JOIN_KINDS) and self._prev,
 768            )
 769
 770        def _parse_join(
 771            self, skip_join_token: bool = False, parse_bracket: bool = False
 772        ) -> t.Optional[exp.Join]:
 773            join = super()._parse_join(skip_join_token=skip_join_token, parse_bracket=True)
 774            if join:
 775                join.set("global", join.args.pop("method", None))
 776
 777                # tbl ARRAY JOIN arr <-- this should be a `Column` reference, not a `Table`
 778                # https://clickhouse.com/docs/en/sql-reference/statements/select/array-join
 779                if join.kind == "ARRAY":
 780                    for table in join.find_all(exp.Table):
 781                        table.replace(table.to_column())
 782
 783            return join
 784
 785        def _parse_function(
 786            self,
 787            functions: t.Optional[t.Dict[str, t.Callable]] = None,
 788            anonymous: bool = False,
 789            optional_parens: bool = True,
 790            any_token: bool = False,
 791        ) -> t.Optional[exp.Expression]:
 792            expr = super()._parse_function(
 793                functions=functions,
 794                anonymous=anonymous,
 795                optional_parens=optional_parens,
 796                any_token=any_token,
 797            )
 798
 799            func = expr.this if isinstance(expr, exp.Window) else expr
 800
 801            # Aggregate functions can be split in 2 parts: <func_name><suffix>
 802            parts = (
 803                self.AGG_FUNC_MAPPING.get(func.this) if isinstance(func, exp.Anonymous) else None
 804            )
 805
 806            if parts:
 807                anon_func: exp.Anonymous = t.cast(exp.Anonymous, func)
 808                params = self._parse_func_params(anon_func)
 809
 810                kwargs = {
 811                    "this": anon_func.this,
 812                    "expressions": anon_func.expressions,
 813                }
 814                if parts[1]:
 815                    exp_class: t.Type[exp.Expression] = (
 816                        exp.CombinedParameterizedAgg if params else exp.CombinedAggFunc
 817                    )
 818                else:
 819                    exp_class = exp.ParameterizedAgg if params else exp.AnonymousAggFunc
 820
 821                kwargs["exp_class"] = exp_class
 822                if params:
 823                    kwargs["params"] = params
 824
 825                func = self.expression(**kwargs)
 826
 827                if isinstance(expr, exp.Window):
 828                    # The window's func was parsed as Anonymous in base parser, fix its
 829                    # type to be ClickHouse style CombinedAnonymousAggFunc / AnonymousAggFunc
 830                    expr.set("this", func)
 831                elif params:
 832                    # Params have blocked super()._parse_function() from parsing the following window
 833                    # (if that exists) as they're standing between the function call and the window spec
 834                    expr = self._parse_window(func)
 835                else:
 836                    expr = func
 837
 838            return expr
 839
 840        def _parse_func_params(
 841            self, this: t.Optional[exp.Func] = None
 842        ) -> t.Optional[t.List[exp.Expression]]:
 843            if self._match_pair(TokenType.R_PAREN, TokenType.L_PAREN):
 844                return self._parse_csv(self._parse_lambda)
 845
 846            if self._match(TokenType.L_PAREN):
 847                params = self._parse_csv(self._parse_lambda)
 848                self._match_r_paren(this)
 849                return params
 850
 851            return None
 852
 853        def _parse_quantile(self) -> exp.Quantile:
 854            this = self._parse_lambda()
 855            params = self._parse_func_params()
 856            if params:
 857                return self.expression(exp.Quantile, this=params[0], quantile=this)
 858            return self.expression(exp.Quantile, this=this, quantile=exp.Literal.number(0.5))
 859
 860        def _parse_wrapped_id_vars(self, optional: bool = False) -> t.List[exp.Expression]:
 861            return super()._parse_wrapped_id_vars(optional=True)
 862
 863        def _parse_primary_key(
 864            self, wrapped_optional: bool = False, in_props: bool = False
 865        ) -> exp.PrimaryKeyColumnConstraint | exp.PrimaryKey:
 866            return super()._parse_primary_key(
 867                wrapped_optional=wrapped_optional or in_props, in_props=in_props
 868            )
 869
 870        def _parse_on_property(self) -> t.Optional[exp.Expression]:
 871            index = self._index
 872            if self._match_text_seq("CLUSTER"):
 873                this = self._parse_string() or self._parse_id_var()
 874                if this:
 875                    return self.expression(exp.OnCluster, this=this)
 876                else:
 877                    self._retreat(index)
 878            return None
 879
 880        def _parse_index_constraint(
 881            self, kind: t.Optional[str] = None
 882        ) -> exp.IndexColumnConstraint:
 883            # INDEX name1 expr TYPE type1(args) GRANULARITY value
 884            this = self._parse_id_var()
 885            expression = self._parse_assignment()
 886
 887            index_type = self._match_text_seq("TYPE") and (
 888                self._parse_function() or self._parse_var()
 889            )
 890
 891            granularity = self._match_text_seq("GRANULARITY") and self._parse_term()
 892
 893            return self.expression(
 894                exp.IndexColumnConstraint,
 895                this=this,
 896                expression=expression,
 897                index_type=index_type,
 898                granularity=granularity,
 899            )
 900
 901        def _parse_partition(self) -> t.Optional[exp.Partition]:
 902            # https://clickhouse.com/docs/en/sql-reference/statements/alter/partition#how-to-set-partition-expression
 903            if not self._match(TokenType.PARTITION):
 904                return None
 905
 906            if self._match_text_seq("ID"):
 907                # Corresponds to the PARTITION ID <string_value> syntax
 908                expressions: t.List[exp.Expression] = [
 909                    self.expression(exp.PartitionId, this=self._parse_string())
 910                ]
 911            else:
 912                expressions = self._parse_expressions()
 913
 914            return self.expression(exp.Partition, expressions=expressions)
 915
 916        def _parse_alter_table_replace(self) -> t.Optional[exp.Expression]:
 917            partition = self._parse_partition()
 918
 919            if not partition or not self._match(TokenType.FROM):
 920                return None
 921
 922            return self.expression(
 923                exp.ReplacePartition, expression=partition, source=self._parse_table_parts()
 924            )
 925
 926        def _parse_projection_def(self) -> t.Optional[exp.ProjectionDef]:
 927            if not self._match_text_seq("PROJECTION"):
 928                return None
 929
 930            return self.expression(
 931                exp.ProjectionDef,
 932                this=self._parse_id_var(),
 933                expression=self._parse_wrapped(self._parse_statement),
 934            )
 935
 936        def _parse_constraint(self) -> t.Optional[exp.Expression]:
 937            return super()._parse_constraint() or self._parse_projection_def()
 938
 939        def _parse_alias(
 940            self, this: t.Optional[exp.Expression], explicit: bool = False
 941        ) -> t.Optional[exp.Expression]:
 942            # In clickhouse "SELECT <expr> APPLY(...)" is a query modifier,
 943            # so "APPLY" shouldn't be parsed as <expr>'s alias. However, "SELECT <expr> apply" is a valid alias
 944            if self._match_pair(TokenType.APPLY, TokenType.L_PAREN, advance=False):
 945                return this
 946
 947            return super()._parse_alias(this=this, explicit=explicit)
 948
 949        def _parse_expression(self) -> t.Optional[exp.Expression]:
 950            this = super()._parse_expression()
 951
 952            # Clickhouse allows "SELECT <expr> [APPLY(func)] [...]]" modifier
 953            while self._match_pair(TokenType.APPLY, TokenType.L_PAREN):
 954                this = exp.Apply(this=this, expression=self._parse_var(any_token=True))
 955                self._match(TokenType.R_PAREN)
 956
 957            return this
 958
 959        def _parse_columns(self) -> exp.Expression:
 960            this: exp.Expression = self.expression(exp.Columns, this=self._parse_lambda())
 961
 962            while self._next and self._match_text_seq(")", "APPLY", "("):
 963                self._match(TokenType.R_PAREN)
 964                this = exp.Apply(this=this, expression=self._parse_var(any_token=True))
 965            return this
 966
 967        def _parse_value(self, values: bool = True) -> t.Optional[exp.Tuple]:
 968            value = super()._parse_value(values=values)
 969            if not value:
 970                return None
 971
 972            # In Clickhouse "SELECT * FROM VALUES (1, 2, 3)" generates a table with a single column, in contrast
 973            # to other dialects. For this case, we canonicalize the values into a tuple-of-tuples AST if it's not already one.
 974            # In INSERT INTO statements the same clause actually references multiple columns (opposite semantics),
 975            # but the final result is not altered by the extra parentheses.
 976            # Note: Clickhouse allows VALUES([structure], value, ...) so the branch checks for the last expression
 977            expressions = value.expressions
 978            if values and not isinstance(expressions[-1], exp.Tuple):
 979                value.set(
 980                    "expressions",
 981                    [self.expression(exp.Tuple, expressions=[expr]) for expr in expressions],
 982                )
 983
 984            return value
 985
 986        def _parse_partitioned_by(self) -> exp.PartitionedByProperty:
 987            # ClickHouse allows custom expressions as partition key
 988            # https://clickhouse.com/docs/engines/table-engines/mergetree-family/custom-partitioning-key
 989            return self.expression(
 990                exp.PartitionedByProperty,
 991                this=self._parse_assignment(),
 992            )
 993
 994    class Generator(generator.Generator):
 995        QUERY_HINTS = False
 996        STRUCT_DELIMITER = ("(", ")")
 997        NVL2_SUPPORTED = False
 998        TABLESAMPLE_REQUIRES_PARENS = False
 999        TABLESAMPLE_SIZE_IS_ROWS = False
1000        TABLESAMPLE_KEYWORDS = "SAMPLE"
1001        LAST_DAY_SUPPORTS_DATE_PART = False
1002        CAN_IMPLEMENT_ARRAY_ANY = True
1003        SUPPORTS_TO_NUMBER = False
1004        JOIN_HINTS = False
1005        TABLE_HINTS = False
1006        GROUPINGS_SEP = ""
1007        SET_OP_MODIFIERS = False
1008        ARRAY_SIZE_NAME = "LENGTH"
1009        WRAP_DERIVED_VALUES = False
1010
1011        STRING_TYPE_MAPPING = {
1012            exp.DataType.Type.BLOB: "String",
1013            exp.DataType.Type.CHAR: "String",
1014            exp.DataType.Type.LONGBLOB: "String",
1015            exp.DataType.Type.LONGTEXT: "String",
1016            exp.DataType.Type.MEDIUMBLOB: "String",
1017            exp.DataType.Type.MEDIUMTEXT: "String",
1018            exp.DataType.Type.TINYBLOB: "String",
1019            exp.DataType.Type.TINYTEXT: "String",
1020            exp.DataType.Type.TEXT: "String",
1021            exp.DataType.Type.VARBINARY: "String",
1022            exp.DataType.Type.VARCHAR: "String",
1023        }
1024
1025        SUPPORTED_JSON_PATH_PARTS = {
1026            exp.JSONPathKey,
1027            exp.JSONPathRoot,
1028            exp.JSONPathSubscript,
1029        }
1030
1031        TYPE_MAPPING = {
1032            **generator.Generator.TYPE_MAPPING,
1033            **STRING_TYPE_MAPPING,
1034            exp.DataType.Type.ARRAY: "Array",
1035            exp.DataType.Type.BOOLEAN: "Bool",
1036            exp.DataType.Type.BIGINT: "Int64",
1037            exp.DataType.Type.DATE32: "Date32",
1038            exp.DataType.Type.DATETIME: "DateTime",
1039            exp.DataType.Type.DATETIME2: "DateTime",
1040            exp.DataType.Type.SMALLDATETIME: "DateTime",
1041            exp.DataType.Type.DATETIME64: "DateTime64",
1042            exp.DataType.Type.DECIMAL: "Decimal",
1043            exp.DataType.Type.DECIMAL32: "Decimal32",
1044            exp.DataType.Type.DECIMAL64: "Decimal64",
1045            exp.DataType.Type.DECIMAL128: "Decimal128",
1046            exp.DataType.Type.DECIMAL256: "Decimal256",
1047            exp.DataType.Type.TIMESTAMP: "DateTime",
1048            exp.DataType.Type.TIMESTAMPNTZ: "DateTime",
1049            exp.DataType.Type.TIMESTAMPTZ: "DateTime",
1050            exp.DataType.Type.DOUBLE: "Float64",
1051            exp.DataType.Type.ENUM: "Enum",
1052            exp.DataType.Type.ENUM8: "Enum8",
1053            exp.DataType.Type.ENUM16: "Enum16",
1054            exp.DataType.Type.FIXEDSTRING: "FixedString",
1055            exp.DataType.Type.FLOAT: "Float32",
1056            exp.DataType.Type.INT: "Int32",
1057            exp.DataType.Type.MEDIUMINT: "Int32",
1058            exp.DataType.Type.INT128: "Int128",
1059            exp.DataType.Type.INT256: "Int256",
1060            exp.DataType.Type.LOWCARDINALITY: "LowCardinality",
1061            exp.DataType.Type.MAP: "Map",
1062            exp.DataType.Type.NESTED: "Nested",
1063            exp.DataType.Type.NOTHING: "Nothing",
1064            exp.DataType.Type.SMALLINT: "Int16",
1065            exp.DataType.Type.STRUCT: "Tuple",
1066            exp.DataType.Type.TINYINT: "Int8",
1067            exp.DataType.Type.UBIGINT: "UInt64",
1068            exp.DataType.Type.UINT: "UInt32",
1069            exp.DataType.Type.UINT128: "UInt128",
1070            exp.DataType.Type.UINT256: "UInt256",
1071            exp.DataType.Type.USMALLINT: "UInt16",
1072            exp.DataType.Type.UTINYINT: "UInt8",
1073            exp.DataType.Type.IPV4: "IPv4",
1074            exp.DataType.Type.IPV6: "IPv6",
1075            exp.DataType.Type.POINT: "Point",
1076            exp.DataType.Type.RING: "Ring",
1077            exp.DataType.Type.LINESTRING: "LineString",
1078            exp.DataType.Type.MULTILINESTRING: "MultiLineString",
1079            exp.DataType.Type.POLYGON: "Polygon",
1080            exp.DataType.Type.MULTIPOLYGON: "MultiPolygon",
1081            exp.DataType.Type.AGGREGATEFUNCTION: "AggregateFunction",
1082            exp.DataType.Type.SIMPLEAGGREGATEFUNCTION: "SimpleAggregateFunction",
1083            exp.DataType.Type.DYNAMIC: "Dynamic",
1084        }
1085
1086        TRANSFORMS = {
1087            **generator.Generator.TRANSFORMS,
1088            exp.AnyValue: rename_func("any"),
1089            exp.ApproxDistinct: rename_func("uniq"),
1090            exp.ArrayConcat: rename_func("arrayConcat"),
1091            exp.ArrayFilter: lambda self, e: self.func("arrayFilter", e.expression, e.this),
1092            exp.ArrayRemove: remove_from_array_using_filter,
1093            exp.ArrayReverse: rename_func("arrayReverse"),
1094            exp.ArraySlice: rename_func("arraySlice"),
1095            exp.ArraySum: rename_func("arraySum"),
1096            exp.ArgMax: arg_max_or_min_no_count("argMax"),
1097            exp.ArgMin: arg_max_or_min_no_count("argMin"),
1098            exp.Array: inline_array_sql,
1099            exp.CastToStrType: rename_func("CAST"),
1100            exp.CountIf: rename_func("countIf"),
1101            exp.CosineDistance: rename_func("cosineDistance"),
1102            exp.CompressColumnConstraint: lambda self,
1103            e: f"CODEC({self.expressions(e, key='this', flat=True)})",
1104            exp.ComputedColumnConstraint: lambda self,
1105            e: f"{'MATERIALIZED' if e.args.get('persisted') else 'ALIAS'} {self.sql(e, 'this')}",
1106            exp.CurrentDate: lambda self, e: self.func("CURRENT_DATE"),
1107            exp.DateAdd: _datetime_delta_sql("DATE_ADD"),
1108            exp.DateDiff: _datetime_delta_sql("DATE_DIFF"),
1109            exp.DateStrToDate: rename_func("toDate"),
1110            exp.DateSub: _datetime_delta_sql("DATE_SUB"),
1111            exp.Explode: rename_func("arrayJoin"),
1112            exp.FarmFingerprint: rename_func("farmFingerprint64"),
1113            exp.Final: lambda self, e: f"{self.sql(e, 'this')} FINAL",
1114            exp.IsNan: rename_func("isNaN"),
1115            exp.JSONCast: lambda self, e: f"{self.sql(e, 'this')}.:{self.sql(e, 'to')}",
1116            exp.JSONExtract: json_extract_segments("JSONExtractString", quoted_index=False),
1117            exp.JSONExtractScalar: json_extract_segments("JSONExtractString", quoted_index=False),
1118            exp.JSONPathKey: json_path_key_only_name,
1119            exp.JSONPathRoot: lambda *_: "",
1120            exp.Length: length_or_char_length_sql,
1121            exp.Map: _map_sql,
1122            exp.Median: rename_func("median"),
1123            exp.Nullif: rename_func("nullIf"),
1124            exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}",
1125            exp.Pivot: no_pivot_sql,
1126            exp.Quantile: _quantile_sql,
1127            exp.RegexpLike: lambda self, e: self.func("match", e.this, e.expression),
1128            exp.Rand: rename_func("randCanonical"),
1129            exp.StartsWith: rename_func("startsWith"),
1130            exp.EndsWith: rename_func("endsWith"),
1131            exp.EuclideanDistance: rename_func("L2Distance"),
1132            exp.StrPosition: lambda self, e: strposition_sql(
1133                self,
1134                e,
1135                func_name="POSITION",
1136                supports_position=True,
1137                use_ansi_position=False,
1138            ),
1139            exp.TimeToStr: lambda self, e: self.func(
1140                "formatDateTime", e.this, self.format_time(e), e.args.get("zone")
1141            ),
1142            exp.TimeStrToTime: _timestrtotime_sql,
1143            exp.TimestampAdd: _datetime_delta_sql("TIMESTAMP_ADD"),
1144            exp.TimestampSub: _datetime_delta_sql("TIMESTAMP_SUB"),
1145            exp.Typeof: rename_func("toTypeName"),
1146            exp.VarMap: _map_sql,
1147            exp.Xor: lambda self, e: self.func("xor", e.this, e.expression, *e.expressions),
1148            exp.MD5Digest: rename_func("MD5"),
1149            exp.MD5: lambda self, e: self.func("LOWER", self.func("HEX", self.func("MD5", e.this))),
1150            exp.SHA: rename_func("SHA1"),
1151            exp.SHA2: sha256_sql,
1152            exp.UnixToTime: _unix_to_time_sql,
1153            exp.TimestampTrunc: timestamptrunc_sql(zone=True),
1154            exp.Trim: lambda self, e: trim_sql(self, e, default_trim_type="BOTH"),
1155            exp.Variance: rename_func("varSamp"),
1156            exp.SchemaCommentProperty: lambda self, e: self.naked_property(e),
1157            exp.Stddev: rename_func("stddevSamp"),
1158            exp.Chr: rename_func("CHAR"),
1159            exp.Lag: lambda self, e: self.func(
1160                "lagInFrame", e.this, e.args.get("offset"), e.args.get("default")
1161            ),
1162            exp.Lead: lambda self, e: self.func(
1163                "leadInFrame", e.this, e.args.get("offset"), e.args.get("default")
1164            ),
1165            exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")(
1166                rename_func("editDistance")
1167            ),
1168            exp.ParseDatetime: rename_func("parseDateTime"),
1169        }
1170
1171        PROPERTIES_LOCATION = {
1172            **generator.Generator.PROPERTIES_LOCATION,
1173            exp.OnCluster: exp.Properties.Location.POST_NAME,
1174            exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA,
1175            exp.ToTableProperty: exp.Properties.Location.POST_NAME,
1176            exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED,
1177        }
1178
1179        # There's no list in docs, but it can be found in Clickhouse code
1180        # see `ClickHouse/src/Parsers/ParserCreate*.cpp`
1181        ON_CLUSTER_TARGETS = {
1182            "SCHEMA",  # Transpiled CREATE SCHEMA may have OnCluster property set
1183            "DATABASE",
1184            "TABLE",
1185            "VIEW",
1186            "DICTIONARY",
1187            "INDEX",
1188            "FUNCTION",
1189            "NAMED COLLECTION",
1190        }
1191
1192        # https://clickhouse.com/docs/en/sql-reference/data-types/nullable
1193        NON_NULLABLE_TYPES = {
1194            exp.DataType.Type.ARRAY,
1195            exp.DataType.Type.MAP,
1196            exp.DataType.Type.STRUCT,
1197            exp.DataType.Type.POINT,
1198            exp.DataType.Type.RING,
1199            exp.DataType.Type.LINESTRING,
1200            exp.DataType.Type.MULTILINESTRING,
1201            exp.DataType.Type.POLYGON,
1202            exp.DataType.Type.MULTIPOLYGON,
1203        }
1204
1205        def offset_sql(self, expression: exp.Offset) -> str:
1206            offset = super().offset_sql(expression)
1207
1208            # OFFSET ... FETCH syntax requires a "ROW" or "ROWS" keyword
1209            # https://clickhouse.com/docs/sql-reference/statements/select/offset
1210            parent = expression.parent
1211            if isinstance(parent, exp.Select) and isinstance(parent.args.get("limit"), exp.Fetch):
1212                offset = f"{offset} ROWS"
1213
1214            return offset
1215
1216        def strtodate_sql(self, expression: exp.StrToDate) -> str:
1217            strtodate_sql = self.function_fallback_sql(expression)
1218
1219            if not isinstance(expression.parent, exp.Cast):
1220                # StrToDate returns DATEs in other dialects (eg. postgres), so
1221                # this branch aims to improve the transpilation to clickhouse
1222                return self.cast_sql(exp.cast(expression, "DATE"))
1223
1224            return strtodate_sql
1225
1226        def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str:
1227            this = expression.this
1228
1229            if isinstance(this, exp.StrToDate) and expression.to == exp.DataType.build("datetime"):
1230                return self.sql(this)
1231
1232            return super().cast_sql(expression, safe_prefix=safe_prefix)
1233
1234        def trycast_sql(self, expression: exp.TryCast) -> str:
1235            dtype = expression.to
1236            if not dtype.is_type(*self.NON_NULLABLE_TYPES, check_nullable=True):
1237                # Casting x into Nullable(T) appears to behave similarly to TRY_CAST(x AS T)
1238                dtype.set("nullable", True)
1239
1240            return super().cast_sql(expression)
1241
1242        def _jsonpathsubscript_sql(self, expression: exp.JSONPathSubscript) -> str:
1243            this = self.json_path_part(expression.this)
1244            return str(int(this) + 1) if is_int(this) else this
1245
1246        def likeproperty_sql(self, expression: exp.LikeProperty) -> str:
1247            return f"AS {self.sql(expression, 'this')}"
1248
1249        def _any_to_has(
1250            self,
1251            expression: exp.EQ | exp.NEQ,
1252            default: t.Callable[[t.Any], str],
1253            prefix: str = "",
1254        ) -> str:
1255            if isinstance(expression.left, exp.Any):
1256                arr = expression.left
1257                this = expression.right
1258            elif isinstance(expression.right, exp.Any):
1259                arr = expression.right
1260                this = expression.left
1261            else:
1262                return default(expression)
1263
1264            return prefix + self.func("has", arr.this.unnest(), this)
1265
1266        def eq_sql(self, expression: exp.EQ) -> str:
1267            return self._any_to_has(expression, super().eq_sql)
1268
1269        def neq_sql(self, expression: exp.NEQ) -> str:
1270            return self._any_to_has(expression, super().neq_sql, "NOT ")
1271
1272        def regexpilike_sql(self, expression: exp.RegexpILike) -> str:
1273            # Manually add a flag to make the search case-insensitive
1274            regex = self.func("CONCAT", "'(?i)'", expression.expression)
1275            return self.func("match", expression.this, regex)
1276
1277        def datatype_sql(self, expression: exp.DataType) -> str:
1278            # String is the standard ClickHouse type, every other variant is just an alias.
1279            # Additionally, any supplied length parameter will be ignored.
1280            #
1281            # https://clickhouse.com/docs/en/sql-reference/data-types/string
1282            if expression.this in self.STRING_TYPE_MAPPING:
1283                dtype = "String"
1284            else:
1285                dtype = super().datatype_sql(expression)
1286
1287            # This section changes the type to `Nullable(...)` if the following conditions hold:
1288            # - It's marked as nullable - this ensures we won't wrap ClickHouse types with `Nullable`
1289            #   and change their semantics
1290            # - It's not the key type of a `Map`. This is because ClickHouse enforces the following
1291            #   constraint: "Type of Map key must be a type, that can be represented by integer or
1292            #   String or FixedString (possibly LowCardinality) or UUID or IPv6"
1293            # - It's not a composite type, e.g. `Nullable(Array(...))` is not a valid type
1294            parent = expression.parent
1295            nullable = expression.args.get("nullable")
1296            if nullable is True or (
1297                nullable is None
1298                and not (
1299                    isinstance(parent, exp.DataType)
1300                    and parent.is_type(exp.DataType.Type.MAP, check_nullable=True)
1301                    and expression.index in (None, 0)
1302                )
1303                and not expression.is_type(*self.NON_NULLABLE_TYPES, check_nullable=True)
1304            ):
1305                dtype = f"Nullable({dtype})"
1306
1307            return dtype
1308
1309        def cte_sql(self, expression: exp.CTE) -> str:
1310            if expression.args.get("scalar"):
1311                this = self.sql(expression, "this")
1312                alias = self.sql(expression, "alias")
1313                return f"{this} AS {alias}"
1314
1315            return super().cte_sql(expression)
1316
1317        def after_limit_modifiers(self, expression: exp.Expression) -> t.List[str]:
1318            return super().after_limit_modifiers(expression) + [
1319                (
1320                    self.seg("SETTINGS ") + self.expressions(expression, key="settings", flat=True)
1321                    if expression.args.get("settings")
1322                    else ""
1323                ),
1324                (
1325                    self.seg("FORMAT ") + self.sql(expression, "format")
1326                    if expression.args.get("format")
1327                    else ""
1328                ),
1329            ]
1330
1331        def placeholder_sql(self, expression: exp.Placeholder) -> str:
1332            return f"{{{expression.name}: {self.sql(expression, 'kind')}}}"
1333
1334        def oncluster_sql(self, expression: exp.OnCluster) -> str:
1335            return f"ON CLUSTER {self.sql(expression, 'this')}"
1336
1337        def createable_sql(self, expression: exp.Create, locations: t.DefaultDict) -> str:
1338            if expression.kind in self.ON_CLUSTER_TARGETS and locations.get(
1339                exp.Properties.Location.POST_NAME
1340            ):
1341                this_name = self.sql(
1342                    expression.this if isinstance(expression.this, exp.Schema) else expression,
1343                    "this",
1344                )
1345                this_properties = " ".join(
1346                    [self.sql(prop) for prop in locations[exp.Properties.Location.POST_NAME]]
1347                )
1348                this_schema = self.schema_columns_sql(expression.this)
1349                this_schema = f"{self.sep()}{this_schema}" if this_schema else ""
1350
1351                return f"{this_name}{self.sep()}{this_properties}{this_schema}"
1352
1353            return super().createable_sql(expression, locations)
1354
1355        def create_sql(self, expression: exp.Create) -> str:
1356            # The comment property comes last in CTAS statements, i.e. after the query
1357            query = expression.expression
1358            if isinstance(query, exp.Query):
1359                comment_prop = expression.find(exp.SchemaCommentProperty)
1360                if comment_prop:
1361                    comment_prop.pop()
1362                    query.replace(exp.paren(query))
1363            else:
1364                comment_prop = None
1365
1366            create_sql = super().create_sql(expression)
1367
1368            comment_sql = self.sql(comment_prop)
1369            comment_sql = f" {comment_sql}" if comment_sql else ""
1370
1371            return f"{create_sql}{comment_sql}"
1372
1373        def prewhere_sql(self, expression: exp.PreWhere) -> str:
1374            this = self.indent(self.sql(expression, "this"))
1375            return f"{self.seg('PREWHERE')}{self.sep()}{this}"
1376
1377        def indexcolumnconstraint_sql(self, expression: exp.IndexColumnConstraint) -> str:
1378            this = self.sql(expression, "this")
1379            this = f" {this}" if this else ""
1380            expr = self.sql(expression, "expression")
1381            expr = f" {expr}" if expr else ""
1382            index_type = self.sql(expression, "index_type")
1383            index_type = f" TYPE {index_type}" if index_type else ""
1384            granularity = self.sql(expression, "granularity")
1385            granularity = f" GRANULARITY {granularity}" if granularity else ""
1386
1387            return f"INDEX{this}{expr}{index_type}{granularity}"
1388
1389        def partition_sql(self, expression: exp.Partition) -> str:
1390            return f"PARTITION {self.expressions(expression, flat=True)}"
1391
1392        def partitionid_sql(self, expression: exp.PartitionId) -> str:
1393            return f"ID {self.sql(expression.this)}"
1394
1395        def replacepartition_sql(self, expression: exp.ReplacePartition) -> str:
1396            return (
1397                f"REPLACE {self.sql(expression.expression)} FROM {self.sql(expression, 'source')}"
1398            )
1399
1400        def projectiondef_sql(self, expression: exp.ProjectionDef) -> str:
1401            return f"PROJECTION {self.sql(expression.this)} {self.wrap(expression.expression)}"
1402
1403        def is_sql(self, expression: exp.Is) -> str:
1404            is_sql = super().is_sql(expression)
1405
1406            if isinstance(expression.parent, exp.Not):
1407                # value IS NOT NULL -> NOT (value IS NULL)
1408                is_sql = self.wrap(is_sql)
1409
1410            return is_sql
1411
1412        def in_sql(self, expression: exp.In) -> str:
1413            in_sql = super().in_sql(expression)
1414
1415            if isinstance(expression.parent, exp.Not) and expression.args.get("is_global"):
1416                in_sql = in_sql.replace("GLOBAL IN", "GLOBAL NOT IN", 1)
1417
1418            return in_sql
1419
1420        def not_sql(self, expression: exp.Not) -> str:
1421            if isinstance(expression.this, exp.In) and expression.this.args.get("is_global"):
1422                # let `GLOBAL IN` child interpose `NOT`
1423                return self.sql(expression, "this")
1424
1425            return super().not_sql(expression)
1426
1427        def values_sql(self, expression: exp.Values, values_as_table: bool = True) -> str:
1428            # If the VALUES clause contains tuples of expressions, we need to treat it
1429            # as a table since Clickhouse will automatically alias it as such.
1430            alias = expression.args.get("alias")
1431
1432            if alias and alias.args.get("columns") and expression.expressions:
1433                values = expression.expressions[0].expressions
1434                values_as_table = any(isinstance(value, exp.Tuple) for value in values)
1435            else:
1436                values_as_table = True
1437
1438            return super().values_sql(expression, values_as_table=values_as_table)
INDEX_OFFSET = 1

The base index offset for arrays.

NORMALIZE_FUNCTIONS: bool | str = False

Determines how function names are going to be normalized.

Possible values:

"upper" or True: Convert names to uppercase. "lower": Convert names to lowercase. False: Disables function name normalization.

NULL_ORDERING = 'nulls_are_last'

Default NULL ordering method to use if not explicitly set. Possible values: "nulls_are_small", "nulls_are_large", "nulls_are_last"

SUPPORTS_USER_DEFINED_TYPES = False

Whether user-defined data types are supported.

SAFE_DIVISION = True

Whether division by zero throws an error (False) or returns NULL (True).

LOG_BASE_FIRST: Optional[bool] = None

Whether the base comes first in the LOG function. Possible values: True, False, None (two arguments are not supported by LOG)

FORCE_EARLY_ALIAS_REF_EXPANSION = True

Whether alias reference expansion (_expand_alias_refs()) should run before column qualification (_qualify_columns()).

For example:

WITH data AS ( SELECT 1 AS id, 2 AS my_id ) SELECT id AS my_id FROM data WHERE my_id = 1 GROUP BY my_id, HAVING my_id = 1

In most dialects, "my_id" would refer to "data.my_id" across the query, except: - BigQuery, which will forward the alias to GROUP BY + HAVING clauses i.e it resolves to "WHERE my_id = 1 GROUP BY id HAVING id = 1" - Clickhouse, which will forward the alias across the query i.e it resolves to "WHERE id = 1 GROUP BY id HAVING id = 1"

PRESERVE_ORIGINAL_NAMES = True

Whether the name of the function should be preserved inside the node's metadata, can be useful for roundtripping deprecated vs new functions that share an AST node e.g JSON_VALUE vs JSON_EXTRACT_SCALAR in BigQuery

NUMBERS_CAN_BE_UNDERSCORE_SEPARATED = True

Whether number literals can include underscores for better readability

IDENTIFIERS_CAN_START_WITH_DIGIT = True

Whether an unquoted identifier can start with a digit.

HEX_STRING_IS_INTEGER_TYPE = True

Whether hex strings such as x'CC' evaluate to integer or binary/blob type

NORMALIZATION_STRATEGY = <NormalizationStrategy.CASE_SENSITIVE: 'CASE_SENSITIVE'>

Specifies the strategy according to which identifiers should be normalized.

UNESCAPED_SEQUENCES = {'\\a': '\x07', '\\b': '\x08', '\\f': '\x0c', '\\n': '\n', '\\r': '\r', '\\t': '\t', '\\v': '\x0b', '\\\\': '\\', '\\0': '\x00'}

Mapping of an escaped sequence (\n) to its unescaped version ( ).

CREATABLE_KIND_MAPPING = {'DATABASE': 'SCHEMA'}

Helper for dialects that use a different name for the same creatable kind. For example, the Clickhouse equivalent of CREATE SCHEMA is CREATE DATABASE.

SET_OP_DISTINCT_BY_DEFAULT: Dict[Type[sqlglot.expressions.Expression], Optional[bool]] = {<class 'sqlglot.expressions.Except'>: False, <class 'sqlglot.expressions.Intersect'>: False, <class 'sqlglot.expressions.Union'>: None}

Whether a set operation uses DISTINCT by default. This is None when either DISTINCT or ALL must be explicitly specified.

def generate_values_aliases( self, expression: sqlglot.expressions.Values) -> List[sqlglot.expressions.Identifier]:
220    def generate_values_aliases(self, expression: exp.Values) -> t.List[exp.Identifier]:
221        # Clickhouse allows VALUES to have an embedded structure e.g:
222        # VALUES('person String, place String', ('Noah', 'Paris'), ...)
223        # In this case, we don't want to qualify the columns
224        values = expression.expressions[0].expressions
225
226        structure = (
227            values[0]
228            if (len(values) > 1 and values[0].is_string and isinstance(values[1], exp.Tuple))
229            else None
230        )
231        if structure:
232            # Split each column definition into the column name e.g:
233            # 'person String, place String' -> ['person', 'place']
234            structure_coldefs = [coldef.strip() for coldef in structure.name.split(",")]
235            column_aliases = [
236                exp.to_identifier(coldef.split(" ")[0]) for coldef in structure_coldefs
237            ]
238        else:
239            # Default column aliases in CH are "c1", "c2", etc.
240            column_aliases = [
241                exp.to_identifier(f"c{i + 1}") for i in range(len(values[0].expressions))
242            ]
243
244        return column_aliases
SUPPORTS_COLUMN_JOIN_MARKS = False

Whether the old-style outer join (+) syntax is supported.

tokenizer_class = <class 'ClickHouse.Tokenizer'>
jsonpath_tokenizer_class = <class 'sqlglot.tokens.JSONPathTokenizer'>
parser_class = <class 'ClickHouse.Parser'>
generator_class = <class 'ClickHouse.Generator'>
TIME_TRIE: Dict = {}
FORMAT_TRIE: Dict = {}
INVERSE_TIME_MAPPING: Dict[str, str] = {}
INVERSE_TIME_TRIE: Dict = {}
INVERSE_FORMAT_MAPPING: Dict[str, str] = {}
INVERSE_FORMAT_TRIE: Dict = {}
INVERSE_CREATABLE_KIND_MAPPING: dict[str, str] = {'SCHEMA': 'DATABASE'}
ESCAPED_SEQUENCES: Dict[str, str] = {'\x07': '\\a', '\x08': '\\b', '\x0c': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t', '\x0b': '\\v', '\\': '\\\\', '\x00': '\\0'}
QUOTE_START = "'"
QUOTE_END = "'"
IDENTIFIER_START = '"'
IDENTIFIER_END = '"'
BIT_START: Optional[str] = '0b'
BIT_END: Optional[str] = ''
HEX_START: Optional[str] = '0x'
HEX_END: Optional[str] = ''
BYTE_START: Optional[str] = None
BYTE_END: Optional[str] = None
UNICODE_START: Optional[str] = None
UNICODE_END: Optional[str] = None
class ClickHouse.Tokenizer(sqlglot.tokens.Tokenizer):
246    class Tokenizer(tokens.Tokenizer):
247        COMMENTS = ["--", "#", "#!", ("/*", "*/")]
248        IDENTIFIERS = ['"', "`"]
249        IDENTIFIER_ESCAPES = ["\\"]
250        STRING_ESCAPES = ["'", "\\"]
251        BIT_STRINGS = [("0b", "")]
252        HEX_STRINGS = [("0x", ""), ("0X", "")]
253        HEREDOC_STRINGS = ["$"]
254
255        KEYWORDS = {
256            **tokens.Tokenizer.KEYWORDS,
257            ".:": TokenType.DOTCOLON,
258            "ATTACH": TokenType.COMMAND,
259            "DATE32": TokenType.DATE32,
260            "DATETIME64": TokenType.DATETIME64,
261            "DICTIONARY": TokenType.DICTIONARY,
262            "DYNAMIC": TokenType.DYNAMIC,
263            "ENUM8": TokenType.ENUM8,
264            "ENUM16": TokenType.ENUM16,
265            "EXCHANGE": TokenType.COMMAND,
266            "FINAL": TokenType.FINAL,
267            "FIXEDSTRING": TokenType.FIXEDSTRING,
268            "FLOAT32": TokenType.FLOAT,
269            "FLOAT64": TokenType.DOUBLE,
270            "GLOBAL": TokenType.GLOBAL,
271            "LOWCARDINALITY": TokenType.LOWCARDINALITY,
272            "MAP": TokenType.MAP,
273            "NESTED": TokenType.NESTED,
274            "NOTHING": TokenType.NOTHING,
275            "SAMPLE": TokenType.TABLE_SAMPLE,
276            "TUPLE": TokenType.STRUCT,
277            "UINT16": TokenType.USMALLINT,
278            "UINT32": TokenType.UINT,
279            "UINT64": TokenType.UBIGINT,
280            "UINT8": TokenType.UTINYINT,
281            "IPV4": TokenType.IPV4,
282            "IPV6": TokenType.IPV6,
283            "POINT": TokenType.POINT,
284            "RING": TokenType.RING,
285            "LINESTRING": TokenType.LINESTRING,
286            "MULTILINESTRING": TokenType.MULTILINESTRING,
287            "POLYGON": TokenType.POLYGON,
288            "MULTIPOLYGON": TokenType.MULTIPOLYGON,
289            "AGGREGATEFUNCTION": TokenType.AGGREGATEFUNCTION,
290            "SIMPLEAGGREGATEFUNCTION": TokenType.SIMPLEAGGREGATEFUNCTION,
291            "SYSTEM": TokenType.COMMAND,
292            "PREWHERE": TokenType.PREWHERE,
293        }
294        KEYWORDS.pop("/*+")
295
296        SINGLE_TOKENS = {
297            **tokens.Tokenizer.SINGLE_TOKENS,
298            "$": TokenType.HEREDOC_STRING,
299        }
COMMENTS = ['--', '#', '#!', ('/*', '*/')]
IDENTIFIERS = ['"', '`']
IDENTIFIER_ESCAPES = ['\\']
STRING_ESCAPES = ["'", '\\']
BIT_STRINGS = [('0b', '')]
HEX_STRINGS = [('0x', ''), ('0X', '')]
HEREDOC_STRINGS = ['$']
KEYWORDS = {'{%': <TokenType.BLOCK_START: 'BLOCK_START'>, '{%+': <TokenType.BLOCK_START: 'BLOCK_START'>, '{%-': <TokenType.BLOCK_START: 'BLOCK_START'>, '%}': <TokenType.BLOCK_END: 'BLOCK_END'>, '+%}': <TokenType.BLOCK_END: 'BLOCK_END'>, '-%}': <TokenType.BLOCK_END: 'BLOCK_END'>, '{{+': <TokenType.BLOCK_START: 'BLOCK_START'>, '{{-': <TokenType.BLOCK_START: 'BLOCK_START'>, '+}}': <TokenType.BLOCK_END: 'BLOCK_END'>, '-}}': <TokenType.BLOCK_END: 'BLOCK_END'>, '==': <TokenType.EQ: 'EQ'>, '::': <TokenType.DCOLON: 'DCOLON'>, '||': <TokenType.DPIPE: 'DPIPE'>, '|>': <TokenType.PIPE_GT: 'PIPE_GT'>, '>=': <TokenType.GTE: 'GTE'>, '<=': <TokenType.LTE: 'LTE'>, '<>': <TokenType.NEQ: 'NEQ'>, '!=': <TokenType.NEQ: 'NEQ'>, ':=': <TokenType.COLON_EQ: 'COLON_EQ'>, '<=>': <TokenType.NULLSAFE_EQ: 'NULLSAFE_EQ'>, '->': <TokenType.ARROW: 'ARROW'>, '->>': <TokenType.DARROW: 'DARROW'>, '=>': <TokenType.FARROW: 'FARROW'>, '#>': <TokenType.HASH_ARROW: 'HASH_ARROW'>, '#>>': <TokenType.DHASH_ARROW: 'DHASH_ARROW'>, '<->': <TokenType.LR_ARROW: 'LR_ARROW'>, '&&': <TokenType.DAMP: 'DAMP'>, '??': <TokenType.DQMARK: 'DQMARK'>, '~~~': <TokenType.GLOB: 'GLOB'>, '~~': <TokenType.LIKE: 'LIKE'>, '~~*': <TokenType.ILIKE: 'ILIKE'>, '~*': <TokenType.IRLIKE: 'IRLIKE'>, 'ALL': <TokenType.ALL: 'ALL'>, 'AND': <TokenType.AND: 'AND'>, 'ANTI': <TokenType.ANTI: 'ANTI'>, 'ANY': <TokenType.ANY: 'ANY'>, 'ASC': <TokenType.ASC: 'ASC'>, 'AS': <TokenType.ALIAS: 'ALIAS'>, 'ASOF': <TokenType.ASOF: 'ASOF'>, 'AUTOINCREMENT': <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, 'AUTO_INCREMENT': <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, 'BEGIN': <TokenType.BEGIN: 'BEGIN'>, 'BETWEEN': <TokenType.BETWEEN: 'BETWEEN'>, 'CACHE': <TokenType.CACHE: 'CACHE'>, 'UNCACHE': <TokenType.UNCACHE: 'UNCACHE'>, 'CASE': <TokenType.CASE: 'CASE'>, 'CHARACTER SET': <TokenType.CHARACTER_SET: 'CHARACTER_SET'>, 'CLUSTER BY': <TokenType.CLUSTER_BY: 'CLUSTER_BY'>, 'COLLATE': <TokenType.COLLATE: 'COLLATE'>, 'COLUMN': <TokenType.COLUMN: 'COLUMN'>, 'COMMIT': <TokenType.COMMIT: 'COMMIT'>, 'CONNECT BY': <TokenType.CONNECT_BY: 'CONNECT_BY'>, 'CONSTRAINT': <TokenType.CONSTRAINT: 'CONSTRAINT'>, 'COPY': <TokenType.COPY: 'COPY'>, 'CREATE': <TokenType.CREATE: 'CREATE'>, 'CROSS': <TokenType.CROSS: 'CROSS'>, 'CUBE': <TokenType.CUBE: 'CUBE'>, 'CURRENT_DATE': <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, 'CURRENT_SCHEMA': <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, 'CURRENT_TIME': <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, 'CURRENT_TIMESTAMP': <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, 'CURRENT_USER': <TokenType.CURRENT_USER: 'CURRENT_USER'>, 'DATABASE': <TokenType.DATABASE: 'DATABASE'>, 'DEFAULT': <TokenType.DEFAULT: 'DEFAULT'>, 'DELETE': <TokenType.DELETE: 'DELETE'>, 'DESC': <TokenType.DESC: 'DESC'>, 'DESCRIBE': <TokenType.DESCRIBE: 'DESCRIBE'>, 'DISTINCT': <TokenType.DISTINCT: 'DISTINCT'>, 'DISTRIBUTE BY': <TokenType.DISTRIBUTE_BY: 'DISTRIBUTE_BY'>, 'DIV': <TokenType.DIV: 'DIV'>, 'DROP': <TokenType.DROP: 'DROP'>, 'ELSE': <TokenType.ELSE: 'ELSE'>, 'END': <TokenType.END: 'END'>, 'ENUM': <TokenType.ENUM: 'ENUM'>, 'ESCAPE': <TokenType.ESCAPE: 'ESCAPE'>, 'EXCEPT': <TokenType.EXCEPT: 'EXCEPT'>, 'EXECUTE': <TokenType.EXECUTE: 'EXECUTE'>, 'EXISTS': <TokenType.EXISTS: 'EXISTS'>, 'FALSE': <TokenType.FALSE: 'FALSE'>, 'FETCH': <TokenType.FETCH: 'FETCH'>, 'FILTER': <TokenType.FILTER: 'FILTER'>, 'FIRST': <TokenType.FIRST: 'FIRST'>, 'FULL': <TokenType.FULL: 'FULL'>, 'FUNCTION': <TokenType.FUNCTION: 'FUNCTION'>, 'FOR': <TokenType.FOR: 'FOR'>, 'FOREIGN KEY': <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, 'FORMAT': <TokenType.FORMAT: 'FORMAT'>, 'FROM': <TokenType.FROM: 'FROM'>, 'GEOGRAPHY': <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, 'GEOMETRY': <TokenType.GEOMETRY: 'GEOMETRY'>, 'GLOB': <TokenType.GLOB: 'GLOB'>, 'GROUP BY': <TokenType.GROUP_BY: 'GROUP_BY'>, 'GROUPING SETS': <TokenType.GROUPING_SETS: 'GROUPING_SETS'>, 'HAVING': <TokenType.HAVING: 'HAVING'>, 'ILIKE': <TokenType.ILIKE: 'ILIKE'>, 'IN': <TokenType.IN: 'IN'>, 'INDEX': <TokenType.INDEX: 'INDEX'>, 'INET': <TokenType.INET: 'INET'>, 'INNER': <TokenType.INNER: 'INNER'>, 'INSERT': <TokenType.INSERT: 'INSERT'>, 'INTERVAL': <TokenType.INTERVAL: 'INTERVAL'>, 'INTERSECT': <TokenType.INTERSECT: 'INTERSECT'>, 'INTO': <TokenType.INTO: 'INTO'>, 'IS': <TokenType.IS: 'IS'>, 'ISNULL': <TokenType.ISNULL: 'ISNULL'>, 'JOIN': <TokenType.JOIN: 'JOIN'>, 'KEEP': <TokenType.KEEP: 'KEEP'>, 'KILL': <TokenType.KILL: 'KILL'>, 'LATERAL': <TokenType.LATERAL: 'LATERAL'>, 'LEFT': <TokenType.LEFT: 'LEFT'>, 'LIKE': <TokenType.LIKE: 'LIKE'>, 'LIMIT': <TokenType.LIMIT: 'LIMIT'>, 'LOAD': <TokenType.LOAD: 'LOAD'>, 'LOCK': <TokenType.LOCK: 'LOCK'>, 'MERGE': <TokenType.MERGE: 'MERGE'>, 'NAMESPACE': <TokenType.NAMESPACE: 'NAMESPACE'>, 'NATURAL': <TokenType.NATURAL: 'NATURAL'>, 'NEXT': <TokenType.NEXT: 'NEXT'>, 'NOT': <TokenType.NOT: 'NOT'>, 'NOTNULL': <TokenType.NOTNULL: 'NOTNULL'>, 'NULL': <TokenType.NULL: 'NULL'>, 'OBJECT': <TokenType.OBJECT: 'OBJECT'>, 'OFFSET': <TokenType.OFFSET: 'OFFSET'>, 'ON': <TokenType.ON: 'ON'>, 'OR': <TokenType.OR: 'OR'>, 'XOR': <TokenType.XOR: 'XOR'>, 'ORDER BY': <TokenType.ORDER_BY: 'ORDER_BY'>, 'ORDINALITY': <TokenType.ORDINALITY: 'ORDINALITY'>, 'OUTER': <TokenType.OUTER: 'OUTER'>, 'OVER': <TokenType.OVER: 'OVER'>, 'OVERLAPS': <TokenType.OVERLAPS: 'OVERLAPS'>, 'OVERWRITE': <TokenType.OVERWRITE: 'OVERWRITE'>, 'PARTITION': <TokenType.PARTITION: 'PARTITION'>, 'PARTITION BY': <TokenType.PARTITION_BY: 'PARTITION_BY'>, 'PARTITIONED BY': <TokenType.PARTITION_BY: 'PARTITION_BY'>, 'PARTITIONED_BY': <TokenType.PARTITION_BY: 'PARTITION_BY'>, 'PERCENT': <TokenType.PERCENT: 'PERCENT'>, 'PIVOT': <TokenType.PIVOT: 'PIVOT'>, 'PRAGMA': <TokenType.PRAGMA: 'PRAGMA'>, 'PRIMARY KEY': <TokenType.PRIMARY_KEY: 'PRIMARY_KEY'>, 'PROCEDURE': <TokenType.PROCEDURE: 'PROCEDURE'>, 'QUALIFY': <TokenType.QUALIFY: 'QUALIFY'>, 'RANGE': <TokenType.RANGE: 'RANGE'>, 'RECURSIVE': <TokenType.RECURSIVE: 'RECURSIVE'>, 'REGEXP': <TokenType.RLIKE: 'RLIKE'>, 'RENAME': <TokenType.RENAME: 'RENAME'>, 'REPLACE': <TokenType.REPLACE: 'REPLACE'>, 'RETURNING': <TokenType.RETURNING: 'RETURNING'>, 'REFERENCES': <TokenType.REFERENCES: 'REFERENCES'>, 'RIGHT': <TokenType.RIGHT: 'RIGHT'>, 'RLIKE': <TokenType.RLIKE: 'RLIKE'>, 'ROLLBACK': <TokenType.ROLLBACK: 'ROLLBACK'>, 'ROLLUP': <TokenType.ROLLUP: 'ROLLUP'>, 'ROW': <TokenType.ROW: 'ROW'>, 'ROWS': <TokenType.ROWS: 'ROWS'>, 'SCHEMA': <TokenType.SCHEMA: 'SCHEMA'>, 'SELECT': <TokenType.SELECT: 'SELECT'>, 'SEMI': <TokenType.SEMI: 'SEMI'>, 'SESSION': <TokenType.SESSION: 'SESSION'>, 'SET': <TokenType.SET: 'SET'>, 'SETTINGS': <TokenType.SETTINGS: 'SETTINGS'>, 'SHOW': <TokenType.SHOW: 'SHOW'>, 'SIMILAR TO': <TokenType.SIMILAR_TO: 'SIMILAR_TO'>, 'SOME': <TokenType.SOME: 'SOME'>, 'SORT BY': <TokenType.SORT_BY: 'SORT_BY'>, 'START WITH': <TokenType.START_WITH: 'START_WITH'>, 'STRAIGHT_JOIN': <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, 'TABLE': <TokenType.TABLE: 'TABLE'>, 'TABLESAMPLE': <TokenType.TABLE_SAMPLE: 'TABLE_SAMPLE'>, 'TEMP': <TokenType.TEMPORARY: 'TEMPORARY'>, 'TEMPORARY': <TokenType.TEMPORARY: 'TEMPORARY'>, 'THEN': <TokenType.THEN: 'THEN'>, 'TRUE': <TokenType.TRUE: 'TRUE'>, 'TRUNCATE': <TokenType.TRUNCATE: 'TRUNCATE'>, 'UNION': <TokenType.UNION: 'UNION'>, 'UNKNOWN': <TokenType.UNKNOWN: 'UNKNOWN'>, 'UNNEST': <TokenType.UNNEST: 'UNNEST'>, 'UNPIVOT': <TokenType.UNPIVOT: 'UNPIVOT'>, 'UPDATE': <TokenType.UPDATE: 'UPDATE'>, 'USE': <TokenType.USE: 'USE'>, 'USING': <TokenType.USING: 'USING'>, 'UUID': <TokenType.UUID: 'UUID'>, 'VALUES': <TokenType.VALUES: 'VALUES'>, 'VIEW': <TokenType.VIEW: 'VIEW'>, 'VOLATILE': <TokenType.VOLATILE: 'VOLATILE'>, 'WHEN': <TokenType.WHEN: 'WHEN'>, 'WHERE': <TokenType.WHERE: 'WHERE'>, 'WINDOW': <TokenType.WINDOW: 'WINDOW'>, 'WITH': <TokenType.WITH: 'WITH'>, 'APPLY': <TokenType.APPLY: 'APPLY'>, 'ARRAY': <TokenType.ARRAY: 'ARRAY'>, 'BIT': <TokenType.BIT: 'BIT'>, 'BOOL': <TokenType.BOOLEAN: 'BOOLEAN'>, 'BOOLEAN': <TokenType.BOOLEAN: 'BOOLEAN'>, 'BYTE': <TokenType.TINYINT: 'TINYINT'>, 'MEDIUMINT': <TokenType.MEDIUMINT: 'MEDIUMINT'>, 'INT1': <TokenType.TINYINT: 'TINYINT'>, 'TINYINT': <TokenType.TINYINT: 'TINYINT'>, 'INT16': <TokenType.SMALLINT: 'SMALLINT'>, 'SHORT': <TokenType.SMALLINT: 'SMALLINT'>, 'SMALLINT': <TokenType.SMALLINT: 'SMALLINT'>, 'HUGEINT': <TokenType.INT128: 'INT128'>, 'UHUGEINT': <TokenType.UINT128: 'UINT128'>, 'INT2': <TokenType.SMALLINT: 'SMALLINT'>, 'INTEGER': <TokenType.INT: 'INT'>, 'INT': <TokenType.INT: 'INT'>, 'INT4': <TokenType.INT: 'INT'>, 'INT32': <TokenType.INT: 'INT'>, 'INT64': <TokenType.BIGINT: 'BIGINT'>, 'INT128': <TokenType.INT128: 'INT128'>, 'INT256': <TokenType.INT256: 'INT256'>, 'LONG': <TokenType.BIGINT: 'BIGINT'>, 'BIGINT': <TokenType.BIGINT: 'BIGINT'>, 'INT8': <TokenType.TINYINT: 'TINYINT'>, 'UINT': <TokenType.UINT: 'UINT'>, 'UINT128': <TokenType.UINT128: 'UINT128'>, 'UINT256': <TokenType.UINT256: 'UINT256'>, 'DEC': <TokenType.DECIMAL: 'DECIMAL'>, 'DECIMAL': <TokenType.DECIMAL: 'DECIMAL'>, 'DECIMAL32': <TokenType.DECIMAL32: 'DECIMAL32'>, 'DECIMAL64': <TokenType.DECIMAL64: 'DECIMAL64'>, 'DECIMAL128': <TokenType.DECIMAL128: 'DECIMAL128'>, 'DECIMAL256': <TokenType.DECIMAL256: 'DECIMAL256'>, 'BIGDECIMAL': <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, 'BIGNUMERIC': <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, 'LIST': <TokenType.LIST: 'LIST'>, 'MAP': <TokenType.MAP: 'MAP'>, 'NULLABLE': <TokenType.NULLABLE: 'NULLABLE'>, 'NUMBER': <TokenType.DECIMAL: 'DECIMAL'>, 'NUMERIC': <TokenType.DECIMAL: 'DECIMAL'>, 'FIXED': <TokenType.DECIMAL: 'DECIMAL'>, 'REAL': <TokenType.FLOAT: 'FLOAT'>, 'FLOAT': <TokenType.FLOAT: 'FLOAT'>, 'FLOAT4': <TokenType.FLOAT: 'FLOAT'>, 'FLOAT8': <TokenType.DOUBLE: 'DOUBLE'>, 'DOUBLE': <TokenType.DOUBLE: 'DOUBLE'>, 'DOUBLE PRECISION': <TokenType.DOUBLE: 'DOUBLE'>, 'JSON': <TokenType.JSON: 'JSON'>, 'JSONB': <TokenType.JSONB: 'JSONB'>, 'CHAR': <TokenType.CHAR: 'CHAR'>, 'CHARACTER': <TokenType.CHAR: 'CHAR'>, 'CHAR VARYING': <TokenType.VARCHAR: 'VARCHAR'>, 'CHARACTER VARYING': <TokenType.VARCHAR: 'VARCHAR'>, 'NCHAR': <TokenType.NCHAR: 'NCHAR'>, 'VARCHAR': <TokenType.VARCHAR: 'VARCHAR'>, 'VARCHAR2': <TokenType.VARCHAR: 'VARCHAR'>, 'NVARCHAR': <TokenType.NVARCHAR: 'NVARCHAR'>, 'NVARCHAR2': <TokenType.NVARCHAR: 'NVARCHAR'>, 'BPCHAR': <TokenType.BPCHAR: 'BPCHAR'>, 'STR': <TokenType.TEXT: 'TEXT'>, 'STRING': <TokenType.TEXT: 'TEXT'>, 'TEXT': <TokenType.TEXT: 'TEXT'>, 'LONGTEXT': <TokenType.LONGTEXT: 'LONGTEXT'>, 'MEDIUMTEXT': <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, 'TINYTEXT': <TokenType.TINYTEXT: 'TINYTEXT'>, 'CLOB': <TokenType.TEXT: 'TEXT'>, 'LONGVARCHAR': <TokenType.TEXT: 'TEXT'>, 'BINARY': <TokenType.BINARY: 'BINARY'>, 'BLOB': <TokenType.VARBINARY: 'VARBINARY'>, 'LONGBLOB': <TokenType.LONGBLOB: 'LONGBLOB'>, 'MEDIUMBLOB': <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, 'TINYBLOB': <TokenType.TINYBLOB: 'TINYBLOB'>, 'BYTEA': <TokenType.VARBINARY: 'VARBINARY'>, 'VARBINARY': <TokenType.VARBINARY: 'VARBINARY'>, 'TIME': <TokenType.TIME: 'TIME'>, 'TIMETZ': <TokenType.TIMETZ: 'TIMETZ'>, 'TIMESTAMP': <TokenType.TIMESTAMP: 'TIMESTAMP'>, 'TIMESTAMPTZ': <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, 'TIMESTAMPLTZ': <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, 'TIMESTAMP_LTZ': <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, 'TIMESTAMPNTZ': <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, 'TIMESTAMP_NTZ': <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, 'DATE': <TokenType.DATE: 'DATE'>, 'DATETIME': <TokenType.DATETIME: 'DATETIME'>, 'INT4RANGE': <TokenType.INT4RANGE: 'INT4RANGE'>, 'INT4MULTIRANGE': <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, 'INT8RANGE': <TokenType.INT8RANGE: 'INT8RANGE'>, 'INT8MULTIRANGE': <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, 'NUMRANGE': <TokenType.NUMRANGE: 'NUMRANGE'>, 'NUMMULTIRANGE': <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, 'TSRANGE': <TokenType.TSRANGE: 'TSRANGE'>, 'TSMULTIRANGE': <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, 'TSTZRANGE': <TokenType.TSTZRANGE: 'TSTZRANGE'>, 'TSTZMULTIRANGE': <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, 'DATERANGE': <TokenType.DATERANGE: 'DATERANGE'>, 'DATEMULTIRANGE': <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, 'UNIQUE': <TokenType.UNIQUE: 'UNIQUE'>, 'VECTOR': <TokenType.VECTOR: 'VECTOR'>, 'STRUCT': <TokenType.STRUCT: 'STRUCT'>, 'SEQUENCE': <TokenType.SEQUENCE: 'SEQUENCE'>, 'VARIANT': <TokenType.VARIANT: 'VARIANT'>, 'ALTER': <TokenType.ALTER: 'ALTER'>, 'ANALYZE': <TokenType.ANALYZE: 'ANALYZE'>, 'CALL': <TokenType.COMMAND: 'COMMAND'>, 'COMMENT': <TokenType.COMMENT: 'COMMENT'>, 'EXPLAIN': <TokenType.COMMAND: 'COMMAND'>, 'GRANT': <TokenType.GRANT: 'GRANT'>, 'REVOKE': <TokenType.REVOKE: 'REVOKE'>, 'OPTIMIZE': <TokenType.COMMAND: 'COMMAND'>, 'PREPARE': <TokenType.COMMAND: 'COMMAND'>, 'VACUUM': <TokenType.COMMAND: 'COMMAND'>, 'USER-DEFINED': <TokenType.USERDEFINED: 'USERDEFINED'>, 'FOR VERSION': <TokenType.VERSION_SNAPSHOT: 'VERSION_SNAPSHOT'>, 'FOR TIMESTAMP': <TokenType.TIMESTAMP_SNAPSHOT: 'TIMESTAMP_SNAPSHOT'>, '.:': <TokenType.DOTCOLON: 'DOTCOLON'>, 'ATTACH': <TokenType.COMMAND: 'COMMAND'>, 'DATE32': <TokenType.DATE32: 'DATE32'>, 'DATETIME64': <TokenType.DATETIME64: 'DATETIME64'>, 'DICTIONARY': <TokenType.DICTIONARY: 'DICTIONARY'>, 'DYNAMIC': <TokenType.DYNAMIC: 'DYNAMIC'>, 'ENUM8': <TokenType.ENUM8: 'ENUM8'>, 'ENUM16': <TokenType.ENUM16: 'ENUM16'>, 'EXCHANGE': <TokenType.COMMAND: 'COMMAND'>, 'FINAL': <TokenType.FINAL: 'FINAL'>, 'FIXEDSTRING': <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, 'FLOAT32': <TokenType.FLOAT: 'FLOAT'>, 'FLOAT64': <TokenType.DOUBLE: 'DOUBLE'>, 'GLOBAL': <TokenType.GLOBAL: 'GLOBAL'>, 'LOWCARDINALITY': <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, 'NESTED': <TokenType.NESTED: 'NESTED'>, 'NOTHING': <TokenType.NOTHING: 'NOTHING'>, 'SAMPLE': <TokenType.TABLE_SAMPLE: 'TABLE_SAMPLE'>, 'TUPLE': <TokenType.STRUCT: 'STRUCT'>, 'UINT16': <TokenType.USMALLINT: 'USMALLINT'>, 'UINT32': <TokenType.UINT: 'UINT'>, 'UINT64': <TokenType.UBIGINT: 'UBIGINT'>, 'UINT8': <TokenType.UTINYINT: 'UTINYINT'>, 'IPV4': <TokenType.IPV4: 'IPV4'>, 'IPV6': <TokenType.IPV6: 'IPV6'>, 'POINT': <TokenType.POINT: 'POINT'>, 'RING': <TokenType.RING: 'RING'>, 'LINESTRING': <TokenType.LINESTRING: 'LINESTRING'>, 'MULTILINESTRING': <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, 'POLYGON': <TokenType.POLYGON: 'POLYGON'>, 'MULTIPOLYGON': <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, 'AGGREGATEFUNCTION': <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, 'SIMPLEAGGREGATEFUNCTION': <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, 'SYSTEM': <TokenType.COMMAND: 'COMMAND'>, 'PREWHERE': <TokenType.PREWHERE: 'PREWHERE'>}
SINGLE_TOKENS = {'(': <TokenType.L_PAREN: 'L_PAREN'>, ')': <TokenType.R_PAREN: 'R_PAREN'>, '[': <TokenType.L_BRACKET: 'L_BRACKET'>, ']': <TokenType.R_BRACKET: 'R_BRACKET'>, '{': <TokenType.L_BRACE: 'L_BRACE'>, '}': <TokenType.R_BRACE: 'R_BRACE'>, '&': <TokenType.AMP: 'AMP'>, '^': <TokenType.CARET: 'CARET'>, ':': <TokenType.COLON: 'COLON'>, ',': <TokenType.COMMA: 'COMMA'>, '.': <TokenType.DOT: 'DOT'>, '-': <TokenType.DASH: 'DASH'>, '=': <TokenType.EQ: 'EQ'>, '>': <TokenType.GT: 'GT'>, '<': <TokenType.LT: 'LT'>, '%': <TokenType.MOD: 'MOD'>, '!': <TokenType.NOT: 'NOT'>, '|': <TokenType.PIPE: 'PIPE'>, '+': <TokenType.PLUS: 'PLUS'>, ';': <TokenType.SEMICOLON: 'SEMICOLON'>, '/': <TokenType.SLASH: 'SLASH'>, '\\': <TokenType.BACKSLASH: 'BACKSLASH'>, '*': <TokenType.STAR: 'STAR'>, '~': <TokenType.TILDA: 'TILDA'>, '?': <TokenType.PLACEHOLDER: 'PLACEHOLDER'>, '@': <TokenType.PARAMETER: 'PARAMETER'>, '#': <TokenType.HASH: 'HASH'>, "'": <TokenType.UNKNOWN: 'UNKNOWN'>, '`': <TokenType.UNKNOWN: 'UNKNOWN'>, '"': <TokenType.UNKNOWN: 'UNKNOWN'>, '$': <TokenType.HEREDOC_STRING: 'HEREDOC_STRING'>}
class ClickHouse.Parser(sqlglot.parser.Parser):
301    class Parser(parser.Parser):
302        # Tested in ClickHouse's playground, it seems that the following two queries do the same thing
303        # * select x from t1 union all select x from t2 limit 1;
304        # * select x from t1 union all (select x from t2 limit 1);
305        MODIFIERS_ATTACHED_TO_SET_OP = False
306        INTERVAL_SPANS = False
307        OPTIONAL_ALIAS_TOKEN_CTE = False
308        JOINS_HAVE_EQUAL_PRECEDENCE = True
309
310        FUNCTIONS = {
311            **parser.Parser.FUNCTIONS,
312            "ANY": exp.AnyValue.from_arg_list,
313            "ARRAYSUM": exp.ArraySum.from_arg_list,
314            "ARRAYREVERSE": exp.ArrayReverse.from_arg_list,
315            "ARRAYSLICE": exp.ArraySlice.from_arg_list,
316            "COUNTIF": _build_count_if,
317            "COSINEDISTANCE": exp.CosineDistance.from_arg_list,
318            "DATE_ADD": build_date_delta(exp.DateAdd, default_unit=None),
319            "DATEADD": build_date_delta(exp.DateAdd, default_unit=None),
320            "DATE_DIFF": build_date_delta(exp.DateDiff, default_unit=None, supports_timezone=True),
321            "DATEDIFF": build_date_delta(exp.DateDiff, default_unit=None, supports_timezone=True),
322            "DATE_FORMAT": _build_datetime_format(exp.TimeToStr),
323            "DATE_SUB": build_date_delta(exp.DateSub, default_unit=None),
324            "DATESUB": build_date_delta(exp.DateSub, default_unit=None),
325            "FORMATDATETIME": _build_datetime_format(exp.TimeToStr),
326            "JSONEXTRACTSTRING": build_json_extract_path(
327                exp.JSONExtractScalar, zero_based_indexing=False
328            ),
329            "LENGTH": lambda args: exp.Length(this=seq_get(args, 0), binary=True),
330            "L2Distance": exp.EuclideanDistance.from_arg_list,
331            "MAP": parser.build_var_map,
332            "MATCH": exp.RegexpLike.from_arg_list,
333            "PARSEDATETIME": _build_datetime_format(exp.ParseDatetime),
334            "RANDCANONICAL": exp.Rand.from_arg_list,
335            "STR_TO_DATE": _build_str_to_date,
336            "TUPLE": exp.Struct.from_arg_list,
337            "TIMESTAMP_SUB": build_date_delta(exp.TimestampSub, default_unit=None),
338            "TIMESTAMPSUB": build_date_delta(exp.TimestampSub, default_unit=None),
339            "TIMESTAMP_ADD": build_date_delta(exp.TimestampAdd, default_unit=None),
340            "TIMESTAMPADD": build_date_delta(exp.TimestampAdd, default_unit=None),
341            "UNIQ": exp.ApproxDistinct.from_arg_list,
342            "XOR": lambda args: exp.Xor(expressions=args),
343            "MD5": exp.MD5Digest.from_arg_list,
344            "SHA256": lambda args: exp.SHA2(this=seq_get(args, 0), length=exp.Literal.number(256)),
345            "SHA512": lambda args: exp.SHA2(this=seq_get(args, 0), length=exp.Literal.number(512)),
346            "SUBSTRINGINDEX": exp.SubstringIndex.from_arg_list,
347            "TOTYPENAME": exp.Typeof.from_arg_list,
348            "EDITDISTANCE": exp.Levenshtein.from_arg_list,
349            "LEVENSHTEINDISTANCE": exp.Levenshtein.from_arg_list,
350        }
351        FUNCTIONS.pop("TRANSFORM")
352        FUNCTIONS.pop("APPROX_TOP_SUM")
353
354        AGG_FUNCTIONS = {
355            "count",
356            "min",
357            "max",
358            "sum",
359            "avg",
360            "any",
361            "stddevPop",
362            "stddevSamp",
363            "varPop",
364            "varSamp",
365            "corr",
366            "covarPop",
367            "covarSamp",
368            "entropy",
369            "exponentialMovingAverage",
370            "intervalLengthSum",
371            "kolmogorovSmirnovTest",
372            "mannWhitneyUTest",
373            "median",
374            "rankCorr",
375            "sumKahan",
376            "studentTTest",
377            "welchTTest",
378            "anyHeavy",
379            "anyLast",
380            "boundingRatio",
381            "first_value",
382            "last_value",
383            "argMin",
384            "argMax",
385            "avgWeighted",
386            "topK",
387            "approx_top_sum",
388            "topKWeighted",
389            "deltaSum",
390            "deltaSumTimestamp",
391            "groupArray",
392            "groupArrayLast",
393            "groupUniqArray",
394            "groupArrayInsertAt",
395            "groupArrayMovingAvg",
396            "groupArrayMovingSum",
397            "groupArraySample",
398            "groupBitAnd",
399            "groupBitOr",
400            "groupBitXor",
401            "groupBitmap",
402            "groupBitmapAnd",
403            "groupBitmapOr",
404            "groupBitmapXor",
405            "sumWithOverflow",
406            "sumMap",
407            "minMap",
408            "maxMap",
409            "skewSamp",
410            "skewPop",
411            "kurtSamp",
412            "kurtPop",
413            "uniq",
414            "uniqExact",
415            "uniqCombined",
416            "uniqCombined64",
417            "uniqHLL12",
418            "uniqTheta",
419            "quantile",
420            "quantiles",
421            "quantileExact",
422            "quantilesExact",
423            "quantileExactLow",
424            "quantilesExactLow",
425            "quantileExactHigh",
426            "quantilesExactHigh",
427            "quantileExactWeighted",
428            "quantilesExactWeighted",
429            "quantileTiming",
430            "quantilesTiming",
431            "quantileTimingWeighted",
432            "quantilesTimingWeighted",
433            "quantileDeterministic",
434            "quantilesDeterministic",
435            "quantileTDigest",
436            "quantilesTDigest",
437            "quantileTDigestWeighted",
438            "quantilesTDigestWeighted",
439            "quantileBFloat16",
440            "quantilesBFloat16",
441            "quantileBFloat16Weighted",
442            "quantilesBFloat16Weighted",
443            "simpleLinearRegression",
444            "stochasticLinearRegression",
445            "stochasticLogisticRegression",
446            "categoricalInformationValue",
447            "contingency",
448            "cramersV",
449            "cramersVBiasCorrected",
450            "theilsU",
451            "maxIntersections",
452            "maxIntersectionsPosition",
453            "meanZTest",
454            "quantileInterpolatedWeighted",
455            "quantilesInterpolatedWeighted",
456            "quantileGK",
457            "quantilesGK",
458            "sparkBar",
459            "sumCount",
460            "largestTriangleThreeBuckets",
461            "histogram",
462            "sequenceMatch",
463            "sequenceCount",
464            "windowFunnel",
465            "retention",
466            "uniqUpTo",
467            "sequenceNextNode",
468            "exponentialTimeDecayedAvg",
469        }
470
471        AGG_FUNCTIONS_SUFFIXES = [
472            "If",
473            "Array",
474            "ArrayIf",
475            "Map",
476            "SimpleState",
477            "State",
478            "Merge",
479            "MergeState",
480            "ForEach",
481            "Distinct",
482            "OrDefault",
483            "OrNull",
484            "Resample",
485            "ArgMin",
486            "ArgMax",
487        ]
488
489        FUNC_TOKENS = {
490            *parser.Parser.FUNC_TOKENS,
491            TokenType.AND,
492            TokenType.OR,
493            TokenType.SET,
494        }
495
496        RESERVED_TOKENS = parser.Parser.RESERVED_TOKENS - {TokenType.SELECT}
497
498        ID_VAR_TOKENS = {
499            *parser.Parser.ID_VAR_TOKENS,
500            TokenType.LIKE,
501        }
502
503        AGG_FUNC_MAPPING = (
504            lambda functions, suffixes: {
505                f"{f}{sfx}": (f, sfx) for sfx in (suffixes + [""]) for f in functions
506            }
507        )(AGG_FUNCTIONS, AGG_FUNCTIONS_SUFFIXES)
508
509        FUNCTIONS_WITH_ALIASED_ARGS = {*parser.Parser.FUNCTIONS_WITH_ALIASED_ARGS, "TUPLE"}
510
511        FUNCTION_PARSERS = {
512            **parser.Parser.FUNCTION_PARSERS,
513            "ARRAYJOIN": lambda self: self.expression(exp.Explode, this=self._parse_expression()),
514            "QUANTILE": lambda self: self._parse_quantile(),
515            "MEDIAN": lambda self: self._parse_quantile(),
516            "COLUMNS": lambda self: self._parse_columns(),
517        }
518
519        FUNCTION_PARSERS.pop("MATCH")
520
521        PROPERTY_PARSERS = {
522            **parser.Parser.PROPERTY_PARSERS,
523            "ENGINE": lambda self: self._parse_engine_property(),
524        }
525        PROPERTY_PARSERS.pop("DYNAMIC")
526
527        NO_PAREN_FUNCTION_PARSERS = parser.Parser.NO_PAREN_FUNCTION_PARSERS.copy()
528        NO_PAREN_FUNCTION_PARSERS.pop("ANY")
529
530        NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy()
531        NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIMESTAMP)
532
533        RANGE_PARSERS = {
534            **parser.Parser.RANGE_PARSERS,
535            TokenType.GLOBAL: lambda self, this: self._parse_global_in(this),
536        }
537
538        # The PLACEHOLDER entry is popped because 1) it doesn't affect Clickhouse (it corresponds to
539        # the postgres-specific JSONBContains parser) and 2) it makes parsing the ternary op simpler.
540        COLUMN_OPERATORS = parser.Parser.COLUMN_OPERATORS.copy()
541        COLUMN_OPERATORS.pop(TokenType.PLACEHOLDER)
542
543        JOIN_KINDS = {
544            *parser.Parser.JOIN_KINDS,
545            TokenType.ANY,
546            TokenType.ASOF,
547            TokenType.ARRAY,
548        }
549
550        TABLE_ALIAS_TOKENS = parser.Parser.TABLE_ALIAS_TOKENS - {
551            TokenType.ANY,
552            TokenType.ARRAY,
553            TokenType.FINAL,
554            TokenType.FORMAT,
555            TokenType.SETTINGS,
556        }
557
558        ALIAS_TOKENS = parser.Parser.ALIAS_TOKENS - {
559            TokenType.FORMAT,
560        }
561
562        LOG_DEFAULTS_TO_LN = True
563
564        QUERY_MODIFIER_PARSERS = {
565            **parser.Parser.QUERY_MODIFIER_PARSERS,
566            TokenType.SETTINGS: lambda self: (
567                "settings",
568                self._advance() or self._parse_csv(self._parse_assignment),
569            ),
570            TokenType.FORMAT: lambda self: ("format", self._advance() or self._parse_id_var()),
571        }
572
573        CONSTRAINT_PARSERS = {
574            **parser.Parser.CONSTRAINT_PARSERS,
575            "INDEX": lambda self: self._parse_index_constraint(),
576            "CODEC": lambda self: self._parse_compress(),
577        }
578
579        ALTER_PARSERS = {
580            **parser.Parser.ALTER_PARSERS,
581            "REPLACE": lambda self: self._parse_alter_table_replace(),
582        }
583
584        SCHEMA_UNNAMED_CONSTRAINTS = {
585            *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS,
586            "INDEX",
587        }
588
589        PLACEHOLDER_PARSERS = {
590            **parser.Parser.PLACEHOLDER_PARSERS,
591            TokenType.L_BRACE: lambda self: self._parse_query_parameter(),
592        }
593
594        def _parse_engine_property(self) -> exp.EngineProperty:
595            self._match(TokenType.EQ)
596            return self.expression(
597                exp.EngineProperty,
598                this=self._parse_field(any_token=True, anonymous_func=True),
599            )
600
601        # https://clickhouse.com/docs/en/sql-reference/statements/create/function
602        def _parse_user_defined_function_expression(self) -> t.Optional[exp.Expression]:
603            return self._parse_lambda()
604
605        def _parse_types(
606            self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True
607        ) -> t.Optional[exp.Expression]:
608            dtype = super()._parse_types(
609                check_func=check_func, schema=schema, allow_identifiers=allow_identifiers
610            )
611            if isinstance(dtype, exp.DataType) and dtype.args.get("nullable") is not True:
612                # Mark every type as non-nullable which is ClickHouse's default, unless it's
613                # already marked as nullable. This marker helps us transpile types from other
614                # dialects to ClickHouse, so that we can e.g. produce `CAST(x AS Nullable(String))`
615                # from `CAST(x AS TEXT)`. If there is a `NULL` value in `x`, the former would
616                # fail in ClickHouse without the `Nullable` type constructor.
617                dtype.set("nullable", False)
618
619            return dtype
620
621        def _parse_extract(self) -> exp.Extract | exp.Anonymous:
622            index = self._index
623            this = self._parse_bitwise()
624            if self._match(TokenType.FROM):
625                self._retreat(index)
626                return super()._parse_extract()
627
628            # We return Anonymous here because extract and regexpExtract have different semantics,
629            # so parsing extract(foo, bar) into RegexpExtract can potentially break queries. E.g.,
630            # `extract('foobar', 'b')` works, but ClickHouse crashes for `regexpExtract('foobar', 'b')`.
631            #
632            # TODO: can we somehow convert the former into an equivalent `regexpExtract` call?
633            self._match(TokenType.COMMA)
634            return self.expression(
635                exp.Anonymous, this="extract", expressions=[this, self._parse_bitwise()]
636            )
637
638        def _parse_assignment(self) -> t.Optional[exp.Expression]:
639            this = super()._parse_assignment()
640
641            if self._match(TokenType.PLACEHOLDER):
642                return self.expression(
643                    exp.If,
644                    this=this,
645                    true=self._parse_assignment(),
646                    false=self._match(TokenType.COLON) and self._parse_assignment(),
647                )
648
649            return this
650
651        def _parse_query_parameter(self) -> t.Optional[exp.Expression]:
652            """
653            Parse a placeholder expression like SELECT {abc: UInt32} or FROM {table: Identifier}
654            https://clickhouse.com/docs/en/sql-reference/syntax#defining-and-using-query-parameters
655            """
656            index = self._index
657
658            this = self._parse_id_var()
659            self._match(TokenType.COLON)
660            kind = self._parse_types(check_func=False, allow_identifiers=False) or (
661                self._match_text_seq("IDENTIFIER") and "Identifier"
662            )
663
664            if not kind:
665                self._retreat(index)
666                return None
667            elif not self._match(TokenType.R_BRACE):
668                self.raise_error("Expecting }")
669
670            if isinstance(this, exp.Identifier) and not this.quoted:
671                this = exp.var(this.name)
672
673            return self.expression(exp.Placeholder, this=this, kind=kind)
674
675        def _parse_bracket(
676            self, this: t.Optional[exp.Expression] = None
677        ) -> t.Optional[exp.Expression]:
678            l_brace = self._match(TokenType.L_BRACE, advance=False)
679            bracket = super()._parse_bracket(this)
680
681            if l_brace and isinstance(bracket, exp.Struct):
682                varmap = exp.VarMap(keys=exp.Array(), values=exp.Array())
683                for expression in bracket.expressions:
684                    if not isinstance(expression, exp.PropertyEQ):
685                        break
686
687                    varmap.args["keys"].append("expressions", exp.Literal.string(expression.name))
688                    varmap.args["values"].append("expressions", expression.expression)
689
690                return varmap
691
692            return bracket
693
694        def _parse_in(self, this: t.Optional[exp.Expression], is_global: bool = False) -> exp.In:
695            this = super()._parse_in(this)
696            this.set("is_global", is_global)
697            return this
698
699        def _parse_global_in(self, this: t.Optional[exp.Expression]) -> exp.Not | exp.In:
700            is_negated = self._match(TokenType.NOT)
701            this = self._match(TokenType.IN) and self._parse_in(this, is_global=True)
702            return self.expression(exp.Not, this=this) if is_negated else this
703
704        def _parse_table(
705            self,
706            schema: bool = False,
707            joins: bool = False,
708            alias_tokens: t.Optional[t.Collection[TokenType]] = None,
709            parse_bracket: bool = False,
710            is_db_reference: bool = False,
711            parse_partition: bool = False,
712            consume_pipe: bool = False,
713        ) -> t.Optional[exp.Expression]:
714            this = super()._parse_table(
715                schema=schema,
716                joins=joins,
717                alias_tokens=alias_tokens,
718                parse_bracket=parse_bracket,
719                is_db_reference=is_db_reference,
720            )
721
722            if isinstance(this, exp.Table):
723                inner = this.this
724                alias = this.args.get("alias")
725
726                if isinstance(inner, exp.GenerateSeries) and alias and not alias.columns:
727                    alias.set("columns", [exp.to_identifier("generate_series")])
728
729            if self._match(TokenType.FINAL):
730                this = self.expression(exp.Final, this=this)
731
732            return this
733
734        def _parse_position(self, haystack_first: bool = False) -> exp.StrPosition:
735            return super()._parse_position(haystack_first=True)
736
737        # https://clickhouse.com/docs/en/sql-reference/statements/select/with/
738        def _parse_cte(self) -> t.Optional[exp.CTE]:
739            # WITH <identifier> AS <subquery expression>
740            cte: t.Optional[exp.CTE] = self._try_parse(super()._parse_cte)
741
742            if not cte:
743                # WITH <expression> AS <identifier>
744                cte = self.expression(
745                    exp.CTE,
746                    this=self._parse_assignment(),
747                    alias=self._parse_table_alias(),
748                    scalar=True,
749                )
750
751            return cte
752
753        def _parse_join_parts(
754            self,
755        ) -> t.Tuple[t.Optional[Token], t.Optional[Token], t.Optional[Token]]:
756            is_global = self._match(TokenType.GLOBAL) and self._prev
757            kind_pre = self._match_set(self.JOIN_KINDS, advance=False) and self._prev
758
759            if kind_pre:
760                kind = self._match_set(self.JOIN_KINDS) and self._prev
761                side = self._match_set(self.JOIN_SIDES) and self._prev
762                return is_global, side, kind
763
764            return (
765                is_global,
766                self._match_set(self.JOIN_SIDES) and self._prev,
767                self._match_set(self.JOIN_KINDS) and self._prev,
768            )
769
770        def _parse_join(
771            self, skip_join_token: bool = False, parse_bracket: bool = False
772        ) -> t.Optional[exp.Join]:
773            join = super()._parse_join(skip_join_token=skip_join_token, parse_bracket=True)
774            if join:
775                join.set("global", join.args.pop("method", None))
776
777                # tbl ARRAY JOIN arr <-- this should be a `Column` reference, not a `Table`
778                # https://clickhouse.com/docs/en/sql-reference/statements/select/array-join
779                if join.kind == "ARRAY":
780                    for table in join.find_all(exp.Table):
781                        table.replace(table.to_column())
782
783            return join
784
785        def _parse_function(
786            self,
787            functions: t.Optional[t.Dict[str, t.Callable]] = None,
788            anonymous: bool = False,
789            optional_parens: bool = True,
790            any_token: bool = False,
791        ) -> t.Optional[exp.Expression]:
792            expr = super()._parse_function(
793                functions=functions,
794                anonymous=anonymous,
795                optional_parens=optional_parens,
796                any_token=any_token,
797            )
798
799            func = expr.this if isinstance(expr, exp.Window) else expr
800
801            # Aggregate functions can be split in 2 parts: <func_name><suffix>
802            parts = (
803                self.AGG_FUNC_MAPPING.get(func.this) if isinstance(func, exp.Anonymous) else None
804            )
805
806            if parts:
807                anon_func: exp.Anonymous = t.cast(exp.Anonymous, func)
808                params = self._parse_func_params(anon_func)
809
810                kwargs = {
811                    "this": anon_func.this,
812                    "expressions": anon_func.expressions,
813                }
814                if parts[1]:
815                    exp_class: t.Type[exp.Expression] = (
816                        exp.CombinedParameterizedAgg if params else exp.CombinedAggFunc
817                    )
818                else:
819                    exp_class = exp.ParameterizedAgg if params else exp.AnonymousAggFunc
820
821                kwargs["exp_class"] = exp_class
822                if params:
823                    kwargs["params"] = params
824
825                func = self.expression(**kwargs)
826
827                if isinstance(expr, exp.Window):
828                    # The window's func was parsed as Anonymous in base parser, fix its
829                    # type to be ClickHouse style CombinedAnonymousAggFunc / AnonymousAggFunc
830                    expr.set("this", func)
831                elif params:
832                    # Params have blocked super()._parse_function() from parsing the following window
833                    # (if that exists) as they're standing between the function call and the window spec
834                    expr = self._parse_window(func)
835                else:
836                    expr = func
837
838            return expr
839
840        def _parse_func_params(
841            self, this: t.Optional[exp.Func] = None
842        ) -> t.Optional[t.List[exp.Expression]]:
843            if self._match_pair(TokenType.R_PAREN, TokenType.L_PAREN):
844                return self._parse_csv(self._parse_lambda)
845
846            if self._match(TokenType.L_PAREN):
847                params = self._parse_csv(self._parse_lambda)
848                self._match_r_paren(this)
849                return params
850
851            return None
852
853        def _parse_quantile(self) -> exp.Quantile:
854            this = self._parse_lambda()
855            params = self._parse_func_params()
856            if params:
857                return self.expression(exp.Quantile, this=params[0], quantile=this)
858            return self.expression(exp.Quantile, this=this, quantile=exp.Literal.number(0.5))
859
860        def _parse_wrapped_id_vars(self, optional: bool = False) -> t.List[exp.Expression]:
861            return super()._parse_wrapped_id_vars(optional=True)
862
863        def _parse_primary_key(
864            self, wrapped_optional: bool = False, in_props: bool = False
865        ) -> exp.PrimaryKeyColumnConstraint | exp.PrimaryKey:
866            return super()._parse_primary_key(
867                wrapped_optional=wrapped_optional or in_props, in_props=in_props
868            )
869
870        def _parse_on_property(self) -> t.Optional[exp.Expression]:
871            index = self._index
872            if self._match_text_seq("CLUSTER"):
873                this = self._parse_string() or self._parse_id_var()
874                if this:
875                    return self.expression(exp.OnCluster, this=this)
876                else:
877                    self._retreat(index)
878            return None
879
880        def _parse_index_constraint(
881            self, kind: t.Optional[str] = None
882        ) -> exp.IndexColumnConstraint:
883            # INDEX name1 expr TYPE type1(args) GRANULARITY value
884            this = self._parse_id_var()
885            expression = self._parse_assignment()
886
887            index_type = self._match_text_seq("TYPE") and (
888                self._parse_function() or self._parse_var()
889            )
890
891            granularity = self._match_text_seq("GRANULARITY") and self._parse_term()
892
893            return self.expression(
894                exp.IndexColumnConstraint,
895                this=this,
896                expression=expression,
897                index_type=index_type,
898                granularity=granularity,
899            )
900
901        def _parse_partition(self) -> t.Optional[exp.Partition]:
902            # https://clickhouse.com/docs/en/sql-reference/statements/alter/partition#how-to-set-partition-expression
903            if not self._match(TokenType.PARTITION):
904                return None
905
906            if self._match_text_seq("ID"):
907                # Corresponds to the PARTITION ID <string_value> syntax
908                expressions: t.List[exp.Expression] = [
909                    self.expression(exp.PartitionId, this=self._parse_string())
910                ]
911            else:
912                expressions = self._parse_expressions()
913
914            return self.expression(exp.Partition, expressions=expressions)
915
916        def _parse_alter_table_replace(self) -> t.Optional[exp.Expression]:
917            partition = self._parse_partition()
918
919            if not partition or not self._match(TokenType.FROM):
920                return None
921
922            return self.expression(
923                exp.ReplacePartition, expression=partition, source=self._parse_table_parts()
924            )
925
926        def _parse_projection_def(self) -> t.Optional[exp.ProjectionDef]:
927            if not self._match_text_seq("PROJECTION"):
928                return None
929
930            return self.expression(
931                exp.ProjectionDef,
932                this=self._parse_id_var(),
933                expression=self._parse_wrapped(self._parse_statement),
934            )
935
936        def _parse_constraint(self) -> t.Optional[exp.Expression]:
937            return super()._parse_constraint() or self._parse_projection_def()
938
939        def _parse_alias(
940            self, this: t.Optional[exp.Expression], explicit: bool = False
941        ) -> t.Optional[exp.Expression]:
942            # In clickhouse "SELECT <expr> APPLY(...)" is a query modifier,
943            # so "APPLY" shouldn't be parsed as <expr>'s alias. However, "SELECT <expr> apply" is a valid alias
944            if self._match_pair(TokenType.APPLY, TokenType.L_PAREN, advance=False):
945                return this
946
947            return super()._parse_alias(this=this, explicit=explicit)
948
949        def _parse_expression(self) -> t.Optional[exp.Expression]:
950            this = super()._parse_expression()
951
952            # Clickhouse allows "SELECT <expr> [APPLY(func)] [...]]" modifier
953            while self._match_pair(TokenType.APPLY, TokenType.L_PAREN):
954                this = exp.Apply(this=this, expression=self._parse_var(any_token=True))
955                self._match(TokenType.R_PAREN)
956
957            return this
958
959        def _parse_columns(self) -> exp.Expression:
960            this: exp.Expression = self.expression(exp.Columns, this=self._parse_lambda())
961
962            while self._next and self._match_text_seq(")", "APPLY", "("):
963                self._match(TokenType.R_PAREN)
964                this = exp.Apply(this=this, expression=self._parse_var(any_token=True))
965            return this
966
967        def _parse_value(self, values: bool = True) -> t.Optional[exp.Tuple]:
968            value = super()._parse_value(values=values)
969            if not value:
970                return None
971
972            # In Clickhouse "SELECT * FROM VALUES (1, 2, 3)" generates a table with a single column, in contrast
973            # to other dialects. For this case, we canonicalize the values into a tuple-of-tuples AST if it's not already one.
974            # In INSERT INTO statements the same clause actually references multiple columns (opposite semantics),
975            # but the final result is not altered by the extra parentheses.
976            # Note: Clickhouse allows VALUES([structure], value, ...) so the branch checks for the last expression
977            expressions = value.expressions
978            if values and not isinstance(expressions[-1], exp.Tuple):
979                value.set(
980                    "expressions",
981                    [self.expression(exp.Tuple, expressions=[expr]) for expr in expressions],
982                )
983
984            return value
985
986        def _parse_partitioned_by(self) -> exp.PartitionedByProperty:
987            # ClickHouse allows custom expressions as partition key
988            # https://clickhouse.com/docs/engines/table-engines/mergetree-family/custom-partitioning-key
989            return self.expression(
990                exp.PartitionedByProperty,
991                this=self._parse_assignment(),
992            )

Parser consumes a list of tokens produced by the Tokenizer and produces a parsed syntax tree.

Arguments:
  • error_level: The desired error level. Default: ErrorLevel.IMMEDIATE
  • error_message_context: The amount of context to capture from a query string when displaying the error message (in number of characters). Default: 100
  • max_errors: Maximum number of error messages to include in a raised ParseError. This is only relevant if error_level is ErrorLevel.RAISE. Default: 3
MODIFIERS_ATTACHED_TO_SET_OP = False
INTERVAL_SPANS = False
OPTIONAL_ALIAS_TOKEN_CTE = False
JOINS_HAVE_EQUAL_PRECEDENCE = True
FUNCTIONS = {'ABS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Abs'>>, 'ACOS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Acos'>>, 'ACOSH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Acosh'>>, 'ADD_MONTHS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AddMonths'>>, 'AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.And'>>, 'ANONYMOUS_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AnonymousAggFunc'>>, 'ANY_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AnyValue'>>, 'APPLY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Apply'>>, 'APPROX_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxDistinct'>>, 'APPROX_COUNT_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxDistinct'>>, 'APPROX_QUANTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxQuantile'>>, 'APPROX_QUANTILES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxQuantiles'>>, 'APPROX_TOP_K': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxTopK'>>, 'ARG_MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMax'>>, 'ARGMAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMax'>>, 'MAX_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMax'>>, 'ARG_MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMin'>>, 'ARGMIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMin'>>, 'MIN_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMin'>>, 'ARRAY': <function Parser.<lambda>>, 'ARRAY_AGG': <function Parser.<lambda>>, 'ARRAY_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayAll'>>, 'ARRAY_ANY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayAny'>>, 'ARRAY_CONCAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayConcat'>>, 'ARRAY_CAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayConcat'>>, 'ARRAY_CONCAT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayConcatAgg'>>, 'ARRAY_CONSTRUCT_COMPACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayConstructCompact'>>, 'ARRAY_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContains'>>, 'ARRAY_HAS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContains'>>, 'ARRAY_CONTAINS_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContainsAll'>>, 'ARRAY_HAS_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContainsAll'>>, 'FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayFilter'>>, 'ARRAY_FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayFilter'>>, 'ARRAY_FIRST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayFirst'>>, 'ARRAY_INTERSECT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayIntersect'>>, 'ARRAY_INTERSECTION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayIntersect'>>, 'ARRAY_LAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayLast'>>, 'ARRAY_OVERLAPS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayOverlaps'>>, 'ARRAY_REMOVE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayRemove'>>, 'ARRAY_REVERSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayReverse'>>, 'ARRAY_SIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySize'>>, 'ARRAY_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySize'>>, 'ARRAY_SLICE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySlice'>>, 'ARRAY_SORT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySort'>>, 'ARRAY_SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySum'>>, 'ARRAY_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayToString'>>, 'ARRAY_JOIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayToString'>>, 'ARRAY_UNION_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayUnionAgg'>>, 'ARRAY_UNIQUE_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayUniqueAgg'>>, 'ASCII': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ascii'>>, 'ASIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Asin'>>, 'ASINH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Asinh'>>, 'ATAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Atan'>>, 'ATAN2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Atan2'>>, 'ATANH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Atanh'>>, 'AVG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Avg'>>, 'BITWISE_AND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitwiseAndAgg'>>, 'BITWISE_COUNT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitwiseCountAgg'>>, 'BITWISE_OR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitwiseOrAgg'>>, 'BITWISE_XOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitwiseXorAgg'>>, 'BYTE_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ByteLength'>>, 'CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Case'>>, 'CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cast'>>, 'CAST_TO_STR_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CastToStrType'>>, 'CBRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cbrt'>>, 'CEIL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ceil'>>, 'CEILING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ceil'>>, 'CHR': <function Parser.<lambda>>, 'CHAR': <function Parser.<lambda>>, 'COALESCE': <function build_coalesce>, 'IFNULL': <function build_coalesce>, 'NVL': <function build_coalesce>, 'CODE_POINTS_TO_BYTES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CodePointsToBytes'>>, 'CODE_POINTS_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CodePointsToString'>>, 'COLLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Collate'>>, 'COLUMNS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Columns'>>, 'COMBINED_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CombinedAggFunc'>>, 'COMBINED_PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CombinedParameterizedAgg'>>, 'CONCAT': <function Parser.<lambda>>, 'CONCAT_WS': <function Parser.<lambda>>, 'CONNECT_BY_ROOT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ConnectByRoot'>>, 'CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Contains'>>, 'CONVERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Convert'>>, 'CONVERT_TIMEZONE': <function build_convert_timezone>, 'CONVERT_TO_CHARSET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ConvertToCharset'>>, 'CORR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Corr'>>, 'COSINE_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CosineDistance'>>, 'COT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cot'>>, 'COTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Coth'>>, 'COUNT': <function Parser.<lambda>>, 'COUNT_IF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CountIf'>>, 'COUNTIF': <function _build_count_if>, 'COVAR_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CovarPop'>>, 'COVAR_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CovarSamp'>>, 'CSC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Csc'>>, 'CSCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Csch'>>, 'CUME_DIST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CumeDist'>>, 'CURRENT_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentDate'>>, 'CURRENT_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentDatetime'>>, 'CURRENT_SCHEMA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentSchema'>>, 'CURRENT_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentTime'>>, 'CURRENT_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentTimestamp'>>, 'CURRENT_TIMESTAMP_L_T_Z': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentTimestampLTZ'>>, 'CURRENT_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentUser'>>, 'DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Date'>>, 'DATE_ADD': <function build_date_delta.<locals>._builder>, 'DATE_BIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateBin'>>, 'DATEDIFF': <function build_date_delta.<locals>._builder>, 'DATE_DIFF': <function build_date_delta.<locals>._builder>, 'DATE_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateFromParts'>>, 'DATEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateFromParts'>>, 'DATE_FROM_UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateFromUnixDate'>>, 'DATE_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateStrToDate'>>, 'DATE_SUB': <function build_date_delta.<locals>._builder>, 'DATE_TO_DATE_STR': <function Parser.<lambda>>, 'DATE_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateToDi'>>, 'DATE_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateTrunc'>>, 'DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Datetime'>>, 'DATETIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeAdd'>>, 'DATETIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeDiff'>>, 'DATETIME_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeSub'>>, 'DATETIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeTrunc'>>, 'DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Day'>>, 'DAY_OF_MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfMonth'>>, 'DAYOFMONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfMonth'>>, 'DAY_OF_WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfWeek'>>, 'DAYOFWEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfWeek'>>, 'DAYOFWEEK_ISO': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfWeekIso'>>, 'ISODOW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfWeekIso'>>, 'DAY_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfYear'>>, 'DAYOFYEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfYear'>>, 'DECODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Decode'>>, 'DECODE_CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DecodeCase'>>, 'DENSE_RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DenseRank'>>, 'DI_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DiToDate'>>, 'ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Encode'>>, 'ENDS_WITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.EndsWith'>>, 'ENDSWITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.EndsWith'>>, 'EUCLIDEAN_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.EuclideanDistance'>>, 'EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Exists'>>, 'EXP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Exp'>>, 'EXPLODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Explode'>>, 'EXPLODE_OUTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ExplodeOuter'>>, 'EXPLODING_GENERATE_SERIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ExplodingGenerateSeries'>>, 'EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Extract'>>, 'FARM_FINGERPRINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FarmFingerprint'>>, 'FARMFINGERPRINT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FarmFingerprint'>>, 'FEATURES_AT_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FeaturesAtTime'>>, 'FIRST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.First'>>, 'FIRST_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FirstValue'>>, 'FLATTEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Flatten'>>, 'FLOAT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Float64'>>, 'FLOOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Floor'>>, 'FORMAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Format'>>, 'FROM_BASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromBase'>>, 'FROM_BASE32': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromBase32'>>, 'FROM_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromBase64'>>, 'FROM_ISO8601_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromISO8601Timestamp'>>, 'GAP_FILL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GapFill'>>, 'GENERATE_DATE_ARRAY': <function Parser.<lambda>>, 'GENERATE_EMBEDDING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GenerateEmbedding'>>, 'GENERATE_SERIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GenerateSeries'>>, 'GENERATE_TIMESTAMP_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GenerateTimestampArray'>>, 'GET_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GetExtract'>>, 'GREATEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Greatest'>>, 'GROUP_CONCAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GroupConcat'>>, 'GROUPING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Grouping'>>, 'HEX': <function build_hex>, 'HLL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Hll'>>, 'IF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.If'>>, 'IIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.If'>>, 'INITCAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Initcap'>>, 'INLINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Inline'>>, 'INT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Int64'>>, 'IS_ASCII': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsAscii'>>, 'IS_INF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsInf'>>, 'ISINF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsInf'>>, 'IS_NAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsNan'>>, 'ISNAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsNan'>>, 'J_S_O_N_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArray'>>, 'J_S_O_N_ARRAY_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArrayAgg'>>, 'JSON_ARRAY_APPEND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArrayAppend'>>, 'JSON_ARRAY_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArrayContains'>>, 'JSON_ARRAY_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArrayInsert'>>, 'JSONB_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBContains'>>, 'J_S_O_N_B_CONTAINS_ALL_TOP_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBContainsAllTopKeys'>>, 'J_S_O_N_B_CONTAINS_ANY_TOP_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBContainsAnyTopKeys'>>, 'J_S_O_N_B_DELETE_AT_PATH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBDeleteAtPath'>>, 'JSONB_EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBExists'>>, 'JSONB_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBExtract'>>, 'JSONB_EXTRACT_SCALAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBExtractScalar'>>, 'J_S_O_N_B_OBJECT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBObjectAgg'>>, 'J_S_O_N_BOOL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBool'>>, 'J_S_O_N_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONCast'>>, 'J_S_O_N_EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONExists'>>, 'JSON_EXTRACT': <function build_extract_json_with_path.<locals>._builder>, 'JSON_EXTRACT_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONExtractArray'>>, 'JSON_EXTRACT_SCALAR': <function build_extract_json_with_path.<locals>._builder>, 'JSON_FORMAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONFormat'>>, 'J_S_O_N_KEYS_AT_DEPTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONKeysAtDepth'>>, 'J_S_O_N_OBJECT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONObject'>>, 'J_S_O_N_OBJECT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONObjectAgg'>>, 'JSON_REMOVE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONRemove'>>, 'JSON_SET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONSet'>>, 'JSON_STRIP_NULLS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONStripNulls'>>, 'J_S_O_N_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONTable'>>, 'JSON_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONType'>>, 'J_S_O_N_VALUE_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONValueArray'>>, 'JUSTIFY_DAYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JustifyDays'>>, 'JUSTIFY_HOURS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JustifyHours'>>, 'JUSTIFY_INTERVAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JustifyInterval'>>, 'LAG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Lag'>>, 'LAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Last'>>, 'LAST_DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LastDay'>>, 'LAST_DAY_OF_MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LastDay'>>, 'LAST_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LastValue'>>, 'LAX_BOOL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LaxBool'>>, 'LAX_FLOAT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LaxFloat64'>>, 'LAX_INT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LaxInt64'>>, 'LAX_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LaxString'>>, 'LEAD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Lead'>>, 'LEAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Least'>>, 'LEFT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Left'>>, 'LENGTH': <function ClickHouse.Parser.<lambda>>, 'LEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Length'>>, 'CHAR_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Length'>>, 'CHARACTER_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Length'>>, 'LEVENSHTEIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Levenshtein'>>, 'LIST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.List'>>, 'LN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ln'>>, 'LOG': <function build_logarithm>, 'LOGICAL_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalAnd'>>, 'BOOL_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalAnd'>>, 'BOOLAND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalAnd'>>, 'LOGICAL_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalOr'>>, 'BOOL_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalOr'>>, 'BOOLOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalOr'>>, 'LOWER': <function build_lower>, 'LCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Lower'>>, 'LOWER_HEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LowerHex'>>, 'MD5': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MD5Digest'>>, 'MD5_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MD5Digest'>>, 'M_L_FORECAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MLForecast'>>, 'M_L_TRANSLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MLTranslate'>>, 'MAKE_INTERVAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MakeInterval'>>, 'MAP': <function build_var_map>, 'MAP_FROM_ENTRIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MapFromEntries'>>, 'MATCH_AGAINST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MatchAgainst'>>, 'MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Max'>>, 'MEDIAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Median'>>, 'MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Min'>>, 'MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Month'>>, 'MONTHS_BETWEEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MonthsBetween'>>, 'NEXT_VALUE_FOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.NextValueFor'>>, 'NORMALIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Normalize'>>, 'NTH_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.NthValue'>>, 'NTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ntile'>>, 'NULLIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Nullif'>>, 'NUMBER_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.NumberToStr'>>, 'NVL2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Nvl2'>>, 'OBJECT_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ObjectInsert'>>, 'OPEN_J_S_O_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.OpenJSON'>>, 'OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Or'>>, 'OVERLAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Overlay'>>, 'PAD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Pad'>>, 'PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParameterizedAgg'>>, 'PARSE_BIGNUMERIC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseBignumeric'>>, 'PARSE_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseDatetime'>>, 'PARSE_JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseJSON'>>, 'JSON_PARSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseJSON'>>, 'PARSE_NUMERIC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseNumeric'>>, 'PARSE_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseTime'>>, 'PERCENT_RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PercentRank'>>, 'PERCENTILE_CONT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PercentileCont'>>, 'PERCENTILE_DISC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PercentileDisc'>>, 'POSEXPLODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Posexplode'>>, 'POSEXPLODE_OUTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PosexplodeOuter'>>, 'POWER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Pow'>>, 'POW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Pow'>>, 'PREDICT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Predict'>>, 'QUANTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Quantile'>>, 'QUARTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Quarter'>>, 'RAND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Rand'>>, 'RANDOM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Rand'>>, 'RANDN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Randn'>>, 'RANGE_BUCKET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RangeBucket'>>, 'RANGE_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RangeN'>>, 'RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Rank'>>, 'READ_CSV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ReadCSV'>>, 'REDUCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Reduce'>>, 'REGEXP_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpExtract'>>, 'REGEXP_EXTRACT_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpExtractAll'>>, 'REGEXP_I_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpILike'>>, 'REGEXP_INSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpInstr'>>, 'REGEXP_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpLike'>>, 'REGEXP_REPLACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpReplace'>>, 'REGEXP_SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpSplit'>>, 'REPEAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Repeat'>>, 'REPLACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Replace'>>, 'REVERSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Reverse'>>, 'RIGHT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Right'>>, 'ROUND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Round'>>, 'ROW_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RowNumber'>>, 'SHA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA'>>, 'SHA1': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA'>>, 'SHA2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA2'>>, 'SAFE_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeAdd'>>, 'SAFE_CONVERT_BYTES_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeConvertBytesToString'>>, 'SAFE_DIVIDE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeDivide'>>, 'SAFE_MULTIPLY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeMultiply'>>, 'SAFE_NEGATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeNegate'>>, 'SAFE_SUBTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeSubtract'>>, 'SEC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sec'>>, 'SECH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sech'>>, 'SIGN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sign'>>, 'SIGNUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sign'>>, 'SIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sin'>>, 'SINH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sinh'>>, 'SORT_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SortArray'>>, 'SOUNDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Soundex'>>, 'SPACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Space'>>, 'SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Split'>>, 'SPLIT_PART': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SplitPart'>>, 'SQRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sqrt'>>, 'ST_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StDistance'>>, 'ST_POINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StPoint'>>, 'ST_MAKEPOINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StPoint'>>, 'STANDARD_HASH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StandardHash'>>, 'STAR_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StarMap'>>, 'STARTS_WITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StartsWith'>>, 'STARTSWITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StartsWith'>>, 'STDDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stddev'>>, 'STDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stddev'>>, 'STDDEV_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StddevPop'>>, 'STDDEV_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StddevSamp'>>, 'STR_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrPosition'>>, 'STR_TO_DATE': <function _build_str_to_date>, 'STR_TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToMap'>>, 'STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToTime'>>, 'STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToUnix'>>, 'STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.String'>>, 'STRING_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'SPLIT_BY_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'STRTOK_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'STRUCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Struct'>>, 'STRUCT_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StructExtract'>>, 'STUFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stuff'>>, 'INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stuff'>>, 'SUBSTRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Substring'>>, 'SUBSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Substring'>>, 'SUBSTRING_INDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SubstringIndex'>>, 'SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sum'>>, 'TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Time'>>, 'TIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeAdd'>>, 'TIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeDiff'>>, 'TIME_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeFromParts'>>, 'TIMEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeFromParts'>>, 'TIME_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToDate'>>, 'TIME_STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToTime'>>, 'TIME_STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToUnix'>>, 'TIME_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeSub'>>, 'TIME_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeToStr'>>, 'TIME_TO_TIME_STR': <function Parser.<lambda>>, 'TIME_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeToUnix'>>, 'TIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeTrunc'>>, 'TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Timestamp'>>, 'TIMESTAMP_ADD': <function build_date_delta.<locals>._builder>, 'TIMESTAMPDIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampDiff'>>, 'TIMESTAMP_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampDiff'>>, 'TIMESTAMP_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampFromParts'>>, 'TIMESTAMPFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampFromParts'>>, 'TIMESTAMP_SUB': <function build_date_delta.<locals>._builder>, 'TIMESTAMP_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampTrunc'>>, 'TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToArray'>>, 'TO_BASE32': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToBase32'>>, 'TO_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToBase64'>>, 'TO_CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToChar'>>, 'TO_CODE_POINTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToCodePoints'>>, 'TO_DAYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToDays'>>, 'TO_DOUBLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToDouble'>>, 'TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToMap'>>, 'TO_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToNumber'>>, 'TRANSLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Translate'>>, 'TRIM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Trim'>>, 'TRY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Try'>>, 'TRY_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TryCast'>>, 'TS_OR_DI_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDiToDi'>>, 'TS_OR_DS_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsAdd'>>, 'TS_OR_DS_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsDiff'>>, 'TS_OR_DS_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToDate'>>, 'TS_OR_DS_TO_DATE_STR': <function Parser.<lambda>>, 'TS_OR_DS_TO_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToDatetime'>>, 'TS_OR_DS_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToTime'>>, 'TS_OR_DS_TO_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToTimestamp'>>, 'TYPEOF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Typeof'>>, 'UNHEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Unhex'>>, 'UNICODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Unicode'>>, 'UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixDate'>>, 'UNIX_MICROS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixMicros'>>, 'UNIX_MILLIS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixMillis'>>, 'UNIX_SECONDS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixSeconds'>>, 'UNIX_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToStr'>>, 'UNIX_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToTime'>>, 'UNIX_TO_TIME_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToTimeStr'>>, 'UNNEST': <function Parser.<lambda>>, 'UPPER': <function build_upper>, 'UCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Upper'>>, 'UTC_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UtcDate'>>, 'UTC_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UtcTime'>>, 'UTC_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UtcTimestamp'>>, 'UUID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Uuid'>>, 'GEN_RANDOM_UUID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Uuid'>>, 'GENERATE_UUID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Uuid'>>, 'UUID_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Uuid'>>, 'VAR_MAP': <function build_var_map>, 'VARIANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Variance'>>, 'VARIANCE_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Variance'>>, 'VAR_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Variance'>>, 'VARIANCE_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.VariancePop'>>, 'VAR_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.VariancePop'>>, 'VECTOR_SEARCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.VectorSearch'>>, 'WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Week'>>, 'WEEK_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.WeekOfYear'>>, 'WEEKOFYEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.WeekOfYear'>>, 'XMLELEMENT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.XMLElement'>>, 'X_M_L_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.XMLTable'>>, 'XOR': <function ClickHouse.Parser.<lambda>>, 'YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Year'>>, 'ARRAYAGG': <function Parser.<lambda>>, 'GLOB': <function Parser.<lambda>>, 'JSON_EXTRACT_PATH_TEXT': <function build_extract_json_with_path.<locals>._builder>, 'LIKE': <function build_like>, 'LOG2': <function Parser.<lambda>>, 'LOG10': <function Parser.<lambda>>, 'LPAD': <function Parser.<lambda>>, 'LEFTPAD': <function Parser.<lambda>>, 'LTRIM': <function Parser.<lambda>>, 'MOD': <function build_mod>, 'RIGHTPAD': <function Parser.<lambda>>, 'RPAD': <function Parser.<lambda>>, 'RTRIM': <function Parser.<lambda>>, 'SCOPE_RESOLUTION': <function Parser.<lambda>>, 'STRPOS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrPosition'>>, 'CHARINDEX': <function Parser.<lambda>>, 'INSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrPosition'>>, 'LOCATE': <function Parser.<lambda>>, 'TO_HEX': <function build_hex>, 'ANY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AnyValue'>>, 'ARRAYSUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySum'>>, 'ARRAYREVERSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayReverse'>>, 'ARRAYSLICE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySlice'>>, 'COSINEDISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CosineDistance'>>, 'DATEADD': <function build_date_delta.<locals>._builder>, 'DATE_FORMAT': <function _build_datetime_format.<locals>._builder>, 'DATESUB': <function build_date_delta.<locals>._builder>, 'FORMATDATETIME': <function _build_datetime_format.<locals>._builder>, 'JSONEXTRACTSTRING': <function build_json_extract_path.<locals>._builder>, 'L2Distance': <bound method Func.from_arg_list of <class 'sqlglot.expressions.EuclideanDistance'>>, 'MATCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpLike'>>, 'PARSEDATETIME': <function _build_datetime_format.<locals>._builder>, 'RANDCANONICAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Rand'>>, 'TUPLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Struct'>>, 'TIMESTAMPSUB': <function build_date_delta.<locals>._builder>, 'TIMESTAMPADD': <function build_date_delta.<locals>._builder>, 'UNIQ': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxDistinct'>>, 'SHA256': <function ClickHouse.Parser.<lambda>>, 'SHA512': <function ClickHouse.Parser.<lambda>>, 'SUBSTRINGINDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SubstringIndex'>>, 'TOTYPENAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Typeof'>>, 'EDITDISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Levenshtein'>>, 'LEVENSHTEINDISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Levenshtein'>>}
AGG_FUNCTIONS = {'avgWeighted', 'quantileExactLow', 'exponentialTimeDecayedAvg', 'uniqUpTo', 'quantilesExactHigh', 'groupBitmapOr', 'argMin', 'sparkBar', 'quantiles', 'groupBitAnd', 'minMap', 'exponentialMovingAverage', 'quantilesExactLow', 'retention', 'sumWithOverflow', 'quantilesExactWeighted', 'skewSamp', 'welchTTest', 'groupBitOr', 'quantilesTiming', 'quantile', 'contingency', 'groupArraySample', 'deltaSum', 'quantilesTDigestWeighted', 'maxMap', 'sum', 'topK', 'quantileInterpolatedWeighted', 'groupArrayMovingSum', 'quantileBFloat16', 'quantilesDeterministic', 'kurtPop', 'sumCount', 'groupArrayLast', 'stochasticLogisticRegression', 'quantileTimingWeighted', 'groupUniqArray', 'kurtSamp', 'count', 'quantilesBFloat16Weighted', 'groupBitmapXor', 'first_value', 'sumMap', 'quantileDeterministic', 'intervalLengthSum', 'cramersV', 'uniqCombined64', 'rankCorr', 'quantilesGK', 'varPop', 'anyHeavy', 'entropy', 'deltaSumTimestamp', 'max', 'quantilesTimingWeighted', 'groupBitmap', 'approx_top_sum', 'median', 'maxIntersections', 'quantileExact', 'categoricalInformationValue', 'groupArrayMovingAvg', 'uniqHLL12', 'studentTTest', 'topKWeighted', 'stochasticLinearRegression', 'stddevPop', 'quantileExactHigh', 'corr', 'skewPop', 'min', 'boundingRatio', 'largestTriangleThreeBuckets', 'anyLast', 'maxIntersectionsPosition', 'quantilesInterpolatedWeighted', 'histogram', 'uniqTheta', 'groupArrayInsertAt', 'covarPop', 'uniqCombined', 'covarSamp', 'simpleLinearRegression', 'varSamp', 'cramersVBiasCorrected', 'sequenceCount', 'sequenceNextNode', 'windowFunnel', 'mannWhitneyUTest', 'quantileTDigestWeighted', 'sumKahan', 'kolmogorovSmirnovTest', 'quantileExactWeighted', 'quantileTiming', 'groupBitXor', 'meanZTest', 'avg', 'uniq', 'quantileBFloat16Weighted', 'any', 'quantileGK', 'groupBitmapAnd', 'argMax', 'last_value', 'quantilesExact', 'uniqExact', 'quantilesBFloat16', 'sequenceMatch', 'stddevSamp', 'theilsU', 'groupArray', 'quantilesTDigest', 'quantileTDigest'}
AGG_FUNCTIONS_SUFFIXES = ['If', 'Array', 'ArrayIf', 'Map', 'SimpleState', 'State', 'Merge', 'MergeState', 'ForEach', 'Distinct', 'OrDefault', 'OrNull', 'Resample', 'ArgMin', 'ArgMax']
FUNC_TOKENS = {<TokenType.XOR: 'XOR'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.OR: 'OR'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.RLIKE: 'RLIKE'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.INDEX: 'INDEX'>, <TokenType.SOME: 'SOME'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.MAP: 'MAP'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.VOID: 'VOID'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.GLOB: 'GLOB'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.NEXT: 'NEXT'>, <TokenType.NULL: 'NULL'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.DATE: 'DATE'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.INET: 'INET'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.FILTER: 'FILTER'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.PRIMARY_KEY: 'PRIMARY_KEY'>, <TokenType.BIT: 'BIT'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.GET: 'GET'>, <TokenType.UTC_TIME: 'UTC_TIME'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.INT256: 'INT256'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.ROW: 'ROW'>, <TokenType.JSONB: 'JSONB'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.BINARY: 'BINARY'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.UTC_TIMESTAMP: 'UTC_TIMESTAMP'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.INT: 'INT'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.UUID: 'UUID'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.MERGE: 'MERGE'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.VAR: 'VAR'>, <TokenType.YEAR: 'YEAR'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.INSERT: 'INSERT'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.ALL: 'ALL'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.POINT: 'POINT'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.CHAR: 'CHAR'>, <TokenType.BLOB: 'BLOB'>, <TokenType.XML: 'XML'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.GEOGRAPHYPOINT: 'GEOGRAPHYPOINT'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.SET: 'SET'>, <TokenType.TIME: 'TIME'>, <TokenType.UINT: 'UINT'>, <TokenType.IPV4: 'IPV4'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.UINT128: 'UINT128'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.JSON: 'JSON'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.IPV6: 'IPV6'>, <TokenType.RIGHT: 'RIGHT'>, <TokenType.NESTED: 'NESTED'>, <TokenType.SUPER: 'SUPER'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.INT128: 'INT128'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.ENUM: 'ENUM'>, <TokenType.MONEY: 'MONEY'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.RING: 'RING'>, <TokenType.FIRST: 'FIRST'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.NAME: 'NAME'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.UNION: 'UNION'>, <TokenType.AND: 'AND'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.LIKE: 'LIKE'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.TABLE: 'TABLE'>, <TokenType.ILIKE: 'ILIKE'>, <TokenType.LEFT: 'LEFT'>, <TokenType.DATE32: 'DATE32'>, <TokenType.NOTHING: 'NOTHING'>, <TokenType.LIST: 'LIST'>, <TokenType.ANY: 'ANY'>, <TokenType.UINT256: 'UINT256'>, <TokenType.UTC_DATE: 'UTC_DATE'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.WINDOW: 'WINDOW'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.TEXT: 'TEXT'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.RANGE: 'RANGE'>}
RESERVED_TOKENS = {<TokenType.STAR: 'STAR'>, <TokenType.AMP: 'AMP'>, <TokenType.DOT: 'DOT'>, <TokenType.L_BRACE: 'L_BRACE'>, <TokenType.L_BRACKET: 'L_BRACKET'>, <TokenType.GT: 'GT'>, <TokenType.NOT: 'NOT'>, <TokenType.LT: 'LT'>, <TokenType.DASH: 'DASH'>, <TokenType.COLON: 'COLON'>, <TokenType.R_PAREN: 'R_PAREN'>, <TokenType.PLACEHOLDER: 'PLACEHOLDER'>, <TokenType.HASH: 'HASH'>, <TokenType.SLASH: 'SLASH'>, <TokenType.SEMICOLON: 'SEMICOLON'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.PLUS: 'PLUS'>, <TokenType.R_BRACKET: 'R_BRACKET'>, <TokenType.L_PAREN: 'L_PAREN'>, <TokenType.CARET: 'CARET'>, <TokenType.MOD: 'MOD'>, <TokenType.BACKSLASH: 'BACKSLASH'>, <TokenType.PIPE: 'PIPE'>, <TokenType.R_BRACE: 'R_BRACE'>, <TokenType.TILDA: 'TILDA'>, <TokenType.PARAMETER: 'PARAMETER'>, <TokenType.COMMA: 'COMMA'>, <TokenType.EQ: 'EQ'>}
ID_VAR_TOKENS = {<TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.FULL: 'FULL'>, <TokenType.NAMESPACE: 'NAMESPACE'>, <TokenType.SOURCE: 'SOURCE'>, <TokenType.ASC: 'ASC'>, <TokenType.LOAD: 'LOAD'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.RANGE: 'RANGE'>, <TokenType.SEMANTIC_VIEW: 'SEMANTIC_VIEW'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.INDEX: 'INDEX'>, <TokenType.SOME: 'SOME'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.MAP: 'MAP'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.VOID: 'VOID'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.LIMIT: 'LIMIT'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.NEXT: 'NEXT'>, <TokenType.KILL: 'KILL'>, <TokenType.NULL: 'NULL'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.ROWS: 'ROWS'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.DATE: 'DATE'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.INET: 'INET'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.FILTER: 'FILTER'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.FILE_FORMAT: 'FILE_FORMAT'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.BIT: 'BIT'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.GET: 'GET'>, <TokenType.TRUE: 'TRUE'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.INT256: 'INT256'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.NATURAL: 'NATURAL'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.ROW: 'ROW'>, <TokenType.JSONB: 'JSONB'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.BINARY: 'BINARY'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.COPY: 'COPY'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.FALSE: 'FALSE'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.INT: 'INT'>, <TokenType.CUBE: 'CUBE'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.SEMI: 'SEMI'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.MERGE: 'MERGE'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.VAR: 'VAR'>, <TokenType.YEAR: 'YEAR'>, <TokenType.KEEP: 'KEEP'>, <TokenType.CASE: 'CASE'>, <TokenType.SESSION: 'SESSION'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.ALL: 'ALL'>, <TokenType.DELETE: 'DELETE'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.POINT: 'POINT'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.TOP: 'TOP'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.CHAR: 'CHAR'>, <TokenType.BLOB: 'BLOB'>, <TokenType.XML: 'XML'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.FINAL: 'FINAL'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.SET: 'SET'>, <TokenType.GEOGRAPHYPOINT: 'GEOGRAPHYPOINT'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.TIME: 'TIME'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.UINT: 'UINT'>, <TokenType.IPV4: 'IPV4'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.UINT128: 'UINT128'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.DETACH: 'DETACH'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.JSON: 'JSON'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.MODEL: 'MODEL'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.IPV6: 'IPV6'>, <TokenType.RIGHT: 'RIGHT'>, <TokenType.NESTED: 'NESTED'>, <TokenType.SUPER: 'SUPER'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.INT128: 'INT128'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.ENUM: 'ENUM'>, <TokenType.MONEY: 'MONEY'>, <TokenType.APPLY: 'APPLY'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.RING: 'RING'>, <TokenType.USE: 'USE'>, <TokenType.FIRST: 'FIRST'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.NAME: 'NAME'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.ASOF: 'ASOF'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.LIKE: 'LIKE'>, <TokenType.DESC: 'DESC'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.TABLE: 'TABLE'>, <TokenType.PUT: 'PUT'>, <TokenType.SHOW: 'SHOW'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.LEFT: 'LEFT'>, <TokenType.DATE32: 'DATE32'>, <TokenType.NOTHING: 'NOTHING'>, <TokenType.TAG: 'TAG'>, <TokenType.DIV: 'DIV'>, <TokenType.RENAME: 'RENAME'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.ANY: 'ANY'>, <TokenType.LIST: 'LIST'>, <TokenType.UINT256: 'UINT256'>, <TokenType.EXPORT: 'EXPORT'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.ANTI: 'ANTI'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.WINDOW: 'WINDOW'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.TEXT: 'TEXT'>, <TokenType.STAGE: 'STAGE'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.END: 'END'>, <TokenType.CACHE: 'CACHE'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.VIEW: 'VIEW'>, <TokenType.IS: 'IS'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.ATTACH: 'ATTACH'>, <TokenType.UUID: 'UUID'>, <TokenType.SINK: 'SINK'>}
AGG_FUNC_MAPPING = {'avgWeightedIf': ('avgWeighted', 'If'), 'quantileExactLowIf': ('quantileExactLow', 'If'), 'exponentialTimeDecayedAvgIf': ('exponentialTimeDecayedAvg', 'If'), 'uniqUpToIf': ('uniqUpTo', 'If'), 'quantilesExactHighIf': ('quantilesExactHigh', 'If'), 'groupBitmapOrIf': ('groupBitmapOr', 'If'), 'argMinIf': ('argMin', 'If'), 'sparkBarIf': ('sparkBar', 'If'), 'quantilesIf': ('quantiles', 'If'), 'groupBitAndIf': ('groupBitAnd', 'If'), 'minMapIf': ('minMap', 'If'), 'exponentialMovingAverageIf': ('exponentialMovingAverage', 'If'), 'quantilesExactLowIf': ('quantilesExactLow', 'If'), 'retentionIf': ('retention', 'If'), 'sumWithOverflowIf': ('sumWithOverflow', 'If'), 'quantilesExactWeightedIf': ('quantilesExactWeighted', 'If'), 'skewSampIf': ('skewSamp', 'If'), 'welchTTestIf': ('welchTTest', 'If'), 'groupBitOrIf': ('groupBitOr', 'If'), 'quantilesTimingIf': ('quantilesTiming', 'If'), 'quantileIf': ('quantile', 'If'), 'contingencyIf': ('contingency', 'If'), 'groupArraySampleIf': ('groupArraySample', 'If'), 'deltaSumIf': ('deltaSum', 'If'), 'quantilesTDigestWeightedIf': ('quantilesTDigestWeighted', 'If'), 'maxMapIf': ('maxMap', 'If'), 'sumIf': ('sum', 'If'), 'topKIf': ('topK', 'If'), 'quantileInterpolatedWeightedIf': ('quantileInterpolatedWeighted', 'If'), 'groupArrayMovingSumIf': ('groupArrayMovingSum', 'If'), 'quantileBFloat16If': ('quantileBFloat16', 'If'), 'quantilesDeterministicIf': ('quantilesDeterministic', 'If'), 'kurtPopIf': ('kurtPop', 'If'), 'sumCountIf': ('sumCount', 'If'), 'groupArrayLastIf': ('groupArrayLast', 'If'), 'stochasticLogisticRegressionIf': ('stochasticLogisticRegression', 'If'), 'quantileTimingWeightedIf': ('quantileTimingWeighted', 'If'), 'groupUniqArrayIf': ('groupUniqArray', 'If'), 'kurtSampIf': ('kurtSamp', 'If'), 'countIf': ('count', 'If'), 'quantilesBFloat16WeightedIf': ('quantilesBFloat16Weighted', 'If'), 'groupBitmapXorIf': ('groupBitmapXor', 'If'), 'first_valueIf': ('first_value', 'If'), 'sumMapIf': ('sumMap', 'If'), 'quantileDeterministicIf': ('quantileDeterministic', 'If'), 'intervalLengthSumIf': ('intervalLengthSum', 'If'), 'cramersVIf': ('cramersV', 'If'), 'uniqCombined64If': ('uniqCombined64', 'If'), 'rankCorrIf': ('rankCorr', 'If'), 'quantilesGKIf': ('quantilesGK', 'If'), 'varPopIf': ('varPop', 'If'), 'anyHeavyIf': ('anyHeavy', 'If'), 'entropyIf': ('entropy', 'If'), 'deltaSumTimestampIf': ('deltaSumTimestamp', 'If'), 'maxIf': ('max', 'If'), 'quantilesTimingWeightedIf': ('quantilesTimingWeighted', 'If'), 'groupBitmapIf': ('groupBitmap', 'If'), 'approx_top_sumIf': ('approx_top_sum', 'If'), 'medianIf': ('median', 'If'), 'maxIntersectionsIf': ('maxIntersections', 'If'), 'quantileExactIf': ('quantileExact', 'If'), 'categoricalInformationValueIf': ('categoricalInformationValue', 'If'), 'groupArrayMovingAvgIf': ('groupArrayMovingAvg', 'If'), 'uniqHLL12If': ('uniqHLL12', 'If'), 'studentTTestIf': ('studentTTest', 'If'), 'topKWeightedIf': ('topKWeighted', 'If'), 'stochasticLinearRegressionIf': ('stochasticLinearRegression', 'If'), 'stddevPopIf': ('stddevPop', 'If'), 'quantileExactHighIf': ('quantileExactHigh', 'If'), 'corrIf': ('corr', 'If'), 'skewPopIf': ('skewPop', 'If'), 'minIf': ('min', 'If'), 'boundingRatioIf': ('boundingRatio', 'If'), 'largestTriangleThreeBucketsIf': ('largestTriangleThreeBuckets', 'If'), 'anyLastIf': ('anyLast', 'If'), 'maxIntersectionsPositionIf': ('maxIntersectionsPosition', 'If'), 'quantilesInterpolatedWeightedIf': ('quantilesInterpolatedWeighted', 'If'), 'histogramIf': ('histogram', 'If'), 'uniqThetaIf': ('uniqTheta', 'If'), 'groupArrayInsertAtIf': ('groupArrayInsertAt', 'If'), 'covarPopIf': ('covarPop', 'If'), 'uniqCombinedIf': ('uniqCombined', 'If'), 'covarSampIf': ('covarSamp', 'If'), 'simpleLinearRegressionIf': ('simpleLinearRegression', 'If'), 'varSampIf': ('varSamp', 'If'), 'cramersVBiasCorrectedIf': ('cramersVBiasCorrected', 'If'), 'sequenceCountIf': ('sequenceCount', 'If'), 'sequenceNextNodeIf': ('sequenceNextNode', 'If'), 'windowFunnelIf': ('windowFunnel', 'If'), 'mannWhitneyUTestIf': ('mannWhitneyUTest', 'If'), 'quantileTDigestWeightedIf': ('quantileTDigestWeighted', 'If'), 'sumKahanIf': ('sumKahan', 'If'), 'kolmogorovSmirnovTestIf': ('kolmogorovSmirnovTest', 'If'), 'quantileExactWeightedIf': ('quantileExactWeighted', 'If'), 'quantileTimingIf': ('quantileTiming', 'If'), 'groupBitXorIf': ('groupBitXor', 'If'), 'meanZTestIf': ('meanZTest', 'If'), 'avgIf': ('avg', 'If'), 'uniqIf': ('uniq', 'If'), 'quantileBFloat16WeightedIf': ('quantileBFloat16Weighted', 'If'), 'anyIf': ('any', 'If'), 'quantileGKIf': ('quantileGK', 'If'), 'groupBitmapAndIf': ('groupBitmapAnd', 'If'), 'argMaxIf': ('argMax', 'If'), 'last_valueIf': ('last_value', 'If'), 'quantilesExactIf': ('quantilesExact', 'If'), 'uniqExactIf': ('uniqExact', 'If'), 'quantilesBFloat16If': ('quantilesBFloat16', 'If'), 'sequenceMatchIf': ('sequenceMatch', 'If'), 'stddevSampIf': ('stddevSamp', 'If'), 'theilsUIf': ('theilsU', 'If'), 'groupArrayIf': ('groupArray', 'If'), 'quantilesTDigestIf': ('quantilesTDigest', 'If'), 'quantileTDigestIf': ('quantileTDigest', 'If'), 'avgWeightedArray': ('avgWeighted', 'Array'), 'quantileExactLowArray': ('quantileExactLow', 'Array'), 'exponentialTimeDecayedAvgArray': ('exponentialTimeDecayedAvg', 'Array'), 'uniqUpToArray': ('uniqUpTo', 'Array'), 'quantilesExactHighArray': ('quantilesExactHigh', 'Array'), 'groupBitmapOrArray': ('groupBitmapOr', 'Array'), 'argMinArray': ('argMin', 'Array'), 'sparkBarArray': ('sparkBar', 'Array'), 'quantilesArray': ('quantiles', 'Array'), 'groupBitAndArray': ('groupBitAnd', 'Array'), 'minMapArray': ('minMap', 'Array'), 'exponentialMovingAverageArray': ('exponentialMovingAverage', 'Array'), 'quantilesExactLowArray': ('quantilesExactLow', 'Array'), 'retentionArray': ('retention', 'Array'), 'sumWithOverflowArray': ('sumWithOverflow', 'Array'), 'quantilesExactWeightedArray': ('quantilesExactWeighted', 'Array'), 'skewSampArray': ('skewSamp', 'Array'), 'welchTTestArray': ('welchTTest', 'Array'), 'groupBitOrArray': ('groupBitOr', 'Array'), 'quantilesTimingArray': ('quantilesTiming', 'Array'), 'quantileArray': ('quantile', 'Array'), 'contingencyArray': ('contingency', 'Array'), 'groupArraySampleArray': ('groupArraySample', 'Array'), 'deltaSumArray': ('deltaSum', 'Array'), 'quantilesTDigestWeightedArray': ('quantilesTDigestWeighted', 'Array'), 'maxMapArray': ('maxMap', 'Array'), 'sumArray': ('sum', 'Array'), 'topKArray': ('topK', 'Array'), 'quantileInterpolatedWeightedArray': ('quantileInterpolatedWeighted', 'Array'), 'groupArrayMovingSumArray': ('groupArrayMovingSum', 'Array'), 'quantileBFloat16Array': ('quantileBFloat16', 'Array'), 'quantilesDeterministicArray': ('quantilesDeterministic', 'Array'), 'kurtPopArray': ('kurtPop', 'Array'), 'sumCountArray': ('sumCount', 'Array'), 'groupArrayLastArray': ('groupArrayLast', 'Array'), 'stochasticLogisticRegressionArray': ('stochasticLogisticRegression', 'Array'), 'quantileTimingWeightedArray': ('quantileTimingWeighted', 'Array'), 'groupUniqArrayArray': ('groupUniqArray', 'Array'), 'kurtSampArray': ('kurtSamp', 'Array'), 'countArray': ('count', 'Array'), 'quantilesBFloat16WeightedArray': ('quantilesBFloat16Weighted', 'Array'), 'groupBitmapXorArray': ('groupBitmapXor', 'Array'), 'first_valueArray': ('first_value', 'Array'), 'sumMapArray': ('sumMap', 'Array'), 'quantileDeterministicArray': ('quantileDeterministic', 'Array'), 'intervalLengthSumArray': ('intervalLengthSum', 'Array'), 'cramersVArray': ('cramersV', 'Array'), 'uniqCombined64Array': ('uniqCombined64', 'Array'), 'rankCorrArray': ('rankCorr', 'Array'), 'quantilesGKArray': ('quantilesGK', 'Array'), 'varPopArray': ('varPop', 'Array'), 'anyHeavyArray': ('anyHeavy', 'Array'), 'entropyArray': ('entropy', 'Array'), 'deltaSumTimestampArray': ('deltaSumTimestamp', 'Array'), 'maxArray': ('max', 'Array'), 'quantilesTimingWeightedArray': ('quantilesTimingWeighted', 'Array'), 'groupBitmapArray': ('groupBitmap', 'Array'), 'approx_top_sumArray': ('approx_top_sum', 'Array'), 'medianArray': ('median', 'Array'), 'maxIntersectionsArray': ('maxIntersections', 'Array'), 'quantileExactArray': ('quantileExact', 'Array'), 'categoricalInformationValueArray': ('categoricalInformationValue', 'Array'), 'groupArrayMovingAvgArray': ('groupArrayMovingAvg', 'Array'), 'uniqHLL12Array': ('uniqHLL12', 'Array'), 'studentTTestArray': ('studentTTest', 'Array'), 'topKWeightedArray': ('topKWeighted', 'Array'), 'stochasticLinearRegressionArray': ('stochasticLinearRegression', 'Array'), 'stddevPopArray': ('stddevPop', 'Array'), 'quantileExactHighArray': ('quantileExactHigh', 'Array'), 'corrArray': ('corr', 'Array'), 'skewPopArray': ('skewPop', 'Array'), 'minArray': ('min', 'Array'), 'boundingRatioArray': ('boundingRatio', 'Array'), 'largestTriangleThreeBucketsArray': ('largestTriangleThreeBuckets', 'Array'), 'anyLastArray': ('anyLast', 'Array'), 'maxIntersectionsPositionArray': ('maxIntersectionsPosition', 'Array'), 'quantilesInterpolatedWeightedArray': ('quantilesInterpolatedWeighted', 'Array'), 'histogramArray': ('histogram', 'Array'), 'uniqThetaArray': ('uniqTheta', 'Array'), 'groupArrayInsertAtArray': ('groupArrayInsertAt', 'Array'), 'covarPopArray': ('covarPop', 'Array'), 'uniqCombinedArray': ('uniqCombined', 'Array'), 'covarSampArray': ('covarSamp', 'Array'), 'simpleLinearRegressionArray': ('simpleLinearRegression', 'Array'), 'varSampArray': ('varSamp', 'Array'), 'cramersVBiasCorrectedArray': ('cramersVBiasCorrected', 'Array'), 'sequenceCountArray': ('sequenceCount', 'Array'), 'sequenceNextNodeArray': ('sequenceNextNode', 'Array'), 'windowFunnelArray': ('windowFunnel', 'Array'), 'mannWhitneyUTestArray': ('mannWhitneyUTest', 'Array'), 'quantileTDigestWeightedArray': ('quantileTDigestWeighted', 'Array'), 'sumKahanArray': ('sumKahan', 'Array'), 'kolmogorovSmirnovTestArray': ('kolmogorovSmirnovTest', 'Array'), 'quantileExactWeightedArray': ('quantileExactWeighted', 'Array'), 'quantileTimingArray': ('quantileTiming', 'Array'), 'groupBitXorArray': ('groupBitXor', 'Array'), 'meanZTestArray': ('meanZTest', 'Array'), 'avgArray': ('avg', 'Array'), 'uniqArray': ('uniq', 'Array'), 'quantileBFloat16WeightedArray': ('quantileBFloat16Weighted', 'Array'), 'anyArray': ('any', 'Array'), 'quantileGKArray': ('quantileGK', 'Array'), 'groupBitmapAndArray': ('groupBitmapAnd', 'Array'), 'argMaxArray': ('argMax', 'Array'), 'last_valueArray': ('last_value', 'Array'), 'quantilesExactArray': ('quantilesExact', 'Array'), 'uniqExactArray': ('uniqExact', 'Array'), 'quantilesBFloat16Array': ('quantilesBFloat16', 'Array'), 'sequenceMatchArray': ('sequenceMatch', 'Array'), 'stddevSampArray': ('stddevSamp', 'Array'), 'theilsUArray': ('theilsU', 'Array'), 'groupArrayArray': ('groupArray', 'Array'), 'quantilesTDigestArray': ('quantilesTDigest', 'Array'), 'quantileTDigestArray': ('quantileTDigest', 'Array'), 'avgWeightedArrayIf': ('avgWeighted', 'ArrayIf'), 'quantileExactLowArrayIf': ('quantileExactLow', 'ArrayIf'), 'exponentialTimeDecayedAvgArrayIf': ('exponentialTimeDecayedAvg', 'ArrayIf'), 'uniqUpToArrayIf': ('uniqUpTo', 'ArrayIf'), 'quantilesExactHighArrayIf': ('quantilesExactHigh', 'ArrayIf'), 'groupBitmapOrArrayIf': ('groupBitmapOr', 'ArrayIf'), 'argMinArrayIf': ('argMin', 'ArrayIf'), 'sparkBarArrayIf': ('sparkBar', 'ArrayIf'), 'quantilesArrayIf': ('quantiles', 'ArrayIf'), 'groupBitAndArrayIf': ('groupBitAnd', 'ArrayIf'), 'minMapArrayIf': ('minMap', 'ArrayIf'), 'exponentialMovingAverageArrayIf': ('exponentialMovingAverage', 'ArrayIf'), 'quantilesExactLowArrayIf': ('quantilesExactLow', 'ArrayIf'), 'retentionArrayIf': ('retention', 'ArrayIf'), 'sumWithOverflowArrayIf': ('sumWithOverflow', 'ArrayIf'), 'quantilesExactWeightedArrayIf': ('quantilesExactWeighted', 'ArrayIf'), 'skewSampArrayIf': ('skewSamp', 'ArrayIf'), 'welchTTestArrayIf': ('welchTTest', 'ArrayIf'), 'groupBitOrArrayIf': ('groupBitOr', 'ArrayIf'), 'quantilesTimingArrayIf': ('quantilesTiming', 'ArrayIf'), 'quantileArrayIf': ('quantile', 'ArrayIf'), 'contingencyArrayIf': ('contingency', 'ArrayIf'), 'groupArraySampleArrayIf': ('groupArraySample', 'ArrayIf'), 'deltaSumArrayIf': ('deltaSum', 'ArrayIf'), 'quantilesTDigestWeightedArrayIf': ('quantilesTDigestWeighted', 'ArrayIf'), 'maxMapArrayIf': ('maxMap', 'ArrayIf'), 'sumArrayIf': ('sum', 'ArrayIf'), 'topKArrayIf': ('topK', 'ArrayIf'), 'quantileInterpolatedWeightedArrayIf': ('quantileInterpolatedWeighted', 'ArrayIf'), 'groupArrayMovingSumArrayIf': ('groupArrayMovingSum', 'ArrayIf'), 'quantileBFloat16ArrayIf': ('quantileBFloat16', 'ArrayIf'), 'quantilesDeterministicArrayIf': ('quantilesDeterministic', 'ArrayIf'), 'kurtPopArrayIf': ('kurtPop', 'ArrayIf'), 'sumCountArrayIf': ('sumCount', 'ArrayIf'), 'groupArrayLastArrayIf': ('groupArrayLast', 'ArrayIf'), 'stochasticLogisticRegressionArrayIf': ('stochasticLogisticRegression', 'ArrayIf'), 'quantileTimingWeightedArrayIf': ('quantileTimingWeighted', 'ArrayIf'), 'groupUniqArrayArrayIf': ('groupUniqArray', 'ArrayIf'), 'kurtSampArrayIf': ('kurtSamp', 'ArrayIf'), 'countArrayIf': ('count', 'ArrayIf'), 'quantilesBFloat16WeightedArrayIf': ('quantilesBFloat16Weighted', 'ArrayIf'), 'groupBitmapXorArrayIf': ('groupBitmapXor', 'ArrayIf'), 'first_valueArrayIf': ('first_value', 'ArrayIf'), 'sumMapArrayIf': ('sumMap', 'ArrayIf'), 'quantileDeterministicArrayIf': ('quantileDeterministic', 'ArrayIf'), 'intervalLengthSumArrayIf': ('intervalLengthSum', 'ArrayIf'), 'cramersVArrayIf': ('cramersV', 'ArrayIf'), 'uniqCombined64ArrayIf': ('uniqCombined64', 'ArrayIf'), 'rankCorrArrayIf': ('rankCorr', 'ArrayIf'), 'quantilesGKArrayIf': ('quantilesGK', 'ArrayIf'), 'varPopArrayIf': ('varPop', 'ArrayIf'), 'anyHeavyArrayIf': ('anyHeavy', 'ArrayIf'), 'entropyArrayIf': ('entropy', 'ArrayIf'), 'deltaSumTimestampArrayIf': ('deltaSumTimestamp', 'ArrayIf'), 'maxArrayIf': ('max', 'ArrayIf'), 'quantilesTimingWeightedArrayIf': ('quantilesTimingWeighted', 'ArrayIf'), 'groupBitmapArrayIf': ('groupBitmap', 'ArrayIf'), 'approx_top_sumArrayIf': ('approx_top_sum', 'ArrayIf'), 'medianArrayIf': ('median', 'ArrayIf'), 'maxIntersectionsArrayIf': ('maxIntersections', 'ArrayIf'), 'quantileExactArrayIf': ('quantileExact', 'ArrayIf'), 'categoricalInformationValueArrayIf': ('categoricalInformationValue', 'ArrayIf'), 'groupArrayMovingAvgArrayIf': ('groupArrayMovingAvg', 'ArrayIf'), 'uniqHLL12ArrayIf': ('uniqHLL12', 'ArrayIf'), 'studentTTestArrayIf': ('studentTTest', 'ArrayIf'), 'topKWeightedArrayIf': ('topKWeighted', 'ArrayIf'), 'stochasticLinearRegressionArrayIf': ('stochasticLinearRegression', 'ArrayIf'), 'stddevPopArrayIf': ('stddevPop', 'ArrayIf'), 'quantileExactHighArrayIf': ('quantileExactHigh', 'ArrayIf'), 'corrArrayIf': ('corr', 'ArrayIf'), 'skewPopArrayIf': ('skewPop', 'ArrayIf'), 'minArrayIf': ('min', 'ArrayIf'), 'boundingRatioArrayIf': ('boundingRatio', 'ArrayIf'), 'largestTriangleThreeBucketsArrayIf': ('largestTriangleThreeBuckets', 'ArrayIf'), 'anyLastArrayIf': ('anyLast', 'ArrayIf'), 'maxIntersectionsPositionArrayIf': ('maxIntersectionsPosition', 'ArrayIf'), 'quantilesInterpolatedWeightedArrayIf': ('quantilesInterpolatedWeighted', 'ArrayIf'), 'histogramArrayIf': ('histogram', 'ArrayIf'), 'uniqThetaArrayIf': ('uniqTheta', 'ArrayIf'), 'groupArrayInsertAtArrayIf': ('groupArrayInsertAt', 'ArrayIf'), 'covarPopArrayIf': ('covarPop', 'ArrayIf'), 'uniqCombinedArrayIf': ('uniqCombined', 'ArrayIf'), 'covarSampArrayIf': ('covarSamp', 'ArrayIf'), 'simpleLinearRegressionArrayIf': ('simpleLinearRegression', 'ArrayIf'), 'varSampArrayIf': ('varSamp', 'ArrayIf'), 'cramersVBiasCorrectedArrayIf': ('cramersVBiasCorrected', 'ArrayIf'), 'sequenceCountArrayIf': ('sequenceCount', 'ArrayIf'), 'sequenceNextNodeArrayIf': ('sequenceNextNode', 'ArrayIf'), 'windowFunnelArrayIf': ('windowFunnel', 'ArrayIf'), 'mannWhitneyUTestArrayIf': ('mannWhitneyUTest', 'ArrayIf'), 'quantileTDigestWeightedArrayIf': ('quantileTDigestWeighted', 'ArrayIf'), 'sumKahanArrayIf': ('sumKahan', 'ArrayIf'), 'kolmogorovSmirnovTestArrayIf': ('kolmogorovSmirnovTest', 'ArrayIf'), 'quantileExactWeightedArrayIf': ('quantileExactWeighted', 'ArrayIf'), 'quantileTimingArrayIf': ('quantileTiming', 'ArrayIf'), 'groupBitXorArrayIf': ('groupBitXor', 'ArrayIf'), 'meanZTestArrayIf': ('meanZTest', 'ArrayIf'), 'avgArrayIf': ('avg', 'ArrayIf'), 'uniqArrayIf': ('uniq', 'ArrayIf'), 'quantileBFloat16WeightedArrayIf': ('quantileBFloat16Weighted', 'ArrayIf'), 'anyArrayIf': ('any', 'ArrayIf'), 'quantileGKArrayIf': ('quantileGK', 'ArrayIf'), 'groupBitmapAndArrayIf': ('groupBitmapAnd', 'ArrayIf'), 'argMaxArrayIf': ('argMax', 'ArrayIf'), 'last_valueArrayIf': ('last_value', 'ArrayIf'), 'quantilesExactArrayIf': ('quantilesExact', 'ArrayIf'), 'uniqExactArrayIf': ('uniqExact', 'ArrayIf'), 'quantilesBFloat16ArrayIf': ('quantilesBFloat16', 'ArrayIf'), 'sequenceMatchArrayIf': ('sequenceMatch', 'ArrayIf'), 'stddevSampArrayIf': ('stddevSamp', 'ArrayIf'), 'theilsUArrayIf': ('theilsU', 'ArrayIf'), 'groupArrayArrayIf': ('groupArray', 'ArrayIf'), 'quantilesTDigestArrayIf': ('quantilesTDigest', 'ArrayIf'), 'quantileTDigestArrayIf': ('quantileTDigest', 'ArrayIf'), 'avgWeightedMap': ('avgWeighted', 'Map'), 'quantileExactLowMap': ('quantileExactLow', 'Map'), 'exponentialTimeDecayedAvgMap': ('exponentialTimeDecayedAvg', 'Map'), 'uniqUpToMap': ('uniqUpTo', 'Map'), 'quantilesExactHighMap': ('quantilesExactHigh', 'Map'), 'groupBitmapOrMap': ('groupBitmapOr', 'Map'), 'argMinMap': ('argMin', 'Map'), 'sparkBarMap': ('sparkBar', 'Map'), 'quantilesMap': ('quantiles', 'Map'), 'groupBitAndMap': ('groupBitAnd', 'Map'), 'minMapMap': ('minMap', 'Map'), 'exponentialMovingAverageMap': ('exponentialMovingAverage', 'Map'), 'quantilesExactLowMap': ('quantilesExactLow', 'Map'), 'retentionMap': ('retention', 'Map'), 'sumWithOverflowMap': ('sumWithOverflow', 'Map'), 'quantilesExactWeightedMap': ('quantilesExactWeighted', 'Map'), 'skewSampMap': ('skewSamp', 'Map'), 'welchTTestMap': ('welchTTest', 'Map'), 'groupBitOrMap': ('groupBitOr', 'Map'), 'quantilesTimingMap': ('quantilesTiming', 'Map'), 'quantileMap': ('quantile', 'Map'), 'contingencyMap': ('contingency', 'Map'), 'groupArraySampleMap': ('groupArraySample', 'Map'), 'deltaSumMap': ('deltaSum', 'Map'), 'quantilesTDigestWeightedMap': ('quantilesTDigestWeighted', 'Map'), 'maxMapMap': ('maxMap', 'Map'), 'sumMap': ('sumMap', ''), 'topKMap': ('topK', 'Map'), 'quantileInterpolatedWeightedMap': ('quantileInterpolatedWeighted', 'Map'), 'groupArrayMovingSumMap': ('groupArrayMovingSum', 'Map'), 'quantileBFloat16Map': ('quantileBFloat16', 'Map'), 'quantilesDeterministicMap': ('quantilesDeterministic', 'Map'), 'kurtPopMap': ('kurtPop', 'Map'), 'sumCountMap': ('sumCount', 'Map'), 'groupArrayLastMap': ('groupArrayLast', 'Map'), 'stochasticLogisticRegressionMap': ('stochasticLogisticRegression', 'Map'), 'quantileTimingWeightedMap': ('quantileTimingWeighted', 'Map'), 'groupUniqArrayMap': ('groupUniqArray', 'Map'), 'kurtSampMap': ('kurtSamp', 'Map'), 'countMap': ('count', 'Map'), 'quantilesBFloat16WeightedMap': ('quantilesBFloat16Weighted', 'Map'), 'groupBitmapXorMap': ('groupBitmapXor', 'Map'), 'first_valueMap': ('first_value', 'Map'), 'sumMapMap': ('sumMap', 'Map'), 'quantileDeterministicMap': ('quantileDeterministic', 'Map'), 'intervalLengthSumMap': ('intervalLengthSum', 'Map'), 'cramersVMap': ('cramersV', 'Map'), 'uniqCombined64Map': ('uniqCombined64', 'Map'), 'rankCorrMap': ('rankCorr', 'Map'), 'quantilesGKMap': ('quantilesGK', 'Map'), 'varPopMap': ('varPop', 'Map'), 'anyHeavyMap': ('anyHeavy', 'Map'), 'entropyMap': ('entropy', 'Map'), 'deltaSumTimestampMap': ('deltaSumTimestamp', 'Map'), 'maxMap': ('maxMap', ''), 'quantilesTimingWeightedMap': ('quantilesTimingWeighted', 'Map'), 'groupBitmapMap': ('groupBitmap', 'Map'), 'approx_top_sumMap': ('approx_top_sum', 'Map'), 'medianMap': ('median', 'Map'), 'maxIntersectionsMap': ('maxIntersections', 'Map'), 'quantileExactMap': ('quantileExact', 'Map'), 'categoricalInformationValueMap': ('categoricalInformationValue', 'Map'), 'groupArrayMovingAvgMap': ('groupArrayMovingAvg', 'Map'), 'uniqHLL12Map': ('uniqHLL12', 'Map'), 'studentTTestMap': ('studentTTest', 'Map'), 'topKWeightedMap': ('topKWeighted', 'Map'), 'stochasticLinearRegressionMap': ('stochasticLinearRegression', 'Map'), 'stddevPopMap': ('stddevPop', 'Map'), 'quantileExactHighMap': ('quantileExactHigh', 'Map'), 'corrMap': ('corr', 'Map'), 'skewPopMap': ('skewPop', 'Map'), 'minMap': ('minMap', ''), 'boundingRatioMap': ('boundingRatio', 'Map'), 'largestTriangleThreeBucketsMap': ('largestTriangleThreeBuckets', 'Map'), 'anyLastMap': ('anyLast', 'Map'), 'maxIntersectionsPositionMap': ('maxIntersectionsPosition', 'Map'), 'quantilesInterpolatedWeightedMap': ('quantilesInterpolatedWeighted', 'Map'), 'histogramMap': ('histogram', 'Map'), 'uniqThetaMap': ('uniqTheta', 'Map'), 'groupArrayInsertAtMap': ('groupArrayInsertAt', 'Map'), 'covarPopMap': ('covarPop', 'Map'), 'uniqCombinedMap': ('uniqCombined', 'Map'), 'covarSampMap': ('covarSamp', 'Map'), 'simpleLinearRegressionMap': ('simpleLinearRegression', 'Map'), 'varSampMap': ('varSamp', 'Map'), 'cramersVBiasCorrectedMap': ('cramersVBiasCorrected', 'Map'), 'sequenceCountMap': ('sequenceCount', 'Map'), 'sequenceNextNodeMap': ('sequenceNextNode', 'Map'), 'windowFunnelMap': ('windowFunnel', 'Map'), 'mannWhitneyUTestMap': ('mannWhitneyUTest', 'Map'), 'quantileTDigestWeightedMap': ('quantileTDigestWeighted', 'Map'), 'sumKahanMap': ('sumKahan', 'Map'), 'kolmogorovSmirnovTestMap': ('kolmogorovSmirnovTest', 'Map'), 'quantileExactWeightedMap': ('quantileExactWeighted', 'Map'), 'quantileTimingMap': ('quantileTiming', 'Map'), 'groupBitXorMap': ('groupBitXor', 'Map'), 'meanZTestMap': ('meanZTest', 'Map'), 'avgMap': ('avg', 'Map'), 'uniqMap': ('uniq', 'Map'), 'quantileBFloat16WeightedMap': ('quantileBFloat16Weighted', 'Map'), 'anyMap': ('any', 'Map'), 'quantileGKMap': ('quantileGK', 'Map'), 'groupBitmapAndMap': ('groupBitmapAnd', 'Map'), 'argMaxMap': ('argMax', 'Map'), 'last_valueMap': ('last_value', 'Map'), 'quantilesExactMap': ('quantilesExact', 'Map'), 'uniqExactMap': ('uniqExact', 'Map'), 'quantilesBFloat16Map': ('quantilesBFloat16', 'Map'), 'sequenceMatchMap': ('sequenceMatch', 'Map'), 'stddevSampMap': ('stddevSamp', 'Map'), 'theilsUMap': ('theilsU', 'Map'), 'groupArrayMap': ('groupArray', 'Map'), 'quantilesTDigestMap': ('quantilesTDigest', 'Map'), 'quantileTDigestMap': ('quantileTDigest', 'Map'), 'avgWeightedSimpleState': ('avgWeighted', 'SimpleState'), 'quantileExactLowSimpleState': ('quantileExactLow', 'SimpleState'), 'exponentialTimeDecayedAvgSimpleState': ('exponentialTimeDecayedAvg', 'SimpleState'), 'uniqUpToSimpleState': ('uniqUpTo', 'SimpleState'), 'quantilesExactHighSimpleState': ('quantilesExactHigh', 'SimpleState'), 'groupBitmapOrSimpleState': ('groupBitmapOr', 'SimpleState'), 'argMinSimpleState': ('argMin', 'SimpleState'), 'sparkBarSimpleState': ('sparkBar', 'SimpleState'), 'quantilesSimpleState': ('quantiles', 'SimpleState'), 'groupBitAndSimpleState': ('groupBitAnd', 'SimpleState'), 'minMapSimpleState': ('minMap', 'SimpleState'), 'exponentialMovingAverageSimpleState': ('exponentialMovingAverage', 'SimpleState'), 'quantilesExactLowSimpleState': ('quantilesExactLow', 'SimpleState'), 'retentionSimpleState': ('retention', 'SimpleState'), 'sumWithOverflowSimpleState': ('sumWithOverflow', 'SimpleState'), 'quantilesExactWeightedSimpleState': ('quantilesExactWeighted', 'SimpleState'), 'skewSampSimpleState': ('skewSamp', 'SimpleState'), 'welchTTestSimpleState': ('welchTTest', 'SimpleState'), 'groupBitOrSimpleState': ('groupBitOr', 'SimpleState'), 'quantilesTimingSimpleState': ('quantilesTiming', 'SimpleState'), 'quantileSimpleState': ('quantile', 'SimpleState'), 'contingencySimpleState': ('contingency', 'SimpleState'), 'groupArraySampleSimpleState': ('groupArraySample', 'SimpleState'), 'deltaSumSimpleState': ('deltaSum', 'SimpleState'), 'quantilesTDigestWeightedSimpleState': ('quantilesTDigestWeighted', 'SimpleState'), 'maxMapSimpleState': ('maxMap', 'SimpleState'), 'sumSimpleState': ('sum', 'SimpleState'), 'topKSimpleState': ('topK', 'SimpleState'), 'quantileInterpolatedWeightedSimpleState': ('quantileInterpolatedWeighted', 'SimpleState'), 'groupArrayMovingSumSimpleState': ('groupArrayMovingSum', 'SimpleState'), 'quantileBFloat16SimpleState': ('quantileBFloat16', 'SimpleState'), 'quantilesDeterministicSimpleState': ('quantilesDeterministic', 'SimpleState'), 'kurtPopSimpleState': ('kurtPop', 'SimpleState'), 'sumCountSimpleState': ('sumCount', 'SimpleState'), 'groupArrayLastSimpleState': ('groupArrayLast', 'SimpleState'), 'stochasticLogisticRegressionSimpleState': ('stochasticLogisticRegression', 'SimpleState'), 'quantileTimingWeightedSimpleState': ('quantileTimingWeighted', 'SimpleState'), 'groupUniqArraySimpleState': ('groupUniqArray', 'SimpleState'), 'kurtSampSimpleState': ('kurtSamp', 'SimpleState'), 'countSimpleState': ('count', 'SimpleState'), 'quantilesBFloat16WeightedSimpleState': ('quantilesBFloat16Weighted', 'SimpleState'), 'groupBitmapXorSimpleState': ('groupBitmapXor', 'SimpleState'), 'first_valueSimpleState': ('first_value', 'SimpleState'), 'sumMapSimpleState': ('sumMap', 'SimpleState'), 'quantileDeterministicSimpleState': ('quantileDeterministic', 'SimpleState'), 'intervalLengthSumSimpleState': ('intervalLengthSum', 'SimpleState'), 'cramersVSimpleState': ('cramersV', 'SimpleState'), 'uniqCombined64SimpleState': ('uniqCombined64', 'SimpleState'), 'rankCorrSimpleState': ('rankCorr', 'SimpleState'), 'quantilesGKSimpleState': ('quantilesGK', 'SimpleState'), 'varPopSimpleState': ('varPop', 'SimpleState'), 'anyHeavySimpleState': ('anyHeavy', 'SimpleState'), 'entropySimpleState': ('entropy', 'SimpleState'), 'deltaSumTimestampSimpleState': ('deltaSumTimestamp', 'SimpleState'), 'maxSimpleState': ('max', 'SimpleState'), 'quantilesTimingWeightedSimpleState': ('quantilesTimingWeighted', 'SimpleState'), 'groupBitmapSimpleState': ('groupBitmap', 'SimpleState'), 'approx_top_sumSimpleState': ('approx_top_sum', 'SimpleState'), 'medianSimpleState': ('median', 'SimpleState'), 'maxIntersectionsSimpleState': ('maxIntersections', 'SimpleState'), 'quantileExactSimpleState': ('quantileExact', 'SimpleState'), 'categoricalInformationValueSimpleState': ('categoricalInformationValue', 'SimpleState'), 'groupArrayMovingAvgSimpleState': ('groupArrayMovingAvg', 'SimpleState'), 'uniqHLL12SimpleState': ('uniqHLL12', 'SimpleState'), 'studentTTestSimpleState': ('studentTTest', 'SimpleState'), 'topKWeightedSimpleState': ('topKWeighted', 'SimpleState'), 'stochasticLinearRegressionSimpleState': ('stochasticLinearRegression', 'SimpleState'), 'stddevPopSimpleState': ('stddevPop', 'SimpleState'), 'quantileExactHighSimpleState': ('quantileExactHigh', 'SimpleState'), 'corrSimpleState': ('corr', 'SimpleState'), 'skewPopSimpleState': ('skewPop', 'SimpleState'), 'minSimpleState': ('min', 'SimpleState'), 'boundingRatioSimpleState': ('boundingRatio', 'SimpleState'), 'largestTriangleThreeBucketsSimpleState': ('largestTriangleThreeBuckets', 'SimpleState'), 'anyLastSimpleState': ('anyLast', 'SimpleState'), 'maxIntersectionsPositionSimpleState': ('maxIntersectionsPosition', 'SimpleState'), 'quantilesInterpolatedWeightedSimpleState': ('quantilesInterpolatedWeighted', 'SimpleState'), 'histogramSimpleState': ('histogram', 'SimpleState'), 'uniqThetaSimpleState': ('uniqTheta', 'SimpleState'), 'groupArrayInsertAtSimpleState': ('groupArrayInsertAt', 'SimpleState'), 'covarPopSimpleState': ('covarPop', 'SimpleState'), 'uniqCombinedSimpleState': ('uniqCombined', 'SimpleState'), 'covarSampSimpleState': ('covarSamp', 'SimpleState'), 'simpleLinearRegressionSimpleState': ('simpleLinearRegression', 'SimpleState'), 'varSampSimpleState': ('varSamp', 'SimpleState'), 'cramersVBiasCorrectedSimpleState': ('cramersVBiasCorrected', 'SimpleState'), 'sequenceCountSimpleState': ('sequenceCount', 'SimpleState'), 'sequenceNextNodeSimpleState': ('sequenceNextNode', 'SimpleState'), 'windowFunnelSimpleState': ('windowFunnel', 'SimpleState'), 'mannWhitneyUTestSimpleState': ('mannWhitneyUTest', 'SimpleState'), 'quantileTDigestWeightedSimpleState': ('quantileTDigestWeighted', 'SimpleState'), 'sumKahanSimpleState': ('sumKahan', 'SimpleState'), 'kolmogorovSmirnovTestSimpleState': ('kolmogorovSmirnovTest', 'SimpleState'), 'quantileExactWeightedSimpleState': ('quantileExactWeighted', 'SimpleState'), 'quantileTimingSimpleState': ('quantileTiming', 'SimpleState'), 'groupBitXorSimpleState': ('groupBitXor', 'SimpleState'), 'meanZTestSimpleState': ('meanZTest', 'SimpleState'), 'avgSimpleState': ('avg', 'SimpleState'), 'uniqSimpleState': ('uniq', 'SimpleState'), 'quantileBFloat16WeightedSimpleState': ('quantileBFloat16Weighted', 'SimpleState'), 'anySimpleState': ('any', 'SimpleState'), 'quantileGKSimpleState': ('quantileGK', 'SimpleState'), 'groupBitmapAndSimpleState': ('groupBitmapAnd', 'SimpleState'), 'argMaxSimpleState': ('argMax', 'SimpleState'), 'last_valueSimpleState': ('last_value', 'SimpleState'), 'quantilesExactSimpleState': ('quantilesExact', 'SimpleState'), 'uniqExactSimpleState': ('uniqExact', 'SimpleState'), 'quantilesBFloat16SimpleState': ('quantilesBFloat16', 'SimpleState'), 'sequenceMatchSimpleState': ('sequenceMatch', 'SimpleState'), 'stddevSampSimpleState': ('stddevSamp', 'SimpleState'), 'theilsUSimpleState': ('theilsU', 'SimpleState'), 'groupArraySimpleState': ('groupArray', 'SimpleState'), 'quantilesTDigestSimpleState': ('quantilesTDigest', 'SimpleState'), 'quantileTDigestSimpleState': ('quantileTDigest', 'SimpleState'), 'avgWeightedState': ('avgWeighted', 'State'), 'quantileExactLowState': ('quantileExactLow', 'State'), 'exponentialTimeDecayedAvgState': ('exponentialTimeDecayedAvg', 'State'), 'uniqUpToState': ('uniqUpTo', 'State'), 'quantilesExactHighState': ('quantilesExactHigh', 'State'), 'groupBitmapOrState': ('groupBitmapOr', 'State'), 'argMinState': ('argMin', 'State'), 'sparkBarState': ('sparkBar', 'State'), 'quantilesState': ('quantiles', 'State'), 'groupBitAndState': ('groupBitAnd', 'State'), 'minMapState': ('minMap', 'State'), 'exponentialMovingAverageState': ('exponentialMovingAverage', 'State'), 'quantilesExactLowState': ('quantilesExactLow', 'State'), 'retentionState': ('retention', 'State'), 'sumWithOverflowState': ('sumWithOverflow', 'State'), 'quantilesExactWeightedState': ('quantilesExactWeighted', 'State'), 'skewSampState': ('skewSamp', 'State'), 'welchTTestState': ('welchTTest', 'State'), 'groupBitOrState': ('groupBitOr', 'State'), 'quantilesTimingState': ('quantilesTiming', 'State'), 'quantileState': ('quantile', 'State'), 'contingencyState': ('contingency', 'State'), 'groupArraySampleState': ('groupArraySample', 'State'), 'deltaSumState': ('deltaSum', 'State'), 'quantilesTDigestWeightedState': ('quantilesTDigestWeighted', 'State'), 'maxMapState': ('maxMap', 'State'), 'sumState': ('sum', 'State'), 'topKState': ('topK', 'State'), 'quantileInterpolatedWeightedState': ('quantileInterpolatedWeighted', 'State'), 'groupArrayMovingSumState': ('groupArrayMovingSum', 'State'), 'quantileBFloat16State': ('quantileBFloat16', 'State'), 'quantilesDeterministicState': ('quantilesDeterministic', 'State'), 'kurtPopState': ('kurtPop', 'State'), 'sumCountState': ('sumCount', 'State'), 'groupArrayLastState': ('groupArrayLast', 'State'), 'stochasticLogisticRegressionState': ('stochasticLogisticRegression', 'State'), 'quantileTimingWeightedState': ('quantileTimingWeighted', 'State'), 'groupUniqArrayState': ('groupUniqArray', 'State'), 'kurtSampState': ('kurtSamp', 'State'), 'countState': ('count', 'State'), 'quantilesBFloat16WeightedState': ('quantilesBFloat16Weighted', 'State'), 'groupBitmapXorState': ('groupBitmapXor', 'State'), 'first_valueState': ('first_value', 'State'), 'sumMapState': ('sumMap', 'State'), 'quantileDeterministicState': ('quantileDeterministic', 'State'), 'intervalLengthSumState': ('intervalLengthSum', 'State'), 'cramersVState': ('cramersV', 'State'), 'uniqCombined64State': ('uniqCombined64', 'State'), 'rankCorrState': ('rankCorr', 'State'), 'quantilesGKState': ('quantilesGK', 'State'), 'varPopState': ('varPop', 'State'), 'anyHeavyState': ('anyHeavy', 'State'), 'entropyState': ('entropy', 'State'), 'deltaSumTimestampState': ('deltaSumTimestamp', 'State'), 'maxState': ('max', 'State'), 'quantilesTimingWeightedState': ('quantilesTimingWeighted', 'State'), 'groupBitmapState': ('groupBitmap', 'State'), 'approx_top_sumState': ('approx_top_sum', 'State'), 'medianState': ('median', 'State'), 'maxIntersectionsState': ('maxIntersections', 'State'), 'quantileExactState': ('quantileExact', 'State'), 'categoricalInformationValueState': ('categoricalInformationValue', 'State'), 'groupArrayMovingAvgState': ('groupArrayMovingAvg', 'State'), 'uniqHLL12State': ('uniqHLL12', 'State'), 'studentTTestState': ('studentTTest', 'State'), 'topKWeightedState': ('topKWeighted', 'State'), 'stochasticLinearRegressionState': ('stochasticLinearRegression', 'State'), 'stddevPopState': ('stddevPop', 'State'), 'quantileExactHighState': ('quantileExactHigh', 'State'), 'corrState': ('corr', 'State'), 'skewPopState': ('skewPop', 'State'), 'minState': ('min', 'State'), 'boundingRatioState': ('boundingRatio', 'State'), 'largestTriangleThreeBucketsState': ('largestTriangleThreeBuckets', 'State'), 'anyLastState': ('anyLast', 'State'), 'maxIntersectionsPositionState': ('maxIntersectionsPosition', 'State'), 'quantilesInterpolatedWeightedState': ('quantilesInterpolatedWeighted', 'State'), 'histogramState': ('histogram', 'State'), 'uniqThetaState': ('uniqTheta', 'State'), 'groupArrayInsertAtState': ('groupArrayInsertAt', 'State'), 'covarPopState': ('covarPop', 'State'), 'uniqCombinedState': ('uniqCombined', 'State'), 'covarSampState': ('covarSamp', 'State'), 'simpleLinearRegressionState': ('simpleLinearRegression', 'State'), 'varSampState': ('varSamp', 'State'), 'cramersVBiasCorrectedState': ('cramersVBiasCorrected', 'State'), 'sequenceCountState': ('sequenceCount', 'State'), 'sequenceNextNodeState': ('sequenceNextNode', 'State'), 'windowFunnelState': ('windowFunnel', 'State'), 'mannWhitneyUTestState': ('mannWhitneyUTest', 'State'), 'quantileTDigestWeightedState': ('quantileTDigestWeighted', 'State'), 'sumKahanState': ('sumKahan', 'State'), 'kolmogorovSmirnovTestState': ('kolmogorovSmirnovTest', 'State'), 'quantileExactWeightedState': ('quantileExactWeighted', 'State'), 'quantileTimingState': ('quantileTiming', 'State'), 'groupBitXorState': ('groupBitXor', 'State'), 'meanZTestState': ('meanZTest', 'State'), 'avgState': ('avg', 'State'), 'uniqState': ('uniq', 'State'), 'quantileBFloat16WeightedState': ('quantileBFloat16Weighted', 'State'), 'anyState': ('any', 'State'), 'quantileGKState': ('quantileGK', 'State'), 'groupBitmapAndState': ('groupBitmapAnd', 'State'), 'argMaxState': ('argMax', 'State'), 'last_valueState': ('last_value', 'State'), 'quantilesExactState': ('quantilesExact', 'State'), 'uniqExactState': ('uniqExact', 'State'), 'quantilesBFloat16State': ('quantilesBFloat16', 'State'), 'sequenceMatchState': ('sequenceMatch', 'State'), 'stddevSampState': ('stddevSamp', 'State'), 'theilsUState': ('theilsU', 'State'), 'groupArrayState': ('groupArray', 'State'), 'quantilesTDigestState': ('quantilesTDigest', 'State'), 'quantileTDigestState': ('quantileTDigest', 'State'), 'avgWeightedMerge': ('avgWeighted', 'Merge'), 'quantileExactLowMerge': ('quantileExactLow', 'Merge'), 'exponentialTimeDecayedAvgMerge': ('exponentialTimeDecayedAvg', 'Merge'), 'uniqUpToMerge': ('uniqUpTo', 'Merge'), 'quantilesExactHighMerge': ('quantilesExactHigh', 'Merge'), 'groupBitmapOrMerge': ('groupBitmapOr', 'Merge'), 'argMinMerge': ('argMin', 'Merge'), 'sparkBarMerge': ('sparkBar', 'Merge'), 'quantilesMerge': ('quantiles', 'Merge'), 'groupBitAndMerge': ('groupBitAnd', 'Merge'), 'minMapMerge': ('minMap', 'Merge'), 'exponentialMovingAverageMerge': ('exponentialMovingAverage', 'Merge'), 'quantilesExactLowMerge': ('quantilesExactLow', 'Merge'), 'retentionMerge': ('retention', 'Merge'), 'sumWithOverflowMerge': ('sumWithOverflow', 'Merge'), 'quantilesExactWeightedMerge': ('quantilesExactWeighted', 'Merge'), 'skewSampMerge': ('skewSamp', 'Merge'), 'welchTTestMerge': ('welchTTest', 'Merge'), 'groupBitOrMerge': ('groupBitOr', 'Merge'), 'quantilesTimingMerge': ('quantilesTiming', 'Merge'), 'quantileMerge': ('quantile', 'Merge'), 'contingencyMerge': ('contingency', 'Merge'), 'groupArraySampleMerge': ('groupArraySample', 'Merge'), 'deltaSumMerge': ('deltaSum', 'Merge'), 'quantilesTDigestWeightedMerge': ('quantilesTDigestWeighted', 'Merge'), 'maxMapMerge': ('maxMap', 'Merge'), 'sumMerge': ('sum', 'Merge'), 'topKMerge': ('topK', 'Merge'), 'quantileInterpolatedWeightedMerge': ('quantileInterpolatedWeighted', 'Merge'), 'groupArrayMovingSumMerge': ('groupArrayMovingSum', 'Merge'), 'quantileBFloat16Merge': ('quantileBFloat16', 'Merge'), 'quantilesDeterministicMerge': ('quantilesDeterministic', 'Merge'), 'kurtPopMerge': ('kurtPop', 'Merge'), 'sumCountMerge': ('sumCount', 'Merge'), 'groupArrayLastMerge': ('groupArrayLast', 'Merge'), 'stochasticLogisticRegressionMerge': ('stochasticLogisticRegression', 'Merge'), 'quantileTimingWeightedMerge': ('quantileTimingWeighted', 'Merge'), 'groupUniqArrayMerge': ('groupUniqArray', 'Merge'), 'kurtSampMerge': ('kurtSamp', 'Merge'), 'countMerge': ('count', 'Merge'), 'quantilesBFloat16WeightedMerge': ('quantilesBFloat16Weighted', 'Merge'), 'groupBitmapXorMerge': ('groupBitmapXor', 'Merge'), 'first_valueMerge': ('first_value', 'Merge'), 'sumMapMerge': ('sumMap', 'Merge'), 'quantileDeterministicMerge': ('quantileDeterministic', 'Merge'), 'intervalLengthSumMerge': ('intervalLengthSum', 'Merge'), 'cramersVMerge': ('cramersV', 'Merge'), 'uniqCombined64Merge': ('uniqCombined64', 'Merge'), 'rankCorrMerge': ('rankCorr', 'Merge'), 'quantilesGKMerge': ('quantilesGK', 'Merge'), 'varPopMerge': ('varPop', 'Merge'), 'anyHeavyMerge': ('anyHeavy', 'Merge'), 'entropyMerge': ('entropy', 'Merge'), 'deltaSumTimestampMerge': ('deltaSumTimestamp', 'Merge'), 'maxMerge': ('max', 'Merge'), 'quantilesTimingWeightedMerge': ('quantilesTimingWeighted', 'Merge'), 'groupBitmapMerge': ('groupBitmap', 'Merge'), 'approx_top_sumMerge': ('approx_top_sum', 'Merge'), 'medianMerge': ('median', 'Merge'), 'maxIntersectionsMerge': ('maxIntersections', 'Merge'), 'quantileExactMerge': ('quantileExact', 'Merge'), 'categoricalInformationValueMerge': ('categoricalInformationValue', 'Merge'), 'groupArrayMovingAvgMerge': ('groupArrayMovingAvg', 'Merge'), 'uniqHLL12Merge': ('uniqHLL12', 'Merge'), 'studentTTestMerge': ('studentTTest', 'Merge'), 'topKWeightedMerge': ('topKWeighted', 'Merge'), 'stochasticLinearRegressionMerge': ('stochasticLinearRegression', 'Merge'), 'stddevPopMerge': ('stddevPop', 'Merge'), 'quantileExactHighMerge': ('quantileExactHigh', 'Merge'), 'corrMerge': ('corr', 'Merge'), 'skewPopMerge': ('skewPop', 'Merge'), 'minMerge': ('min', 'Merge'), 'boundingRatioMerge': ('boundingRatio', 'Merge'), 'largestTriangleThreeBucketsMerge': ('largestTriangleThreeBuckets', 'Merge'), 'anyLastMerge': ('anyLast', 'Merge'), 'maxIntersectionsPositionMerge': ('maxIntersectionsPosition', 'Merge'), 'quantilesInterpolatedWeightedMerge': ('quantilesInterpolatedWeighted', 'Merge'), 'histogramMerge': ('histogram', 'Merge'), 'uniqThetaMerge': ('uniqTheta', 'Merge'), 'groupArrayInsertAtMerge': ('groupArrayInsertAt', 'Merge'), 'covarPopMerge': ('covarPop', 'Merge'), 'uniqCombinedMerge': ('uniqCombined', 'Merge'), 'covarSampMerge': ('covarSamp', 'Merge'), 'simpleLinearRegressionMerge': ('simpleLinearRegression', 'Merge'), 'varSampMerge': ('varSamp', 'Merge'), 'cramersVBiasCorrectedMerge': ('cramersVBiasCorrected', 'Merge'), 'sequenceCountMerge': ('sequenceCount', 'Merge'), 'sequenceNextNodeMerge': ('sequenceNextNode', 'Merge'), 'windowFunnelMerge': ('windowFunnel', 'Merge'), 'mannWhitneyUTestMerge': ('mannWhitneyUTest', 'Merge'), 'quantileTDigestWeightedMerge': ('quantileTDigestWeighted', 'Merge'), 'sumKahanMerge': ('sumKahan', 'Merge'), 'kolmogorovSmirnovTestMerge': ('kolmogorovSmirnovTest', 'Merge'), 'quantileExactWeightedMerge': ('quantileExactWeighted', 'Merge'), 'quantileTimingMerge': ('quantileTiming', 'Merge'), 'groupBitXorMerge': ('groupBitXor', 'Merge'), 'meanZTestMerge': ('meanZTest', 'Merge'), 'avgMerge': ('avg', 'Merge'), 'uniqMerge': ('uniq', 'Merge'), 'quantileBFloat16WeightedMerge': ('quantileBFloat16Weighted', 'Merge'), 'anyMerge': ('any', 'Merge'), 'quantileGKMerge': ('quantileGK', 'Merge'), 'groupBitmapAndMerge': ('groupBitmapAnd', 'Merge'), 'argMaxMerge': ('argMax', 'Merge'), 'last_valueMerge': ('last_value', 'Merge'), 'quantilesExactMerge': ('quantilesExact', 'Merge'), 'uniqExactMerge': ('uniqExact', 'Merge'), 'quantilesBFloat16Merge': ('quantilesBFloat16', 'Merge'), 'sequenceMatchMerge': ('sequenceMatch', 'Merge'), 'stddevSampMerge': ('stddevSamp', 'Merge'), 'theilsUMerge': ('theilsU', 'Merge'), 'groupArrayMerge': ('groupArray', 'Merge'), 'quantilesTDigestMerge': ('quantilesTDigest', 'Merge'), 'quantileTDigestMerge': ('quantileTDigest', 'Merge'), 'avgWeightedMergeState': ('avgWeighted', 'MergeState'), 'quantileExactLowMergeState': ('quantileExactLow', 'MergeState'), 'exponentialTimeDecayedAvgMergeState': ('exponentialTimeDecayedAvg', 'MergeState'), 'uniqUpToMergeState': ('uniqUpTo', 'MergeState'), 'quantilesExactHighMergeState': ('quantilesExactHigh', 'MergeState'), 'groupBitmapOrMergeState': ('groupBitmapOr', 'MergeState'), 'argMinMergeState': ('argMin', 'MergeState'), 'sparkBarMergeState': ('sparkBar', 'MergeState'), 'quantilesMergeState': ('quantiles', 'MergeState'), 'groupBitAndMergeState': ('groupBitAnd', 'MergeState'), 'minMapMergeState': ('minMap', 'MergeState'), 'exponentialMovingAverageMergeState': ('exponentialMovingAverage', 'MergeState'), 'quantilesExactLowMergeState': ('quantilesExactLow', 'MergeState'), 'retentionMergeState': ('retention', 'MergeState'), 'sumWithOverflowMergeState': ('sumWithOverflow', 'MergeState'), 'quantilesExactWeightedMergeState': ('quantilesExactWeighted', 'MergeState'), 'skewSampMergeState': ('skewSamp', 'MergeState'), 'welchTTestMergeState': ('welchTTest', 'MergeState'), 'groupBitOrMergeState': ('groupBitOr', 'MergeState'), 'quantilesTimingMergeState': ('quantilesTiming', 'MergeState'), 'quantileMergeState': ('quantile', 'MergeState'), 'contingencyMergeState': ('contingency', 'MergeState'), 'groupArraySampleMergeState': ('groupArraySample', 'MergeState'), 'deltaSumMergeState': ('deltaSum', 'MergeState'), 'quantilesTDigestWeightedMergeState': ('quantilesTDigestWeighted', 'MergeState'), 'maxMapMergeState': ('maxMap', 'MergeState'), 'sumMergeState': ('sum', 'MergeState'), 'topKMergeState': ('topK', 'MergeState'), 'quantileInterpolatedWeightedMergeState': ('quantileInterpolatedWeighted', 'MergeState'), 'groupArrayMovingSumMergeState': ('groupArrayMovingSum', 'MergeState'), 'quantileBFloat16MergeState': ('quantileBFloat16', 'MergeState'), 'quantilesDeterministicMergeState': ('quantilesDeterministic', 'MergeState'), 'kurtPopMergeState': ('kurtPop', 'MergeState'), 'sumCountMergeState': ('sumCount', 'MergeState'), 'groupArrayLastMergeState': ('groupArrayLast', 'MergeState'), 'stochasticLogisticRegressionMergeState': ('stochasticLogisticRegression', 'MergeState'), 'quantileTimingWeightedMergeState': ('quantileTimingWeighted', 'MergeState'), 'groupUniqArrayMergeState': ('groupUniqArray', 'MergeState'), 'kurtSampMergeState': ('kurtSamp', 'MergeState'), 'countMergeState': ('count', 'MergeState'), 'quantilesBFloat16WeightedMergeState': ('quantilesBFloat16Weighted', 'MergeState'), 'groupBitmapXorMergeState': ('groupBitmapXor', 'MergeState'), 'first_valueMergeState': ('first_value', 'MergeState'), 'sumMapMergeState': ('sumMap', 'MergeState'), 'quantileDeterministicMergeState': ('quantileDeterministic', 'MergeState'), 'intervalLengthSumMergeState': ('intervalLengthSum', 'MergeState'), 'cramersVMergeState': ('cramersV', 'MergeState'), 'uniqCombined64MergeState': ('uniqCombined64', 'MergeState'), 'rankCorrMergeState': ('rankCorr', 'MergeState'), 'quantilesGKMergeState': ('quantilesGK', 'MergeState'), 'varPopMergeState': ('varPop', 'MergeState'), 'anyHeavyMergeState': ('anyHeavy', 'MergeState'), 'entropyMergeState': ('entropy', 'MergeState'), 'deltaSumTimestampMergeState': ('deltaSumTimestamp', 'MergeState'), 'maxMergeState': ('max', 'MergeState'), 'quantilesTimingWeightedMergeState': ('quantilesTimingWeighted', 'MergeState'), 'groupBitmapMergeState': ('groupBitmap', 'MergeState'), 'approx_top_sumMergeState': ('approx_top_sum', 'MergeState'), 'medianMergeState': ('median', 'MergeState'), 'maxIntersectionsMergeState': ('maxIntersections', 'MergeState'), 'quantileExactMergeState': ('quantileExact', 'MergeState'), 'categoricalInformationValueMergeState': ('categoricalInformationValue', 'MergeState'), 'groupArrayMovingAvgMergeState': ('groupArrayMovingAvg', 'MergeState'), 'uniqHLL12MergeState': ('uniqHLL12', 'MergeState'), 'studentTTestMergeState': ('studentTTest', 'MergeState'), 'topKWeightedMergeState': ('topKWeighted', 'MergeState'), 'stochasticLinearRegressionMergeState': ('stochasticLinearRegression', 'MergeState'), 'stddevPopMergeState': ('stddevPop', 'MergeState'), 'quantileExactHighMergeState': ('quantileExactHigh', 'MergeState'), 'corrMergeState': ('corr', 'MergeState'), 'skewPopMergeState': ('skewPop', 'MergeState'), 'minMergeState': ('min', 'MergeState'), 'boundingRatioMergeState': ('boundingRatio', 'MergeState'), 'largestTriangleThreeBucketsMergeState': ('largestTriangleThreeBuckets', 'MergeState'), 'anyLastMergeState': ('anyLast', 'MergeState'), 'maxIntersectionsPositionMergeState': ('maxIntersectionsPosition', 'MergeState'), 'quantilesInterpolatedWeightedMergeState': ('quantilesInterpolatedWeighted', 'MergeState'), 'histogramMergeState': ('histogram', 'MergeState'), 'uniqThetaMergeState': ('uniqTheta', 'MergeState'), 'groupArrayInsertAtMergeState': ('groupArrayInsertAt', 'MergeState'), 'covarPopMergeState': ('covarPop', 'MergeState'), 'uniqCombinedMergeState': ('uniqCombined', 'MergeState'), 'covarSampMergeState': ('covarSamp', 'MergeState'), 'simpleLinearRegressionMergeState': ('simpleLinearRegression', 'MergeState'), 'varSampMergeState': ('varSamp', 'MergeState'), 'cramersVBiasCorrectedMergeState': ('cramersVBiasCorrected', 'MergeState'), 'sequenceCountMergeState': ('sequenceCount', 'MergeState'), 'sequenceNextNodeMergeState': ('sequenceNextNode', 'MergeState'), 'windowFunnelMergeState': ('windowFunnel', 'MergeState'), 'mannWhitneyUTestMergeState': ('mannWhitneyUTest', 'MergeState'), 'quantileTDigestWeightedMergeState': ('quantileTDigestWeighted', 'MergeState'), 'sumKahanMergeState': ('sumKahan', 'MergeState'), 'kolmogorovSmirnovTestMergeState': ('kolmogorovSmirnovTest', 'MergeState'), 'quantileExactWeightedMergeState': ('quantileExactWeighted', 'MergeState'), 'quantileTimingMergeState': ('quantileTiming', 'MergeState'), 'groupBitXorMergeState': ('groupBitXor', 'MergeState'), 'meanZTestMergeState': ('meanZTest', 'MergeState'), 'avgMergeState': ('avg', 'MergeState'), 'uniqMergeState': ('uniq', 'MergeState'), 'quantileBFloat16WeightedMergeState': ('quantileBFloat16Weighted', 'MergeState'), 'anyMergeState': ('any', 'MergeState'), 'quantileGKMergeState': ('quantileGK', 'MergeState'), 'groupBitmapAndMergeState': ('groupBitmapAnd', 'MergeState'), 'argMaxMergeState': ('argMax', 'MergeState'), 'last_valueMergeState': ('last_value', 'MergeState'), 'quantilesExactMergeState': ('quantilesExact', 'MergeState'), 'uniqExactMergeState': ('uniqExact', 'MergeState'), 'quantilesBFloat16MergeState': ('quantilesBFloat16', 'MergeState'), 'sequenceMatchMergeState': ('sequenceMatch', 'MergeState'), 'stddevSampMergeState': ('stddevSamp', 'MergeState'), 'theilsUMergeState': ('theilsU', 'MergeState'), 'groupArrayMergeState': ('groupArray', 'MergeState'), 'quantilesTDigestMergeState': ('quantilesTDigest', 'MergeState'), 'quantileTDigestMergeState': ('quantileTDigest', 'MergeState'), 'avgWeightedForEach': ('avgWeighted', 'ForEach'), 'quantileExactLowForEach': ('quantileExactLow', 'ForEach'), 'exponentialTimeDecayedAvgForEach': ('exponentialTimeDecayedAvg', 'ForEach'), 'uniqUpToForEach': ('uniqUpTo', 'ForEach'), 'quantilesExactHighForEach': ('quantilesExactHigh', 'ForEach'), 'groupBitmapOrForEach': ('groupBitmapOr', 'ForEach'), 'argMinForEach': ('argMin', 'ForEach'), 'sparkBarForEach': ('sparkBar', 'ForEach'), 'quantilesForEach': ('quantiles', 'ForEach'), 'groupBitAndForEach': ('groupBitAnd', 'ForEach'), 'minMapForEach': ('minMap', 'ForEach'), 'exponentialMovingAverageForEach': ('exponentialMovingAverage', 'ForEach'), 'quantilesExactLowForEach': ('quantilesExactLow', 'ForEach'), 'retentionForEach': ('retention', 'ForEach'), 'sumWithOverflowForEach': ('sumWithOverflow', 'ForEach'), 'quantilesExactWeightedForEach': ('quantilesExactWeighted', 'ForEach'), 'skewSampForEach': ('skewSamp', 'ForEach'), 'welchTTestForEach': ('welchTTest', 'ForEach'), 'groupBitOrForEach': ('groupBitOr', 'ForEach'), 'quantilesTimingForEach': ('quantilesTiming', 'ForEach'), 'quantileForEach': ('quantile', 'ForEach'), 'contingencyForEach': ('contingency', 'ForEach'), 'groupArraySampleForEach': ('groupArraySample', 'ForEach'), 'deltaSumForEach': ('deltaSum', 'ForEach'), 'quantilesTDigestWeightedForEach': ('quantilesTDigestWeighted', 'ForEach'), 'maxMapForEach': ('maxMap', 'ForEach'), 'sumForEach': ('sum', 'ForEach'), 'topKForEach': ('topK', 'ForEach'), 'quantileInterpolatedWeightedForEach': ('quantileInterpolatedWeighted', 'ForEach'), 'groupArrayMovingSumForEach': ('groupArrayMovingSum', 'ForEach'), 'quantileBFloat16ForEach': ('quantileBFloat16', 'ForEach'), 'quantilesDeterministicForEach': ('quantilesDeterministic', 'ForEach'), 'kurtPopForEach': ('kurtPop', 'ForEach'), 'sumCountForEach': ('sumCount', 'ForEach'), 'groupArrayLastForEach': ('groupArrayLast', 'ForEach'), 'stochasticLogisticRegressionForEach': ('stochasticLogisticRegression', 'ForEach'), 'quantileTimingWeightedForEach': ('quantileTimingWeighted', 'ForEach'), 'groupUniqArrayForEach': ('groupUniqArray', 'ForEach'), 'kurtSampForEach': ('kurtSamp', 'ForEach'), 'countForEach': ('count', 'ForEach'), 'quantilesBFloat16WeightedForEach': ('quantilesBFloat16Weighted', 'ForEach'), 'groupBitmapXorForEach': ('groupBitmapXor', 'ForEach'), 'first_valueForEach': ('first_value', 'ForEach'), 'sumMapForEach': ('sumMap', 'ForEach'), 'quantileDeterministicForEach': ('quantileDeterministic', 'ForEach'), 'intervalLengthSumForEach': ('intervalLengthSum', 'ForEach'), 'cramersVForEach': ('cramersV', 'ForEach'), 'uniqCombined64ForEach': ('uniqCombined64', 'ForEach'), 'rankCorrForEach': ('rankCorr', 'ForEach'), 'quantilesGKForEach': ('quantilesGK', 'ForEach'), 'varPopForEach': ('varPop', 'ForEach'), 'anyHeavyForEach': ('anyHeavy', 'ForEach'), 'entropyForEach': ('entropy', 'ForEach'), 'deltaSumTimestampForEach': ('deltaSumTimestamp', 'ForEach'), 'maxForEach': ('max', 'ForEach'), 'quantilesTimingWeightedForEach': ('quantilesTimingWeighted', 'ForEach'), 'groupBitmapForEach': ('groupBitmap', 'ForEach'), 'approx_top_sumForEach': ('approx_top_sum', 'ForEach'), 'medianForEach': ('median', 'ForEach'), 'maxIntersectionsForEach': ('maxIntersections', 'ForEach'), 'quantileExactForEach': ('quantileExact', 'ForEach'), 'categoricalInformationValueForEach': ('categoricalInformationValue', 'ForEach'), 'groupArrayMovingAvgForEach': ('groupArrayMovingAvg', 'ForEach'), 'uniqHLL12ForEach': ('uniqHLL12', 'ForEach'), 'studentTTestForEach': ('studentTTest', 'ForEach'), 'topKWeightedForEach': ('topKWeighted', 'ForEach'), 'stochasticLinearRegressionForEach': ('stochasticLinearRegression', 'ForEach'), 'stddevPopForEach': ('stddevPop', 'ForEach'), 'quantileExactHighForEach': ('quantileExactHigh', 'ForEach'), 'corrForEach': ('corr', 'ForEach'), 'skewPopForEach': ('skewPop', 'ForEach'), 'minForEach': ('min', 'ForEach'), 'boundingRatioForEach': ('boundingRatio', 'ForEach'), 'largestTriangleThreeBucketsForEach': ('largestTriangleThreeBuckets', 'ForEach'), 'anyLastForEach': ('anyLast', 'ForEach'), 'maxIntersectionsPositionForEach': ('maxIntersectionsPosition', 'ForEach'), 'quantilesInterpolatedWeightedForEach': ('quantilesInterpolatedWeighted', 'ForEach'), 'histogramForEach': ('histogram', 'ForEach'), 'uniqThetaForEach': ('uniqTheta', 'ForEach'), 'groupArrayInsertAtForEach': ('groupArrayInsertAt', 'ForEach'), 'covarPopForEach': ('covarPop', 'ForEach'), 'uniqCombinedForEach': ('uniqCombined', 'ForEach'), 'covarSampForEach': ('covarSamp', 'ForEach'), 'simpleLinearRegressionForEach': ('simpleLinearRegression', 'ForEach'), 'varSampForEach': ('varSamp', 'ForEach'), 'cramersVBiasCorrectedForEach': ('cramersVBiasCorrected', 'ForEach'), 'sequenceCountForEach': ('sequenceCount', 'ForEach'), 'sequenceNextNodeForEach': ('sequenceNextNode', 'ForEach'), 'windowFunnelForEach': ('windowFunnel', 'ForEach'), 'mannWhitneyUTestForEach': ('mannWhitneyUTest', 'ForEach'), 'quantileTDigestWeightedForEach': ('quantileTDigestWeighted', 'ForEach'), 'sumKahanForEach': ('sumKahan', 'ForEach'), 'kolmogorovSmirnovTestForEach': ('kolmogorovSmirnovTest', 'ForEach'), 'quantileExactWeightedForEach': ('quantileExactWeighted', 'ForEach'), 'quantileTimingForEach': ('quantileTiming', 'ForEach'), 'groupBitXorForEach': ('groupBitXor', 'ForEach'), 'meanZTestForEach': ('meanZTest', 'ForEach'), 'avgForEach': ('avg', 'ForEach'), 'uniqForEach': ('uniq', 'ForEach'), 'quantileBFloat16WeightedForEach': ('quantileBFloat16Weighted', 'ForEach'), 'anyForEach': ('any', 'ForEach'), 'quantileGKForEach': ('quantileGK', 'ForEach'), 'groupBitmapAndForEach': ('groupBitmapAnd', 'ForEach'), 'argMaxForEach': ('argMax', 'ForEach'), 'last_valueForEach': ('last_value', 'ForEach'), 'quantilesExactForEach': ('quantilesExact', 'ForEach'), 'uniqExactForEach': ('uniqExact', 'ForEach'), 'quantilesBFloat16ForEach': ('quantilesBFloat16', 'ForEach'), 'sequenceMatchForEach': ('sequenceMatch', 'ForEach'), 'stddevSampForEach': ('stddevSamp', 'ForEach'), 'theilsUForEach': ('theilsU', 'ForEach'), 'groupArrayForEach': ('groupArray', 'ForEach'), 'quantilesTDigestForEach': ('quantilesTDigest', 'ForEach'), 'quantileTDigestForEach': ('quantileTDigest', 'ForEach'), 'avgWeightedDistinct': ('avgWeighted', 'Distinct'), 'quantileExactLowDistinct': ('quantileExactLow', 'Distinct'), 'exponentialTimeDecayedAvgDistinct': ('exponentialTimeDecayedAvg', 'Distinct'), 'uniqUpToDistinct': ('uniqUpTo', 'Distinct'), 'quantilesExactHighDistinct': ('quantilesExactHigh', 'Distinct'), 'groupBitmapOrDistinct': ('groupBitmapOr', 'Distinct'), 'argMinDistinct': ('argMin', 'Distinct'), 'sparkBarDistinct': ('sparkBar', 'Distinct'), 'quantilesDistinct': ('quantiles', 'Distinct'), 'groupBitAndDistinct': ('groupBitAnd', 'Distinct'), 'minMapDistinct': ('minMap', 'Distinct'), 'exponentialMovingAverageDistinct': ('exponentialMovingAverage', 'Distinct'), 'quantilesExactLowDistinct': ('quantilesExactLow', 'Distinct'), 'retentionDistinct': ('retention', 'Distinct'), 'sumWithOverflowDistinct': ('sumWithOverflow', 'Distinct'), 'quantilesExactWeightedDistinct': ('quantilesExactWeighted', 'Distinct'), 'skewSampDistinct': ('skewSamp', 'Distinct'), 'welchTTestDistinct': ('welchTTest', 'Distinct'), 'groupBitOrDistinct': ('groupBitOr', 'Distinct'), 'quantilesTimingDistinct': ('quantilesTiming', 'Distinct'), 'quantileDistinct': ('quantile', 'Distinct'), 'contingencyDistinct': ('contingency', 'Distinct'), 'groupArraySampleDistinct': ('groupArraySample', 'Distinct'), 'deltaSumDistinct': ('deltaSum', 'Distinct'), 'quantilesTDigestWeightedDistinct': ('quantilesTDigestWeighted', 'Distinct'), 'maxMapDistinct': ('maxMap', 'Distinct'), 'sumDistinct': ('sum', 'Distinct'), 'topKDistinct': ('topK', 'Distinct'), 'quantileInterpolatedWeightedDistinct': ('quantileInterpolatedWeighted', 'Distinct'), 'groupArrayMovingSumDistinct': ('groupArrayMovingSum', 'Distinct'), 'quantileBFloat16Distinct': ('quantileBFloat16', 'Distinct'), 'quantilesDeterministicDistinct': ('quantilesDeterministic', 'Distinct'), 'kurtPopDistinct': ('kurtPop', 'Distinct'), 'sumCountDistinct': ('sumCount', 'Distinct'), 'groupArrayLastDistinct': ('groupArrayLast', 'Distinct'), 'stochasticLogisticRegressionDistinct': ('stochasticLogisticRegression', 'Distinct'), 'quantileTimingWeightedDistinct': ('quantileTimingWeighted', 'Distinct'), 'groupUniqArrayDistinct': ('groupUniqArray', 'Distinct'), 'kurtSampDistinct': ('kurtSamp', 'Distinct'), 'countDistinct': ('count', 'Distinct'), 'quantilesBFloat16WeightedDistinct': ('quantilesBFloat16Weighted', 'Distinct'), 'groupBitmapXorDistinct': ('groupBitmapXor', 'Distinct'), 'first_valueDistinct': ('first_value', 'Distinct'), 'sumMapDistinct': ('sumMap', 'Distinct'), 'quantileDeterministicDistinct': ('quantileDeterministic', 'Distinct'), 'intervalLengthSumDistinct': ('intervalLengthSum', 'Distinct'), 'cramersVDistinct': ('cramersV', 'Distinct'), 'uniqCombined64Distinct': ('uniqCombined64', 'Distinct'), 'rankCorrDistinct': ('rankCorr', 'Distinct'), 'quantilesGKDistinct': ('quantilesGK', 'Distinct'), 'varPopDistinct': ('varPop', 'Distinct'), 'anyHeavyDistinct': ('anyHeavy', 'Distinct'), 'entropyDistinct': ('entropy', 'Distinct'), 'deltaSumTimestampDistinct': ('deltaSumTimestamp', 'Distinct'), 'maxDistinct': ('max', 'Distinct'), 'quantilesTimingWeightedDistinct': ('quantilesTimingWeighted', 'Distinct'), 'groupBitmapDistinct': ('groupBitmap', 'Distinct'), 'approx_top_sumDistinct': ('approx_top_sum', 'Distinct'), 'medianDistinct': ('median', 'Distinct'), 'maxIntersectionsDistinct': ('maxIntersections', 'Distinct'), 'quantileExactDistinct': ('quantileExact', 'Distinct'), 'categoricalInformationValueDistinct': ('categoricalInformationValue', 'Distinct'), 'groupArrayMovingAvgDistinct': ('groupArrayMovingAvg', 'Distinct'), 'uniqHLL12Distinct': ('uniqHLL12', 'Distinct'), 'studentTTestDistinct': ('studentTTest', 'Distinct'), 'topKWeightedDistinct': ('topKWeighted', 'Distinct'), 'stochasticLinearRegressionDistinct': ('stochasticLinearRegression', 'Distinct'), 'stddevPopDistinct': ('stddevPop', 'Distinct'), 'quantileExactHighDistinct': ('quantileExactHigh', 'Distinct'), 'corrDistinct': ('corr', 'Distinct'), 'skewPopDistinct': ('skewPop', 'Distinct'), 'minDistinct': ('min', 'Distinct'), 'boundingRatioDistinct': ('boundingRatio', 'Distinct'), 'largestTriangleThreeBucketsDistinct': ('largestTriangleThreeBuckets', 'Distinct'), 'anyLastDistinct': ('anyLast', 'Distinct'), 'maxIntersectionsPositionDistinct': ('maxIntersectionsPosition', 'Distinct'), 'quantilesInterpolatedWeightedDistinct': ('quantilesInterpolatedWeighted', 'Distinct'), 'histogramDistinct': ('histogram', 'Distinct'), 'uniqThetaDistinct': ('uniqTheta', 'Distinct'), 'groupArrayInsertAtDistinct': ('groupArrayInsertAt', 'Distinct'), 'covarPopDistinct': ('covarPop', 'Distinct'), 'uniqCombinedDistinct': ('uniqCombined', 'Distinct'), 'covarSampDistinct': ('covarSamp', 'Distinct'), 'simpleLinearRegressionDistinct': ('simpleLinearRegression', 'Distinct'), 'varSampDistinct': ('varSamp', 'Distinct'), 'cramersVBiasCorrectedDistinct': ('cramersVBiasCorrected', 'Distinct'), 'sequenceCountDistinct': ('sequenceCount', 'Distinct'), 'sequenceNextNodeDistinct': ('sequenceNextNode', 'Distinct'), 'windowFunnelDistinct': ('windowFunnel', 'Distinct'), 'mannWhitneyUTestDistinct': ('mannWhitneyUTest', 'Distinct'), 'quantileTDigestWeightedDistinct': ('quantileTDigestWeighted', 'Distinct'), 'sumKahanDistinct': ('sumKahan', 'Distinct'), 'kolmogorovSmirnovTestDistinct': ('kolmogorovSmirnovTest', 'Distinct'), 'quantileExactWeightedDistinct': ('quantileExactWeighted', 'Distinct'), 'quantileTimingDistinct': ('quantileTiming', 'Distinct'), 'groupBitXorDistinct': ('groupBitXor', 'Distinct'), 'meanZTestDistinct': ('meanZTest', 'Distinct'), 'avgDistinct': ('avg', 'Distinct'), 'uniqDistinct': ('uniq', 'Distinct'), 'quantileBFloat16WeightedDistinct': ('quantileBFloat16Weighted', 'Distinct'), 'anyDistinct': ('any', 'Distinct'), 'quantileGKDistinct': ('quantileGK', 'Distinct'), 'groupBitmapAndDistinct': ('groupBitmapAnd', 'Distinct'), 'argMaxDistinct': ('argMax', 'Distinct'), 'last_valueDistinct': ('last_value', 'Distinct'), 'quantilesExactDistinct': ('quantilesExact', 'Distinct'), 'uniqExactDistinct': ('uniqExact', 'Distinct'), 'quantilesBFloat16Distinct': ('quantilesBFloat16', 'Distinct'), 'sequenceMatchDistinct': ('sequenceMatch', 'Distinct'), 'stddevSampDistinct': ('stddevSamp', 'Distinct'), 'theilsUDistinct': ('theilsU', 'Distinct'), 'groupArrayDistinct': ('groupArray', 'Distinct'), 'quantilesTDigestDistinct': ('quantilesTDigest', 'Distinct'), 'quantileTDigestDistinct': ('quantileTDigest', 'Distinct'), 'avgWeightedOrDefault': ('avgWeighted', 'OrDefault'), 'quantileExactLowOrDefault': ('quantileExactLow', 'OrDefault'), 'exponentialTimeDecayedAvgOrDefault': ('exponentialTimeDecayedAvg', 'OrDefault'), 'uniqUpToOrDefault': ('uniqUpTo', 'OrDefault'), 'quantilesExactHighOrDefault': ('quantilesExactHigh', 'OrDefault'), 'groupBitmapOrOrDefault': ('groupBitmapOr', 'OrDefault'), 'argMinOrDefault': ('argMin', 'OrDefault'), 'sparkBarOrDefault': ('sparkBar', 'OrDefault'), 'quantilesOrDefault': ('quantiles', 'OrDefault'), 'groupBitAndOrDefault': ('groupBitAnd', 'OrDefault'), 'minMapOrDefault': ('minMap', 'OrDefault'), 'exponentialMovingAverageOrDefault': ('exponentialMovingAverage', 'OrDefault'), 'quantilesExactLowOrDefault': ('quantilesExactLow', 'OrDefault'), 'retentionOrDefault': ('retention', 'OrDefault'), 'sumWithOverflowOrDefault': ('sumWithOverflow', 'OrDefault'), 'quantilesExactWeightedOrDefault': ('quantilesExactWeighted', 'OrDefault'), 'skewSampOrDefault': ('skewSamp', 'OrDefault'), 'welchTTestOrDefault': ('welchTTest', 'OrDefault'), 'groupBitOrOrDefault': ('groupBitOr', 'OrDefault'), 'quantilesTimingOrDefault': ('quantilesTiming', 'OrDefault'), 'quantileOrDefault': ('quantile', 'OrDefault'), 'contingencyOrDefault': ('contingency', 'OrDefault'), 'groupArraySampleOrDefault': ('groupArraySample', 'OrDefault'), 'deltaSumOrDefault': ('deltaSum', 'OrDefault'), 'quantilesTDigestWeightedOrDefault': ('quantilesTDigestWeighted', 'OrDefault'), 'maxMapOrDefault': ('maxMap', 'OrDefault'), 'sumOrDefault': ('sum', 'OrDefault'), 'topKOrDefault': ('topK', 'OrDefault'), 'quantileInterpolatedWeightedOrDefault': ('quantileInterpolatedWeighted', 'OrDefault'), 'groupArrayMovingSumOrDefault': ('groupArrayMovingSum', 'OrDefault'), 'quantileBFloat16OrDefault': ('quantileBFloat16', 'OrDefault'), 'quantilesDeterministicOrDefault': ('quantilesDeterministic', 'OrDefault'), 'kurtPopOrDefault': ('kurtPop', 'OrDefault'), 'sumCountOrDefault': ('sumCount', 'OrDefault'), 'groupArrayLastOrDefault': ('groupArrayLast', 'OrDefault'), 'stochasticLogisticRegressionOrDefault': ('stochasticLogisticRegression', 'OrDefault'), 'quantileTimingWeightedOrDefault': ('quantileTimingWeighted', 'OrDefault'), 'groupUniqArrayOrDefault': ('groupUniqArray', 'OrDefault'), 'kurtSampOrDefault': ('kurtSamp', 'OrDefault'), 'countOrDefault': ('count', 'OrDefault'), 'quantilesBFloat16WeightedOrDefault': ('quantilesBFloat16Weighted', 'OrDefault'), 'groupBitmapXorOrDefault': ('groupBitmapXor', 'OrDefault'), 'first_valueOrDefault': ('first_value', 'OrDefault'), 'sumMapOrDefault': ('sumMap', 'OrDefault'), 'quantileDeterministicOrDefault': ('quantileDeterministic', 'OrDefault'), 'intervalLengthSumOrDefault': ('intervalLengthSum', 'OrDefault'), 'cramersVOrDefault': ('cramersV', 'OrDefault'), 'uniqCombined64OrDefault': ('uniqCombined64', 'OrDefault'), 'rankCorrOrDefault': ('rankCorr', 'OrDefault'), 'quantilesGKOrDefault': ('quantilesGK', 'OrDefault'), 'varPopOrDefault': ('varPop', 'OrDefault'), 'anyHeavyOrDefault': ('anyHeavy', 'OrDefault'), 'entropyOrDefault': ('entropy', 'OrDefault'), 'deltaSumTimestampOrDefault': ('deltaSumTimestamp', 'OrDefault'), 'maxOrDefault': ('max', 'OrDefault'), 'quantilesTimingWeightedOrDefault': ('quantilesTimingWeighted', 'OrDefault'), 'groupBitmapOrDefault': ('groupBitmap', 'OrDefault'), 'approx_top_sumOrDefault': ('approx_top_sum', 'OrDefault'), 'medianOrDefault': ('median', 'OrDefault'), 'maxIntersectionsOrDefault': ('maxIntersections', 'OrDefault'), 'quantileExactOrDefault': ('quantileExact', 'OrDefault'), 'categoricalInformationValueOrDefault': ('categoricalInformationValue', 'OrDefault'), 'groupArrayMovingAvgOrDefault': ('groupArrayMovingAvg', 'OrDefault'), 'uniqHLL12OrDefault': ('uniqHLL12', 'OrDefault'), 'studentTTestOrDefault': ('studentTTest', 'OrDefault'), 'topKWeightedOrDefault': ('topKWeighted', 'OrDefault'), 'stochasticLinearRegressionOrDefault': ('stochasticLinearRegression', 'OrDefault'), 'stddevPopOrDefault': ('stddevPop', 'OrDefault'), 'quantileExactHighOrDefault': ('quantileExactHigh', 'OrDefault'), 'corrOrDefault': ('corr', 'OrDefault'), 'skewPopOrDefault': ('skewPop', 'OrDefault'), 'minOrDefault': ('min', 'OrDefault'), 'boundingRatioOrDefault': ('boundingRatio', 'OrDefault'), 'largestTriangleThreeBucketsOrDefault': ('largestTriangleThreeBuckets', 'OrDefault'), 'anyLastOrDefault': ('anyLast', 'OrDefault'), 'maxIntersectionsPositionOrDefault': ('maxIntersectionsPosition', 'OrDefault'), 'quantilesInterpolatedWeightedOrDefault': ('quantilesInterpolatedWeighted', 'OrDefault'), 'histogramOrDefault': ('histogram', 'OrDefault'), 'uniqThetaOrDefault': ('uniqTheta', 'OrDefault'), 'groupArrayInsertAtOrDefault': ('groupArrayInsertAt', 'OrDefault'), 'covarPopOrDefault': ('covarPop', 'OrDefault'), 'uniqCombinedOrDefault': ('uniqCombined', 'OrDefault'), 'covarSampOrDefault': ('covarSamp', 'OrDefault'), 'simpleLinearRegressionOrDefault': ('simpleLinearRegression', 'OrDefault'), 'varSampOrDefault': ('varSamp', 'OrDefault'), 'cramersVBiasCorrectedOrDefault': ('cramersVBiasCorrected', 'OrDefault'), 'sequenceCountOrDefault': ('sequenceCount', 'OrDefault'), 'sequenceNextNodeOrDefault': ('sequenceNextNode', 'OrDefault'), 'windowFunnelOrDefault': ('windowFunnel', 'OrDefault'), 'mannWhitneyUTestOrDefault': ('mannWhitneyUTest', 'OrDefault'), 'quantileTDigestWeightedOrDefault': ('quantileTDigestWeighted', 'OrDefault'), 'sumKahanOrDefault': ('sumKahan', 'OrDefault'), 'kolmogorovSmirnovTestOrDefault': ('kolmogorovSmirnovTest', 'OrDefault'), 'quantileExactWeightedOrDefault': ('quantileExactWeighted', 'OrDefault'), 'quantileTimingOrDefault': ('quantileTiming', 'OrDefault'), 'groupBitXorOrDefault': ('groupBitXor', 'OrDefault'), 'meanZTestOrDefault': ('meanZTest', 'OrDefault'), 'avgOrDefault': ('avg', 'OrDefault'), 'uniqOrDefault': ('uniq', 'OrDefault'), 'quantileBFloat16WeightedOrDefault': ('quantileBFloat16Weighted', 'OrDefault'), 'anyOrDefault': ('any', 'OrDefault'), 'quantileGKOrDefault': ('quantileGK', 'OrDefault'), 'groupBitmapAndOrDefault': ('groupBitmapAnd', 'OrDefault'), 'argMaxOrDefault': ('argMax', 'OrDefault'), 'last_valueOrDefault': ('last_value', 'OrDefault'), 'quantilesExactOrDefault': ('quantilesExact', 'OrDefault'), 'uniqExactOrDefault': ('uniqExact', 'OrDefault'), 'quantilesBFloat16OrDefault': ('quantilesBFloat16', 'OrDefault'), 'sequenceMatchOrDefault': ('sequenceMatch', 'OrDefault'), 'stddevSampOrDefault': ('stddevSamp', 'OrDefault'), 'theilsUOrDefault': ('theilsU', 'OrDefault'), 'groupArrayOrDefault': ('groupArray', 'OrDefault'), 'quantilesTDigestOrDefault': ('quantilesTDigest', 'OrDefault'), 'quantileTDigestOrDefault': ('quantileTDigest', 'OrDefault'), 'avgWeightedOrNull': ('avgWeighted', 'OrNull'), 'quantileExactLowOrNull': ('quantileExactLow', 'OrNull'), 'exponentialTimeDecayedAvgOrNull': ('exponentialTimeDecayedAvg', 'OrNull'), 'uniqUpToOrNull': ('uniqUpTo', 'OrNull'), 'quantilesExactHighOrNull': ('quantilesExactHigh', 'OrNull'), 'groupBitmapOrOrNull': ('groupBitmapOr', 'OrNull'), 'argMinOrNull': ('argMin', 'OrNull'), 'sparkBarOrNull': ('sparkBar', 'OrNull'), 'quantilesOrNull': ('quantiles', 'OrNull'), 'groupBitAndOrNull': ('groupBitAnd', 'OrNull'), 'minMapOrNull': ('minMap', 'OrNull'), 'exponentialMovingAverageOrNull': ('exponentialMovingAverage', 'OrNull'), 'quantilesExactLowOrNull': ('quantilesExactLow', 'OrNull'), 'retentionOrNull': ('retention', 'OrNull'), 'sumWithOverflowOrNull': ('sumWithOverflow', 'OrNull'), 'quantilesExactWeightedOrNull': ('quantilesExactWeighted', 'OrNull'), 'skewSampOrNull': ('skewSamp', 'OrNull'), 'welchTTestOrNull': ('welchTTest', 'OrNull'), 'groupBitOrOrNull': ('groupBitOr', 'OrNull'), 'quantilesTimingOrNull': ('quantilesTiming', 'OrNull'), 'quantileOrNull': ('quantile', 'OrNull'), 'contingencyOrNull': ('contingency', 'OrNull'), 'groupArraySampleOrNull': ('groupArraySample', 'OrNull'), 'deltaSumOrNull': ('deltaSum', 'OrNull'), 'quantilesTDigestWeightedOrNull': ('quantilesTDigestWeighted', 'OrNull'), 'maxMapOrNull': ('maxMap', 'OrNull'), 'sumOrNull': ('sum', 'OrNull'), 'topKOrNull': ('topK', 'OrNull'), 'quantileInterpolatedWeightedOrNull': ('quantileInterpolatedWeighted', 'OrNull'), 'groupArrayMovingSumOrNull': ('groupArrayMovingSum', 'OrNull'), 'quantileBFloat16OrNull': ('quantileBFloat16', 'OrNull'), 'quantilesDeterministicOrNull': ('quantilesDeterministic', 'OrNull'), 'kurtPopOrNull': ('kurtPop', 'OrNull'), 'sumCountOrNull': ('sumCount', 'OrNull'), 'groupArrayLastOrNull': ('groupArrayLast', 'OrNull'), 'stochasticLogisticRegressionOrNull': ('stochasticLogisticRegression', 'OrNull'), 'quantileTimingWeightedOrNull': ('quantileTimingWeighted', 'OrNull'), 'groupUniqArrayOrNull': ('groupUniqArray', 'OrNull'), 'kurtSampOrNull': ('kurtSamp', 'OrNull'), 'countOrNull': ('count', 'OrNull'), 'quantilesBFloat16WeightedOrNull': ('quantilesBFloat16Weighted', 'OrNull'), 'groupBitmapXorOrNull': ('groupBitmapXor', 'OrNull'), 'first_valueOrNull': ('first_value', 'OrNull'), 'sumMapOrNull': ('sumMap', 'OrNull'), 'quantileDeterministicOrNull': ('quantileDeterministic', 'OrNull'), 'intervalLengthSumOrNull': ('intervalLengthSum', 'OrNull'), 'cramersVOrNull': ('cramersV', 'OrNull'), 'uniqCombined64OrNull': ('uniqCombined64', 'OrNull'), 'rankCorrOrNull': ('rankCorr', 'OrNull'), 'quantilesGKOrNull': ('quantilesGK', 'OrNull'), 'varPopOrNull': ('varPop', 'OrNull'), 'anyHeavyOrNull': ('anyHeavy', 'OrNull'), 'entropyOrNull': ('entropy', 'OrNull'), 'deltaSumTimestampOrNull': ('deltaSumTimestamp', 'OrNull'), 'maxOrNull': ('max', 'OrNull'), 'quantilesTimingWeightedOrNull': ('quantilesTimingWeighted', 'OrNull'), 'groupBitmapOrNull': ('groupBitmap', 'OrNull'), 'approx_top_sumOrNull': ('approx_top_sum', 'OrNull'), 'medianOrNull': ('median', 'OrNull'), 'maxIntersectionsOrNull': ('maxIntersections', 'OrNull'), 'quantileExactOrNull': ('quantileExact', 'OrNull'), 'categoricalInformationValueOrNull': ('categoricalInformationValue', 'OrNull'), 'groupArrayMovingAvgOrNull': ('groupArrayMovingAvg', 'OrNull'), 'uniqHLL12OrNull': ('uniqHLL12', 'OrNull'), 'studentTTestOrNull': ('studentTTest', 'OrNull'), 'topKWeightedOrNull': ('topKWeighted', 'OrNull'), 'stochasticLinearRegressionOrNull': ('stochasticLinearRegression', 'OrNull'), 'stddevPopOrNull': ('stddevPop', 'OrNull'), 'quantileExactHighOrNull': ('quantileExactHigh', 'OrNull'), 'corrOrNull': ('corr', 'OrNull'), 'skewPopOrNull': ('skewPop', 'OrNull'), 'minOrNull': ('min', 'OrNull'), 'boundingRatioOrNull': ('boundingRatio', 'OrNull'), 'largestTriangleThreeBucketsOrNull': ('largestTriangleThreeBuckets', 'OrNull'), 'anyLastOrNull': ('anyLast', 'OrNull'), 'maxIntersectionsPositionOrNull': ('maxIntersectionsPosition', 'OrNull'), 'quantilesInterpolatedWeightedOrNull': ('quantilesInterpolatedWeighted', 'OrNull'), 'histogramOrNull': ('histogram', 'OrNull'), 'uniqThetaOrNull': ('uniqTheta', 'OrNull'), 'groupArrayInsertAtOrNull': ('groupArrayInsertAt', 'OrNull'), 'covarPopOrNull': ('covarPop', 'OrNull'), 'uniqCombinedOrNull': ('uniqCombined', 'OrNull'), 'covarSampOrNull': ('covarSamp', 'OrNull'), 'simpleLinearRegressionOrNull': ('simpleLinearRegression', 'OrNull'), 'varSampOrNull': ('varSamp', 'OrNull'), 'cramersVBiasCorrectedOrNull': ('cramersVBiasCorrected', 'OrNull'), 'sequenceCountOrNull': ('sequenceCount', 'OrNull'), 'sequenceNextNodeOrNull': ('sequenceNextNode', 'OrNull'), 'windowFunnelOrNull': ('windowFunnel', 'OrNull'), 'mannWhitneyUTestOrNull': ('mannWhitneyUTest', 'OrNull'), 'quantileTDigestWeightedOrNull': ('quantileTDigestWeighted', 'OrNull'), 'sumKahanOrNull': ('sumKahan', 'OrNull'), 'kolmogorovSmirnovTestOrNull': ('kolmogorovSmirnovTest', 'OrNull'), 'quantileExactWeightedOrNull': ('quantileExactWeighted', 'OrNull'), 'quantileTimingOrNull': ('quantileTiming', 'OrNull'), 'groupBitXorOrNull': ('groupBitXor', 'OrNull'), 'meanZTestOrNull': ('meanZTest', 'OrNull'), 'avgOrNull': ('avg', 'OrNull'), 'uniqOrNull': ('uniq', 'OrNull'), 'quantileBFloat16WeightedOrNull': ('quantileBFloat16Weighted', 'OrNull'), 'anyOrNull': ('any', 'OrNull'), 'quantileGKOrNull': ('quantileGK', 'OrNull'), 'groupBitmapAndOrNull': ('groupBitmapAnd', 'OrNull'), 'argMaxOrNull': ('argMax', 'OrNull'), 'last_valueOrNull': ('last_value', 'OrNull'), 'quantilesExactOrNull': ('quantilesExact', 'OrNull'), 'uniqExactOrNull': ('uniqExact', 'OrNull'), 'quantilesBFloat16OrNull': ('quantilesBFloat16', 'OrNull'), 'sequenceMatchOrNull': ('sequenceMatch', 'OrNull'), 'stddevSampOrNull': ('stddevSamp', 'OrNull'), 'theilsUOrNull': ('theilsU', 'OrNull'), 'groupArrayOrNull': ('groupArray', 'OrNull'), 'quantilesTDigestOrNull': ('quantilesTDigest', 'OrNull'), 'quantileTDigestOrNull': ('quantileTDigest', 'OrNull'), 'avgWeightedResample': ('avgWeighted', 'Resample'), 'quantileExactLowResample': ('quantileExactLow', 'Resample'), 'exponentialTimeDecayedAvgResample': ('exponentialTimeDecayedAvg', 'Resample'), 'uniqUpToResample': ('uniqUpTo', 'Resample'), 'quantilesExactHighResample': ('quantilesExactHigh', 'Resample'), 'groupBitmapOrResample': ('groupBitmapOr', 'Resample'), 'argMinResample': ('argMin', 'Resample'), 'sparkBarResample': ('sparkBar', 'Resample'), 'quantilesResample': ('quantiles', 'Resample'), 'groupBitAndResample': ('groupBitAnd', 'Resample'), 'minMapResample': ('minMap', 'Resample'), 'exponentialMovingAverageResample': ('exponentialMovingAverage', 'Resample'), 'quantilesExactLowResample': ('quantilesExactLow', 'Resample'), 'retentionResample': ('retention', 'Resample'), 'sumWithOverflowResample': ('sumWithOverflow', 'Resample'), 'quantilesExactWeightedResample': ('quantilesExactWeighted', 'Resample'), 'skewSampResample': ('skewSamp', 'Resample'), 'welchTTestResample': ('welchTTest', 'Resample'), 'groupBitOrResample': ('groupBitOr', 'Resample'), 'quantilesTimingResample': ('quantilesTiming', 'Resample'), 'quantileResample': ('quantile', 'Resample'), 'contingencyResample': ('contingency', 'Resample'), 'groupArraySampleResample': ('groupArraySample', 'Resample'), 'deltaSumResample': ('deltaSum', 'Resample'), 'quantilesTDigestWeightedResample': ('quantilesTDigestWeighted', 'Resample'), 'maxMapResample': ('maxMap', 'Resample'), 'sumResample': ('sum', 'Resample'), 'topKResample': ('topK', 'Resample'), 'quantileInterpolatedWeightedResample': ('quantileInterpolatedWeighted', 'Resample'), 'groupArrayMovingSumResample': ('groupArrayMovingSum', 'Resample'), 'quantileBFloat16Resample': ('quantileBFloat16', 'Resample'), 'quantilesDeterministicResample': ('quantilesDeterministic', 'Resample'), 'kurtPopResample': ('kurtPop', 'Resample'), 'sumCountResample': ('sumCount', 'Resample'), 'groupArrayLastResample': ('groupArrayLast', 'Resample'), 'stochasticLogisticRegressionResample': ('stochasticLogisticRegression', 'Resample'), 'quantileTimingWeightedResample': ('quantileTimingWeighted', 'Resample'), 'groupUniqArrayResample': ('groupUniqArray', 'Resample'), 'kurtSampResample': ('kurtSamp', 'Resample'), 'countResample': ('count', 'Resample'), 'quantilesBFloat16WeightedResample': ('quantilesBFloat16Weighted', 'Resample'), 'groupBitmapXorResample': ('groupBitmapXor', 'Resample'), 'first_valueResample': ('first_value', 'Resample'), 'sumMapResample': ('sumMap', 'Resample'), 'quantileDeterministicResample': ('quantileDeterministic', 'Resample'), 'intervalLengthSumResample': ('intervalLengthSum', 'Resample'), 'cramersVResample': ('cramersV', 'Resample'), 'uniqCombined64Resample': ('uniqCombined64', 'Resample'), 'rankCorrResample': ('rankCorr', 'Resample'), 'quantilesGKResample': ('quantilesGK', 'Resample'), 'varPopResample': ('varPop', 'Resample'), 'anyHeavyResample': ('anyHeavy', 'Resample'), 'entropyResample': ('entropy', 'Resample'), 'deltaSumTimestampResample': ('deltaSumTimestamp', 'Resample'), 'maxResample': ('max', 'Resample'), 'quantilesTimingWeightedResample': ('quantilesTimingWeighted', 'Resample'), 'groupBitmapResample': ('groupBitmap', 'Resample'), 'approx_top_sumResample': ('approx_top_sum', 'Resample'), 'medianResample': ('median', 'Resample'), 'maxIntersectionsResample': ('maxIntersections', 'Resample'), 'quantileExactResample': ('quantileExact', 'Resample'), 'categoricalInformationValueResample': ('categoricalInformationValue', 'Resample'), 'groupArrayMovingAvgResample': ('groupArrayMovingAvg', 'Resample'), 'uniqHLL12Resample': ('uniqHLL12', 'Resample'), 'studentTTestResample': ('studentTTest', 'Resample'), 'topKWeightedResample': ('topKWeighted', 'Resample'), 'stochasticLinearRegressionResample': ('stochasticLinearRegression', 'Resample'), 'stddevPopResample': ('stddevPop', 'Resample'), 'quantileExactHighResample': ('quantileExactHigh', 'Resample'), 'corrResample': ('corr', 'Resample'), 'skewPopResample': ('skewPop', 'Resample'), 'minResample': ('min', 'Resample'), 'boundingRatioResample': ('boundingRatio', 'Resample'), 'largestTriangleThreeBucketsResample': ('largestTriangleThreeBuckets', 'Resample'), 'anyLastResample': ('anyLast', 'Resample'), 'maxIntersectionsPositionResample': ('maxIntersectionsPosition', 'Resample'), 'quantilesInterpolatedWeightedResample': ('quantilesInterpolatedWeighted', 'Resample'), 'histogramResample': ('histogram', 'Resample'), 'uniqThetaResample': ('uniqTheta', 'Resample'), 'groupArrayInsertAtResample': ('groupArrayInsertAt', 'Resample'), 'covarPopResample': ('covarPop', 'Resample'), 'uniqCombinedResample': ('uniqCombined', 'Resample'), 'covarSampResample': ('covarSamp', 'Resample'), 'simpleLinearRegressionResample': ('simpleLinearRegression', 'Resample'), 'varSampResample': ('varSamp', 'Resample'), 'cramersVBiasCorrectedResample': ('cramersVBiasCorrected', 'Resample'), 'sequenceCountResample': ('sequenceCount', 'Resample'), 'sequenceNextNodeResample': ('sequenceNextNode', 'Resample'), 'windowFunnelResample': ('windowFunnel', 'Resample'), 'mannWhitneyUTestResample': ('mannWhitneyUTest', 'Resample'), 'quantileTDigestWeightedResample': ('quantileTDigestWeighted', 'Resample'), 'sumKahanResample': ('sumKahan', 'Resample'), 'kolmogorovSmirnovTestResample': ('kolmogorovSmirnovTest', 'Resample'), 'quantileExactWeightedResample': ('quantileExactWeighted', 'Resample'), 'quantileTimingResample': ('quantileTiming', 'Resample'), 'groupBitXorResample': ('groupBitXor', 'Resample'), 'meanZTestResample': ('meanZTest', 'Resample'), 'avgResample': ('avg', 'Resample'), 'uniqResample': ('uniq', 'Resample'), 'quantileBFloat16WeightedResample': ('quantileBFloat16Weighted', 'Resample'), 'anyResample': ('any', 'Resample'), 'quantileGKResample': ('quantileGK', 'Resample'), 'groupBitmapAndResample': ('groupBitmapAnd', 'Resample'), 'argMaxResample': ('argMax', 'Resample'), 'last_valueResample': ('last_value', 'Resample'), 'quantilesExactResample': ('quantilesExact', 'Resample'), 'uniqExactResample': ('uniqExact', 'Resample'), 'quantilesBFloat16Resample': ('quantilesBFloat16', 'Resample'), 'sequenceMatchResample': ('sequenceMatch', 'Resample'), 'stddevSampResample': ('stddevSamp', 'Resample'), 'theilsUResample': ('theilsU', 'Resample'), 'groupArrayResample': ('groupArray', 'Resample'), 'quantilesTDigestResample': ('quantilesTDigest', 'Resample'), 'quantileTDigestResample': ('quantileTDigest', 'Resample'), 'avgWeightedArgMin': ('avgWeighted', 'ArgMin'), 'quantileExactLowArgMin': ('quantileExactLow', 'ArgMin'), 'exponentialTimeDecayedAvgArgMin': ('exponentialTimeDecayedAvg', 'ArgMin'), 'uniqUpToArgMin': ('uniqUpTo', 'ArgMin'), 'quantilesExactHighArgMin': ('quantilesExactHigh', 'ArgMin'), 'groupBitmapOrArgMin': ('groupBitmapOr', 'ArgMin'), 'argMinArgMin': ('argMin', 'ArgMin'), 'sparkBarArgMin': ('sparkBar', 'ArgMin'), 'quantilesArgMin': ('quantiles', 'ArgMin'), 'groupBitAndArgMin': ('groupBitAnd', 'ArgMin'), 'minMapArgMin': ('minMap', 'ArgMin'), 'exponentialMovingAverageArgMin': ('exponentialMovingAverage', 'ArgMin'), 'quantilesExactLowArgMin': ('quantilesExactLow', 'ArgMin'), 'retentionArgMin': ('retention', 'ArgMin'), 'sumWithOverflowArgMin': ('sumWithOverflow', 'ArgMin'), 'quantilesExactWeightedArgMin': ('quantilesExactWeighted', 'ArgMin'), 'skewSampArgMin': ('skewSamp', 'ArgMin'), 'welchTTestArgMin': ('welchTTest', 'ArgMin'), 'groupBitOrArgMin': ('groupBitOr', 'ArgMin'), 'quantilesTimingArgMin': ('quantilesTiming', 'ArgMin'), 'quantileArgMin': ('quantile', 'ArgMin'), 'contingencyArgMin': ('contingency', 'ArgMin'), 'groupArraySampleArgMin': ('groupArraySample', 'ArgMin'), 'deltaSumArgMin': ('deltaSum', 'ArgMin'), 'quantilesTDigestWeightedArgMin': ('quantilesTDigestWeighted', 'ArgMin'), 'maxMapArgMin': ('maxMap', 'ArgMin'), 'sumArgMin': ('sum', 'ArgMin'), 'topKArgMin': ('topK', 'ArgMin'), 'quantileInterpolatedWeightedArgMin': ('quantileInterpolatedWeighted', 'ArgMin'), 'groupArrayMovingSumArgMin': ('groupArrayMovingSum', 'ArgMin'), 'quantileBFloat16ArgMin': ('quantileBFloat16', 'ArgMin'), 'quantilesDeterministicArgMin': ('quantilesDeterministic', 'ArgMin'), 'kurtPopArgMin': ('kurtPop', 'ArgMin'), 'sumCountArgMin': ('sumCount', 'ArgMin'), 'groupArrayLastArgMin': ('groupArrayLast', 'ArgMin'), 'stochasticLogisticRegressionArgMin': ('stochasticLogisticRegression', 'ArgMin'), 'quantileTimingWeightedArgMin': ('quantileTimingWeighted', 'ArgMin'), 'groupUniqArrayArgMin': ('groupUniqArray', 'ArgMin'), 'kurtSampArgMin': ('kurtSamp', 'ArgMin'), 'countArgMin': ('count', 'ArgMin'), 'quantilesBFloat16WeightedArgMin': ('quantilesBFloat16Weighted', 'ArgMin'), 'groupBitmapXorArgMin': ('groupBitmapXor', 'ArgMin'), 'first_valueArgMin': ('first_value', 'ArgMin'), 'sumMapArgMin': ('sumMap', 'ArgMin'), 'quantileDeterministicArgMin': ('quantileDeterministic', 'ArgMin'), 'intervalLengthSumArgMin': ('intervalLengthSum', 'ArgMin'), 'cramersVArgMin': ('cramersV', 'ArgMin'), 'uniqCombined64ArgMin': ('uniqCombined64', 'ArgMin'), 'rankCorrArgMin': ('rankCorr', 'ArgMin'), 'quantilesGKArgMin': ('quantilesGK', 'ArgMin'), 'varPopArgMin': ('varPop', 'ArgMin'), 'anyHeavyArgMin': ('anyHeavy', 'ArgMin'), 'entropyArgMin': ('entropy', 'ArgMin'), 'deltaSumTimestampArgMin': ('deltaSumTimestamp', 'ArgMin'), 'maxArgMin': ('max', 'ArgMin'), 'quantilesTimingWeightedArgMin': ('quantilesTimingWeighted', 'ArgMin'), 'groupBitmapArgMin': ('groupBitmap', 'ArgMin'), 'approx_top_sumArgMin': ('approx_top_sum', 'ArgMin'), 'medianArgMin': ('median', 'ArgMin'), 'maxIntersectionsArgMin': ('maxIntersections', 'ArgMin'), 'quantileExactArgMin': ('quantileExact', 'ArgMin'), 'categoricalInformationValueArgMin': ('categoricalInformationValue', 'ArgMin'), 'groupArrayMovingAvgArgMin': ('groupArrayMovingAvg', 'ArgMin'), 'uniqHLL12ArgMin': ('uniqHLL12', 'ArgMin'), 'studentTTestArgMin': ('studentTTest', 'ArgMin'), 'topKWeightedArgMin': ('topKWeighted', 'ArgMin'), 'stochasticLinearRegressionArgMin': ('stochasticLinearRegression', 'ArgMin'), 'stddevPopArgMin': ('stddevPop', 'ArgMin'), 'quantileExactHighArgMin': ('quantileExactHigh', 'ArgMin'), 'corrArgMin': ('corr', 'ArgMin'), 'skewPopArgMin': ('skewPop', 'ArgMin'), 'minArgMin': ('min', 'ArgMin'), 'boundingRatioArgMin': ('boundingRatio', 'ArgMin'), 'largestTriangleThreeBucketsArgMin': ('largestTriangleThreeBuckets', 'ArgMin'), 'anyLastArgMin': ('anyLast', 'ArgMin'), 'maxIntersectionsPositionArgMin': ('maxIntersectionsPosition', 'ArgMin'), 'quantilesInterpolatedWeightedArgMin': ('quantilesInterpolatedWeighted', 'ArgMin'), 'histogramArgMin': ('histogram', 'ArgMin'), 'uniqThetaArgMin': ('uniqTheta', 'ArgMin'), 'groupArrayInsertAtArgMin': ('groupArrayInsertAt', 'ArgMin'), 'covarPopArgMin': ('covarPop', 'ArgMin'), 'uniqCombinedArgMin': ('uniqCombined', 'ArgMin'), 'covarSampArgMin': ('covarSamp', 'ArgMin'), 'simpleLinearRegressionArgMin': ('simpleLinearRegression', 'ArgMin'), 'varSampArgMin': ('varSamp', 'ArgMin'), 'cramersVBiasCorrectedArgMin': ('cramersVBiasCorrected', 'ArgMin'), 'sequenceCountArgMin': ('sequenceCount', 'ArgMin'), 'sequenceNextNodeArgMin': ('sequenceNextNode', 'ArgMin'), 'windowFunnelArgMin': ('windowFunnel', 'ArgMin'), 'mannWhitneyUTestArgMin': ('mannWhitneyUTest', 'ArgMin'), 'quantileTDigestWeightedArgMin': ('quantileTDigestWeighted', 'ArgMin'), 'sumKahanArgMin': ('sumKahan', 'ArgMin'), 'kolmogorovSmirnovTestArgMin': ('kolmogorovSmirnovTest', 'ArgMin'), 'quantileExactWeightedArgMin': ('quantileExactWeighted', 'ArgMin'), 'quantileTimingArgMin': ('quantileTiming', 'ArgMin'), 'groupBitXorArgMin': ('groupBitXor', 'ArgMin'), 'meanZTestArgMin': ('meanZTest', 'ArgMin'), 'avgArgMin': ('avg', 'ArgMin'), 'uniqArgMin': ('uniq', 'ArgMin'), 'quantileBFloat16WeightedArgMin': ('quantileBFloat16Weighted', 'ArgMin'), 'anyArgMin': ('any', 'ArgMin'), 'quantileGKArgMin': ('quantileGK', 'ArgMin'), 'groupBitmapAndArgMin': ('groupBitmapAnd', 'ArgMin'), 'argMaxArgMin': ('argMax', 'ArgMin'), 'last_valueArgMin': ('last_value', 'ArgMin'), 'quantilesExactArgMin': ('quantilesExact', 'ArgMin'), 'uniqExactArgMin': ('uniqExact', 'ArgMin'), 'quantilesBFloat16ArgMin': ('quantilesBFloat16', 'ArgMin'), 'sequenceMatchArgMin': ('sequenceMatch', 'ArgMin'), 'stddevSampArgMin': ('stddevSamp', 'ArgMin'), 'theilsUArgMin': ('theilsU', 'ArgMin'), 'groupArrayArgMin': ('groupArray', 'ArgMin'), 'quantilesTDigestArgMin': ('quantilesTDigest', 'ArgMin'), 'quantileTDigestArgMin': ('quantileTDigest', 'ArgMin'), 'avgWeightedArgMax': ('avgWeighted', 'ArgMax'), 'quantileExactLowArgMax': ('quantileExactLow', 'ArgMax'), 'exponentialTimeDecayedAvgArgMax': ('exponentialTimeDecayedAvg', 'ArgMax'), 'uniqUpToArgMax': ('uniqUpTo', 'ArgMax'), 'quantilesExactHighArgMax': ('quantilesExactHigh', 'ArgMax'), 'groupBitmapOrArgMax': ('groupBitmapOr', 'ArgMax'), 'argMinArgMax': ('argMin', 'ArgMax'), 'sparkBarArgMax': ('sparkBar', 'ArgMax'), 'quantilesArgMax': ('quantiles', 'ArgMax'), 'groupBitAndArgMax': ('groupBitAnd', 'ArgMax'), 'minMapArgMax': ('minMap', 'ArgMax'), 'exponentialMovingAverageArgMax': ('exponentialMovingAverage', 'ArgMax'), 'quantilesExactLowArgMax': ('quantilesExactLow', 'ArgMax'), 'retentionArgMax': ('retention', 'ArgMax'), 'sumWithOverflowArgMax': ('sumWithOverflow', 'ArgMax'), 'quantilesExactWeightedArgMax': ('quantilesExactWeighted', 'ArgMax'), 'skewSampArgMax': ('skewSamp', 'ArgMax'), 'welchTTestArgMax': ('welchTTest', 'ArgMax'), 'groupBitOrArgMax': ('groupBitOr', 'ArgMax'), 'quantilesTimingArgMax': ('quantilesTiming', 'ArgMax'), 'quantileArgMax': ('quantile', 'ArgMax'), 'contingencyArgMax': ('contingency', 'ArgMax'), 'groupArraySampleArgMax': ('groupArraySample', 'ArgMax'), 'deltaSumArgMax': ('deltaSum', 'ArgMax'), 'quantilesTDigestWeightedArgMax': ('quantilesTDigestWeighted', 'ArgMax'), 'maxMapArgMax': ('maxMap', 'ArgMax'), 'sumArgMax': ('sum', 'ArgMax'), 'topKArgMax': ('topK', 'ArgMax'), 'quantileInterpolatedWeightedArgMax': ('quantileInterpolatedWeighted', 'ArgMax'), 'groupArrayMovingSumArgMax': ('groupArrayMovingSum', 'ArgMax'), 'quantileBFloat16ArgMax': ('quantileBFloat16', 'ArgMax'), 'quantilesDeterministicArgMax': ('quantilesDeterministic', 'ArgMax'), 'kurtPopArgMax': ('kurtPop', 'ArgMax'), 'sumCountArgMax': ('sumCount', 'ArgMax'), 'groupArrayLastArgMax': ('groupArrayLast', 'ArgMax'), 'stochasticLogisticRegressionArgMax': ('stochasticLogisticRegression', 'ArgMax'), 'quantileTimingWeightedArgMax': ('quantileTimingWeighted', 'ArgMax'), 'groupUniqArrayArgMax': ('groupUniqArray', 'ArgMax'), 'kurtSampArgMax': ('kurtSamp', 'ArgMax'), 'countArgMax': ('count', 'ArgMax'), 'quantilesBFloat16WeightedArgMax': ('quantilesBFloat16Weighted', 'ArgMax'), 'groupBitmapXorArgMax': ('groupBitmapXor', 'ArgMax'), 'first_valueArgMax': ('first_value', 'ArgMax'), 'sumMapArgMax': ('sumMap', 'ArgMax'), 'quantileDeterministicArgMax': ('quantileDeterministic', 'ArgMax'), 'intervalLengthSumArgMax': ('intervalLengthSum', 'ArgMax'), 'cramersVArgMax': ('cramersV', 'ArgMax'), 'uniqCombined64ArgMax': ('uniqCombined64', 'ArgMax'), 'rankCorrArgMax': ('rankCorr', 'ArgMax'), 'quantilesGKArgMax': ('quantilesGK', 'ArgMax'), 'varPopArgMax': ('varPop', 'ArgMax'), 'anyHeavyArgMax': ('anyHeavy', 'ArgMax'), 'entropyArgMax': ('entropy', 'ArgMax'), 'deltaSumTimestampArgMax': ('deltaSumTimestamp', 'ArgMax'), 'maxArgMax': ('max', 'ArgMax'), 'quantilesTimingWeightedArgMax': ('quantilesTimingWeighted', 'ArgMax'), 'groupBitmapArgMax': ('groupBitmap', 'ArgMax'), 'approx_top_sumArgMax': ('approx_top_sum', 'ArgMax'), 'medianArgMax': ('median', 'ArgMax'), 'maxIntersectionsArgMax': ('maxIntersections', 'ArgMax'), 'quantileExactArgMax': ('quantileExact', 'ArgMax'), 'categoricalInformationValueArgMax': ('categoricalInformationValue', 'ArgMax'), 'groupArrayMovingAvgArgMax': ('groupArrayMovingAvg', 'ArgMax'), 'uniqHLL12ArgMax': ('uniqHLL12', 'ArgMax'), 'studentTTestArgMax': ('studentTTest', 'ArgMax'), 'topKWeightedArgMax': ('topKWeighted', 'ArgMax'), 'stochasticLinearRegressionArgMax': ('stochasticLinearRegression', 'ArgMax'), 'stddevPopArgMax': ('stddevPop', 'ArgMax'), 'quantileExactHighArgMax': ('quantileExactHigh', 'ArgMax'), 'corrArgMax': ('corr', 'ArgMax'), 'skewPopArgMax': ('skewPop', 'ArgMax'), 'minArgMax': ('min', 'ArgMax'), 'boundingRatioArgMax': ('boundingRatio', 'ArgMax'), 'largestTriangleThreeBucketsArgMax': ('largestTriangleThreeBuckets', 'ArgMax'), 'anyLastArgMax': ('anyLast', 'ArgMax'), 'maxIntersectionsPositionArgMax': ('maxIntersectionsPosition', 'ArgMax'), 'quantilesInterpolatedWeightedArgMax': ('quantilesInterpolatedWeighted', 'ArgMax'), 'histogramArgMax': ('histogram', 'ArgMax'), 'uniqThetaArgMax': ('uniqTheta', 'ArgMax'), 'groupArrayInsertAtArgMax': ('groupArrayInsertAt', 'ArgMax'), 'covarPopArgMax': ('covarPop', 'ArgMax'), 'uniqCombinedArgMax': ('uniqCombined', 'ArgMax'), 'covarSampArgMax': ('covarSamp', 'ArgMax'), 'simpleLinearRegressionArgMax': ('simpleLinearRegression', 'ArgMax'), 'varSampArgMax': ('varSamp', 'ArgMax'), 'cramersVBiasCorrectedArgMax': ('cramersVBiasCorrected', 'ArgMax'), 'sequenceCountArgMax': ('sequenceCount', 'ArgMax'), 'sequenceNextNodeArgMax': ('sequenceNextNode', 'ArgMax'), 'windowFunnelArgMax': ('windowFunnel', 'ArgMax'), 'mannWhitneyUTestArgMax': ('mannWhitneyUTest', 'ArgMax'), 'quantileTDigestWeightedArgMax': ('quantileTDigestWeighted', 'ArgMax'), 'sumKahanArgMax': ('sumKahan', 'ArgMax'), 'kolmogorovSmirnovTestArgMax': ('kolmogorovSmirnovTest', 'ArgMax'), 'quantileExactWeightedArgMax': ('quantileExactWeighted', 'ArgMax'), 'quantileTimingArgMax': ('quantileTiming', 'ArgMax'), 'groupBitXorArgMax': ('groupBitXor', 'ArgMax'), 'meanZTestArgMax': ('meanZTest', 'ArgMax'), 'avgArgMax': ('avg', 'ArgMax'), 'uniqArgMax': ('uniq', 'ArgMax'), 'quantileBFloat16WeightedArgMax': ('quantileBFloat16Weighted', 'ArgMax'), 'anyArgMax': ('any', 'ArgMax'), 'quantileGKArgMax': ('quantileGK', 'ArgMax'), 'groupBitmapAndArgMax': ('groupBitmapAnd', 'ArgMax'), 'argMaxArgMax': ('argMax', 'ArgMax'), 'last_valueArgMax': ('last_value', 'ArgMax'), 'quantilesExactArgMax': ('quantilesExact', 'ArgMax'), 'uniqExactArgMax': ('uniqExact', 'ArgMax'), 'quantilesBFloat16ArgMax': ('quantilesBFloat16', 'ArgMax'), 'sequenceMatchArgMax': ('sequenceMatch', 'ArgMax'), 'stddevSampArgMax': ('stddevSamp', 'ArgMax'), 'theilsUArgMax': ('theilsU', 'ArgMax'), 'groupArrayArgMax': ('groupArray', 'ArgMax'), 'quantilesTDigestArgMax': ('quantilesTDigest', 'ArgMax'), 'quantileTDigestArgMax': ('quantileTDigest', 'ArgMax'), 'avgWeighted': ('avgWeighted', ''), 'quantileExactLow': ('quantileExactLow', ''), 'exponentialTimeDecayedAvg': ('exponentialTimeDecayedAvg', ''), 'uniqUpTo': ('uniqUpTo', ''), 'quantilesExactHigh': ('quantilesExactHigh', ''), 'groupBitmapOr': ('groupBitmapOr', ''), 'argMin': ('argMin', ''), 'sparkBar': ('sparkBar', ''), 'quantiles': ('quantiles', ''), 'groupBitAnd': ('groupBitAnd', ''), 'exponentialMovingAverage': ('exponentialMovingAverage', ''), 'quantilesExactLow': ('quantilesExactLow', ''), 'retention': ('retention', ''), 'sumWithOverflow': ('sumWithOverflow', ''), 'quantilesExactWeighted': ('quantilesExactWeighted', ''), 'skewSamp': ('skewSamp', ''), 'welchTTest': ('welchTTest', ''), 'groupBitOr': ('groupBitOr', ''), 'quantilesTiming': ('quantilesTiming', ''), 'quantile': ('quantile', ''), 'contingency': ('contingency', ''), 'groupArraySample': ('groupArraySample', ''), 'deltaSum': ('deltaSum', ''), 'quantilesTDigestWeighted': ('quantilesTDigestWeighted', ''), 'sum': ('sum', ''), 'topK': ('topK', ''), 'quantileInterpolatedWeighted': ('quantileInterpolatedWeighted', ''), 'groupArrayMovingSum': ('groupArrayMovingSum', ''), 'quantileBFloat16': ('quantileBFloat16', ''), 'quantilesDeterministic': ('quantilesDeterministic', ''), 'kurtPop': ('kurtPop', ''), 'sumCount': ('sumCount', ''), 'groupArrayLast': ('groupArrayLast', ''), 'stochasticLogisticRegression': ('stochasticLogisticRegression', ''), 'quantileTimingWeighted': ('quantileTimingWeighted', ''), 'groupUniqArray': ('groupUniqArray', ''), 'kurtSamp': ('kurtSamp', ''), 'count': ('count', ''), 'quantilesBFloat16Weighted': ('quantilesBFloat16Weighted', ''), 'groupBitmapXor': ('groupBitmapXor', ''), 'first_value': ('first_value', ''), 'quantileDeterministic': ('quantileDeterministic', ''), 'intervalLengthSum': ('intervalLengthSum', ''), 'cramersV': ('cramersV', ''), 'uniqCombined64': ('uniqCombined64', ''), 'rankCorr': ('rankCorr', ''), 'quantilesGK': ('quantilesGK', ''), 'varPop': ('varPop', ''), 'anyHeavy': ('anyHeavy', ''), 'entropy': ('entropy', ''), 'deltaSumTimestamp': ('deltaSumTimestamp', ''), 'max': ('max', ''), 'quantilesTimingWeighted': ('quantilesTimingWeighted', ''), 'groupBitmap': ('groupBitmap', ''), 'approx_top_sum': ('approx_top_sum', ''), 'median': ('median', ''), 'maxIntersections': ('maxIntersections', ''), 'quantileExact': ('quantileExact', ''), 'categoricalInformationValue': ('categoricalInformationValue', ''), 'groupArrayMovingAvg': ('groupArrayMovingAvg', ''), 'uniqHLL12': ('uniqHLL12', ''), 'studentTTest': ('studentTTest', ''), 'topKWeighted': ('topKWeighted', ''), 'stochasticLinearRegression': ('stochasticLinearRegression', ''), 'stddevPop': ('stddevPop', ''), 'quantileExactHigh': ('quantileExactHigh', ''), 'corr': ('corr', ''), 'skewPop': ('skewPop', ''), 'min': ('min', ''), 'boundingRatio': ('boundingRatio', ''), 'largestTriangleThreeBuckets': ('largestTriangleThreeBuckets', ''), 'anyLast': ('anyLast', ''), 'maxIntersectionsPosition': ('maxIntersectionsPosition', ''), 'quantilesInterpolatedWeighted': ('quantilesInterpolatedWeighted', ''), 'histogram': ('histogram', ''), 'uniqTheta': ('uniqTheta', ''), 'groupArrayInsertAt': ('groupArrayInsertAt', ''), 'covarPop': ('covarPop', ''), 'uniqCombined': ('uniqCombined', ''), 'covarSamp': ('covarSamp', ''), 'simpleLinearRegression': ('simpleLinearRegression', ''), 'varSamp': ('varSamp', ''), 'cramersVBiasCorrected': ('cramersVBiasCorrected', ''), 'sequenceCount': ('sequenceCount', ''), 'sequenceNextNode': ('sequenceNextNode', ''), 'windowFunnel': ('windowFunnel', ''), 'mannWhitneyUTest': ('mannWhitneyUTest', ''), 'quantileTDigestWeighted': ('quantileTDigestWeighted', ''), 'sumKahan': ('sumKahan', ''), 'kolmogorovSmirnovTest': ('kolmogorovSmirnovTest', ''), 'quantileExactWeighted': ('quantileExactWeighted', ''), 'quantileTiming': ('quantileTiming', ''), 'groupBitXor': ('groupBitXor', ''), 'meanZTest': ('meanZTest', ''), 'avg': ('avg', ''), 'uniq': ('uniq', ''), 'quantileBFloat16Weighted': ('quantileBFloat16Weighted', ''), 'any': ('any', ''), 'quantileGK': ('quantileGK', ''), 'groupBitmapAnd': ('groupBitmapAnd', ''), 'argMax': ('argMax', ''), 'last_value': ('last_value', ''), 'quantilesExact': ('quantilesExact', ''), 'uniqExact': ('uniqExact', ''), 'quantilesBFloat16': ('quantilesBFloat16', ''), 'sequenceMatch': ('sequenceMatch', ''), 'stddevSamp': ('stddevSamp', ''), 'theilsU': ('theilsU', ''), 'groupArray': ('groupArray', ''), 'quantilesTDigest': ('quantilesTDigest', ''), 'quantileTDigest': ('quantileTDigest', '')}
FUNCTIONS_WITH_ALIASED_ARGS = {'STRUCT', 'TUPLE'}
FUNCTION_PARSERS = {'ARG_MAX': <function Parser.<dictcomp>.<lambda>>, 'ARGMAX': <function Parser.<dictcomp>.<lambda>>, 'MAX_BY': <function Parser.<dictcomp>.<lambda>>, 'ARG_MIN': <function Parser.<dictcomp>.<lambda>>, 'ARGMIN': <function Parser.<dictcomp>.<lambda>>, 'MIN_BY': <function Parser.<dictcomp>.<lambda>>, 'CAST': <function Parser.<lambda>>, 'CEIL': <function Parser.<lambda>>, 'CONVERT': <function Parser.<lambda>>, 'DECODE': <function Parser.<lambda>>, 'EXTRACT': <function Parser.<lambda>>, 'FLOOR': <function Parser.<lambda>>, 'GAP_FILL': <function Parser.<lambda>>, 'JSON_OBJECT': <function Parser.<lambda>>, 'JSON_OBJECTAGG': <function Parser.<lambda>>, 'JSON_TABLE': <function Parser.<lambda>>, 'NORMALIZE': <function Parser.<lambda>>, 'OPENJSON': <function Parser.<lambda>>, 'OVERLAY': <function Parser.<lambda>>, 'POSITION': <function Parser.<lambda>>, 'SAFE_CAST': <function Parser.<lambda>>, 'STRING_AGG': <function Parser.<lambda>>, 'SUBSTRING': <function Parser.<lambda>>, 'TRIM': <function Parser.<lambda>>, 'TRY_CAST': <function Parser.<lambda>>, 'TRY_CONVERT': <function Parser.<lambda>>, 'XMLELEMENT': <function Parser.<lambda>>, 'XMLTABLE': <function Parser.<lambda>>, 'ARRAYJOIN': <function ClickHouse.Parser.<lambda>>, 'QUANTILE': <function ClickHouse.Parser.<lambda>>, 'MEDIAN': <function ClickHouse.Parser.<lambda>>, 'COLUMNS': <function ClickHouse.Parser.<lambda>>}
PROPERTY_PARSERS = {'ALLOWED_VALUES': <function Parser.<lambda>>, 'ALGORITHM': <function Parser.<lambda>>, 'AUTO': <function Parser.<lambda>>, 'AUTO_INCREMENT': <function Parser.<lambda>>, 'BACKUP': <function Parser.<lambda>>, 'BLOCKCOMPRESSION': <function Parser.<lambda>>, 'CHARSET': <function Parser.<lambda>>, 'CHARACTER SET': <function Parser.<lambda>>, 'CHECKSUM': <function Parser.<lambda>>, 'CLUSTER BY': <function Parser.<lambda>>, 'CLUSTERED': <function Parser.<lambda>>, 'COLLATE': <function Parser.<lambda>>, 'COMMENT': <function Parser.<lambda>>, 'CONTAINS': <function Parser.<lambda>>, 'COPY': <function Parser.<lambda>>, 'DATABLOCKSIZE': <function Parser.<lambda>>, 'DATA_DELETION': <function Parser.<lambda>>, 'DEFINER': <function Parser.<lambda>>, 'DETERMINISTIC': <function Parser.<lambda>>, 'DISTRIBUTED': <function Parser.<lambda>>, 'DUPLICATE': <function Parser.<lambda>>, 'DISTKEY': <function Parser.<lambda>>, 'DISTSTYLE': <function Parser.<lambda>>, 'EMPTY': <function Parser.<lambda>>, 'ENGINE': <function ClickHouse.Parser.<lambda>>, 'ENVIRONMENT': <function Parser.<lambda>>, 'EXECUTE': <function Parser.<lambda>>, 'EXTERNAL': <function Parser.<lambda>>, 'FALLBACK': <function Parser.<lambda>>, 'FORMAT': <function Parser.<lambda>>, 'FREESPACE': <function Parser.<lambda>>, 'GLOBAL': <function Parser.<lambda>>, 'HEAP': <function Parser.<lambda>>, 'ICEBERG': <function Parser.<lambda>>, 'IMMUTABLE': <function Parser.<lambda>>, 'INHERITS': <function Parser.<lambda>>, 'INPUT': <function Parser.<lambda>>, 'JOURNAL': <function Parser.<lambda>>, 'LANGUAGE': <function Parser.<lambda>>, 'LAYOUT': <function Parser.<lambda>>, 'LIFETIME': <function Parser.<lambda>>, 'LIKE': <function Parser.<lambda>>, 'LOCATION': <function Parser.<lambda>>, 'LOCK': <function Parser.<lambda>>, 'LOCKING': <function Parser.<lambda>>, 'LOG': <function Parser.<lambda>>, 'MATERIALIZED': <function Parser.<lambda>>, 'MERGEBLOCKRATIO': <function Parser.<lambda>>, 'MODIFIES': <function Parser.<lambda>>, 'MULTISET': <function Parser.<lambda>>, 'NO': <function Parser.<lambda>>, 'ON': <function Parser.<lambda>>, 'ORDER BY': <function Parser.<lambda>>, 'OUTPUT': <function Parser.<lambda>>, 'PARTITION': <function Parser.<lambda>>, 'PARTITION BY': <function Parser.<lambda>>, 'PARTITIONED BY': <function Parser.<lambda>>, 'PARTITIONED_BY': <function Parser.<lambda>>, 'PRIMARY KEY': <function Parser.<lambda>>, 'RANGE': <function Parser.<lambda>>, 'READS': <function Parser.<lambda>>, 'REMOTE': <function Parser.<lambda>>, 'RETURNS': <function Parser.<lambda>>, 'STRICT': <function Parser.<lambda>>, 'STREAMING': <function Parser.<lambda>>, 'ROW': <function Parser.<lambda>>, 'ROW_FORMAT': <function Parser.<lambda>>, 'SAMPLE': <function Parser.<lambda>>, 'SECURE': <function Parser.<lambda>>, 'SECURITY': <function Parser.<lambda>>, 'SET': <function Parser.<lambda>>, 'SETTINGS': <function Parser.<lambda>>, 'SHARING': <function Parser.<lambda>>, 'SORTKEY': <function Parser.<lambda>>, 'SOURCE': <function Parser.<lambda>>, 'STABLE': <function Parser.<lambda>>, 'STORED': <function Parser.<lambda>>, 'SYSTEM_VERSIONING': <function Parser.<lambda>>, 'TBLPROPERTIES': <function Parser.<lambda>>, 'TEMP': <function Parser.<lambda>>, 'TEMPORARY': <function Parser.<lambda>>, 'TO': <function Parser.<lambda>>, 'TRANSIENT': <function Parser.<lambda>>, 'TRANSFORM': <function Parser.<lambda>>, 'TTL': <function Parser.<lambda>>, 'USING': <function Parser.<lambda>>, 'UNLOGGED': <function Parser.<lambda>>, 'VOLATILE': <function Parser.<lambda>>, 'WITH': <function Parser.<lambda>>}
NO_PAREN_FUNCTION_PARSERS = {'CASE': <function Parser.<lambda>>, 'CONNECT_BY_ROOT': <function Parser.<lambda>>, 'IF': <function Parser.<lambda>>}
NO_PAREN_FUNCTIONS = {<TokenType.CURRENT_DATE: 'CURRENT_DATE'>: <class 'sqlglot.expressions.CurrentDate'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>: <class 'sqlglot.expressions.CurrentDate'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>: <class 'sqlglot.expressions.CurrentTime'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>: <class 'sqlglot.expressions.CurrentUser'>}
RANGE_PARSERS = {<TokenType.AT_GT: 'AT_GT'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.BETWEEN: 'BETWEEN'>: <function Parser.<lambda>>, <TokenType.GLOB: 'GLOB'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.ILIKE: 'ILIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IN: 'IN'>: <function Parser.<lambda>>, <TokenType.IRLIKE: 'IRLIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IS: 'IS'>: <function Parser.<lambda>>, <TokenType.LIKE: 'LIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.LT_AT: 'LT_AT'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.OVERLAPS: 'OVERLAPS'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.RLIKE: 'RLIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.SIMILAR_TO: 'SIMILAR_TO'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.FOR: 'FOR'>: <function Parser.<lambda>>, <TokenType.QMARK_AMP: 'QMARK_AMP'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.QMARK_PIPE: 'QMARK_PIPE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.HASH_DASH: 'HASH_DASH'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.GLOBAL: 'GLOBAL'>: <function ClickHouse.Parser.<lambda>>}
COLUMN_OPERATORS = {<TokenType.DOT: 'DOT'>: None, <TokenType.DOTCOLON: 'DOTCOLON'>: <function Parser.<lambda>>, <TokenType.DCOLON: 'DCOLON'>: <function Parser.<lambda>>, <TokenType.ARROW: 'ARROW'>: <function Parser.<lambda>>, <TokenType.DARROW: 'DARROW'>: <function Parser.<lambda>>, <TokenType.HASH_ARROW: 'HASH_ARROW'>: <function Parser.<lambda>>, <TokenType.DHASH_ARROW: 'DHASH_ARROW'>: <function Parser.<lambda>>}
JOIN_KINDS = {<TokenType.CROSS: 'CROSS'>, <TokenType.SEMI: 'SEMI'>, <TokenType.ANY: 'ANY'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.INNER: 'INNER'>, <TokenType.ASOF: 'ASOF'>, <TokenType.ANTI: 'ANTI'>, <TokenType.OUTER: 'OUTER'>, <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>}
TABLE_ALIAS_TOKENS = {<TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.NAMESPACE: 'NAMESPACE'>, <TokenType.SOURCE: 'SOURCE'>, <TokenType.ASC: 'ASC'>, <TokenType.LOAD: 'LOAD'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.RANGE: 'RANGE'>, <TokenType.SEMANTIC_VIEW: 'SEMANTIC_VIEW'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.INDEX: 'INDEX'>, <TokenType.SOME: 'SOME'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.MAP: 'MAP'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.VOID: 'VOID'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.LIMIT: 'LIMIT'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.NEXT: 'NEXT'>, <TokenType.KILL: 'KILL'>, <TokenType.NULL: 'NULL'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.ROWS: 'ROWS'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.DATE: 'DATE'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.INET: 'INET'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.FILTER: 'FILTER'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.FILE_FORMAT: 'FILE_FORMAT'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.BIT: 'BIT'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.GET: 'GET'>, <TokenType.TRUE: 'TRUE'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.INT256: 'INT256'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.ROW: 'ROW'>, <TokenType.JSONB: 'JSONB'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.BINARY: 'BINARY'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.COPY: 'COPY'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.FALSE: 'FALSE'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.INT: 'INT'>, <TokenType.CUBE: 'CUBE'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.MERGE: 'MERGE'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.VAR: 'VAR'>, <TokenType.YEAR: 'YEAR'>, <TokenType.KEEP: 'KEEP'>, <TokenType.CASE: 'CASE'>, <TokenType.SESSION: 'SESSION'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.ALL: 'ALL'>, <TokenType.DELETE: 'DELETE'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.POINT: 'POINT'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.TOP: 'TOP'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.CHAR: 'CHAR'>, <TokenType.BLOB: 'BLOB'>, <TokenType.XML: 'XML'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.SET: 'SET'>, <TokenType.GEOGRAPHYPOINT: 'GEOGRAPHYPOINT'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.TIME: 'TIME'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.UINT: 'UINT'>, <TokenType.IPV4: 'IPV4'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.UINT128: 'UINT128'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.DETACH: 'DETACH'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.JSON: 'JSON'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.MODEL: 'MODEL'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.IPV6: 'IPV6'>, <TokenType.NESTED: 'NESTED'>, <TokenType.SUPER: 'SUPER'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.INT128: 'INT128'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.ENUM: 'ENUM'>, <TokenType.MONEY: 'MONEY'>, <TokenType.APPLY: 'APPLY'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.RING: 'RING'>, <TokenType.USE: 'USE'>, <TokenType.FIRST: 'FIRST'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.NAME: 'NAME'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.DESC: 'DESC'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.TABLE: 'TABLE'>, <TokenType.PUT: 'PUT'>, <TokenType.SHOW: 'SHOW'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.DATE32: 'DATE32'>, <TokenType.NOTHING: 'NOTHING'>, <TokenType.TAG: 'TAG'>, <TokenType.DIV: 'DIV'>, <TokenType.RENAME: 'RENAME'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.LIST: 'LIST'>, <TokenType.UINT256: 'UINT256'>, <TokenType.EXPORT: 'EXPORT'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.TEXT: 'TEXT'>, <TokenType.STAGE: 'STAGE'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.END: 'END'>, <TokenType.CACHE: 'CACHE'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.VIEW: 'VIEW'>, <TokenType.IS: 'IS'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.ATTACH: 'ATTACH'>, <TokenType.UUID: 'UUID'>, <TokenType.SINK: 'SINK'>}
ALIAS_TOKENS = {<TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.FULL: 'FULL'>, <TokenType.NAMESPACE: 'NAMESPACE'>, <TokenType.SOURCE: 'SOURCE'>, <TokenType.ASC: 'ASC'>, <TokenType.LOAD: 'LOAD'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.RANGE: 'RANGE'>, <TokenType.SEMANTIC_VIEW: 'SEMANTIC_VIEW'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.INDEX: 'INDEX'>, <TokenType.SOME: 'SOME'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.MAP: 'MAP'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.VOID: 'VOID'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.LIMIT: 'LIMIT'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.NEXT: 'NEXT'>, <TokenType.KILL: 'KILL'>, <TokenType.NULL: 'NULL'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.ROWS: 'ROWS'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.DATE: 'DATE'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.INET: 'INET'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.FILTER: 'FILTER'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.FILE_FORMAT: 'FILE_FORMAT'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.BIT: 'BIT'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.GET: 'GET'>, <TokenType.TRUE: 'TRUE'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.INT256: 'INT256'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.NATURAL: 'NATURAL'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.ROW: 'ROW'>, <TokenType.JSONB: 'JSONB'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.BINARY: 'BINARY'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.COPY: 'COPY'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.FALSE: 'FALSE'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.INT: 'INT'>, <TokenType.CUBE: 'CUBE'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.SEMI: 'SEMI'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.MERGE: 'MERGE'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.VAR: 'VAR'>, <TokenType.YEAR: 'YEAR'>, <TokenType.KEEP: 'KEEP'>, <TokenType.CASE: 'CASE'>, <TokenType.SESSION: 'SESSION'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.ALL: 'ALL'>, <TokenType.DELETE: 'DELETE'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.POINT: 'POINT'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.TOP: 'TOP'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.CHAR: 'CHAR'>, <TokenType.BLOB: 'BLOB'>, <TokenType.XML: 'XML'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.FINAL: 'FINAL'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.SET: 'SET'>, <TokenType.GEOGRAPHYPOINT: 'GEOGRAPHYPOINT'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.TIME: 'TIME'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.UINT: 'UINT'>, <TokenType.IPV4: 'IPV4'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.UINT128: 'UINT128'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.DETACH: 'DETACH'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.JSON: 'JSON'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.MODEL: 'MODEL'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.IPV6: 'IPV6'>, <TokenType.RIGHT: 'RIGHT'>, <TokenType.NESTED: 'NESTED'>, <TokenType.SUPER: 'SUPER'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.INT128: 'INT128'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.ENUM: 'ENUM'>, <TokenType.MONEY: 'MONEY'>, <TokenType.APPLY: 'APPLY'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.RING: 'RING'>, <TokenType.USE: 'USE'>, <TokenType.FIRST: 'FIRST'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.NAME: 'NAME'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.ASOF: 'ASOF'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.DESC: 'DESC'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.TABLE: 'TABLE'>, <TokenType.PUT: 'PUT'>, <TokenType.SHOW: 'SHOW'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.LEFT: 'LEFT'>, <TokenType.DATE32: 'DATE32'>, <TokenType.NOTHING: 'NOTHING'>, <TokenType.TAG: 'TAG'>, <TokenType.DIV: 'DIV'>, <TokenType.RENAME: 'RENAME'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.ANY: 'ANY'>, <TokenType.LIST: 'LIST'>, <TokenType.UINT256: 'UINT256'>, <TokenType.EXPORT: 'EXPORT'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.ANTI: 'ANTI'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.WINDOW: 'WINDOW'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.TEXT: 'TEXT'>, <TokenType.STAGE: 'STAGE'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.END: 'END'>, <TokenType.CACHE: 'CACHE'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.VIEW: 'VIEW'>, <TokenType.IS: 'IS'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.ATTACH: 'ATTACH'>, <TokenType.UUID: 'UUID'>, <TokenType.SINK: 'SINK'>}
LOG_DEFAULTS_TO_LN = True
QUERY_MODIFIER_PARSERS = {<TokenType.MATCH_RECOGNIZE: 'MATCH_RECOGNIZE'>: <function Parser.<lambda>>, <TokenType.PREWHERE: 'PREWHERE'>: <function Parser.<lambda>>, <TokenType.WHERE: 'WHERE'>: <function Parser.<lambda>>, <TokenType.GROUP_BY: 'GROUP_BY'>: <function Parser.<lambda>>, <TokenType.HAVING: 'HAVING'>: <function Parser.<lambda>>, <TokenType.QUALIFY: 'QUALIFY'>: <function Parser.<lambda>>, <TokenType.WINDOW: 'WINDOW'>: <function Parser.<lambda>>, <TokenType.ORDER_BY: 'ORDER_BY'>: <function Parser.<lambda>>, <TokenType.LIMIT: 'LIMIT'>: <function Parser.<lambda>>, <TokenType.FETCH: 'FETCH'>: <function Parser.<lambda>>, <TokenType.OFFSET: 'OFFSET'>: <function Parser.<lambda>>, <TokenType.FOR: 'FOR'>: <function Parser.<lambda>>, <TokenType.LOCK: 'LOCK'>: <function Parser.<lambda>>, <TokenType.TABLE_SAMPLE: 'TABLE_SAMPLE'>: <function Parser.<lambda>>, <TokenType.USING: 'USING'>: <function Parser.<lambda>>, <TokenType.CLUSTER_BY: 'CLUSTER_BY'>: <function Parser.<lambda>>, <TokenType.DISTRIBUTE_BY: 'DISTRIBUTE_BY'>: <function Parser.<lambda>>, <TokenType.SORT_BY: 'SORT_BY'>: <function Parser.<lambda>>, <TokenType.CONNECT_BY: 'CONNECT_BY'>: <function Parser.<lambda>>, <TokenType.START_WITH: 'START_WITH'>: <function Parser.<lambda>>, <TokenType.SETTINGS: 'SETTINGS'>: <function ClickHouse.Parser.<lambda>>, <TokenType.FORMAT: 'FORMAT'>: <function ClickHouse.Parser.<lambda>>}
CONSTRAINT_PARSERS = {'AUTOINCREMENT': <function Parser.<lambda>>, 'AUTO_INCREMENT': <function Parser.<lambda>>, 'CASESPECIFIC': <function Parser.<lambda>>, 'CHARACTER SET': <function Parser.<lambda>>, 'CHECK': <function Parser.<lambda>>, 'COLLATE': <function Parser.<lambda>>, 'COMMENT': <function Parser.<lambda>>, 'COMPRESS': <function Parser.<lambda>>, 'CLUSTERED': <function Parser.<lambda>>, 'NONCLUSTERED': <function Parser.<lambda>>, 'DEFAULT': <function Parser.<lambda>>, 'ENCODE': <function Parser.<lambda>>, 'EPHEMERAL': <function Parser.<lambda>>, 'EXCLUDE': <function Parser.<lambda>>, 'FOREIGN KEY': <function Parser.<lambda>>, 'FORMAT': <function Parser.<lambda>>, 'GENERATED': <function Parser.<lambda>>, 'IDENTITY': <function Parser.<lambda>>, 'INLINE': <function Parser.<lambda>>, 'LIKE': <function Parser.<lambda>>, 'NOT': <function Parser.<lambda>>, 'NULL': <function Parser.<lambda>>, 'ON': <function Parser.<lambda>>, 'PATH': <function Parser.<lambda>>, 'PERIOD': <function Parser.<lambda>>, 'PRIMARY KEY': <function Parser.<lambda>>, 'REFERENCES': <function Parser.<lambda>>, 'TITLE': <function Parser.<lambda>>, 'TTL': <function Parser.<lambda>>, 'UNIQUE': <function Parser.<lambda>>, 'UPPERCASE': <function Parser.<lambda>>, 'WATERMARK': <function Parser.<lambda>>, 'WITH': <function Parser.<lambda>>, 'BUCKET': <function Parser.<lambda>>, 'TRUNCATE': <function Parser.<lambda>>, 'INDEX': <function ClickHouse.Parser.<lambda>>, 'CODEC': <function ClickHouse.Parser.<lambda>>}
ALTER_PARSERS = {'ADD': <function Parser.<lambda>>, 'AS': <function Parser.<lambda>>, 'ALTER': <function Parser.<lambda>>, 'CLUSTER BY': <function Parser.<lambda>>, 'DELETE': <function Parser.<lambda>>, 'DROP': <function Parser.<lambda>>, 'RENAME': <function Parser.<lambda>>, 'SET': <function Parser.<lambda>>, 'SWAP': <function Parser.<lambda>>, 'REPLACE': <function ClickHouse.Parser.<lambda>>}
SCHEMA_UNNAMED_CONSTRAINTS = {'FOREIGN KEY', 'BUCKET', 'WATERMARK', 'UNIQUE', 'PERIOD', 'CHECK', 'PRIMARY KEY', 'INDEX', 'LIKE', 'EXCLUDE', 'TRUNCATE'}
PLACEHOLDER_PARSERS = {<TokenType.PLACEHOLDER: 'PLACEHOLDER'>: <function Parser.<lambda>>, <TokenType.PARAMETER: 'PARAMETER'>: <function Parser.<lambda>>, <TokenType.COLON: 'COLON'>: <function Parser.<lambda>>, <TokenType.L_BRACE: 'L_BRACE'>: <function ClickHouse.Parser.<lambda>>}
SHOW_TRIE: Dict = {}
SET_TRIE: Dict = {'GLOBAL': {0: True}, 'LOCAL': {0: True}, 'SESSION': {0: True}, 'TRANSACTION': {0: True}}
Inherited Members
sqlglot.parser.Parser
Parser
STRUCT_TYPE_TOKENS
NESTED_TYPE_TOKENS
ENUM_TYPE_TOKENS
AGGREGATE_TYPE_TOKENS
TYPE_TOKENS
SIGNED_TO_UNSIGNED_TYPE_TOKEN
SUBQUERY_PREDICATES
DB_CREATABLES
CREATABLES
ALTERABLES
COLON_PLACEHOLDER_TOKENS
ARRAY_CONSTRUCTORS
COMMENT_TABLE_ALIAS_TOKENS
UPDATE_ALIAS_TOKENS
TRIM_TYPES
CONJUNCTION
ASSIGNMENT
DISJUNCTION
EQUALITY
COMPARISON
BITWISE
TERM
FACTOR
EXPONENT
TIMES
TIMESTAMPS
SET_OPERATIONS
JOIN_METHODS
JOIN_SIDES
JOIN_HINTS
LAMBDAS
CAST_COLUMN_OPERATORS
EXPRESSION_PARSERS
STATEMENT_PARSERS
UNARY_PARSERS
STRING_PARSERS
NUMERIC_PARSERS
PRIMARY_PARSERS
PIPE_SYNTAX_TRANSFORM_PARSERS
ALTER_ALTER_PARSERS
INVALID_FUNC_NAME_TOKENS
KEY_VALUE_DEFINITIONS
QUERY_MODIFIER_TOKENS
SET_PARSERS
SHOW_PARSERS
TYPE_LITERAL_PARSERS
TYPE_CONVERTERS
DDL_SELECT_TOKENS
PRE_VOLATILE_TOKENS
TRANSACTION_KIND
TRANSACTION_CHARACTERISTICS
CONFLICT_ACTIONS
CREATE_SEQUENCE
ISOLATED_LOADING_OPTIONS
USABLES
CAST_ACTIONS
SCHEMA_BINDING_OPTIONS
PROCEDURE_OPTIONS
EXECUTE_AS_OPTIONS
KEY_CONSTRAINT_OPTIONS
WINDOW_EXCLUDE_OPTIONS
INSERT_ALTERNATIVES
CLONE_KEYWORDS
HISTORICAL_DATA_PREFIX
HISTORICAL_DATA_KIND
OPCLASS_FOLLOW_KEYWORDS
OPTYPE_FOLLOW_TOKENS
TABLE_INDEX_HINT_TOKENS
VIEW_ATTRIBUTES
WINDOW_ALIAS_TOKENS
WINDOW_BEFORE_PAREN_TOKENS
WINDOW_SIDES
JSON_KEY_VALUE_SEPARATOR_TOKENS
FETCH_TOKENS
ADD_CONSTRAINT_TOKENS
DISTINCT_TOKENS
NULL_TOKENS
UNNEST_OFFSET_ALIAS_TOKENS
SELECT_START_TOKENS
COPY_INTO_VARLEN_OPTIONS
IS_JSON_PREDICATE_KIND
ODBC_DATETIME_LITERALS
ON_CONDITION_TOKENS
PRIVILEGE_FOLLOW_TOKENS
DESCRIBE_STYLES
ANALYZE_STYLES
ANALYZE_EXPRESSION_PARSERS
PARTITION_KEYWORDS
AMBIGUOUS_ALIAS_TOKENS
OPERATION_MODIFIERS
RECURSIVE_CTE_SEARCH_KIND
MODIFIABLES
STRICT_CAST
PREFIXED_PIVOT_COLUMNS
IDENTIFY_PIVOT_STRINGS
TABLESAMPLE_CSV
DEFAULT_SAMPLING_METHOD
SET_REQUIRES_ASSIGNMENT_DELIMITER
TRIM_PATTERN_FIRST
STRING_ALIASES
SET_OP_MODIFIERS
NO_PAREN_IF_COMMANDS
JSON_ARROWS_REQUIRE_JSON_TYPE
COLON_IS_VARIANT_EXTRACT
VALUES_FOLLOWED_BY_PAREN
SUPPORTS_IMPLICIT_UNNEST
SUPPORTS_PARTITION_SELECTION
WRAPPED_TRANSFORM_COLUMN_CONSTRAINT
ALTER_RENAME_REQUIRES_COLUMN
ZONE_AWARE_TIMESTAMP_CONSTRUCTOR
MAP_KEYS_ARE_ARBITRARY_EXPRESSIONS
JSON_EXTRACT_REQUIRES_JSON_EXPRESSION
ADD_JOIN_ON_TRUE
error_level
error_message_context
max_errors
dialect
reset
parse
parse_into
check_errors
raise_error
expression
validate_expression
parse_set_operation
build_cast
errors
sql
class ClickHouse.Generator(sqlglot.generator.Generator):
 994    class Generator(generator.Generator):
 995        QUERY_HINTS = False
 996        STRUCT_DELIMITER = ("(", ")")
 997        NVL2_SUPPORTED = False
 998        TABLESAMPLE_REQUIRES_PARENS = False
 999        TABLESAMPLE_SIZE_IS_ROWS = False
1000        TABLESAMPLE_KEYWORDS = "SAMPLE"
1001        LAST_DAY_SUPPORTS_DATE_PART = False
1002        CAN_IMPLEMENT_ARRAY_ANY = True
1003        SUPPORTS_TO_NUMBER = False
1004        JOIN_HINTS = False
1005        TABLE_HINTS = False
1006        GROUPINGS_SEP = ""
1007        SET_OP_MODIFIERS = False
1008        ARRAY_SIZE_NAME = "LENGTH"
1009        WRAP_DERIVED_VALUES = False
1010
1011        STRING_TYPE_MAPPING = {
1012            exp.DataType.Type.BLOB: "String",
1013            exp.DataType.Type.CHAR: "String",
1014            exp.DataType.Type.LONGBLOB: "String",
1015            exp.DataType.Type.LONGTEXT: "String",
1016            exp.DataType.Type.MEDIUMBLOB: "String",
1017            exp.DataType.Type.MEDIUMTEXT: "String",
1018            exp.DataType.Type.TINYBLOB: "String",
1019            exp.DataType.Type.TINYTEXT: "String",
1020            exp.DataType.Type.TEXT: "String",
1021            exp.DataType.Type.VARBINARY: "String",
1022            exp.DataType.Type.VARCHAR: "String",
1023        }
1024
1025        SUPPORTED_JSON_PATH_PARTS = {
1026            exp.JSONPathKey,
1027            exp.JSONPathRoot,
1028            exp.JSONPathSubscript,
1029        }
1030
1031        TYPE_MAPPING = {
1032            **generator.Generator.TYPE_MAPPING,
1033            **STRING_TYPE_MAPPING,
1034            exp.DataType.Type.ARRAY: "Array",
1035            exp.DataType.Type.BOOLEAN: "Bool",
1036            exp.DataType.Type.BIGINT: "Int64",
1037            exp.DataType.Type.DATE32: "Date32",
1038            exp.DataType.Type.DATETIME: "DateTime",
1039            exp.DataType.Type.DATETIME2: "DateTime",
1040            exp.DataType.Type.SMALLDATETIME: "DateTime",
1041            exp.DataType.Type.DATETIME64: "DateTime64",
1042            exp.DataType.Type.DECIMAL: "Decimal",
1043            exp.DataType.Type.DECIMAL32: "Decimal32",
1044            exp.DataType.Type.DECIMAL64: "Decimal64",
1045            exp.DataType.Type.DECIMAL128: "Decimal128",
1046            exp.DataType.Type.DECIMAL256: "Decimal256",
1047            exp.DataType.Type.TIMESTAMP: "DateTime",
1048            exp.DataType.Type.TIMESTAMPNTZ: "DateTime",
1049            exp.DataType.Type.TIMESTAMPTZ: "DateTime",
1050            exp.DataType.Type.DOUBLE: "Float64",
1051            exp.DataType.Type.ENUM: "Enum",
1052            exp.DataType.Type.ENUM8: "Enum8",
1053            exp.DataType.Type.ENUM16: "Enum16",
1054            exp.DataType.Type.FIXEDSTRING: "FixedString",
1055            exp.DataType.Type.FLOAT: "Float32",
1056            exp.DataType.Type.INT: "Int32",
1057            exp.DataType.Type.MEDIUMINT: "Int32",
1058            exp.DataType.Type.INT128: "Int128",
1059            exp.DataType.Type.INT256: "Int256",
1060            exp.DataType.Type.LOWCARDINALITY: "LowCardinality",
1061            exp.DataType.Type.MAP: "Map",
1062            exp.DataType.Type.NESTED: "Nested",
1063            exp.DataType.Type.NOTHING: "Nothing",
1064            exp.DataType.Type.SMALLINT: "Int16",
1065            exp.DataType.Type.STRUCT: "Tuple",
1066            exp.DataType.Type.TINYINT: "Int8",
1067            exp.DataType.Type.UBIGINT: "UInt64",
1068            exp.DataType.Type.UINT: "UInt32",
1069            exp.DataType.Type.UINT128: "UInt128",
1070            exp.DataType.Type.UINT256: "UInt256",
1071            exp.DataType.Type.USMALLINT: "UInt16",
1072            exp.DataType.Type.UTINYINT: "UInt8",
1073            exp.DataType.Type.IPV4: "IPv4",
1074            exp.DataType.Type.IPV6: "IPv6",
1075            exp.DataType.Type.POINT: "Point",
1076            exp.DataType.Type.RING: "Ring",
1077            exp.DataType.Type.LINESTRING: "LineString",
1078            exp.DataType.Type.MULTILINESTRING: "MultiLineString",
1079            exp.DataType.Type.POLYGON: "Polygon",
1080            exp.DataType.Type.MULTIPOLYGON: "MultiPolygon",
1081            exp.DataType.Type.AGGREGATEFUNCTION: "AggregateFunction",
1082            exp.DataType.Type.SIMPLEAGGREGATEFUNCTION: "SimpleAggregateFunction",
1083            exp.DataType.Type.DYNAMIC: "Dynamic",
1084        }
1085
1086        TRANSFORMS = {
1087            **generator.Generator.TRANSFORMS,
1088            exp.AnyValue: rename_func("any"),
1089            exp.ApproxDistinct: rename_func("uniq"),
1090            exp.ArrayConcat: rename_func("arrayConcat"),
1091            exp.ArrayFilter: lambda self, e: self.func("arrayFilter", e.expression, e.this),
1092            exp.ArrayRemove: remove_from_array_using_filter,
1093            exp.ArrayReverse: rename_func("arrayReverse"),
1094            exp.ArraySlice: rename_func("arraySlice"),
1095            exp.ArraySum: rename_func("arraySum"),
1096            exp.ArgMax: arg_max_or_min_no_count("argMax"),
1097            exp.ArgMin: arg_max_or_min_no_count("argMin"),
1098            exp.Array: inline_array_sql,
1099            exp.CastToStrType: rename_func("CAST"),
1100            exp.CountIf: rename_func("countIf"),
1101            exp.CosineDistance: rename_func("cosineDistance"),
1102            exp.CompressColumnConstraint: lambda self,
1103            e: f"CODEC({self.expressions(e, key='this', flat=True)})",
1104            exp.ComputedColumnConstraint: lambda self,
1105            e: f"{'MATERIALIZED' if e.args.get('persisted') else 'ALIAS'} {self.sql(e, 'this')}",
1106            exp.CurrentDate: lambda self, e: self.func("CURRENT_DATE"),
1107            exp.DateAdd: _datetime_delta_sql("DATE_ADD"),
1108            exp.DateDiff: _datetime_delta_sql("DATE_DIFF"),
1109            exp.DateStrToDate: rename_func("toDate"),
1110            exp.DateSub: _datetime_delta_sql("DATE_SUB"),
1111            exp.Explode: rename_func("arrayJoin"),
1112            exp.FarmFingerprint: rename_func("farmFingerprint64"),
1113            exp.Final: lambda self, e: f"{self.sql(e, 'this')} FINAL",
1114            exp.IsNan: rename_func("isNaN"),
1115            exp.JSONCast: lambda self, e: f"{self.sql(e, 'this')}.:{self.sql(e, 'to')}",
1116            exp.JSONExtract: json_extract_segments("JSONExtractString", quoted_index=False),
1117            exp.JSONExtractScalar: json_extract_segments("JSONExtractString", quoted_index=False),
1118            exp.JSONPathKey: json_path_key_only_name,
1119            exp.JSONPathRoot: lambda *_: "",
1120            exp.Length: length_or_char_length_sql,
1121            exp.Map: _map_sql,
1122            exp.Median: rename_func("median"),
1123            exp.Nullif: rename_func("nullIf"),
1124            exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}",
1125            exp.Pivot: no_pivot_sql,
1126            exp.Quantile: _quantile_sql,
1127            exp.RegexpLike: lambda self, e: self.func("match", e.this, e.expression),
1128            exp.Rand: rename_func("randCanonical"),
1129            exp.StartsWith: rename_func("startsWith"),
1130            exp.EndsWith: rename_func("endsWith"),
1131            exp.EuclideanDistance: rename_func("L2Distance"),
1132            exp.StrPosition: lambda self, e: strposition_sql(
1133                self,
1134                e,
1135                func_name="POSITION",
1136                supports_position=True,
1137                use_ansi_position=False,
1138            ),
1139            exp.TimeToStr: lambda self, e: self.func(
1140                "formatDateTime", e.this, self.format_time(e), e.args.get("zone")
1141            ),
1142            exp.TimeStrToTime: _timestrtotime_sql,
1143            exp.TimestampAdd: _datetime_delta_sql("TIMESTAMP_ADD"),
1144            exp.TimestampSub: _datetime_delta_sql("TIMESTAMP_SUB"),
1145            exp.Typeof: rename_func("toTypeName"),
1146            exp.VarMap: _map_sql,
1147            exp.Xor: lambda self, e: self.func("xor", e.this, e.expression, *e.expressions),
1148            exp.MD5Digest: rename_func("MD5"),
1149            exp.MD5: lambda self, e: self.func("LOWER", self.func("HEX", self.func("MD5", e.this))),
1150            exp.SHA: rename_func("SHA1"),
1151            exp.SHA2: sha256_sql,
1152            exp.UnixToTime: _unix_to_time_sql,
1153            exp.TimestampTrunc: timestamptrunc_sql(zone=True),
1154            exp.Trim: lambda self, e: trim_sql(self, e, default_trim_type="BOTH"),
1155            exp.Variance: rename_func("varSamp"),
1156            exp.SchemaCommentProperty: lambda self, e: self.naked_property(e),
1157            exp.Stddev: rename_func("stddevSamp"),
1158            exp.Chr: rename_func("CHAR"),
1159            exp.Lag: lambda self, e: self.func(
1160                "lagInFrame", e.this, e.args.get("offset"), e.args.get("default")
1161            ),
1162            exp.Lead: lambda self, e: self.func(
1163                "leadInFrame", e.this, e.args.get("offset"), e.args.get("default")
1164            ),
1165            exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")(
1166                rename_func("editDistance")
1167            ),
1168            exp.ParseDatetime: rename_func("parseDateTime"),
1169        }
1170
1171        PROPERTIES_LOCATION = {
1172            **generator.Generator.PROPERTIES_LOCATION,
1173            exp.OnCluster: exp.Properties.Location.POST_NAME,
1174            exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA,
1175            exp.ToTableProperty: exp.Properties.Location.POST_NAME,
1176            exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED,
1177        }
1178
1179        # There's no list in docs, but it can be found in Clickhouse code
1180        # see `ClickHouse/src/Parsers/ParserCreate*.cpp`
1181        ON_CLUSTER_TARGETS = {
1182            "SCHEMA",  # Transpiled CREATE SCHEMA may have OnCluster property set
1183            "DATABASE",
1184            "TABLE",
1185            "VIEW",
1186            "DICTIONARY",
1187            "INDEX",
1188            "FUNCTION",
1189            "NAMED COLLECTION",
1190        }
1191
1192        # https://clickhouse.com/docs/en/sql-reference/data-types/nullable
1193        NON_NULLABLE_TYPES = {
1194            exp.DataType.Type.ARRAY,
1195            exp.DataType.Type.MAP,
1196            exp.DataType.Type.STRUCT,
1197            exp.DataType.Type.POINT,
1198            exp.DataType.Type.RING,
1199            exp.DataType.Type.LINESTRING,
1200            exp.DataType.Type.MULTILINESTRING,
1201            exp.DataType.Type.POLYGON,
1202            exp.DataType.Type.MULTIPOLYGON,
1203        }
1204
1205        def offset_sql(self, expression: exp.Offset) -> str:
1206            offset = super().offset_sql(expression)
1207
1208            # OFFSET ... FETCH syntax requires a "ROW" or "ROWS" keyword
1209            # https://clickhouse.com/docs/sql-reference/statements/select/offset
1210            parent = expression.parent
1211            if isinstance(parent, exp.Select) and isinstance(parent.args.get("limit"), exp.Fetch):
1212                offset = f"{offset} ROWS"
1213
1214            return offset
1215
1216        def strtodate_sql(self, expression: exp.StrToDate) -> str:
1217            strtodate_sql = self.function_fallback_sql(expression)
1218
1219            if not isinstance(expression.parent, exp.Cast):
1220                # StrToDate returns DATEs in other dialects (eg. postgres), so
1221                # this branch aims to improve the transpilation to clickhouse
1222                return self.cast_sql(exp.cast(expression, "DATE"))
1223
1224            return strtodate_sql
1225
1226        def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str:
1227            this = expression.this
1228
1229            if isinstance(this, exp.StrToDate) and expression.to == exp.DataType.build("datetime"):
1230                return self.sql(this)
1231
1232            return super().cast_sql(expression, safe_prefix=safe_prefix)
1233
1234        def trycast_sql(self, expression: exp.TryCast) -> str:
1235            dtype = expression.to
1236            if not dtype.is_type(*self.NON_NULLABLE_TYPES, check_nullable=True):
1237                # Casting x into Nullable(T) appears to behave similarly to TRY_CAST(x AS T)
1238                dtype.set("nullable", True)
1239
1240            return super().cast_sql(expression)
1241
1242        def _jsonpathsubscript_sql(self, expression: exp.JSONPathSubscript) -> str:
1243            this = self.json_path_part(expression.this)
1244            return str(int(this) + 1) if is_int(this) else this
1245
1246        def likeproperty_sql(self, expression: exp.LikeProperty) -> str:
1247            return f"AS {self.sql(expression, 'this')}"
1248
1249        def _any_to_has(
1250            self,
1251            expression: exp.EQ | exp.NEQ,
1252            default: t.Callable[[t.Any], str],
1253            prefix: str = "",
1254        ) -> str:
1255            if isinstance(expression.left, exp.Any):
1256                arr = expression.left
1257                this = expression.right
1258            elif isinstance(expression.right, exp.Any):
1259                arr = expression.right
1260                this = expression.left
1261            else:
1262                return default(expression)
1263
1264            return prefix + self.func("has", arr.this.unnest(), this)
1265
1266        def eq_sql(self, expression: exp.EQ) -> str:
1267            return self._any_to_has(expression, super().eq_sql)
1268
1269        def neq_sql(self, expression: exp.NEQ) -> str:
1270            return self._any_to_has(expression, super().neq_sql, "NOT ")
1271
1272        def regexpilike_sql(self, expression: exp.RegexpILike) -> str:
1273            # Manually add a flag to make the search case-insensitive
1274            regex = self.func("CONCAT", "'(?i)'", expression.expression)
1275            return self.func("match", expression.this, regex)
1276
1277        def datatype_sql(self, expression: exp.DataType) -> str:
1278            # String is the standard ClickHouse type, every other variant is just an alias.
1279            # Additionally, any supplied length parameter will be ignored.
1280            #
1281            # https://clickhouse.com/docs/en/sql-reference/data-types/string
1282            if expression.this in self.STRING_TYPE_MAPPING:
1283                dtype = "String"
1284            else:
1285                dtype = super().datatype_sql(expression)
1286
1287            # This section changes the type to `Nullable(...)` if the following conditions hold:
1288            # - It's marked as nullable - this ensures we won't wrap ClickHouse types with `Nullable`
1289            #   and change their semantics
1290            # - It's not the key type of a `Map`. This is because ClickHouse enforces the following
1291            #   constraint: "Type of Map key must be a type, that can be represented by integer or
1292            #   String or FixedString (possibly LowCardinality) or UUID or IPv6"
1293            # - It's not a composite type, e.g. `Nullable(Array(...))` is not a valid type
1294            parent = expression.parent
1295            nullable = expression.args.get("nullable")
1296            if nullable is True or (
1297                nullable is None
1298                and not (
1299                    isinstance(parent, exp.DataType)
1300                    and parent.is_type(exp.DataType.Type.MAP, check_nullable=True)
1301                    and expression.index in (None, 0)
1302                )
1303                and not expression.is_type(*self.NON_NULLABLE_TYPES, check_nullable=True)
1304            ):
1305                dtype = f"Nullable({dtype})"
1306
1307            return dtype
1308
1309        def cte_sql(self, expression: exp.CTE) -> str:
1310            if expression.args.get("scalar"):
1311                this = self.sql(expression, "this")
1312                alias = self.sql(expression, "alias")
1313                return f"{this} AS {alias}"
1314
1315            return super().cte_sql(expression)
1316
1317        def after_limit_modifiers(self, expression: exp.Expression) -> t.List[str]:
1318            return super().after_limit_modifiers(expression) + [
1319                (
1320                    self.seg("SETTINGS ") + self.expressions(expression, key="settings", flat=True)
1321                    if expression.args.get("settings")
1322                    else ""
1323                ),
1324                (
1325                    self.seg("FORMAT ") + self.sql(expression, "format")
1326                    if expression.args.get("format")
1327                    else ""
1328                ),
1329            ]
1330
1331        def placeholder_sql(self, expression: exp.Placeholder) -> str:
1332            return f"{{{expression.name}: {self.sql(expression, 'kind')}}}"
1333
1334        def oncluster_sql(self, expression: exp.OnCluster) -> str:
1335            return f"ON CLUSTER {self.sql(expression, 'this')}"
1336
1337        def createable_sql(self, expression: exp.Create, locations: t.DefaultDict) -> str:
1338            if expression.kind in self.ON_CLUSTER_TARGETS and locations.get(
1339                exp.Properties.Location.POST_NAME
1340            ):
1341                this_name = self.sql(
1342                    expression.this if isinstance(expression.this, exp.Schema) else expression,
1343                    "this",
1344                )
1345                this_properties = " ".join(
1346                    [self.sql(prop) for prop in locations[exp.Properties.Location.POST_NAME]]
1347                )
1348                this_schema = self.schema_columns_sql(expression.this)
1349                this_schema = f"{self.sep()}{this_schema}" if this_schema else ""
1350
1351                return f"{this_name}{self.sep()}{this_properties}{this_schema}"
1352
1353            return super().createable_sql(expression, locations)
1354
1355        def create_sql(self, expression: exp.Create) -> str:
1356            # The comment property comes last in CTAS statements, i.e. after the query
1357            query = expression.expression
1358            if isinstance(query, exp.Query):
1359                comment_prop = expression.find(exp.SchemaCommentProperty)
1360                if comment_prop:
1361                    comment_prop.pop()
1362                    query.replace(exp.paren(query))
1363            else:
1364                comment_prop = None
1365
1366            create_sql = super().create_sql(expression)
1367
1368            comment_sql = self.sql(comment_prop)
1369            comment_sql = f" {comment_sql}" if comment_sql else ""
1370
1371            return f"{create_sql}{comment_sql}"
1372
1373        def prewhere_sql(self, expression: exp.PreWhere) -> str:
1374            this = self.indent(self.sql(expression, "this"))
1375            return f"{self.seg('PREWHERE')}{self.sep()}{this}"
1376
1377        def indexcolumnconstraint_sql(self, expression: exp.IndexColumnConstraint) -> str:
1378            this = self.sql(expression, "this")
1379            this = f" {this}" if this else ""
1380            expr = self.sql(expression, "expression")
1381            expr = f" {expr}" if expr else ""
1382            index_type = self.sql(expression, "index_type")
1383            index_type = f" TYPE {index_type}" if index_type else ""
1384            granularity = self.sql(expression, "granularity")
1385            granularity = f" GRANULARITY {granularity}" if granularity else ""
1386
1387            return f"INDEX{this}{expr}{index_type}{granularity}"
1388
1389        def partition_sql(self, expression: exp.Partition) -> str:
1390            return f"PARTITION {self.expressions(expression, flat=True)}"
1391
1392        def partitionid_sql(self, expression: exp.PartitionId) -> str:
1393            return f"ID {self.sql(expression.this)}"
1394
1395        def replacepartition_sql(self, expression: exp.ReplacePartition) -> str:
1396            return (
1397                f"REPLACE {self.sql(expression.expression)} FROM {self.sql(expression, 'source')}"
1398            )
1399
1400        def projectiondef_sql(self, expression: exp.ProjectionDef) -> str:
1401            return f"PROJECTION {self.sql(expression.this)} {self.wrap(expression.expression)}"
1402
1403        def is_sql(self, expression: exp.Is) -> str:
1404            is_sql = super().is_sql(expression)
1405
1406            if isinstance(expression.parent, exp.Not):
1407                # value IS NOT NULL -> NOT (value IS NULL)
1408                is_sql = self.wrap(is_sql)
1409
1410            return is_sql
1411
1412        def in_sql(self, expression: exp.In) -> str:
1413            in_sql = super().in_sql(expression)
1414
1415            if isinstance(expression.parent, exp.Not) and expression.args.get("is_global"):
1416                in_sql = in_sql.replace("GLOBAL IN", "GLOBAL NOT IN", 1)
1417
1418            return in_sql
1419
1420        def not_sql(self, expression: exp.Not) -> str:
1421            if isinstance(expression.this, exp.In) and expression.this.args.get("is_global"):
1422                # let `GLOBAL IN` child interpose `NOT`
1423                return self.sql(expression, "this")
1424
1425            return super().not_sql(expression)
1426
1427        def values_sql(self, expression: exp.Values, values_as_table: bool = True) -> str:
1428            # If the VALUES clause contains tuples of expressions, we need to treat it
1429            # as a table since Clickhouse will automatically alias it as such.
1430            alias = expression.args.get("alias")
1431
1432            if alias and alias.args.get("columns") and expression.expressions:
1433                values = expression.expressions[0].expressions
1434                values_as_table = any(isinstance(value, exp.Tuple) for value in values)
1435            else:
1436                values_as_table = True
1437
1438            return super().values_sql(expression, values_as_table=values_as_table)

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 or 'always': Always quote. '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 WHERE clause. 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
QUERY_HINTS = False
STRUCT_DELIMITER = ('(', ')')
NVL2_SUPPORTED = False
TABLESAMPLE_REQUIRES_PARENS = False
TABLESAMPLE_SIZE_IS_ROWS = False
TABLESAMPLE_KEYWORDS = 'SAMPLE'
LAST_DAY_SUPPORTS_DATE_PART = False
CAN_IMPLEMENT_ARRAY_ANY = True
SUPPORTS_TO_NUMBER = False
JOIN_HINTS = False
TABLE_HINTS = False
GROUPINGS_SEP = ''
SET_OP_MODIFIERS = False
ARRAY_SIZE_NAME = 'LENGTH'
WRAP_DERIVED_VALUES = False
STRING_TYPE_MAPPING = {<Type.BLOB: 'BLOB'>: 'String', <Type.CHAR: 'CHAR'>: 'String', <Type.LONGBLOB: 'LONGBLOB'>: 'String', <Type.LONGTEXT: 'LONGTEXT'>: 'String', <Type.MEDIUMBLOB: 'MEDIUMBLOB'>: 'String', <Type.MEDIUMTEXT: 'MEDIUMTEXT'>: 'String', <Type.TINYBLOB: 'TINYBLOB'>: 'String', <Type.TINYTEXT: 'TINYTEXT'>: 'String', <Type.TEXT: 'TEXT'>: 'String', <Type.VARBINARY: 'VARBINARY'>: 'String', <Type.VARCHAR: 'VARCHAR'>: 'String'}
TYPE_MAPPING = {<Type.DATETIME2: 'DATETIME2'>: 'DateTime', <Type.NCHAR: 'NCHAR'>: 'CHAR', <Type.NVARCHAR: 'NVARCHAR'>: 'VARCHAR', <Type.MEDIUMTEXT: 'MEDIUMTEXT'>: 'String', <Type.LONGTEXT: 'LONGTEXT'>: 'String', <Type.TINYTEXT: 'TINYTEXT'>: 'String', <Type.BLOB: 'BLOB'>: 'String', <Type.MEDIUMBLOB: 'MEDIUMBLOB'>: 'String', <Type.LONGBLOB: 'LONGBLOB'>: 'String', <Type.TINYBLOB: 'TINYBLOB'>: 'String', <Type.INET: 'INET'>: 'INET', <Type.ROWVERSION: 'ROWVERSION'>: 'VARBINARY', <Type.SMALLDATETIME: 'SMALLDATETIME'>: 'DateTime', <Type.CHAR: 'CHAR'>: 'String', <Type.TEXT: 'TEXT'>: 'String', <Type.VARBINARY: 'VARBINARY'>: 'String', <Type.VARCHAR: 'VARCHAR'>: 'String', <Type.ARRAY: 'ARRAY'>: 'Array', <Type.BOOLEAN: 'BOOLEAN'>: 'Bool', <Type.BIGINT: 'BIGINT'>: 'Int64', <Type.DATE32: 'DATE32'>: 'Date32', <Type.DATETIME: 'DATETIME'>: 'DateTime', <Type.DATETIME64: 'DATETIME64'>: 'DateTime64', <Type.DECIMAL: 'DECIMAL'>: 'Decimal', <Type.DECIMAL32: 'DECIMAL32'>: 'Decimal32', <Type.DECIMAL64: 'DECIMAL64'>: 'Decimal64', <Type.DECIMAL128: 'DECIMAL128'>: 'Decimal128', <Type.DECIMAL256: 'DECIMAL256'>: 'Decimal256', <Type.TIMESTAMP: 'TIMESTAMP'>: 'DateTime', <Type.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>: 'DateTime', <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>: 'DateTime', <Type.DOUBLE: 'DOUBLE'>: 'Float64', <Type.ENUM: 'ENUM'>: 'Enum', <Type.ENUM8: 'ENUM8'>: 'Enum8', <Type.ENUM16: 'ENUM16'>: 'Enum16', <Type.FIXEDSTRING: 'FIXEDSTRING'>: 'FixedString', <Type.FLOAT: 'FLOAT'>: 'Float32', <Type.INT: 'INT'>: 'Int32', <Type.MEDIUMINT: 'MEDIUMINT'>: 'Int32', <Type.INT128: 'INT128'>: 'Int128', <Type.INT256: 'INT256'>: 'Int256', <Type.LOWCARDINALITY: 'LOWCARDINALITY'>: 'LowCardinality', <Type.MAP: 'MAP'>: 'Map', <Type.NESTED: 'NESTED'>: 'Nested', <Type.NOTHING: 'NOTHING'>: 'Nothing', <Type.SMALLINT: 'SMALLINT'>: 'Int16', <Type.STRUCT: 'STRUCT'>: 'Tuple', <Type.TINYINT: 'TINYINT'>: 'Int8', <Type.UBIGINT: 'UBIGINT'>: 'UInt64', <Type.UINT: 'UINT'>: 'UInt32', <Type.UINT128: 'UINT128'>: 'UInt128', <Type.UINT256: 'UINT256'>: 'UInt256', <Type.USMALLINT: 'USMALLINT'>: 'UInt16', <Type.UTINYINT: 'UTINYINT'>: 'UInt8', <Type.IPV4: 'IPV4'>: 'IPv4', <Type.IPV6: 'IPV6'>: 'IPv6', <Type.POINT: 'POINT'>: 'Point', <Type.RING: 'RING'>: 'Ring', <Type.LINESTRING: 'LINESTRING'>: 'LineString', <Type.MULTILINESTRING: 'MULTILINESTRING'>: 'MultiLineString', <Type.POLYGON: 'POLYGON'>: 'Polygon', <Type.MULTIPOLYGON: 'MULTIPOLYGON'>: 'MultiPolygon', <Type.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>: 'AggregateFunction', <Type.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>: 'SimpleAggregateFunction', <Type.DYNAMIC: 'DYNAMIC'>: 'Dynamic'}
TRANSFORMS = {<class 'sqlglot.expressions.JSONPathKey'>: <function json_path_key_only_name>, <class 'sqlglot.expressions.JSONPathRoot'>: <function ClickHouse.Generator.<lambda>>, <class 'sqlglot.expressions.JSONPathSubscript'>: <function <lambda>>, <class 'sqlglot.expressions.AllowedValuesProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.AnalyzeColumns'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.AnalyzeWith'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ArrayContainsAll'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ArrayOverlaps'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.AutoRefreshProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.BackupProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CaseSpecificColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Ceil'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CharacterSetColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CharacterSetProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ClusteredColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CollateColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CommentColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ConnectByRoot'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ConvertToCharset'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CopyGrantsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CredentialsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.DateFormatColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.DefaultColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.DynamicProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.EmptyProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.EncodeColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.EnviromentProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.EphemeralColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ExcludeColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ExecuteAsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Except'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ExternalProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Floor'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Get'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.GlobalProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.HeapProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.IcebergProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.InheritsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.InlineLengthColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.InputModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Intersect'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.IntervalSpan'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Int64'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.JSONBContainsAnyTopKeys'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.JSONBContainsAllTopKeys'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.JSONBDeleteAtPath'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.LanguageProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.LocationProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.LogProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.MaterializedProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.NonClusteredColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.NoPrimaryIndexProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.NotForReplicationColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.OnCommitProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.OnProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.OnUpdateColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Operator'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.OutputModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.PathColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.PartitionedByBucket'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.PartitionByTruncate'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.PivotAny'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.PositionalColumn'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ProjectionPolicyColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Put'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.RemoteWithConnectionModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ReturnsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SampleProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SecureProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SecurityProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SetConfigProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SetProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SettingsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SharingProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SqlReadWriteProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SqlSecurityProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.StabilityProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Stream'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.StreamingTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.StrictProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SwapTable'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TableColumn'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Tags'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TemporaryProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TitleColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ToMap'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ToTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TransformModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TransientProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Union'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UnloggedProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UsingTemplateProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UsingData'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Uuid'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UppercaseColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UtcDate'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UtcTime'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UtcTimestamp'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.VarMap'>: <function _map_sql>, <class 'sqlglot.expressions.ViewAttributeProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.VolatileProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WeekStart'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WithJournalTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WithProcedureOptions'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WithSchemaBindingProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WithOperator'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ForceProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.AnyValue'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.ApproxDistinct'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.ArrayConcat'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.ArrayFilter'>: <function ClickHouse.Generator.<lambda>>, <class 'sqlglot.expressions.ArrayRemove'>: <function remove_from_array_using_filter>, <class 'sqlglot.expressions.ArrayReverse'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.ArraySlice'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.ArraySum'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.ArgMax'>: <function arg_max_or_min_no_count.<locals>._arg_max_or_min_sql>, <class 'sqlglot.expressions.ArgMin'>: <function arg_max_or_min_no_count.<locals>._arg_max_or_min_sql>, <class 'sqlglot.expressions.Array'>: <function inline_array_sql>, <class 'sqlglot.expressions.CastToStrType'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.CountIf'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.CosineDistance'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.CompressColumnConstraint'>: <function ClickHouse.Generator.<lambda>>, <class 'sqlglot.expressions.ComputedColumnConstraint'>: <function ClickHouse.Generator.<lambda>>, <class 'sqlglot.expressions.CurrentDate'>: <function ClickHouse.Generator.<lambda>>, <class 'sqlglot.expressions.DateAdd'>: <function _datetime_delta_sql.<locals>._delta_sql>, <class 'sqlglot.expressions.DateDiff'>: <function _datetime_delta_sql.<locals>._delta_sql>, <class 'sqlglot.expressions.DateStrToDate'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.DateSub'>: <function _datetime_delta_sql.<locals>._delta_sql>, <class 'sqlglot.expressions.Explode'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.FarmFingerprint'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.Final'>: <function ClickHouse.Generator.<lambda>>, <class 'sqlglot.expressions.IsNan'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.JSONCast'>: <function ClickHouse.Generator.<lambda>>, <class 'sqlglot.expressions.JSONExtract'>: <function json_extract_segments.<locals>._json_extract_segments>, <class 'sqlglot.expressions.JSONExtractScalar'>: <function json_extract_segments.<locals>._json_extract_segments>, <class 'sqlglot.expressions.Length'>: <function length_or_char_length_sql>, <class 'sqlglot.expressions.Map'>: <function _map_sql>, <class 'sqlglot.expressions.Median'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.Nullif'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.PartitionedByProperty'>: <function ClickHouse.Generator.<lambda>>, <class 'sqlglot.expressions.Pivot'>: <function no_pivot_sql>, <class 'sqlglot.expressions.Quantile'>: <function _quantile_sql>, <class 'sqlglot.expressions.RegexpLike'>: <function ClickHouse.Generator.<lambda>>, <class 'sqlglot.expressions.Rand'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.StartsWith'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.EndsWith'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.EuclideanDistance'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.StrPosition'>: <function ClickHouse.Generator.<lambda>>, <class 'sqlglot.expressions.TimeToStr'>: <function ClickHouse.Generator.<lambda>>, <class 'sqlglot.expressions.TimeStrToTime'>: <function _timestrtotime_sql>, <class 'sqlglot.expressions.TimestampAdd'>: <function _datetime_delta_sql.<locals>._delta_sql>, <class 'sqlglot.expressions.TimestampSub'>: <function _datetime_delta_sql.<locals>._delta_sql>, <class 'sqlglot.expressions.Typeof'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.Xor'>: <function ClickHouse.Generator.<lambda>>, <class 'sqlglot.expressions.MD5Digest'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.MD5'>: <function ClickHouse.Generator.<lambda>>, <class 'sqlglot.expressions.SHA'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.SHA2'>: <function sha256_sql>, <class 'sqlglot.expressions.UnixToTime'>: <function _unix_to_time_sql>, <class 'sqlglot.expressions.TimestampTrunc'>: <function timestamptrunc_sql.<locals>._timestamptrunc_sql>, <class 'sqlglot.expressions.Trim'>: <function ClickHouse.Generator.<lambda>>, <class 'sqlglot.expressions.Variance'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.SchemaCommentProperty'>: <function ClickHouse.Generator.<lambda>>, <class 'sqlglot.expressions.Stddev'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.Chr'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.Lag'>: <function ClickHouse.Generator.<lambda>>, <class 'sqlglot.expressions.Lead'>: <function ClickHouse.Generator.<lambda>>, <class 'sqlglot.expressions.Levenshtein'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.ParseDatetime'>: <function rename_func.<locals>.<lambda>>}
PROPERTIES_LOCATION = {<class 'sqlglot.expressions.AllowedValuesProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.AlgorithmProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.AutoIncrementProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.AutoRefreshProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.BackupProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.BlockCompressionProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.CharacterSetProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ChecksumProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.CollateProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.CopyGrantsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Cluster'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ClusteredByProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DistributedByProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DuplicateKeyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DataBlocksizeProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.DataDeletionProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DefinerProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.DictRange'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DictProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DynamicProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.DistKeyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DistStyleProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.EmptyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.EncodeProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.EngineProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.EnviromentProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ExecuteAsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ExternalProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.FallbackProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.FileFormatProperty'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.FreespaceProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.GlobalProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.HeapProperty'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.InheritsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.IcebergProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.IncludeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.InputModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.IsolatedLoadingProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.JournalProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.LanguageProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LikeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LocationProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LockProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LockingProperty'>: <Location.POST_ALIAS: 'POST_ALIAS'>, <class 'sqlglot.expressions.LogProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.MaterializedProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.MergeBlockRatioProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.NoPrimaryIndexProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.OnProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.OnCommitProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.Order'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.OutputModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.PartitionedByProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.PartitionedOfProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.PrimaryKey'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Property'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.RemoteWithConnectionModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ReturnsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RowFormatProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RowFormatDelimitedProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RowFormatSerdeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SampleProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SchemaCommentProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SecureProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.SecurityProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SerdeProperties'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Set'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SettingsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SetProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.SetConfigProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SharingProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.SequenceProperties'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.SortKeyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SqlReadWriteProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SqlSecurityProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.StabilityProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.StorageHandlerProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.StreamingTableProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.StrictProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Tags'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.TemporaryProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.ToTableProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.TransientProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.TransformModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.MergeTreeTTL'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.UnloggedProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.UsingTemplateProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ViewAttributeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.VolatileProperty'>: <Location.UNSUPPORTED: 'UNSUPPORTED'>, <class 'sqlglot.expressions.WithDataProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.WithJournalTableProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.WithProcedureOptions'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.WithSchemaBindingProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.WithSystemVersioningProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ForceProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.OnCluster'>: <Location.POST_NAME: 'POST_NAME'>}
ON_CLUSTER_TARGETS = {'NAMED COLLECTION', 'TABLE', 'DICTIONARY', 'FUNCTION', 'SCHEMA', 'VIEW', 'DATABASE', 'INDEX'}
NON_NULLABLE_TYPES = {<Type.LINESTRING: 'LINESTRING'>, <Type.ARRAY: 'ARRAY'>, <Type.RING: 'RING'>, <Type.POINT: 'POINT'>, <Type.STRUCT: 'STRUCT'>, <Type.MULTIPOLYGON: 'MULTIPOLYGON'>, <Type.POLYGON: 'POLYGON'>, <Type.MULTILINESTRING: 'MULTILINESTRING'>, <Type.MAP: 'MAP'>}
def offset_sql(self, expression: sqlglot.expressions.Offset) -> str:
1205        def offset_sql(self, expression: exp.Offset) -> str:
1206            offset = super().offset_sql(expression)
1207
1208            # OFFSET ... FETCH syntax requires a "ROW" or "ROWS" keyword
1209            # https://clickhouse.com/docs/sql-reference/statements/select/offset
1210            parent = expression.parent
1211            if isinstance(parent, exp.Select) and isinstance(parent.args.get("limit"), exp.Fetch):
1212                offset = f"{offset} ROWS"
1213
1214            return offset
def strtodate_sql(self, expression: sqlglot.expressions.StrToDate) -> str:
1216        def strtodate_sql(self, expression: exp.StrToDate) -> str:
1217            strtodate_sql = self.function_fallback_sql(expression)
1218
1219            if not isinstance(expression.parent, exp.Cast):
1220                # StrToDate returns DATEs in other dialects (eg. postgres), so
1221                # this branch aims to improve the transpilation to clickhouse
1222                return self.cast_sql(exp.cast(expression, "DATE"))
1223
1224            return strtodate_sql
def cast_sql( self, expression: sqlglot.expressions.Cast, safe_prefix: Optional[str] = None) -> str:
1226        def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str:
1227            this = expression.this
1228
1229            if isinstance(this, exp.StrToDate) and expression.to == exp.DataType.build("datetime"):
1230                return self.sql(this)
1231
1232            return super().cast_sql(expression, safe_prefix=safe_prefix)
def trycast_sql(self, expression: sqlglot.expressions.TryCast) -> str:
1234        def trycast_sql(self, expression: exp.TryCast) -> str:
1235            dtype = expression.to
1236            if not dtype.is_type(*self.NON_NULLABLE_TYPES, check_nullable=True):
1237                # Casting x into Nullable(T) appears to behave similarly to TRY_CAST(x AS T)
1238                dtype.set("nullable", True)
1239
1240            return super().cast_sql(expression)
def likeproperty_sql(self, expression: sqlglot.expressions.LikeProperty) -> str:
1246        def likeproperty_sql(self, expression: exp.LikeProperty) -> str:
1247            return f"AS {self.sql(expression, 'this')}"
def eq_sql(self, expression: sqlglot.expressions.EQ) -> str:
1266        def eq_sql(self, expression: exp.EQ) -> str:
1267            return self._any_to_has(expression, super().eq_sql)
def neq_sql(self, expression: sqlglot.expressions.NEQ) -> str:
1269        def neq_sql(self, expression: exp.NEQ) -> str:
1270            return self._any_to_has(expression, super().neq_sql, "NOT ")
def regexpilike_sql(self, expression: sqlglot.expressions.RegexpILike) -> str:
1272        def regexpilike_sql(self, expression: exp.RegexpILike) -> str:
1273            # Manually add a flag to make the search case-insensitive
1274            regex = self.func("CONCAT", "'(?i)'", expression.expression)
1275            return self.func("match", expression.this, regex)
def datatype_sql(self, expression: sqlglot.expressions.DataType) -> str:
1277        def datatype_sql(self, expression: exp.DataType) -> str:
1278            # String is the standard ClickHouse type, every other variant is just an alias.
1279            # Additionally, any supplied length parameter will be ignored.
1280            #
1281            # https://clickhouse.com/docs/en/sql-reference/data-types/string
1282            if expression.this in self.STRING_TYPE_MAPPING:
1283                dtype = "String"
1284            else:
1285                dtype = super().datatype_sql(expression)
1286
1287            # This section changes the type to `Nullable(...)` if the following conditions hold:
1288            # - It's marked as nullable - this ensures we won't wrap ClickHouse types with `Nullable`
1289            #   and change their semantics
1290            # - It's not the key type of a `Map`. This is because ClickHouse enforces the following
1291            #   constraint: "Type of Map key must be a type, that can be represented by integer or
1292            #   String or FixedString (possibly LowCardinality) or UUID or IPv6"
1293            # - It's not a composite type, e.g. `Nullable(Array(...))` is not a valid type
1294            parent = expression.parent
1295            nullable = expression.args.get("nullable")
1296            if nullable is True or (
1297                nullable is None
1298                and not (
1299                    isinstance(parent, exp.DataType)
1300                    and parent.is_type(exp.DataType.Type.MAP, check_nullable=True)
1301                    and expression.index in (None, 0)
1302                )
1303                and not expression.is_type(*self.NON_NULLABLE_TYPES, check_nullable=True)
1304            ):
1305                dtype = f"Nullable({dtype})"
1306
1307            return dtype
def cte_sql(self, expression: sqlglot.expressions.CTE) -> str:
1309        def cte_sql(self, expression: exp.CTE) -> str:
1310            if expression.args.get("scalar"):
1311                this = self.sql(expression, "this")
1312                alias = self.sql(expression, "alias")
1313                return f"{this} AS {alias}"
1314
1315            return super().cte_sql(expression)
def after_limit_modifiers(self, expression: sqlglot.expressions.Expression) -> List[str]:
1317        def after_limit_modifiers(self, expression: exp.Expression) -> t.List[str]:
1318            return super().after_limit_modifiers(expression) + [
1319                (
1320                    self.seg("SETTINGS ") + self.expressions(expression, key="settings", flat=True)
1321                    if expression.args.get("settings")
1322                    else ""
1323                ),
1324                (
1325                    self.seg("FORMAT ") + self.sql(expression, "format")
1326                    if expression.args.get("format")
1327                    else ""
1328                ),
1329            ]
def placeholder_sql(self, expression: sqlglot.expressions.Placeholder) -> str:
1331        def placeholder_sql(self, expression: exp.Placeholder) -> str:
1332            return f"{{{expression.name}: {self.sql(expression, 'kind')}}}"
def oncluster_sql(self, expression: sqlglot.expressions.OnCluster) -> str:
1334        def oncluster_sql(self, expression: exp.OnCluster) -> str:
1335            return f"ON CLUSTER {self.sql(expression, 'this')}"
def createable_sql( self, expression: sqlglot.expressions.Create, locations: DefaultDict) -> str:
1337        def createable_sql(self, expression: exp.Create, locations: t.DefaultDict) -> str:
1338            if expression.kind in self.ON_CLUSTER_TARGETS and locations.get(
1339                exp.Properties.Location.POST_NAME
1340            ):
1341                this_name = self.sql(
1342                    expression.this if isinstance(expression.this, exp.Schema) else expression,
1343                    "this",
1344                )
1345                this_properties = " ".join(
1346                    [self.sql(prop) for prop in locations[exp.Properties.Location.POST_NAME]]
1347                )
1348                this_schema = self.schema_columns_sql(expression.this)
1349                this_schema = f"{self.sep()}{this_schema}" if this_schema else ""
1350
1351                return f"{this_name}{self.sep()}{this_properties}{this_schema}"
1352
1353            return super().createable_sql(expression, locations)
def create_sql(self, expression: sqlglot.expressions.Create) -> str:
1355        def create_sql(self, expression: exp.Create) -> str:
1356            # The comment property comes last in CTAS statements, i.e. after the query
1357            query = expression.expression
1358            if isinstance(query, exp.Query):
1359                comment_prop = expression.find(exp.SchemaCommentProperty)
1360                if comment_prop:
1361                    comment_prop.pop()
1362                    query.replace(exp.paren(query))
1363            else:
1364                comment_prop = None
1365
1366            create_sql = super().create_sql(expression)
1367
1368            comment_sql = self.sql(comment_prop)
1369            comment_sql = f" {comment_sql}" if comment_sql else ""
1370
1371            return f"{create_sql}{comment_sql}"
def prewhere_sql(self, expression: sqlglot.expressions.PreWhere) -> str:
1373        def prewhere_sql(self, expression: exp.PreWhere) -> str:
1374            this = self.indent(self.sql(expression, "this"))
1375            return f"{self.seg('PREWHERE')}{self.sep()}{this}"
def indexcolumnconstraint_sql(self, expression: sqlglot.expressions.IndexColumnConstraint) -> str:
1377        def indexcolumnconstraint_sql(self, expression: exp.IndexColumnConstraint) -> str:
1378            this = self.sql(expression, "this")
1379            this = f" {this}" if this else ""
1380            expr = self.sql(expression, "expression")
1381            expr = f" {expr}" if expr else ""
1382            index_type = self.sql(expression, "index_type")
1383            index_type = f" TYPE {index_type}" if index_type else ""
1384            granularity = self.sql(expression, "granularity")
1385            granularity = f" GRANULARITY {granularity}" if granularity else ""
1386
1387            return f"INDEX{this}{expr}{index_type}{granularity}"
def partition_sql(self, expression: sqlglot.expressions.Partition) -> str:
1389        def partition_sql(self, expression: exp.Partition) -> str:
1390            return f"PARTITION {self.expressions(expression, flat=True)}"
def partitionid_sql(self, expression: sqlglot.expressions.PartitionId) -> str:
1392        def partitionid_sql(self, expression: exp.PartitionId) -> str:
1393            return f"ID {self.sql(expression.this)}"
def replacepartition_sql(self, expression: sqlglot.expressions.ReplacePartition) -> str:
1395        def replacepartition_sql(self, expression: exp.ReplacePartition) -> str:
1396            return (
1397                f"REPLACE {self.sql(expression.expression)} FROM {self.sql(expression, 'source')}"
1398            )
def projectiondef_sql(self, expression: sqlglot.expressions.ProjectionDef) -> str:
1400        def projectiondef_sql(self, expression: exp.ProjectionDef) -> str:
1401            return f"PROJECTION {self.sql(expression.this)} {self.wrap(expression.expression)}"
def is_sql(self, expression: sqlglot.expressions.Is) -> str:
1403        def is_sql(self, expression: exp.Is) -> str:
1404            is_sql = super().is_sql(expression)
1405
1406            if isinstance(expression.parent, exp.Not):
1407                # value IS NOT NULL -> NOT (value IS NULL)
1408                is_sql = self.wrap(is_sql)
1409
1410            return is_sql
def in_sql(self, expression: sqlglot.expressions.In) -> str:
1412        def in_sql(self, expression: exp.In) -> str:
1413            in_sql = super().in_sql(expression)
1414
1415            if isinstance(expression.parent, exp.Not) and expression.args.get("is_global"):
1416                in_sql = in_sql.replace("GLOBAL IN", "GLOBAL NOT IN", 1)
1417
1418            return in_sql
def not_sql(self, expression: sqlglot.expressions.Not) -> str:
1420        def not_sql(self, expression: exp.Not) -> str:
1421            if isinstance(expression.this, exp.In) and expression.this.args.get("is_global"):
1422                # let `GLOBAL IN` child interpose `NOT`
1423                return self.sql(expression, "this")
1424
1425            return super().not_sql(expression)
def values_sql( self, expression: sqlglot.expressions.Values, values_as_table: bool = True) -> str:
1427        def values_sql(self, expression: exp.Values, values_as_table: bool = True) -> str:
1428            # If the VALUES clause contains tuples of expressions, we need to treat it
1429            # as a table since Clickhouse will automatically alias it as such.
1430            alias = expression.args.get("alias")
1431
1432            if alias and alias.args.get("columns") and expression.expressions:
1433                values = expression.expressions[0].expressions
1434                values_as_table = any(isinstance(value, exp.Tuple) for value in values)
1435            else:
1436                values_as_table = True
1437
1438            return super().values_sql(expression, values_as_table=values_as_table)
SELECT_KINDS: Tuple[str, ...] = ()
TRY_SUPPORTED = False
SUPPORTS_UESCAPE = False
SUPPORTS_DECODE_CASE = False
AFTER_HAVING_MODIFIER_TRANSFORMS = {'windows': <function Generator.<lambda>>, 'qualify': <function Generator.<lambda>>}
Inherited Members
sqlglot.generator.Generator
Generator
NULL_ORDERING_SUPPORTED
IGNORE_NULLS_IN_FUNC
LOCKING_READS_SUPPORTED
EXCEPT_INTERSECT_SUPPORT_ALL_CLAUSE
CREATE_FUNCTION_RETURN_AS
MATCHED_BY_SOURCE
SINGLE_STRING_INTERVAL
INTERVAL_ALLOWS_PLURAL_FORM
LIMIT_FETCH
LIMIT_ONLY_LITERALS
RENAME_TABLE_WITH_DB
INDEX_ON
QUERY_HINT_SEP
IS_BOOL_ALLOWED
DUPLICATE_KEY_UPDATE_WITH_SET
LIMIT_IS_TOP
RETURNING_END
EXTRACT_ALLOWS_QUOTES
TZ_TO_WITH_TIME_ZONE
VALUES_AS_TABLE
ALTER_TABLE_INCLUDE_COLUMN_KEYWORD
UNNEST_WITH_ORDINALITY
AGGREGATE_FILTER_SUPPORTED
SEMI_ANTI_JOIN_WITH_SIDE
COMPUTED_COLUMN_WITH_TYPE
SUPPORTS_TABLE_COPY
TABLESAMPLE_WITH_METHOD
TABLESAMPLE_SEED_KEYWORD
COLLATE_IS_FUNC
DATA_TYPE_SPECIFIERS_ALLOWED
ENSURE_BOOLS
CTE_RECURSIVE_KEYWORD_REQUIRED
SUPPORTS_SINGLE_ARG_CONCAT
SUPPORTS_TABLE_ALIAS_COLUMNS
UNPIVOT_ALIASES_ARE_IDENTIFIERS
JSON_KEY_VALUE_PAIR_SEP
INSERT_OVERWRITE
SUPPORTS_SELECT_INTO
SUPPORTS_UNLOGGED_TABLES
SUPPORTS_CREATE_TABLE_LIKE
LIKE_PROPERTY_INSIDE_SCHEMA
MULTI_ARG_DISTINCT
JSON_TYPE_REQUIRED_FOR_EXTRACTION
JSON_PATH_BRACKETED_KEY_SUPPORTED
JSON_PATH_SINGLE_QUOTE_ESCAPE
SUPPORTS_WINDOW_EXCLUDE
COPY_PARAMS_ARE_WRAPPED
COPY_PARAMS_EQ_REQUIRED
COPY_HAS_INTO_KEYWORD
UNICODE_SUBSTITUTE
STAR_EXCEPT
HEX_FUNC
WITH_PROPERTIES_PREFIX
QUOTE_JSON_PATH
PAD_FILL_PATTERN_IS_REQUIRED
SUPPORTS_EXPLODING_PROJECTIONS
ARRAY_CONCAT_IS_VAR_LEN
SUPPORTS_CONVERT_TIMEZONE
SUPPORTS_MEDIAN
SUPPORTS_UNIX_SECONDS
ALTER_SET_WRAPPED
NORMALIZE_EXTRACT_DATE_PARTS
PARSE_JSON_NAME
ALTER_SET_TYPE
ARRAY_SIZE_DIM_REQUIRED
SUPPORTS_BETWEEN_FLAGS
SUPPORTS_LIKE_QUANTIFIERS
MATCH_AGAINST_TABLE_PREFIX
UNSUPPORTED_TYPES
TIME_PART_SINGULARS
TOKEN_MAPPING
PARAMETER_TOKEN
NAMED_PLACEHOLDER_TOKEN
EXPRESSION_PRECEDES_PROPERTIES_CREATABLES
RESERVED_KEYWORDS
WITH_SEPARATED_COMMENTS
EXCLUDE_COMMENTS
UNWRAPPED_INTERVAL_VALUES
PARAMETERIZABLE_TEXT_TYPES
EXPRESSIONS_WITHOUT_NESTED_CTES
RESPECT_IGNORE_NULLS_UNSUPPORTED_EXPRESSIONS
SAFE_JSON_PATH_KEY_RE
SENTINEL_LINE_BREAK
pretty
identify
normalize
pad
unsupported_level
max_unsupported
leading_comma
max_text_width
comments
dialect
normalize_functions
unsupported_messages
generate
preprocess
unsupported
sep
seg
sanitize_comment
maybe_comment
wrap
no_identify
normalize_func
indent
sql
uncache_sql
cache_sql
characterset_sql
column_parts
column_sql
columnposition_sql
columndef_sql
columnconstraint_sql
computedcolumnconstraint_sql
autoincrementcolumnconstraint_sql
compresscolumnconstraint_sql
generatedasidentitycolumnconstraint_sql
generatedasrowcolumnconstraint_sql
periodforsystemtimeconstraint_sql
notnullcolumnconstraint_sql
primarykeycolumnconstraint_sql
uniquecolumnconstraint_sql
sequenceproperties_sql
clone_sql
describe_sql
heredoc_sql
prepend_ctes
with_sql
tablealias_sql
bitstring_sql
hexstring_sql
bytestring_sql
unicodestring_sql
rawstring_sql
datatypeparam_sql
directory_sql
delete_sql
drop_sql
set_operation
set_operations
fetch_sql
limitoptions_sql
filter_sql
hint_sql
indexparameters_sql
index_sql
identifier_sql
hex_sql
lowerhex_sql
inputoutputformat_sql
national_sql
properties_sql
root_properties
properties
with_properties
locate_properties
property_name
property_sql
fallbackproperty_sql
journalproperty_sql
freespaceproperty_sql
checksumproperty_sql
mergeblockratioproperty_sql
datablocksizeproperty_sql
blockcompressionproperty_sql
isolatedloadingproperty_sql
partitionboundspec_sql
partitionedofproperty_sql
lockingproperty_sql
withdataproperty_sql
withsystemversioningproperty_sql
insert_sql
introducer_sql
kill_sql
pseudotype_sql
objectidentifier_sql
onconflict_sql
returning_sql
rowformatdelimitedproperty_sql
withtablehint_sql
indextablehint_sql
historicaldata_sql
table_parts
table_sql
tablefromrows_sql
tablesample_sql
pivot_sql
version_sql
tuple_sql
update_sql
var_sql
into_sql
from_sql
groupingsets_sql
rollup_sql
cube_sql
group_sql
having_sql
connect_sql
prior_sql
join_sql
lambda_sql
lateral_op
lateral_sql
limit_sql
setitem_sql
set_sql
queryband_sql
pragma_sql
lock_sql
literal_sql
escape_str
loaddata_sql
null_sql
boolean_sql
order_sql
withfill_sql
cluster_sql
distribute_sql
sort_sql
ordered_sql
matchrecognizemeasure_sql
matchrecognize_sql
query_modifiers
options_modifier
for_modifiers
queryoption_sql
offset_limit_modifiers
select_sql
schema_sql
schema_columns_sql
star_sql
parameter_sql
sessionparameter_sql
subquery_sql
qualify_sql
unnest_sql
where_sql
window_sql
partition_by_sql
windowspec_sql
withingroup_sql
between_sql
bracket_offset_expressions
bracket_sql
all_sql
any_sql
exists_sql
case_sql
constraint_sql
nextvaluefor_sql
extract_sql
trim_sql
convert_concat_args
concat_sql
concatws_sql
check_sql
foreignkey_sql
primarykey_sql
if_sql
matchagainst_sql
jsonkeyvalue_sql
jsonpath_sql
json_path_part
formatjson_sql
formatphrase_sql
jsonobject_sql
jsonobjectagg_sql
jsonarray_sql
jsonarrayagg_sql
jsoncolumndef_sql
jsonschema_sql
jsontable_sql
openjsoncolumndef_sql
openjson_sql
in_unnest_op
interval_sql
return_sql
reference_sql
anonymous_sql
paren_sql
neg_sql
alias_sql
pivotalias_sql
aliases_sql
atindex_sql
attimezone_sql
fromtimezone_sql
add_sql
and_sql
or_sql
xor_sql
connector_sql
bitwiseand_sql
bitwiseleftshift_sql
bitwisenot_sql
bitwiseor_sql
bitwiserightshift_sql
bitwisexor_sql
currentdate_sql
collate_sql
command_sql
comment_sql
mergetreettlaction_sql
mergetreettl_sql
transaction_sql
commit_sql
rollback_sql
altercolumn_sql
alterindex_sql
alterdiststyle_sql
altersortkey_sql
alterrename_sql
renamecolumn_sql
alterset_sql
alter_sql
altersession_sql
add_column_sql
droppartition_sql
addconstraint_sql
addpartition_sql
distinct_sql
ignorenulls_sql
respectnulls_sql
havingmax_sql
intdiv_sql
dpipe_sql
div_sql
safedivide_sql
overlaps_sql
distance_sql
dot_sql
propertyeq_sql
escape_sql
glob_sql
gt_sql
gte_sql
like_sql
ilike_sql
similarto_sql
lt_sql
lte_sql
mod_sql
mul_sql
nullsafeeq_sql
nullsafeneq_sql
slice_sql
sub_sql
jsoncast_sql
try_sql
log_sql
use_sql
binary
ceil_floor
function_fallback_sql
func
format_args
too_wide
format_time
expressions
op_expressions
naked_property
tag_sql
token_sql
userdefinedfunction_sql
joinhint_sql
kwarg_sql
when_sql
whens_sql
merge_sql
tochar_sql
tonumber_sql
dictproperty_sql
dictrange_sql
dictsubproperty_sql
duplicatekeyproperty_sql
uniquekeyproperty_sql
distributedbyproperty_sql
clusteredbyproperty_sql
anyvalue_sql
querytransform_sql
indexconstraintoption_sql
checkcolumnconstraint_sql
nvl2_sql
comprehension_sql
columnprefix_sql
opclass_sql
predict_sql
generateembedding_sql
mltranslate_sql
mlforecast_sql
featuresattime_sql
vectorsearch_sql
forin_sql
refresh_sql
toarray_sql
tsordstotime_sql
tsordstotimestamp_sql
tsordstodatetime_sql
tsordstodate_sql
unixdate_sql
lastday_sql
dateadd_sql
arrayany_sql
struct_sql
partitionrange_sql
truncatetable_sql
convert_sql
copyparameter_sql
credentials_sql
copy_sql
semicolon_sql
datadeletionproperty_sql
maskingpolicycolumnconstraint_sql
gapfill_sql
scope_resolution
scoperesolution_sql
parsejson_sql
rand_sql
changes_sql
pad_sql
summarize_sql
explodinggenerateseries_sql
arrayconcat_sql
converttimezone_sql
json_sql
jsonvalue_sql
conditionalinsert_sql
multitableinserts_sql
oncondition_sql
jsonextractquote_sql
jsonexists_sql
arrayagg_sql
apply_sql
grant_sql
revoke_sql
grantprivilege_sql
grantprincipal_sql
columns_sql
overlay_sql
todouble_sql
string_sql
median_sql
overflowtruncatebehavior_sql
unixseconds_sql
arraysize_sql
attach_sql
detach_sql
attachoption_sql
watermarkcolumnconstraint_sql
encodeproperty_sql
includeproperty_sql
xmlelement_sql
xmlkeyvalueoption_sql
partitionbyrangeproperty_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
show_sql
get_put_sql
translatecharacters_sql
decodecase_sql
semanticview_sql
getextract_sql
datefromunixdate_sql
space_sql
buildproperty_sql
refreshtriggerproperty_sql