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

EXPRESSION_METADATA = {<class 'sqlglot.expressions.Add'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Adjacent'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.And'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ArrayContains'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.ArrayContainsAll'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ArrayOverlaps'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Binary'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.BitwiseAnd'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.BitwiseLeftShift'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.BitwiseOr'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.BitwiseRightShift'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.BitwiseXor'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Collate'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Connector'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Corr'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.DPipe'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Distance'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Div'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Dot'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.EQ'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Escape'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ExtendsLeft'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ExtendsRight'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.GT'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.GTE'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Glob'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ILike'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.IntDiv'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Is'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.JSONArrayContains'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.JSONBContains'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.JSONBContainsAllTopKeys'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.JSONBContainsAnyTopKeys'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.JSONBDeleteAtPath'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.JSONBExtract'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.JSONBExtractScalar'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.JSONExtract'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.JSONExtractScalar'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Kwarg'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.LT'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.LTE'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Like'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Match'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Mod'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Mul'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.NEQ'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.NullSafeEQ'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.NullSafeNEQ'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Operator'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Or'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Overlaps'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Pow'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.PropertyEQ'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.RegexpFullMatch'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.RegexpILike'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.RegexpLike'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.SimilarTo'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Sub'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Xor'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Alias'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.BitwiseNot'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Neg'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Not'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Paren'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.PivotAlias'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Unary'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Int64'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.UnixMillis'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.UnixMicros'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.ApproxDistinct'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.UnixSeconds'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.CountIf'>: {'returns': <Type.UBIGINT: 'UBIGINT'>}, <class 'sqlglot.expressions.ArraySize'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.FromBase32'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.FromBase64'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.Exists'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.In'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.IsInf'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.LogicalAnd'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.Contains'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.EndsWith'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.IsNan'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.LogicalOr'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.StartsWith'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.Boolean'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.Any'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.All'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.Between'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.LastDay'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.DateStrToDate'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.DiToDate'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.TimeStrToDate'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.DateFromParts'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.TsOrDsToDate'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.CurrentDate'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.StrToDate'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.Date'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.CurrentDatetime'>: {'returns': <Type.DATETIME: 'DATETIME'>}, <class 'sqlglot.expressions.DatetimeSub'>: {'returns': <Type.DATETIME: 'DATETIME'>}, <class 'sqlglot.expressions.Datetime'>: {'returns': <Type.DATETIME: 'DATETIME'>}, <class 'sqlglot.expressions.DatetimeAdd'>: {'returns': <Type.DATETIME: 'DATETIME'>}, <class 'sqlglot.expressions.StddevPop'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.StddevSamp'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Sqrt'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.SafeDivide'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Cot'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Sinh'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Atanh'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Cosh'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Quantile'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Skewness'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Asinh'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Tanh'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.VariancePop'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Acosh'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Log'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Cos'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Round'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Cbrt'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Stddev'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.ToDouble'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Rand'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.ApproxQuantile'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Sin'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Atan'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Degrees'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Kurtosis'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Asin'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Tan'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Variance'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Acos'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Exp'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Ln'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Pi'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Radians'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Avg'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Length'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.DateToDi'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.DayOfMonth'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.Quarter'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.DayOfWeek'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.TimeDiff'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.Ceil'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.Sign'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.Levenshtein'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.UnixDate'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.Unicode'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.Getbit'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.StrPosition'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.TsOrDiToDi'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.DayOfYear'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.TimestampDiff'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.Hour'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.DatetimeDiff'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.Ascii'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.BitLength'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.JustifyDays'>: {'returns': <Type.INTERVAL: 'INTERVAL'>}, <class 'sqlglot.expressions.MakeInterval'>: {'returns': <Type.INTERVAL: 'INTERVAL'>}, <class 'sqlglot.expressions.Interval'>: {'returns': <Type.INTERVAL: 'INTERVAL'>}, <class 'sqlglot.expressions.JustifyInterval'>: {'returns': <Type.INTERVAL: 'INTERVAL'>}, <class 'sqlglot.expressions.JustifyHours'>: {'returns': <Type.INTERVAL: 'INTERVAL'>}, <class 'sqlglot.expressions.ParseJSON'>: {'returns': <Type.JSON: 'JSON'>}, <class 'sqlglot.expressions.Time'>: {'returns': <Type.TIME: 'TIME'>}, <class 'sqlglot.expressions.TimeAdd'>: {'returns': <Type.TIME: 'TIME'>}, <class 'sqlglot.expressions.Localtime'>: {'returns': <Type.TIME: 'TIME'>}, <class 'sqlglot.expressions.CurrentTime'>: {'returns': <Type.TIME: 'TIME'>}, <class 'sqlglot.expressions.TimeSub'>: {'returns': <Type.TIME: 'TIME'>}, <class 'sqlglot.expressions.TimestampLtzFromParts'>: {'returns': <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>}, <class 'sqlglot.expressions.CurrentTimestampLTZ'>: {'returns': <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>}, <class 'sqlglot.expressions.TimestampTzFromParts'>: {'returns': <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>}, <class 'sqlglot.expressions.TimeStrToTime'>: {'returns': <Type.TIMESTAMP: 'TIMESTAMP'>}, <class 'sqlglot.expressions.TimestampSub'>: {'returns': <Type.TIMESTAMP: 'TIMESTAMP'>}, <class 'sqlglot.expressions.StrToTime'>: {'returns': <Type.TIMESTAMP: 'TIMESTAMP'>}, <class 'sqlglot.expressions.TimestampAdd'>: {'returns': <Type.TIMESTAMP: 'TIMESTAMP'>}, <class 'sqlglot.expressions.UnixToTime'>: {'returns': <Type.TIMESTAMP: 'TIMESTAMP'>}, <class 'sqlglot.expressions.CurrentTimestamp'>: {'returns': <Type.TIMESTAMP: 'TIMESTAMP'>}, <class 'sqlglot.expressions.YearOfWeekIso'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.Week'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.Year'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.DayOfWeekIso'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.YearOfWeek'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.Day'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.Month'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.WeekOfYear'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.Dayname'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.ConcatWs'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.ToBase64'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.ArrayToString'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.SessionUser'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Chr'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Substring'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.MD5'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.TsOrDsToDateStr'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentUser'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Initcap'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Upper'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.TimeToTimeStr'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.SHA'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.ToBase32'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.DateToDateStr'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentVersion'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Concat'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Translate'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.RawString'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.UnixToTimeStr'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Space'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Lower'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Trim'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentCatalog'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.String'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentSchema'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.GroupConcat'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.UnixToStr'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Monthname'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.SHA2'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.TimeToStr'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.ArrayConcatAgg'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.HavingMax'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Abs'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Window'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.SortArray'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Order'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ArraySlice'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Filter'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.AnyValue'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ArrayReverse'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Limit'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.LastValue'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Min'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ArrayConcat'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Least'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Coalesce'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Greatest'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Max'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ArrayFirst'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ArrayLast'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Anonymous'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.DateAdd'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.DateTrunc'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.DateSub'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.TryCast'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Cast'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.VarMap'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Map'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Array'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.ArrayAgg'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Bracket'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Case'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Count'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.DateDiff'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.DataType'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Distinct'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Explode'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Extract'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.HexString'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.GenerateSeries'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.GenerateDateArray'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.GenerateTimestampArray'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.If'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Literal'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Null'>: {'returns': <Type.NULL: 'NULL'>}, <class 'sqlglot.expressions.Nullif'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Struct'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Sum'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Timestamp'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.ToMap'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Unnest'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Subquery'>: {'annotator': <function <lambda>>}}
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]:
263    def generate_values_aliases(self, expression: exp.Values) -> t.List[exp.Identifier]:
264        # Clickhouse allows VALUES to have an embedded structure e.g:
265        # VALUES('person String, place String', ('Noah', 'Paris'), ...)
266        # In this case, we don't want to qualify the columns
267        values = expression.expressions[0].expressions
268
269        structure = (
270            values[0]
271            if (len(values) > 1 and values[0].is_string and isinstance(values[1], exp.Tuple))
272            else None
273        )
274        if structure:
275            # Split each column definition into the column name e.g:
276            # 'person String, place String' -> ['person', 'place']
277            structure_coldefs = [coldef.strip() for coldef in structure.name.split(",")]
278            column_aliases = [
279                exp.to_identifier(coldef.split(" ")[0]) for coldef in structure_coldefs
280            ]
281        else:
282            # Default column aliases in CH are "c1", "c2", etc.
283            column_aliases = [
284                exp.to_identifier(f"c{i + 1}") for i in range(len(values[0].expressions))
285            ]
286
287        return column_aliases
SUPPORTS_COLUMN_JOIN_MARKS = False

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

INITCAP_SUPPORTS_CUSTOM_DELIMITERS = False
tokenizer_class = <class 'ClickHouse.Tokenizer'>
jsonpath_tokenizer_class = <class 'sqlglot.dialects.dialect.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 = '"'
VALID_INTERVAL_UNITS: Set[str] = {'WOY', 'DECADE', 'YR', 'QUARTERS', 'MON', 'DAYOFWEEK', 'TZH', 'MS', 'MILLENNIUM', 'NANOSECOND', 'MONTHS', 'EPOCH_MICROSECONDS', 'WEEKOFYEAR_ISO', 'C', 'SECONDS', 'WEEKOFYEAR', 'NS', 'EPOCH_MILLISECOND', 'Y', 'WK', 'WY', 'USECOND', 'EPOCH_MICROSECOND', 'MILLISEC', 'MONTH', 'YEAR', 'EPOCH_NANOSECONDS', 'MILS', 'DOY', 'NANOSEC', 'DOW_ISO', 'CENT', 'DAYS', 'MINS', 'SEC', 'MILLISECS', 'MI', 'Q', 'MICROSECS', 'DAYOFMONTH', 'WEEKOFYEARISO', 'DECADES', 'S', 'YRS', 'YYYY', 'WEEK', 'MINUTES', 'WEEKDAY', 'EPOCH', 'HOUR', 'YEARS', 'NSEC', 'MSECOND', 'USEC', 'DAYOFWEEK_ISO', 'CENTURIES', 'QTRS', 'MM', 'D', 'MILLISECONDS', 'DAYOFYEAR', 'WEEKISO', 'NANOSECS', 'CENTS', 'WEEKDAY_ISO', 'DAYOFWEEKISO', 'EPOCH_NANOSECOND', 'MICROSECONDS', 'DAY OF YEAR', 'EPOCH_MILLISECONDS', 'USECONDS', 'TIMEZONE_MINUTE', 'YY', 'HR', 'EPOCH_SECONDS', 'MILLENIA', 'W', 'MICROSECOND', 'DECS', 'MINUTE', 'CENTURY', 'MIN', 'YYY', 'MSECONDS', 'HH', 'DD', 'QTR', 'TIMEZONE_HOUR', 'DAY OF WEEK', 'DW', 'QUARTER', 'SECS', 'NSECONDS', 'DW_ISO', 'DAY', 'DY', 'SECOND', 'MILLISECON', 'MICROSEC', 'EPOCH_SECOND', 'HRS', 'HOURS', 'MIL', 'TZM', 'MSEC', 'H', 'DOW', 'MSECS', 'MILLISECOND', 'US', 'MONS', 'DEC', 'WEEK_ISO', 'NSECOND', 'USECS', 'M'}
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
STRINGS_SUPPORT_ESCAPED_SEQUENCES = True
BYTE_STRINGS_SUPPORT_ESCAPED_SEQUENCES = True
class ClickHouse.Tokenizer(sqlglot.tokens.Tokenizer):
289    class Tokenizer(tokens.Tokenizer):
290        COMMENTS = ["--", "#", "#!", ("/*", "*/")]
291        IDENTIFIERS = ['"', "`"]
292        IDENTIFIER_ESCAPES = ["\\"]
293        STRING_ESCAPES = ["'", "\\"]
294        BIT_STRINGS = [("0b", "")]
295        HEX_STRINGS = [("0x", ""), ("0X", "")]
296        HEREDOC_STRINGS = ["$"]
297
298        KEYWORDS = {
299            **tokens.Tokenizer.KEYWORDS,
300            ".:": TokenType.DOTCOLON,
301            "ATTACH": TokenType.COMMAND,
302            "DATE32": TokenType.DATE32,
303            "DATETIME64": TokenType.DATETIME64,
304            "DICTIONARY": TokenType.DICTIONARY,
305            "DYNAMIC": TokenType.DYNAMIC,
306            "ENUM8": TokenType.ENUM8,
307            "ENUM16": TokenType.ENUM16,
308            "EXCHANGE": TokenType.COMMAND,
309            "FINAL": TokenType.FINAL,
310            "FIXEDSTRING": TokenType.FIXEDSTRING,
311            "FLOAT32": TokenType.FLOAT,
312            "FLOAT64": TokenType.DOUBLE,
313            "GLOBAL": TokenType.GLOBAL,
314            "LOWCARDINALITY": TokenType.LOWCARDINALITY,
315            "MAP": TokenType.MAP,
316            "NESTED": TokenType.NESTED,
317            "NOTHING": TokenType.NOTHING,
318            "SAMPLE": TokenType.TABLE_SAMPLE,
319            "TUPLE": TokenType.STRUCT,
320            "UINT16": TokenType.USMALLINT,
321            "UINT32": TokenType.UINT,
322            "UINT64": TokenType.UBIGINT,
323            "UINT8": TokenType.UTINYINT,
324            "IPV4": TokenType.IPV4,
325            "IPV6": TokenType.IPV6,
326            "POINT": TokenType.POINT,
327            "RING": TokenType.RING,
328            "LINESTRING": TokenType.LINESTRING,
329            "MULTILINESTRING": TokenType.MULTILINESTRING,
330            "POLYGON": TokenType.POLYGON,
331            "MULTIPOLYGON": TokenType.MULTIPOLYGON,
332            "AGGREGATEFUNCTION": TokenType.AGGREGATEFUNCTION,
333            "SIMPLEAGGREGATEFUNCTION": TokenType.SIMPLEAGGREGATEFUNCTION,
334            "SYSTEM": TokenType.COMMAND,
335            "PREWHERE": TokenType.PREWHERE,
336        }
337        KEYWORDS.pop("/*+")
338
339        SINGLE_TOKENS = {
340            **tokens.Tokenizer.SINGLE_TOKENS,
341            "$": TokenType.HEREDOC_STRING,
342        }
COMMENTS = ['--', '#', '#!', ('/*', '*/')]
IDENTIFIERS = ['"', '`']
IDENTIFIER_ESCAPES = ['\\']
STRING_ESCAPES = ["'", '\\']
BIT_STRINGS = [('0b', '')]
HEX_STRINGS = [('0x', ''), ('0X', '')]
HEREDOC_STRINGS = ['$']
KEYWORDS = {'{%': <TokenType.BLOCK_START: 70>, '{%+': <TokenType.BLOCK_START: 70>, '{%-': <TokenType.BLOCK_START: 70>, '%}': <TokenType.BLOCK_END: 71>, '+%}': <TokenType.BLOCK_END: 71>, '-%}': <TokenType.BLOCK_END: 71>, '{{+': <TokenType.BLOCK_START: 70>, '{{-': <TokenType.BLOCK_START: 70>, '+}}': <TokenType.BLOCK_END: 71>, '-}}': <TokenType.BLOCK_END: 71>, '&<': <TokenType.AMP_LT: 60>, '&>': <TokenType.AMP_GT: 61>, '==': <TokenType.EQ: 27>, '::': <TokenType.DCOLON: 13>, '?::': <TokenType.QDCOLON: 360>, '||': <TokenType.DPIPE: 36>, '|>': <TokenType.PIPE_GT: 37>, '>=': <TokenType.GTE: 25>, '<=': <TokenType.LTE: 23>, '<>': <TokenType.NEQ: 28>, '!=': <TokenType.NEQ: 28>, ':=': <TokenType.COLON_EQ: 30>, '<=>': <TokenType.NULLSAFE_EQ: 29>, '->': <TokenType.ARROW: 44>, '->>': <TokenType.DARROW: 45>, '=>': <TokenType.FARROW: 46>, '#>': <TokenType.HASH_ARROW: 48>, '#>>': <TokenType.DHASH_ARROW: 49>, '<->': <TokenType.LR_ARROW: 50>, '&&': <TokenType.DAMP: 59>, '??': <TokenType.DQMARK: 17>, '~~~': <TokenType.GLOB: 282>, '~~': <TokenType.LIKE: 312>, '~~*': <TokenType.ILIKE: 290>, '~*': <TokenType.IRLIKE: 301>, '-|-': <TokenType.ADJACENT: 62>, 'ALL': <TokenType.ALL: 216>, 'AND': <TokenType.AND: 33>, 'ANTI': <TokenType.ANTI: 217>, 'ANY': <TokenType.ANY: 218>, 'ASC': <TokenType.ASC: 221>, 'AS': <TokenType.ALIAS: 214>, 'ASOF': <TokenType.ASOF: 222>, 'AUTOINCREMENT': <TokenType.AUTO_INCREMENT: 224>, 'AUTO_INCREMENT': <TokenType.AUTO_INCREMENT: 224>, 'BEGIN': <TokenType.BEGIN: 225>, 'BETWEEN': <TokenType.BETWEEN: 226>, 'CACHE': <TokenType.CACHE: 228>, 'UNCACHE': <TokenType.UNCACHE: 400>, 'CASE': <TokenType.CASE: 229>, 'CHARACTER SET': <TokenType.CHARACTER_SET: 230>, 'CLUSTER BY': <TokenType.CLUSTER_BY: 231>, 'COLLATE': <TokenType.COLLATE: 232>, 'COLUMN': <TokenType.COLUMN: 78>, 'COMMIT': <TokenType.COMMIT: 235>, 'CONNECT BY': <TokenType.CONNECT_BY: 236>, 'CONSTRAINT': <TokenType.CONSTRAINT: 237>, 'COPY': <TokenType.COPY: 238>, 'CREATE': <TokenType.CREATE: 239>, 'CROSS': <TokenType.CROSS: 240>, 'CUBE': <TokenType.CUBE: 241>, 'CURRENT_DATE': <TokenType.CURRENT_DATE: 242>, 'CURRENT_SCHEMA': <TokenType.CURRENT_SCHEMA: 244>, 'CURRENT_TIME': <TokenType.CURRENT_TIME: 245>, 'CURRENT_TIMESTAMP': <TokenType.CURRENT_TIMESTAMP: 246>, 'CURRENT_USER': <TokenType.CURRENT_USER: 247>, 'CURRENT_CATALOG': <TokenType.CURRENT_CATALOG: 249>, 'DATABASE': <TokenType.DATABASE: 77>, 'DEFAULT': <TokenType.DEFAULT: 251>, 'DELETE': <TokenType.DELETE: 252>, 'DESC': <TokenType.DESC: 253>, 'DESCRIBE': <TokenType.DESCRIBE: 254>, 'DISTINCT': <TokenType.DISTINCT: 257>, 'DISTRIBUTE BY': <TokenType.DISTRIBUTE_BY: 258>, 'DIV': <TokenType.DIV: 259>, 'DROP': <TokenType.DROP: 260>, 'ELSE': <TokenType.ELSE: 261>, 'END': <TokenType.END: 262>, 'ENUM': <TokenType.ENUM: 201>, 'ESCAPE': <TokenType.ESCAPE: 263>, 'EXCEPT': <TokenType.EXCEPT: 264>, 'EXECUTE': <TokenType.EXECUTE: 265>, 'EXISTS': <TokenType.EXISTS: 266>, 'FALSE': <TokenType.FALSE: 267>, 'FETCH': <TokenType.FETCH: 268>, 'FILTER': <TokenType.FILTER: 271>, 'FILE': <TokenType.FILE: 269>, 'FIRST': <TokenType.FIRST: 273>, 'FULL': <TokenType.FULL: 279>, 'FUNCTION': <TokenType.FUNCTION: 280>, 'FOR': <TokenType.FOR: 274>, 'FOREIGN KEY': <TokenType.FOREIGN_KEY: 276>, 'FORMAT': <TokenType.FORMAT: 277>, 'FROM': <TokenType.FROM: 278>, 'GEOGRAPHY': <TokenType.GEOGRAPHY: 168>, 'GEOMETRY': <TokenType.GEOMETRY: 171>, 'GLOB': <TokenType.GLOB: 282>, 'GROUP BY': <TokenType.GROUP_BY: 285>, 'GROUPING SETS': <TokenType.GROUPING_SETS: 286>, 'HAVING': <TokenType.HAVING: 287>, 'ILIKE': <TokenType.ILIKE: 290>, 'IN': <TokenType.IN: 291>, 'INDEX': <TokenType.INDEX: 292>, 'INET': <TokenType.INET: 196>, 'INNER': <TokenType.INNER: 294>, 'INSERT': <TokenType.INSERT: 295>, 'INTERVAL': <TokenType.INTERVAL: 298>, 'INTERSECT': <TokenType.INTERSECT: 297>, 'INTO': <TokenType.INTO: 299>, 'IS': <TokenType.IS: 302>, 'ISNULL': <TokenType.ISNULL: 303>, 'JOIN': <TokenType.JOIN: 304>, 'KEEP': <TokenType.KEEP: 306>, 'KILL': <TokenType.KILL: 308>, 'LATERAL': <TokenType.LATERAL: 310>, 'LEFT': <TokenType.LEFT: 311>, 'LIKE': <TokenType.LIKE: 312>, 'LIMIT': <TokenType.LIMIT: 313>, 'LOAD': <TokenType.LOAD: 315>, 'LOCALTIME': <TokenType.LOCALTIME: 175>, 'LOCALTIMESTAMP': <TokenType.LOCALTIMESTAMP: 176>, 'LOCK': <TokenType.LOCK: 316>, 'MERGE': <TokenType.MERGE: 322>, 'NAMESPACE': <TokenType.NAMESPACE: 426>, 'NATURAL': <TokenType.NATURAL: 325>, 'NEXT': <TokenType.NEXT: 326>, 'NOT': <TokenType.NOT: 26>, 'NOTNULL': <TokenType.NOTNULL: 328>, 'NULL': <TokenType.NULL: 329>, 'OBJECT': <TokenType.OBJECT: 195>, 'OFFSET': <TokenType.OFFSET: 331>, 'ON': <TokenType.ON: 332>, 'OR': <TokenType.OR: 34>, 'XOR': <TokenType.XOR: 63>, 'ORDER BY': <TokenType.ORDER_BY: 335>, 'ORDINALITY': <TokenType.ORDINALITY: 338>, 'OUT': <TokenType.OUT: 339>, 'OUTER': <TokenType.OUTER: 341>, 'OVER': <TokenType.OVER: 342>, 'OVERLAPS': <TokenType.OVERLAPS: 343>, 'OVERWRITE': <TokenType.OVERWRITE: 344>, 'PARTITION': <TokenType.PARTITION: 345>, 'PARTITION BY': <TokenType.PARTITION_BY: 346>, 'PARTITIONED BY': <TokenType.PARTITION_BY: 346>, 'PARTITIONED_BY': <TokenType.PARTITION_BY: 346>, 'PERCENT': <TokenType.PERCENT: 347>, 'PIVOT': <TokenType.PIVOT: 348>, 'PRAGMA': <TokenType.PRAGMA: 351>, 'PRIMARY KEY': <TokenType.PRIMARY_KEY: 353>, 'PROCEDURE': <TokenType.PROCEDURE: 354>, 'OPERATOR': <TokenType.OPERATOR: 334>, 'QUALIFY': <TokenType.QUALIFY: 358>, 'RANGE': <TokenType.RANGE: 361>, 'RECURSIVE': <TokenType.RECURSIVE: 362>, 'REGEXP': <TokenType.RLIKE: 370>, 'RENAME': <TokenType.RENAME: 364>, 'REPLACE': <TokenType.REPLACE: 365>, 'RETURNING': <TokenType.RETURNING: 366>, 'REFERENCES': <TokenType.REFERENCES: 368>, 'RIGHT': <TokenType.RIGHT: 369>, 'RLIKE': <TokenType.RLIKE: 370>, 'ROLLBACK': <TokenType.ROLLBACK: 371>, 'ROLLUP': <TokenType.ROLLUP: 372>, 'ROW': <TokenType.ROW: 373>, 'ROWS': <TokenType.ROWS: 374>, 'SCHEMA': <TokenType.SCHEMA: 80>, 'SELECT': <TokenType.SELECT: 375>, 'SEMI': <TokenType.SEMI: 376>, 'SESSION': <TokenType.SESSION: 56>, 'SESSION_USER': <TokenType.SESSION_USER: 58>, 'SET': <TokenType.SET: 380>, 'SETTINGS': <TokenType.SETTINGS: 381>, 'SHOW': <TokenType.SHOW: 382>, 'SIMILAR TO': <TokenType.SIMILAR_TO: 383>, 'SOME': <TokenType.SOME: 384>, 'SORT BY': <TokenType.SORT_BY: 385>, 'START WITH': <TokenType.START_WITH: 387>, 'STRAIGHT_JOIN': <TokenType.STRAIGHT_JOIN: 389>, 'TABLE': <TokenType.TABLE: 81>, 'TABLESAMPLE': <TokenType.TABLE_SAMPLE: 392>, 'TEMP': <TokenType.TEMPORARY: 394>, 'TEMPORARY': <TokenType.TEMPORARY: 394>, 'THEN': <TokenType.THEN: 396>, 'TRUE': <TokenType.TRUE: 397>, 'TRUNCATE': <TokenType.TRUNCATE: 398>, 'TRIGGER': <TokenType.TRIGGER: 399>, 'UNION': <TokenType.UNION: 401>, 'UNKNOWN': <TokenType.UNKNOWN: 210>, 'UNNEST': <TokenType.UNNEST: 402>, 'UNPIVOT': <TokenType.UNPIVOT: 403>, 'UPDATE': <TokenType.UPDATE: 404>, 'USE': <TokenType.USE: 405>, 'USING': <TokenType.USING: 406>, 'UUID': <TokenType.UUID: 167>, 'VALUES': <TokenType.VALUES: 407>, 'VIEW': <TokenType.VIEW: 409>, 'VOLATILE': <TokenType.VOLATILE: 411>, 'WHEN': <TokenType.WHEN: 412>, 'WHERE': <TokenType.WHERE: 413>, 'WINDOW': <TokenType.WINDOW: 414>, 'WITH': <TokenType.WITH: 415>, 'APPLY': <TokenType.APPLY: 219>, 'ARRAY': <TokenType.ARRAY: 220>, 'BIT': <TokenType.BIT: 93>, 'BOOL': <TokenType.BOOLEAN: 94>, 'BOOLEAN': <TokenType.BOOLEAN: 94>, 'BYTE': <TokenType.TINYINT: 95>, 'MEDIUMINT': <TokenType.MEDIUMINT: 99>, 'INT1': <TokenType.TINYINT: 95>, 'TINYINT': <TokenType.TINYINT: 95>, 'INT16': <TokenType.SMALLINT: 97>, 'SHORT': <TokenType.SMALLINT: 97>, 'SMALLINT': <TokenType.SMALLINT: 97>, 'HUGEINT': <TokenType.INT128: 106>, 'UHUGEINT': <TokenType.UINT128: 107>, 'INT2': <TokenType.SMALLINT: 97>, 'INTEGER': <TokenType.INT: 101>, 'INT': <TokenType.INT: 101>, 'INT4': <TokenType.INT: 101>, 'INT32': <TokenType.INT: 101>, 'INT64': <TokenType.BIGINT: 103>, 'INT128': <TokenType.INT128: 106>, 'INT256': <TokenType.INT256: 108>, 'LONG': <TokenType.BIGINT: 103>, 'BIGINT': <TokenType.BIGINT: 103>, 'INT8': <TokenType.TINYINT: 95>, 'UINT': <TokenType.UINT: 102>, 'UINT128': <TokenType.UINT128: 107>, 'UINT256': <TokenType.UINT256: 109>, 'DEC': <TokenType.DECIMAL: 113>, 'DECIMAL': <TokenType.DECIMAL: 113>, 'DECIMAL32': <TokenType.DECIMAL32: 114>, 'DECIMAL64': <TokenType.DECIMAL64: 115>, 'DECIMAL128': <TokenType.DECIMAL128: 116>, 'DECIMAL256': <TokenType.DECIMAL256: 117>, 'DECFLOAT': <TokenType.DECFLOAT: 118>, 'BIGDECIMAL': <TokenType.BIGDECIMAL: 120>, 'BIGNUMERIC': <TokenType.BIGDECIMAL: 120>, 'BIGNUM': <TokenType.BIGNUM: 105>, 'LIST': <TokenType.LIST: 314>, 'MAP': <TokenType.MAP: 317>, 'NULLABLE': <TokenType.NULLABLE: 170>, 'NUMBER': <TokenType.DECIMAL: 113>, 'NUMERIC': <TokenType.DECIMAL: 113>, 'FIXED': <TokenType.DECIMAL: 113>, 'REAL': <TokenType.FLOAT: 110>, 'FLOAT': <TokenType.FLOAT: 110>, 'FLOAT4': <TokenType.FLOAT: 110>, 'FLOAT8': <TokenType.DOUBLE: 111>, 'DOUBLE': <TokenType.DOUBLE: 111>, 'DOUBLE PRECISION': <TokenType.DOUBLE: 111>, 'JSON': <TokenType.JSON: 137>, 'JSONB': <TokenType.JSONB: 138>, 'CHAR': <TokenType.CHAR: 121>, 'CHARACTER': <TokenType.CHAR: 121>, 'CHAR VARYING': <TokenType.VARCHAR: 123>, 'CHARACTER VARYING': <TokenType.VARCHAR: 123>, 'NCHAR': <TokenType.NCHAR: 122>, 'VARCHAR': <TokenType.VARCHAR: 123>, 'VARCHAR2': <TokenType.VARCHAR: 123>, 'NVARCHAR': <TokenType.NVARCHAR: 124>, 'NVARCHAR2': <TokenType.NVARCHAR: 124>, 'BPCHAR': <TokenType.BPCHAR: 125>, 'STR': <TokenType.TEXT: 126>, 'STRING': <TokenType.TEXT: 126>, 'TEXT': <TokenType.TEXT: 126>, 'LONGTEXT': <TokenType.LONGTEXT: 128>, 'MEDIUMTEXT': <TokenType.MEDIUMTEXT: 127>, 'TINYTEXT': <TokenType.TINYTEXT: 133>, 'CLOB': <TokenType.TEXT: 126>, 'LONGVARCHAR': <TokenType.TEXT: 126>, 'BINARY': <TokenType.BINARY: 135>, 'BLOB': <TokenType.VARBINARY: 136>, 'LONGBLOB': <TokenType.LONGBLOB: 131>, 'MEDIUMBLOB': <TokenType.MEDIUMBLOB: 130>, 'TINYBLOB': <TokenType.TINYBLOB: 132>, 'BYTEA': <TokenType.VARBINARY: 136>, 'VARBINARY': <TokenType.VARBINARY: 136>, 'TIME': <TokenType.TIME: 139>, 'TIMETZ': <TokenType.TIMETZ: 140>, 'TIME_NS': <TokenType.TIME_NS: 141>, 'TIMESTAMP': <TokenType.TIMESTAMP: 142>, 'TIMESTAMPTZ': <TokenType.TIMESTAMPTZ: 143>, 'TIMESTAMPLTZ': <TokenType.TIMESTAMPLTZ: 144>, 'TIMESTAMP_LTZ': <TokenType.TIMESTAMPLTZ: 144>, 'TIMESTAMPNTZ': <TokenType.TIMESTAMPNTZ: 145>, 'TIMESTAMP_NTZ': <TokenType.TIMESTAMPNTZ: 145>, 'DATE': <TokenType.DATE: 153>, 'DATETIME': <TokenType.DATETIME: 149>, 'INT4RANGE': <TokenType.INT4RANGE: 155>, 'INT4MULTIRANGE': <TokenType.INT4MULTIRANGE: 156>, 'INT8RANGE': <TokenType.INT8RANGE: 157>, 'INT8MULTIRANGE': <TokenType.INT8MULTIRANGE: 158>, 'NUMRANGE': <TokenType.NUMRANGE: 159>, 'NUMMULTIRANGE': <TokenType.NUMMULTIRANGE: 160>, 'TSRANGE': <TokenType.TSRANGE: 161>, 'TSMULTIRANGE': <TokenType.TSMULTIRANGE: 162>, 'TSTZRANGE': <TokenType.TSTZRANGE: 163>, 'TSTZMULTIRANGE': <TokenType.TSTZMULTIRANGE: 164>, 'DATERANGE': <TokenType.DATERANGE: 165>, 'DATEMULTIRANGE': <TokenType.DATEMULTIRANGE: 166>, 'UNIQUE': <TokenType.UNIQUE: 416>, 'VECTOR': <TokenType.VECTOR: 211>, 'STRUCT': <TokenType.STRUCT: 390>, 'SEQUENCE': <TokenType.SEQUENCE: 378>, 'VARIANT': <TokenType.VARIANT: 194>, 'ALTER': <TokenType.ALTER: 215>, 'ANALYZE': <TokenType.ANALYZE: 425>, 'CALL': <TokenType.COMMAND: 233>, 'COMMENT': <TokenType.COMMENT: 234>, 'EXPLAIN': <TokenType.COMMAND: 233>, 'GRANT': <TokenType.GRANT: 284>, 'REVOKE': <TokenType.REVOKE: 367>, 'OPTIMIZE': <TokenType.COMMAND: 233>, 'PREPARE': <TokenType.COMMAND: 233>, 'VACUUM': <TokenType.COMMAND: 233>, 'USER-DEFINED': <TokenType.USERDEFINED: 189>, 'FOR VERSION': <TokenType.VERSION_SNAPSHOT: 420>, 'FOR TIMESTAMP': <TokenType.TIMESTAMP_SNAPSHOT: 421>, '.:': <TokenType.DOTCOLON: 12>, 'ATTACH': <TokenType.COMMAND: 233>, 'DATE32': <TokenType.DATE32: 154>, 'DATETIME64': <TokenType.DATETIME64: 151>, 'DICTIONARY': <TokenType.DICTIONARY: 256>, 'DYNAMIC': <TokenType.DYNAMIC: 212>, 'ENUM8': <TokenType.ENUM8: 202>, 'ENUM16': <TokenType.ENUM16: 203>, 'EXCHANGE': <TokenType.COMMAND: 233>, 'FINAL': <TokenType.FINAL: 272>, 'FIXEDSTRING': <TokenType.FIXEDSTRING: 204>, 'FLOAT32': <TokenType.FLOAT: 110>, 'FLOAT64': <TokenType.DOUBLE: 111>, 'GLOBAL': <TokenType.GLOBAL: 283>, 'LOWCARDINALITY': <TokenType.LOWCARDINALITY: 205>, 'NESTED': <TokenType.NESTED: 206>, 'NOTHING': <TokenType.NOTHING: 327>, 'SAMPLE': <TokenType.TABLE_SAMPLE: 392>, 'TUPLE': <TokenType.STRUCT: 390>, 'UINT16': <TokenType.USMALLINT: 98>, 'UINT32': <TokenType.UINT: 102>, 'UINT64': <TokenType.UBIGINT: 104>, 'UINT8': <TokenType.UTINYINT: 96>, 'IPV4': <TokenType.IPV4: 199>, 'IPV6': <TokenType.IPV6: 200>, 'POINT': <TokenType.POINT: 172>, 'RING': <TokenType.RING: 173>, 'LINESTRING': <TokenType.LINESTRING: 174>, 'MULTILINESTRING': <TokenType.MULTILINESTRING: 178>, 'POLYGON': <TokenType.POLYGON: 179>, 'MULTIPOLYGON': <TokenType.MULTIPOLYGON: 180>, 'AGGREGATEFUNCTION': <TokenType.AGGREGATEFUNCTION: 207>, 'SIMPLEAGGREGATEFUNCTION': <TokenType.SIMPLEAGGREGATEFUNCTION: 208>, 'SYSTEM': <TokenType.COMMAND: 233>, 'PREWHERE': <TokenType.PREWHERE: 352>}
SINGLE_TOKENS = {'(': <TokenType.L_PAREN: 1>, ')': <TokenType.R_PAREN: 2>, '[': <TokenType.L_BRACKET: 3>, ']': <TokenType.R_BRACKET: 4>, '{': <TokenType.L_BRACE: 5>, '}': <TokenType.R_BRACE: 6>, '&': <TokenType.AMP: 35>, '^': <TokenType.CARET: 41>, ':': <TokenType.COLON: 11>, ',': <TokenType.COMMA: 7>, '.': <TokenType.DOT: 8>, '-': <TokenType.DASH: 9>, '=': <TokenType.EQ: 27>, '>': <TokenType.GT: 24>, '<': <TokenType.LT: 22>, '%': <TokenType.MOD: 323>, '!': <TokenType.NOT: 26>, '|': <TokenType.PIPE: 38>, '+': <TokenType.PLUS: 10>, ';': <TokenType.SEMICOLON: 18>, '/': <TokenType.SLASH: 21>, '\\': <TokenType.BACKSLASH: 20>, '*': <TokenType.STAR: 19>, '~': <TokenType.TILDE: 43>, '?': <TokenType.PLACEHOLDER: 349>, '@': <TokenType.PARAMETER: 55>, '#': <TokenType.HASH: 47>, "'": <TokenType.UNKNOWN: 210>, '`': <TokenType.UNKNOWN: 210>, '"': <TokenType.UNKNOWN: 210>, '$': <TokenType.HEREDOC_STRING: 91>}
BYTE_STRING_ESCAPES: ClassVar[List[str]] = ["'", '\\']
class ClickHouse.Parser(sqlglot.parser.Parser):
 344    class Parser(parser.Parser):
 345        # Tested in ClickHouse's playground, it seems that the following two queries do the same thing
 346        # * select x from t1 union all select x from t2 limit 1;
 347        # * select x from t1 union all (select x from t2 limit 1);
 348        MODIFIERS_ATTACHED_TO_SET_OP = False
 349        INTERVAL_SPANS = False
 350        OPTIONAL_ALIAS_TOKEN_CTE = False
 351        JOINS_HAVE_EQUAL_PRECEDENCE = True
 352
 353        FUNCTIONS = {
 354            **parser.Parser.FUNCTIONS,
 355            **{
 356                f"TOSTARTOF{unit}": _build_timestamp_trunc(unit=unit)
 357                for unit in TIMESTAMP_TRUNC_UNITS
 358            },
 359            "ANY": exp.AnyValue.from_arg_list,
 360            "ARRAYCOMPACT": exp.ArrayCompact.from_arg_list,
 361            "ARRAYCONCAT": exp.ArrayConcat.from_arg_list,
 362            "ARRAYDISTINCT": exp.ArrayDistinct.from_arg_list,
 363            "ARRAYSUM": exp.ArraySum.from_arg_list,
 364            "ARRAYMAX": exp.ArrayMax.from_arg_list,
 365            "ARRAYMIN": exp.ArrayMin.from_arg_list,
 366            "ARRAYREVERSE": exp.ArrayReverse.from_arg_list,
 367            "ARRAYSLICE": exp.ArraySlice.from_arg_list,
 368            "CURRENTDATABASE": exp.CurrentDatabase.from_arg_list,
 369            "CURRENTSCHEMAS": exp.CurrentSchemas.from_arg_list,
 370            "COUNTIF": _build_count_if,
 371            "COSINEDISTANCE": exp.CosineDistance.from_arg_list,
 372            "VERSION": exp.CurrentVersion.from_arg_list,
 373            "DATE_ADD": build_date_delta(exp.DateAdd, default_unit=None),
 374            "DATEADD": build_date_delta(exp.DateAdd, default_unit=None),
 375            "DATE_DIFF": build_date_delta(exp.DateDiff, default_unit=None, supports_timezone=True),
 376            "DATEDIFF": build_date_delta(exp.DateDiff, default_unit=None, supports_timezone=True),
 377            "DATE_FORMAT": _build_datetime_format(exp.TimeToStr),
 378            "DATE_SUB": build_date_delta(exp.DateSub, default_unit=None),
 379            "DATESUB": build_date_delta(exp.DateSub, default_unit=None),
 380            "FORMATDATETIME": _build_datetime_format(exp.TimeToStr),
 381            "HAS": exp.ArrayContains.from_arg_list,
 382            "ILIKE": build_like(exp.ILike),
 383            "JSONEXTRACTSTRING": build_json_extract_path(
 384                exp.JSONExtractScalar, zero_based_indexing=False
 385            ),
 386            "LENGTH": lambda args: exp.Length(this=seq_get(args, 0), binary=True),
 387            "LIKE": build_like(exp.Like),
 388            "L2Distance": exp.EuclideanDistance.from_arg_list,
 389            "MAP": parser.build_var_map,
 390            "MATCH": exp.RegexpLike.from_arg_list,
 391            "NOTLIKE": build_like(exp.Like, not_like=True),
 392            "PARSEDATETIME": _build_datetime_format(exp.ParseDatetime),
 393            "RANDCANONICAL": exp.Rand.from_arg_list,
 394            "STR_TO_DATE": _build_str_to_date,
 395            "TIMESTAMP_SUB": build_date_delta(exp.TimestampSub, default_unit=None),
 396            "TIMESTAMPSUB": build_date_delta(exp.TimestampSub, default_unit=None),
 397            "TIMESTAMP_ADD": build_date_delta(exp.TimestampAdd, default_unit=None),
 398            "TIMESTAMPADD": build_date_delta(exp.TimestampAdd, default_unit=None),
 399            "TOMONDAY": _build_timestamp_trunc("WEEK"),
 400            "UNIQ": exp.ApproxDistinct.from_arg_list,
 401            "XOR": lambda args: exp.Xor(expressions=args),
 402            "MD5": exp.MD5Digest.from_arg_list,
 403            "SHA256": lambda args: exp.SHA2(this=seq_get(args, 0), length=exp.Literal.number(256)),
 404            "SHA512": lambda args: exp.SHA2(this=seq_get(args, 0), length=exp.Literal.number(512)),
 405            "SPLITBYCHAR": _build_split_by_char,
 406            "SPLITBYREGEXP": _build_split(exp.RegexpSplit),
 407            "SPLITBYSTRING": _build_split(exp.Split),
 408            "SUBSTRINGINDEX": exp.SubstringIndex.from_arg_list,
 409            "TOTYPENAME": exp.Typeof.from_arg_list,
 410            "EDITDISTANCE": exp.Levenshtein.from_arg_list,
 411            "JAROWINKLERSIMILARITY": exp.JarowinklerSimilarity.from_arg_list,
 412            "LEVENSHTEINDISTANCE": exp.Levenshtein.from_arg_list,
 413            "UTCTIMESTAMP": exp.UtcTimestamp.from_arg_list,
 414        }
 415        FUNCTIONS.pop("TRANSFORM")
 416        FUNCTIONS.pop("APPROX_TOP_SUM")
 417
 418        AGG_FUNCTIONS = {
 419            "count",
 420            "min",
 421            "max",
 422            "sum",
 423            "avg",
 424            "any",
 425            "stddevPop",
 426            "stddevSamp",
 427            "varPop",
 428            "varSamp",
 429            "corr",
 430            "covarPop",
 431            "covarSamp",
 432            "entropy",
 433            "exponentialMovingAverage",
 434            "intervalLengthSum",
 435            "kolmogorovSmirnovTest",
 436            "mannWhitneyUTest",
 437            "median",
 438            "rankCorr",
 439            "sumKahan",
 440            "studentTTest",
 441            "welchTTest",
 442            "anyHeavy",
 443            "anyLast",
 444            "boundingRatio",
 445            "first_value",
 446            "last_value",
 447            "argMin",
 448            "argMax",
 449            "avgWeighted",
 450            "topK",
 451            "approx_top_sum",
 452            "topKWeighted",
 453            "deltaSum",
 454            "deltaSumTimestamp",
 455            "groupArray",
 456            "groupArrayLast",
 457            "groupUniqArray",
 458            "groupArrayInsertAt",
 459            "groupArrayMovingAvg",
 460            "groupArrayMovingSum",
 461            "groupArraySample",
 462            "groupBitAnd",
 463            "groupBitOr",
 464            "groupBitXor",
 465            "groupBitmap",
 466            "groupBitmapAnd",
 467            "groupBitmapOr",
 468            "groupBitmapXor",
 469            "sumWithOverflow",
 470            "sumMap",
 471            "minMap",
 472            "maxMap",
 473            "skewSamp",
 474            "skewPop",
 475            "kurtSamp",
 476            "kurtPop",
 477            "uniq",
 478            "uniqExact",
 479            "uniqCombined",
 480            "uniqCombined64",
 481            "uniqHLL12",
 482            "uniqTheta",
 483            "quantile",
 484            "quantiles",
 485            "quantileExact",
 486            "quantilesExact",
 487            "quantilesExactExclusive",
 488            "quantileExactLow",
 489            "quantilesExactLow",
 490            "quantileExactHigh",
 491            "quantilesExactHigh",
 492            "quantileExactWeighted",
 493            "quantilesExactWeighted",
 494            "quantileTiming",
 495            "quantilesTiming",
 496            "quantileTimingWeighted",
 497            "quantilesTimingWeighted",
 498            "quantileDeterministic",
 499            "quantilesDeterministic",
 500            "quantileTDigest",
 501            "quantilesTDigest",
 502            "quantileTDigestWeighted",
 503            "quantilesTDigestWeighted",
 504            "quantileBFloat16",
 505            "quantilesBFloat16",
 506            "quantileBFloat16Weighted",
 507            "quantilesBFloat16Weighted",
 508            "simpleLinearRegression",
 509            "stochasticLinearRegression",
 510            "stochasticLogisticRegression",
 511            "categoricalInformationValue",
 512            "contingency",
 513            "cramersV",
 514            "cramersVBiasCorrected",
 515            "theilsU",
 516            "maxIntersections",
 517            "maxIntersectionsPosition",
 518            "meanZTest",
 519            "quantileInterpolatedWeighted",
 520            "quantilesInterpolatedWeighted",
 521            "quantileGK",
 522            "quantilesGK",
 523            "sparkBar",
 524            "sumCount",
 525            "largestTriangleThreeBuckets",
 526            "histogram",
 527            "sequenceMatch",
 528            "sequenceCount",
 529            "windowFunnel",
 530            "retention",
 531            "uniqUpTo",
 532            "sequenceNextNode",
 533            "exponentialTimeDecayedAvg",
 534        }
 535
 536        AGG_FUNCTIONS_SUFFIXES = [
 537            "If",
 538            "Array",
 539            "ArrayIf",
 540            "Map",
 541            "SimpleState",
 542            "State",
 543            "Merge",
 544            "MergeState",
 545            "ForEach",
 546            "Distinct",
 547            "OrDefault",
 548            "OrNull",
 549            "Resample",
 550            "ArgMin",
 551            "ArgMax",
 552        ]
 553
 554        FUNC_TOKENS = {
 555            *parser.Parser.FUNC_TOKENS,
 556            TokenType.AND,
 557            TokenType.OR,
 558            TokenType.SET,
 559        }
 560
 561        RESERVED_TOKENS = parser.Parser.RESERVED_TOKENS - {TokenType.SELECT}
 562
 563        ID_VAR_TOKENS = {
 564            *parser.Parser.ID_VAR_TOKENS,
 565            TokenType.LIKE,
 566        }
 567
 568        AGG_FUNC_MAPPING = (
 569            lambda functions, suffixes: {
 570                f"{f}{sfx}": (f, sfx) for sfx in (suffixes + [""]) for f in functions
 571            }
 572        )(AGG_FUNCTIONS, AGG_FUNCTIONS_SUFFIXES)
 573
 574        FUNCTION_PARSERS = {
 575            **parser.Parser.FUNCTION_PARSERS,
 576            "ARRAYJOIN": lambda self: self.expression(exp.Explode, this=self._parse_expression()),
 577            "QUANTILE": lambda self: self._parse_quantile(),
 578            "MEDIAN": lambda self: self._parse_quantile(),
 579            "COLUMNS": lambda self: self._parse_columns(),
 580            "TUPLE": lambda self: exp.Struct.from_arg_list(self._parse_function_args(alias=True)),
 581            "AND": lambda self: exp.and_(*self._parse_function_args(alias=False)),
 582            "OR": lambda self: exp.or_(*self._parse_function_args(alias=False)),
 583        }
 584
 585        FUNCTION_PARSERS.pop("MATCH")
 586
 587        PROPERTY_PARSERS = {
 588            **parser.Parser.PROPERTY_PARSERS,
 589            "ENGINE": lambda self: self._parse_engine_property(),
 590        }
 591        PROPERTY_PARSERS.pop("DYNAMIC")
 592
 593        NO_PAREN_FUNCTION_PARSERS = parser.Parser.NO_PAREN_FUNCTION_PARSERS.copy()
 594        NO_PAREN_FUNCTION_PARSERS.pop("ANY")
 595
 596        NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy()
 597        NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIMESTAMP)
 598
 599        RANGE_PARSERS = {
 600            **parser.Parser.RANGE_PARSERS,
 601            TokenType.GLOBAL: lambda self, this: self._parse_global_in(this),
 602        }
 603
 604        # The PLACEHOLDER entry is popped because 1) it doesn't affect Clickhouse (it corresponds to
 605        # the postgres-specific JSONBContains parser) and 2) it makes parsing the ternary op simpler.
 606        COLUMN_OPERATORS = parser.Parser.COLUMN_OPERATORS.copy()
 607        COLUMN_OPERATORS.pop(TokenType.PLACEHOLDER)
 608
 609        JOIN_KINDS = {
 610            *parser.Parser.JOIN_KINDS,
 611            TokenType.ANY,
 612            TokenType.ASOF,
 613            TokenType.ARRAY,
 614        }
 615
 616        TABLE_ALIAS_TOKENS = parser.Parser.TABLE_ALIAS_TOKENS - {
 617            TokenType.ANY,
 618            TokenType.ARRAY,
 619            TokenType.FINAL,
 620            TokenType.FORMAT,
 621            TokenType.SETTINGS,
 622        }
 623
 624        ALIAS_TOKENS = parser.Parser.ALIAS_TOKENS - {
 625            TokenType.FORMAT,
 626        }
 627
 628        LOG_DEFAULTS_TO_LN = True
 629
 630        QUERY_MODIFIER_PARSERS = {
 631            **parser.Parser.QUERY_MODIFIER_PARSERS,
 632            TokenType.SETTINGS: lambda self: (
 633                "settings",
 634                self._advance() or self._parse_csv(self._parse_assignment),
 635            ),
 636            TokenType.FORMAT: lambda self: ("format", self._advance() or self._parse_id_var()),
 637        }
 638
 639        CONSTRAINT_PARSERS = {
 640            **parser.Parser.CONSTRAINT_PARSERS,
 641            "INDEX": lambda self: self._parse_index_constraint(),
 642            "CODEC": lambda self: self._parse_compress(),
 643        }
 644
 645        ALTER_PARSERS = {
 646            **parser.Parser.ALTER_PARSERS,
 647            "REPLACE": lambda self: self._parse_alter_table_replace(),
 648        }
 649
 650        SCHEMA_UNNAMED_CONSTRAINTS = {
 651            *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS,
 652            "INDEX",
 653        }
 654
 655        PLACEHOLDER_PARSERS = {
 656            **parser.Parser.PLACEHOLDER_PARSERS,
 657            TokenType.L_BRACE: lambda self: self._parse_query_parameter(),
 658        }
 659
 660        def _parse_engine_property(self) -> exp.EngineProperty:
 661            self._match(TokenType.EQ)
 662            return self.expression(
 663                exp.EngineProperty,
 664                this=self._parse_field(any_token=True, anonymous_func=True),
 665            )
 666
 667        # https://clickhouse.com/docs/en/sql-reference/statements/create/function
 668        def _parse_user_defined_function_expression(self) -> t.Optional[exp.Expression]:
 669            return self._parse_lambda()
 670
 671        def _parse_types(
 672            self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True
 673        ) -> t.Optional[exp.Expression]:
 674            dtype = super()._parse_types(
 675                check_func=check_func, schema=schema, allow_identifiers=allow_identifiers
 676            )
 677            if isinstance(dtype, exp.DataType) and dtype.args.get("nullable") is not True:
 678                # Mark every type as non-nullable which is ClickHouse's default, unless it's
 679                # already marked as nullable. This marker helps us transpile types from other
 680                # dialects to ClickHouse, so that we can e.g. produce `CAST(x AS Nullable(String))`
 681                # from `CAST(x AS TEXT)`. If there is a `NULL` value in `x`, the former would
 682                # fail in ClickHouse without the `Nullable` type constructor.
 683                dtype.set("nullable", False)
 684
 685            return dtype
 686
 687        def _parse_extract(self) -> exp.Extract | exp.Anonymous:
 688            index = self._index
 689            this = self._parse_bitwise()
 690            if self._match(TokenType.FROM):
 691                self._retreat(index)
 692                return super()._parse_extract()
 693
 694            # We return Anonymous here because extract and regexpExtract have different semantics,
 695            # so parsing extract(foo, bar) into RegexpExtract can potentially break queries. E.g.,
 696            # `extract('foobar', 'b')` works, but ClickHouse crashes for `regexpExtract('foobar', 'b')`.
 697            #
 698            # TODO: can we somehow convert the former into an equivalent `regexpExtract` call?
 699            self._match(TokenType.COMMA)
 700            return self.expression(
 701                exp.Anonymous, this="extract", expressions=[this, self._parse_bitwise()]
 702            )
 703
 704        def _parse_assignment(self) -> t.Optional[exp.Expression]:
 705            this = super()._parse_assignment()
 706
 707            if self._match(TokenType.PLACEHOLDER):
 708                return self.expression(
 709                    exp.If,
 710                    this=this,
 711                    true=self._parse_assignment(),
 712                    false=self._match(TokenType.COLON) and self._parse_assignment(),
 713                )
 714
 715            return this
 716
 717        def _parse_query_parameter(self) -> t.Optional[exp.Expression]:
 718            """
 719            Parse a placeholder expression like SELECT {abc: UInt32} or FROM {table: Identifier}
 720            https://clickhouse.com/docs/en/sql-reference/syntax#defining-and-using-query-parameters
 721            """
 722            index = self._index
 723
 724            this = self._parse_id_var()
 725            self._match(TokenType.COLON)
 726            kind = self._parse_types(check_func=False, allow_identifiers=False) or (
 727                self._match_text_seq("IDENTIFIER") and "Identifier"
 728            )
 729
 730            if not kind:
 731                self._retreat(index)
 732                return None
 733            elif not self._match(TokenType.R_BRACE):
 734                self.raise_error("Expecting }")
 735
 736            if isinstance(this, exp.Identifier) and not this.quoted:
 737                this = exp.var(this.name)
 738
 739            return self.expression(exp.Placeholder, this=this, kind=kind)
 740
 741        def _parse_bracket(
 742            self, this: t.Optional[exp.Expression] = None
 743        ) -> t.Optional[exp.Expression]:
 744            l_brace = self._match(TokenType.L_BRACE, advance=False)
 745            bracket = super()._parse_bracket(this)
 746
 747            if l_brace and isinstance(bracket, exp.Struct):
 748                varmap = exp.VarMap(keys=exp.Array(), values=exp.Array())
 749                for expression in bracket.expressions:
 750                    if not isinstance(expression, exp.PropertyEQ):
 751                        break
 752
 753                    varmap.args["keys"].append("expressions", exp.Literal.string(expression.name))
 754                    varmap.args["values"].append("expressions", expression.expression)
 755
 756                return varmap
 757
 758            return bracket
 759
 760        def _parse_in(self, this: t.Optional[exp.Expression], is_global: bool = False) -> exp.In:
 761            this = super()._parse_in(this)
 762            this.set("is_global", is_global)
 763            return this
 764
 765        def _parse_global_in(self, this: t.Optional[exp.Expression]) -> exp.Not | exp.In:
 766            is_negated = self._match(TokenType.NOT)
 767            in_expr = self._parse_in(this, is_global=True) if self._match(TokenType.IN) else None
 768            return self.expression(exp.Not, this=in_expr) if is_negated else t.cast(exp.In, in_expr)
 769
 770        def _parse_table(
 771            self,
 772            schema: bool = False,
 773            joins: bool = False,
 774            alias_tokens: t.Optional[t.Collection[TokenType]] = None,
 775            parse_bracket: bool = False,
 776            is_db_reference: bool = False,
 777            parse_partition: bool = False,
 778            consume_pipe: bool = False,
 779        ) -> t.Optional[exp.Expression]:
 780            this = super()._parse_table(
 781                schema=schema,
 782                joins=joins,
 783                alias_tokens=alias_tokens,
 784                parse_bracket=parse_bracket,
 785                is_db_reference=is_db_reference,
 786            )
 787
 788            if isinstance(this, exp.Table):
 789                inner = this.this
 790                alias = this.args.get("alias")
 791
 792                if isinstance(inner, exp.GenerateSeries) and alias and not alias.columns:
 793                    alias.set("columns", [exp.to_identifier("generate_series")])
 794
 795            if self._match(TokenType.FINAL):
 796                this = self.expression(exp.Final, this=this)
 797
 798            return this
 799
 800        def _parse_position(self, haystack_first: bool = False) -> exp.StrPosition:
 801            return super()._parse_position(haystack_first=True)
 802
 803        # https://clickhouse.com/docs/en/sql-reference/statements/select/with/
 804        def _parse_cte(self) -> t.Optional[exp.CTE]:
 805            # WITH <identifier> AS <subquery expression>
 806            cte: t.Optional[exp.CTE] = self._try_parse(super()._parse_cte)
 807
 808            if not cte:
 809                # WITH <expression> AS <identifier>
 810                cte = self.expression(
 811                    exp.CTE,
 812                    this=self._parse_assignment(),
 813                    alias=self._parse_table_alias(),
 814                    scalar=True,
 815                )
 816
 817            return cte
 818
 819        def _parse_join_parts(
 820            self,
 821        ) -> t.Tuple[t.Optional[Token], t.Optional[Token], t.Optional[Token]]:
 822            is_global = self._prev if self._match(TokenType.GLOBAL) else None
 823            kind_pre = self._prev if self._match_set(self.JOIN_KINDS, advance=False) else None
 824
 825            if kind_pre:
 826                kind = self._prev if self._match_set(self.JOIN_KINDS) else None
 827                side = self._prev if self._match_set(self.JOIN_SIDES) else None
 828                return is_global, side, kind
 829
 830            return (
 831                is_global,
 832                self._prev if self._match_set(self.JOIN_SIDES) else None,
 833                self._prev if self._match_set(self.JOIN_KINDS) else None,
 834            )
 835
 836        def _parse_join(
 837            self, skip_join_token: bool = False, parse_bracket: bool = False
 838        ) -> t.Optional[exp.Join]:
 839            join = super()._parse_join(skip_join_token=skip_join_token, parse_bracket=True)
 840            if join:
 841                method = join.args.get("method")
 842                join.set("method", None)
 843                join.set("global_", method)
 844
 845                # tbl ARRAY JOIN arr <-- this should be a `Column` reference, not a `Table`
 846                # https://clickhouse.com/docs/en/sql-reference/statements/select/array-join
 847                if join.kind == "ARRAY":
 848                    for table in join.find_all(exp.Table):
 849                        table.replace(table.to_column())
 850
 851            return join
 852
 853        def _parse_function(
 854            self,
 855            functions: t.Optional[t.Dict[str, t.Callable]] = None,
 856            anonymous: bool = False,
 857            optional_parens: bool = True,
 858            any_token: bool = False,
 859        ) -> t.Optional[exp.Expression]:
 860            expr = super()._parse_function(
 861                functions=functions,
 862                anonymous=anonymous,
 863                optional_parens=optional_parens,
 864                any_token=any_token,
 865            )
 866
 867            func = expr.this if isinstance(expr, exp.Window) else expr
 868
 869            # Aggregate functions can be split in 2 parts: <func_name><suffix>
 870            parts = (
 871                self.AGG_FUNC_MAPPING.get(func.this) if isinstance(func, exp.Anonymous) else None
 872            )
 873
 874            if parts:
 875                anon_func: exp.Anonymous = t.cast(exp.Anonymous, func)
 876                params = self._parse_func_params(anon_func)
 877
 878                kwargs = {
 879                    "this": anon_func.this,
 880                    "expressions": anon_func.expressions,
 881                }
 882                if parts[1]:
 883                    exp_class: t.Type[exp.Expression] = (
 884                        exp.CombinedParameterizedAgg if params else exp.CombinedAggFunc
 885                    )
 886                else:
 887                    exp_class = exp.ParameterizedAgg if params else exp.AnonymousAggFunc
 888
 889                kwargs["exp_class"] = exp_class
 890                if params:
 891                    kwargs["params"] = params
 892
 893                func = self.expression(**kwargs)
 894
 895                if isinstance(expr, exp.Window):
 896                    # The window's func was parsed as Anonymous in base parser, fix its
 897                    # type to be ClickHouse style CombinedAnonymousAggFunc / AnonymousAggFunc
 898                    expr.set("this", func)
 899                elif params:
 900                    # Params have blocked super()._parse_function() from parsing the following window
 901                    # (if that exists) as they're standing between the function call and the window spec
 902                    expr = self._parse_window(func)
 903                else:
 904                    expr = func
 905
 906            return expr
 907
 908        def _parse_func_params(
 909            self, this: t.Optional[exp.Func] = None
 910        ) -> t.Optional[t.List[exp.Expression]]:
 911            if self._match_pair(TokenType.R_PAREN, TokenType.L_PAREN):
 912                return self._parse_csv(self._parse_lambda)
 913
 914            if self._match(TokenType.L_PAREN):
 915                params = self._parse_csv(self._parse_lambda)
 916                self._match_r_paren(this)
 917                return params
 918
 919            return None
 920
 921        def _parse_quantile(self) -> exp.Quantile:
 922            this = self._parse_lambda()
 923            params = self._parse_func_params()
 924            if params:
 925                return self.expression(exp.Quantile, this=params[0], quantile=this)
 926            return self.expression(exp.Quantile, this=this, quantile=exp.Literal.number(0.5))
 927
 928        def _parse_wrapped_id_vars(self, optional: bool = False) -> t.List[exp.Expression]:
 929            return super()._parse_wrapped_id_vars(optional=True)
 930
 931        def _parse_primary_key(
 932            self,
 933            wrapped_optional: bool = False,
 934            in_props: bool = False,
 935            named_primary_key: bool = False,
 936        ) -> exp.PrimaryKeyColumnConstraint | exp.PrimaryKey:
 937            return super()._parse_primary_key(
 938                wrapped_optional=wrapped_optional or in_props,
 939                in_props=in_props,
 940                named_primary_key=named_primary_key,
 941            )
 942
 943        def _parse_on_property(self) -> t.Optional[exp.Expression]:
 944            index = self._index
 945            if self._match_text_seq("CLUSTER"):
 946                this = self._parse_string() or self._parse_id_var()
 947                if this:
 948                    return self.expression(exp.OnCluster, this=this)
 949                else:
 950                    self._retreat(index)
 951            return None
 952
 953        def _parse_index_constraint(
 954            self, kind: t.Optional[str] = None
 955        ) -> exp.IndexColumnConstraint:
 956            # INDEX name1 expr TYPE type1(args) GRANULARITY value
 957            this = self._parse_id_var()
 958            expression = self._parse_assignment()
 959
 960            index_type = self._match_text_seq("TYPE") and (
 961                self._parse_function() or self._parse_var()
 962            )
 963
 964            granularity = self._match_text_seq("GRANULARITY") and self._parse_term()
 965
 966            return self.expression(
 967                exp.IndexColumnConstraint,
 968                this=this,
 969                expression=expression,
 970                index_type=index_type,
 971                granularity=granularity,
 972            )
 973
 974        def _parse_partition(self) -> t.Optional[exp.Partition]:
 975            # https://clickhouse.com/docs/en/sql-reference/statements/alter/partition#how-to-set-partition-expression
 976            if not self._match(TokenType.PARTITION):
 977                return None
 978
 979            if self._match_text_seq("ID"):
 980                # Corresponds to the PARTITION ID <string_value> syntax
 981                expressions: t.List[exp.Expression] = [
 982                    self.expression(exp.PartitionId, this=self._parse_string())
 983                ]
 984            else:
 985                expressions = self._parse_expressions()
 986
 987            return self.expression(exp.Partition, expressions=expressions)
 988
 989        def _parse_alter_table_replace(self) -> t.Optional[exp.Expression]:
 990            partition = self._parse_partition()
 991
 992            if not partition or not self._match(TokenType.FROM):
 993                return None
 994
 995            return self.expression(
 996                exp.ReplacePartition, expression=partition, source=self._parse_table_parts()
 997            )
 998
 999        def _parse_projection_def(self) -> t.Optional[exp.ProjectionDef]:
1000            if not self._match_text_seq("PROJECTION"):
1001                return None
1002
1003            return self.expression(
1004                exp.ProjectionDef,
1005                this=self._parse_id_var(),
1006                expression=self._parse_wrapped(self._parse_statement),
1007            )
1008
1009        def _parse_constraint(self) -> t.Optional[exp.Expression]:
1010            return super()._parse_constraint() or self._parse_projection_def()
1011
1012        def _parse_alias(
1013            self, this: t.Optional[exp.Expression], explicit: bool = False
1014        ) -> t.Optional[exp.Expression]:
1015            # In clickhouse "SELECT <expr> APPLY(...)" is a query modifier,
1016            # so "APPLY" shouldn't be parsed as <expr>'s alias. However, "SELECT <expr> apply" is a valid alias
1017            if self._match_pair(TokenType.APPLY, TokenType.L_PAREN, advance=False):
1018                return this
1019
1020            return super()._parse_alias(this=this, explicit=explicit)
1021
1022        def _parse_expression(self) -> t.Optional[exp.Expression]:
1023            this = super()._parse_expression()
1024
1025            # Clickhouse allows "SELECT <expr> [APPLY(func)] [...]]" modifier
1026            while self._match_pair(TokenType.APPLY, TokenType.L_PAREN):
1027                this = exp.Apply(this=this, expression=self._parse_var(any_token=True))
1028                self._match(TokenType.R_PAREN)
1029
1030            return this
1031
1032        def _parse_columns(self) -> exp.Expression:
1033            this: exp.Expression = self.expression(exp.Columns, this=self._parse_lambda())
1034
1035            while self._next and self._match_text_seq(")", "APPLY", "("):
1036                self._match(TokenType.R_PAREN)
1037                this = exp.Apply(this=this, expression=self._parse_var(any_token=True))
1038            return this
1039
1040        def _parse_value(self, values: bool = True) -> t.Optional[exp.Tuple]:
1041            value = super()._parse_value(values=values)
1042            if not value:
1043                return None
1044
1045            # In Clickhouse "SELECT * FROM VALUES (1, 2, 3)" generates a table with a single column, in contrast
1046            # to other dialects. For this case, we canonicalize the values into a tuple-of-tuples AST if it's not already one.
1047            # In INSERT INTO statements the same clause actually references multiple columns (opposite semantics),
1048            # but the final result is not altered by the extra parentheses.
1049            # Note: Clickhouse allows VALUES([structure], value, ...) so the branch checks for the last expression
1050            expressions = value.expressions
1051            if values and not isinstance(expressions[-1], exp.Tuple):
1052                value.set(
1053                    "expressions",
1054                    [self.expression(exp.Tuple, expressions=[expr]) for expr in expressions],
1055                )
1056
1057            return value
1058
1059        def _parse_partitioned_by(self) -> exp.PartitionedByProperty:
1060            # ClickHouse allows custom expressions as partition key
1061            # https://clickhouse.com/docs/engines/table-engines/mergetree-family/custom-partitioning-key
1062            return self.expression(
1063                exp.PartitionedByProperty,
1064                this=self._parse_assignment(),
1065            )

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 = {'AI_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AIAgg'>>, 'AI_CLASSIFY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AIClassify'>>, 'AI_SUMMARIZE_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AISummarizeAgg'>>, '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_PERCENTILE_ACCUMULATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxPercentileAccumulate'>>, 'APPROX_PERCENTILE_COMBINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxPercentileCombine'>>, 'APPROX_PERCENTILE_ESTIMATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxPercentileEstimate'>>, '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'>>, 'APPROX_TOP_K_ACCUMULATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxTopKAccumulate'>>, 'APPROX_TOP_K_COMBINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxTopKCombine'>>, 'APPROX_TOP_K_ESTIMATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxTopKEstimate'>>, 'APPROXIMATE_SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproximateSimilarity'>>, 'APPROXIMATE_JACCARD_INDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproximateSimilarity'>>, '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_APPEND': <function build_array_append>, 'ARRAY_COMPACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayCompact'>>, 'ARRAY_CONCAT': <function build_array_concat>, 'ARRAY_CAT': <function build_array_concat>, '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'>>, 'ARRAY_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayDistinct'>>, 'ARRAY_EXCEPT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayExcept'>>, '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_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayInsert'>>, '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_MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayMax'>>, 'ARRAY_MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayMin'>>, 'ARRAY_OVERLAPS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayOverlaps'>>, 'ARRAY_PREPEND': <function build_array_prepend>, 'ARRAY_REMOVE': <function build_array_remove>, 'ARRAY_REMOVE_AT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayRemoveAt'>>, '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'>>, 'ARRAYS_ZIP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraysZip'>>, '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'>>, 'BASE64_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Base64DecodeBinary'>>, 'BASE64_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Base64DecodeString'>>, 'BASE64_ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Base64Encode'>>, 'BIT_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitLength'>>, 'BITMAP_BIT_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitmapBitPosition'>>, 'BITMAP_BUCKET_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitmapBucketNumber'>>, 'BITMAP_CONSTRUCT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitmapConstructAgg'>>, 'BITMAP_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitmapCount'>>, 'BITMAP_OR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitmapOrAgg'>>, 'BITWISE_AND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitwiseAndAgg'>>, 'BITWISE_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitwiseCount'>>, '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'>>, 'BOOLAND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Booland'>>, 'BOOLNOT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Boolnot'>>, 'BOOLOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Boolor'>>, 'BOOLXOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BoolxorAgg'>>, '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'>>, 'CHECK_JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CheckJson'>>, 'CHECK_XML': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CheckXml'>>, 'CHR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Chr'>>, 'CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Chr'>>, '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'>>, 'COLLATION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Collation'>>, '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'>>, 'COMPRESS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Compress'>>, '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'>>, 'COS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cos'>>, 'COSH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cosh'>>, '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_ACCOUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentAccount'>>, 'CURRENT_ACCOUNT_NAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentAccountName'>>, 'CURRENT_AVAILABLE_ROLES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentAvailableRoles'>>, 'CURRENT_CATALOG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentCatalog'>>, 'CURRENT_CLIENT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentClient'>>, 'CURRENT_DATABASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentDatabase'>>, '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_IP_ADDRESS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentIpAddress'>>, 'CURRENT_ORGANIZATION_NAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentOrganizationName'>>, 'CURRENT_ORGANIZATION_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentOrganizationUser'>>, 'CURRENT_REGION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentRegion'>>, 'CURRENT_ROLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentRole'>>, 'CURRENT_ROLE_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentRoleType'>>, 'CURRENT_SCHEMA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentSchema'>>, 'CURRENT_SCHEMAS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentSchemas'>>, 'CURRENT_SECONDARY_ROLES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentSecondaryRoles'>>, 'CURRENT_SESSION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentSession'>>, 'CURRENT_STATEMENT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentStatement'>>, '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_TIMEZONE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentTimezone'>>, 'CURRENT_TRANSACTION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentTransaction'>>, 'CURRENT_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentUser'>>, 'CURRENT_VERSION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentVersion'>>, 'CURRENT_WAREHOUSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentWarehouse'>>, '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'>>, 'DAYNAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Dayname'>>, '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'>>, 'DECOMPRESS_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DecompressBinary'>>, 'DECOMPRESS_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DecompressString'>>, 'DECRYPT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Decrypt'>>, 'DECRYPT_RAW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DecryptRaw'>>, 'DEGREES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Degrees'>>, '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'>>, 'DOT_PRODUCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DotProduct'>>, 'ELT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Elt'>>, 'ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Encode'>>, 'ENCRYPT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Encrypt'>>, 'ENCRYPT_RAW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.EncryptRaw'>>, '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'>>, 'EQUAL_NULL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.EqualNull'>>, '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'>>, 'FACTORIAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Factorial'>>, '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'>>, 'GENERATOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Generator'>>, 'GET_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GetExtract'>>, 'GETBIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Getbit'>>, 'GET_BIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Getbit'>>, 'GREATEST': <function Parser.<lambda>>, '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'>>, 'GROUPING_ID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GroupingId'>>, 'HASH_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.HashAgg'>>, 'HEX': <function build_hex>, 'HEX_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.HexDecodeString'>>, 'HEX_ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.HexEncode'>>, 'HLL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Hll'>>, 'HOST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Host'>>, 'HOUR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Hour'>>, '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_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsArray'>>, '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'>>, 'IS_NULL_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsNullValue'>>, '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'>>, 'JSON_KEYS': <function Parser.<lambda>>, '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'>>, 'JAROWINKLER_SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JarowinklerSimilarity'>>, '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'>>, 'KURTOSIS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Kurtosis'>>, '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': <function Parser.<lambda>>, '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'>>, 'LOCALTIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Localtime'>>, 'LOCALTIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Localtimestamp'>>, '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_D5_NUMBER_LOWER64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MD5NumberLower64'>>, 'M_D5_NUMBER_UPPER64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MD5NumberUpper64'>>, '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'>>, 'MANHATTAN_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ManhattanDistance'>>, 'MAP': <function build_var_map>, 'MAP_CAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MapCat'>>, 'MAP_CONTAINS_KEY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MapContainsKey'>>, 'MAP_DELETE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MapDelete'>>, 'MAP_FROM_ENTRIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MapFromEntries'>>, 'MAP_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MapInsert'>>, 'MAP_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MapKeys'>>, 'MAP_PICK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MapPick'>>, 'MAP_SIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MapSize'>>, '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'>>, 'MINHASH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Minhash'>>, 'MINHASH_COMBINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MinhashCombine'>>, 'MINUTE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Minute'>>, 'MODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Mode'>>, 'MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Month'>>, 'MONTHNAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Monthname'>>, 'MONTHS_BETWEEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MonthsBetween'>>, 'NET_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.NetFunc'>>, 'NEXT_DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.NextDay'>>, 'NEXT_VALUE_FOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.NextValueFor'>>, 'NORMAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Normal'>>, '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_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ObjectAgg'>>, 'OBJECT_ID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ObjectId'>>, '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_IP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseIp'>>, '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'>>, 'PARSE_URL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseUrl'>>, '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'>>, 'PI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Pi'>>, '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'>>, 'PREVIOUS_DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PreviousDay'>>, 'QUANTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Quantile'>>, 'QUARTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Quarter'>>, 'RADIANS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Radians'>>, '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'>>, 'RANDSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Randstr'>>, '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'>>, 'READ_PARQUET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ReadParquet'>>, 'REDUCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Reduce'>>, 'REG_DOMAIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegDomain'>>, 'REGEXP_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpCount'>>, '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_FULL_MATCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpFullMatch'>>, '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'>>, 'REGR_AVGX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegrAvgx'>>, 'REGR_AVGY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegrAvgy'>>, 'REGR_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegrCount'>>, 'REGR_INTERCEPT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegrIntercept'>>, 'REGR_R2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegrR2'>>, 'REGR_SLOPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegrSlope'>>, 'REGR_SXX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegrSxx'>>, 'REGR_SXY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegrSxy'>>, 'REGR_SYY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegrSyy'>>, 'REGR_VALX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegrValx'>>, 'REGR_VALY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegrValy'>>, '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'>>, 'RTRIMMED_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RtrimmedLength'>>, 'SHA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA'>>, 'SHA1': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA'>>, 'S_H_A1_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA1Digest'>>, 'SHA2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA2'>>, 'S_H_A2_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA2Digest'>>, '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_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeFunc'>>, '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'>>, 'SEARCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Search'>>, 'SEARCH_IP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SearchIp'>>, 'SEC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sec'>>, 'SECH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sech'>>, 'SECOND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Second'>>, 'SEQ1': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Seq1'>>, 'SEQ2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Seq2'>>, 'SEQ4': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Seq4'>>, 'SEQ8': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Seq8'>>, 'SESSION_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SessionUser'>>, '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'>>, 'SKEWNESS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Skewness'>>, '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'>>, 'SOUNDEX_P123': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SoundexP123'>>, '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'>>, 'SYSTIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Systimestamp'>>, 'TAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Tan'>>, 'TANH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Tanh'>>, '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_SLICE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeSlice'>>, '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_LTZ_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampLtzFromParts'>>, 'TIMESTAMPLTZFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampLtzFromParts'>>, 'TIMESTAMP_SUB': <function build_date_delta.<locals>._builder>, 'TIMESTAMP_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampTrunc'>>, 'TIMESTAMP_TZ_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampTzFromParts'>>, 'TIMESTAMPTZFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampTzFromParts'>>, '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_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToBinary'>>, 'TO_BOOLEAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToBoolean'>>, '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_DECFLOAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToDecfloat'>>, 'TO_DOUBLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToDouble'>>, 'TO_FILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToFile'>>, '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'>>, 'TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Trunc'>>, 'TRUNCATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Trunc'>>, 'TRY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Try'>>, 'TRY_BASE64_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TryBase64DecodeBinary'>>, 'TRY_BASE64_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TryBase64DecodeString'>>, 'TRY_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TryCast'>>, 'TRY_HEX_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TryHexDecodeBinary'>>, 'TRY_HEX_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TryHexDecodeString'>>, 'TRY_TO_DECFLOAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TryToDecfloat'>>, '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'>>, 'UNIFORM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Uniform'>>, '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': <function Parser.<lambda>>, 'GEN_RANDOM_UUID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Uuid'>>, 'GENERATE_UUID': <function Parser.<lambda>>, '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'>>, 'WIDTH_BUCKET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.WidthBucket'>>, 'XMLELEMENT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.XMLElement'>>, 'XMLGET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.XMLGet'>>, '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'>>, 'YEAR_OF_WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.YearOfWeek'>>, 'YEAROFWEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.YearOfWeek'>>, 'YEAR_OF_WEEK_ISO': <bound method Func.from_arg_list of <class 'sqlglot.expressions.YearOfWeekIso'>>, 'YEAROFWEEKISO': <bound method Func.from_arg_list of <class 'sqlglot.expressions.YearOfWeekIso'>>, 'ZIPF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Zipf'>>, 'ARRAYAGG': <function Parser.<lambda>>, 'GLOB': <function Parser.<lambda>>, 'JSON_EXTRACT_PATH_TEXT': <function build_extract_json_with_path.<locals>._builder>, 'LIKE': <function build_like.<locals>._builder>, '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>, 'TOSTARTOFQUARTER': <function _build_timestamp_trunc.<locals>.<lambda>>, 'TOSTARTOFDAY': <function _build_timestamp_trunc.<locals>.<lambda>>, 'TOSTARTOFMICROSECOND': <function _build_timestamp_trunc.<locals>.<lambda>>, 'TOSTARTOFMILLISECOND': <function _build_timestamp_trunc.<locals>.<lambda>>, 'TOSTARTOFSECOND': <function _build_timestamp_trunc.<locals>.<lambda>>, 'TOSTARTOFMINUTE': <function _build_timestamp_trunc.<locals>.<lambda>>, 'TOSTARTOFMONTH': <function _build_timestamp_trunc.<locals>.<lambda>>, 'TOSTARTOFYEAR': <function _build_timestamp_trunc.<locals>.<lambda>>, 'TOSTARTOFHOUR': <function _build_timestamp_trunc.<locals>.<lambda>>, 'ANY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AnyValue'>>, 'ARRAYCOMPACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayCompact'>>, 'ARRAYCONCAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayConcat'>>, 'ARRAYDISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayDistinct'>>, 'ARRAYSUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySum'>>, 'ARRAYMAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayMax'>>, 'ARRAYMIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayMin'>>, 'ARRAYREVERSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayReverse'>>, 'ARRAYSLICE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySlice'>>, 'CURRENTDATABASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentDatabase'>>, 'CURRENTSCHEMAS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentSchemas'>>, 'COSINEDISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CosineDistance'>>, 'VERSION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentVersion'>>, '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>, 'HAS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContains'>>, 'ILIKE': <function build_like.<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'>>, 'NOTLIKE': <function build_like.<locals>._builder>, 'PARSEDATETIME': <function _build_datetime_format.<locals>._builder>, 'RANDCANONICAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Rand'>>, 'TIMESTAMPSUB': <function build_date_delta.<locals>._builder>, 'TIMESTAMPADD': <function build_date_delta.<locals>._builder>, 'TOMONDAY': <function _build_timestamp_trunc.<locals>.<lambda>>, 'UNIQ': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxDistinct'>>, 'SHA256': <function ClickHouse.Parser.<lambda>>, 'SHA512': <function ClickHouse.Parser.<lambda>>, 'SPLITBYCHAR': <function _build_split_by_char>, 'SPLITBYREGEXP': <function _build_split.<locals>.<lambda>>, 'SPLITBYSTRING': <function _build_split.<locals>.<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'>>, 'JAROWINKLERSIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JarowinklerSimilarity'>>, 'LEVENSHTEINDISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Levenshtein'>>, 'UTCTIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UtcTimestamp'>>}
AGG_FUNCTIONS = {'quantileTDigestWeighted', 'entropy', 'quantileInterpolatedWeighted', 'groupBitmapAnd', 'first_value', 'groupBitmapXor', 'argMax', 'quantileBFloat16Weighted', 'minMap', 'quantilesInterpolatedWeighted', 'kurtPop', 'quantilesTiming', 'quantilesDeterministic', 'quantileGK', 'corr', 'avg', 'anyLast', 'argMin', 'quantileExactLow', 'covarSamp', 'sparkBar', 'sumCount', 'count', 'stddevSamp', 'sequenceNextNode', 'mannWhitneyUTest', 'studentTTest', 'sequenceCount', 'stddevPop', 'quantilesExactExclusive', 'sumWithOverflow', 'max', 'sequenceMatch', 'groupBitmap', 'meanZTest', 'topK', 'anyHeavy', 'groupArrayMovingAvg', 'varSamp', 'median', 'exponentialMovingAverage', 'deltaSum', 'groupArrayMovingSum', 'groupUniqArray', 'quantile', 'quantileBFloat16', 'boundingRatio', 'quantilesTDigest', 'groupArrayInsertAt', 'groupBitOr', 'quantilesBFloat16Weighted', 'quantileDeterministic', 'quantilesTimingWeighted', 'maxIntersections', 'uniqUpTo', 'quantilesGK', 'varPop', 'groupArrayLast', 'groupArray', 'retention', 'quantilesExactWeighted', 'groupArraySample', 'uniqHLL12', 'simpleLinearRegression', 'sumKahan', 'quantileTDigest', 'quantileTimingWeighted', 'last_value', 'quantilesTDigestWeighted', 'skewPop', 'largestTriangleThreeBuckets', 'quantilesExact', 'groupBitmapOr', 'quantilesBFloat16', 'approx_top_sum', 'groupBitAnd', 'covarPop', 'uniqTheta', 'avgWeighted', 'quantileExactWeighted', 'exponentialTimeDecayedAvg', 'theilsU', 'welchTTest', 'categoricalInformationValue', 'quantiles', 'skewSamp', 'quantileExactHigh', 'windowFunnel', 'uniqCombined64', 'uniqCombined', 'uniqExact', 'stochasticLogisticRegression', 'quantileTiming', 'stochasticLinearRegression', 'quantileExact', 'kurtSamp', 'histogram', 'any', 'uniq', 'cramersV', 'cramersVBiasCorrected', 'intervalLengthSum', 'contingency', 'groupBitXor', 'topKWeighted', 'sum', 'min', 'quantilesExactHigh', 'kolmogorovSmirnovTest', 'maxIntersectionsPosition', 'maxMap', 'quantilesExactLow', 'deltaSumTimestamp', 'sumMap', 'rankCorr'}
AGG_FUNCTIONS_SUFFIXES = ['If', 'Array', 'ArrayIf', 'Map', 'SimpleState', 'State', 'Merge', 'MergeState', 'ForEach', 'Distinct', 'OrDefault', 'OrNull', 'Resample', 'ArgMin', 'ArgMax']
FUNC_TOKENS = {<TokenType.AND: 33>, <TokenType.OR: 34>, <TokenType.SESSION_USER: 58>, <TokenType.XOR: 63>, <TokenType.IDENTIFIER: 76>, <TokenType.TABLE: 81>, <TokenType.VAR: 85>, <TokenType.BIT: 93>, <TokenType.BOOLEAN: 94>, <TokenType.TINYINT: 95>, <TokenType.UTINYINT: 96>, <TokenType.SMALLINT: 97>, <TokenType.USMALLINT: 98>, <TokenType.MEDIUMINT: 99>, <TokenType.UMEDIUMINT: 100>, <TokenType.INT: 101>, <TokenType.UINT: 102>, <TokenType.BIGINT: 103>, <TokenType.UBIGINT: 104>, <TokenType.BIGNUM: 105>, <TokenType.INT128: 106>, <TokenType.UINT128: 107>, <TokenType.INT256: 108>, <TokenType.UINT256: 109>, <TokenType.FLOAT: 110>, <TokenType.DOUBLE: 111>, <TokenType.UDOUBLE: 112>, <TokenType.DECIMAL: 113>, <TokenType.DECIMAL32: 114>, <TokenType.DECIMAL64: 115>, <TokenType.DECIMAL128: 116>, <TokenType.DECIMAL256: 117>, <TokenType.DECFLOAT: 118>, <TokenType.UDECIMAL: 119>, <TokenType.BIGDECIMAL: 120>, <TokenType.CHAR: 121>, <TokenType.NCHAR: 122>, <TokenType.VARCHAR: 123>, <TokenType.NVARCHAR: 124>, <TokenType.BPCHAR: 125>, <TokenType.TEXT: 126>, <TokenType.MEDIUMTEXT: 127>, <TokenType.LONGTEXT: 128>, <TokenType.BLOB: 129>, <TokenType.MEDIUMBLOB: 130>, <TokenType.LONGBLOB: 131>, <TokenType.TINYBLOB: 132>, <TokenType.TINYTEXT: 133>, <TokenType.NAME: 134>, <TokenType.BINARY: 135>, <TokenType.VARBINARY: 136>, <TokenType.JSON: 137>, <TokenType.JSONB: 138>, <TokenType.TIME: 139>, <TokenType.TIMETZ: 140>, <TokenType.TIME_NS: 141>, <TokenType.TIMESTAMP: 142>, <TokenType.TIMESTAMPTZ: 143>, <TokenType.TIMESTAMPLTZ: 144>, <TokenType.TIMESTAMPNTZ: 145>, <TokenType.TIMESTAMP_S: 146>, <TokenType.TIMESTAMP_MS: 147>, <TokenType.TIMESTAMP_NS: 148>, <TokenType.DATETIME: 149>, <TokenType.DATETIME2: 150>, <TokenType.DATETIME64: 151>, <TokenType.SMALLDATETIME: 152>, <TokenType.DATE: 153>, <TokenType.DATE32: 154>, <TokenType.INT4RANGE: 155>, <TokenType.INT4MULTIRANGE: 156>, <TokenType.INT8RANGE: 157>, <TokenType.INT8MULTIRANGE: 158>, <TokenType.NUMRANGE: 159>, <TokenType.NUMMULTIRANGE: 160>, <TokenType.TSRANGE: 161>, <TokenType.TSMULTIRANGE: 162>, <TokenType.TSTZRANGE: 163>, <TokenType.TSTZMULTIRANGE: 164>, <TokenType.DATERANGE: 165>, <TokenType.DATEMULTIRANGE: 166>, <TokenType.UUID: 167>, <TokenType.GEOGRAPHY: 168>, <TokenType.GEOGRAPHYPOINT: 169>, <TokenType.NULLABLE: 170>, <TokenType.GEOMETRY: 171>, <TokenType.POINT: 172>, <TokenType.RING: 173>, <TokenType.LINESTRING: 174>, <TokenType.LOCALTIME: 175>, <TokenType.LOCALTIMESTAMP: 176>, <TokenType.MULTILINESTRING: 178>, <TokenType.POLYGON: 179>, <TokenType.MULTIPOLYGON: 180>, <TokenType.HLLSKETCH: 181>, <TokenType.HSTORE: 182>, <TokenType.SUPER: 183>, <TokenType.SERIAL: 184>, <TokenType.SMALLSERIAL: 185>, <TokenType.BIGSERIAL: 186>, <TokenType.XML: 187>, <TokenType.YEAR: 188>, <TokenType.USERDEFINED: 189>, <TokenType.MONEY: 190>, <TokenType.SMALLMONEY: 191>, <TokenType.ROWVERSION: 192>, <TokenType.IMAGE: 193>, <TokenType.VARIANT: 194>, <TokenType.OBJECT: 195>, <TokenType.INET: 196>, <TokenType.IPADDRESS: 197>, <TokenType.IPPREFIX: 198>, <TokenType.IPV4: 199>, <TokenType.IPV6: 200>, <TokenType.ENUM: 201>, <TokenType.ENUM8: 202>, <TokenType.ENUM16: 203>, <TokenType.FIXEDSTRING: 204>, <TokenType.LOWCARDINALITY: 205>, <TokenType.NESTED: 206>, <TokenType.AGGREGATEFUNCTION: 207>, <TokenType.SIMPLEAGGREGATEFUNCTION: 208>, <TokenType.TDIGEST: 209>, <TokenType.UNKNOWN: 210>, <TokenType.VECTOR: 211>, <TokenType.DYNAMIC: 212>, <TokenType.VOID: 213>, <TokenType.ALL: 216>, <TokenType.ANY: 218>, <TokenType.ARRAY: 220>, <TokenType.COLLATE: 232>, <TokenType.COMMAND: 233>, <TokenType.CURRENT_DATE: 242>, <TokenType.CURRENT_DATETIME: 243>, <TokenType.CURRENT_SCHEMA: 244>, <TokenType.CURRENT_TIME: 245>, <TokenType.CURRENT_TIMESTAMP: 246>, <TokenType.CURRENT_USER: 247>, <TokenType.CURRENT_CATALOG: 249>, <TokenType.EXISTS: 266>, <TokenType.FILE: 269>, <TokenType.FILTER: 271>, <TokenType.FIRST: 273>, <TokenType.FORMAT: 277>, <TokenType.GET: 281>, <TokenType.GLOB: 282>, <TokenType.ILIKE: 290>, <TokenType.INDEX: 292>, <TokenType.INSERT: 295>, <TokenType.INTERVAL: 298>, <TokenType.ISNULL: 303>, <TokenType.LEFT: 311>, <TokenType.LIKE: 312>, <TokenType.LIST: 314>, <TokenType.MAP: 317>, <TokenType.MERGE: 322>, <TokenType.NEXT: 326>, <TokenType.NOTHING: 327>, <TokenType.NULL: 329>, <TokenType.OBJECT_IDENTIFIER: 330>, <TokenType.OFFSET: 331>, <TokenType.PRIMARY_KEY: 353>, <TokenType.PSEUDO_TYPE: 356>, <TokenType.RANGE: 361>, <TokenType.REPLACE: 365>, <TokenType.RIGHT: 369>, <TokenType.RLIKE: 370>, <TokenType.ROW: 373>, <TokenType.SEQUENCE: 378>, <TokenType.SET: 380>, <TokenType.SOME: 384>, <TokenType.STRUCT: 390>, <TokenType.TRUNCATE: 398>, <TokenType.UNION: 401>, <TokenType.UNNEST: 402>, <TokenType.WINDOW: 414>, <TokenType.UTC_DATE: 417>, <TokenType.UTC_TIME: 418>, <TokenType.UTC_TIMESTAMP: 419>}
RESERVED_TOKENS = {<TokenType.L_PAREN: 1>, <TokenType.R_PAREN: 2>, <TokenType.L_BRACKET: 3>, <TokenType.R_BRACKET: 4>, <TokenType.L_BRACE: 5>, <TokenType.R_BRACE: 6>, <TokenType.COMMA: 7>, <TokenType.DOT: 8>, <TokenType.DASH: 9>, <TokenType.PLUS: 10>, <TokenType.COLON: 11>, <TokenType.MOD: 323>, <TokenType.SEMICOLON: 18>, <TokenType.STAR: 19>, <TokenType.BACKSLASH: 20>, <TokenType.SLASH: 21>, <TokenType.LT: 22>, <TokenType.UNKNOWN: 210>, <TokenType.GT: 24>, <TokenType.NOT: 26>, <TokenType.EQ: 27>, <TokenType.PLACEHOLDER: 349>, <TokenType.AMP: 35>, <TokenType.PIPE: 38>, <TokenType.CARET: 41>, <TokenType.TILDE: 43>, <TokenType.HASH: 47>, <TokenType.PARAMETER: 55>}
ID_VAR_TOKENS = {<TokenType.SESSION: 56>, <TokenType.SESSION_USER: 58>, <TokenType.IDENTIFIER: 76>, <TokenType.DATABASE: 77>, <TokenType.COLUMN: 78>, <TokenType.SCHEMA: 80>, <TokenType.TABLE: 81>, <TokenType.WAREHOUSE: 82>, <TokenType.STAGE: 83>, <TokenType.STREAMLIT: 84>, <TokenType.VAR: 85>, <TokenType.BIT: 93>, <TokenType.BOOLEAN: 94>, <TokenType.TINYINT: 95>, <TokenType.UTINYINT: 96>, <TokenType.SMALLINT: 97>, <TokenType.USMALLINT: 98>, <TokenType.MEDIUMINT: 99>, <TokenType.UMEDIUMINT: 100>, <TokenType.INT: 101>, <TokenType.UINT: 102>, <TokenType.BIGINT: 103>, <TokenType.UBIGINT: 104>, <TokenType.BIGNUM: 105>, <TokenType.INT128: 106>, <TokenType.UINT128: 107>, <TokenType.INT256: 108>, <TokenType.UINT256: 109>, <TokenType.FLOAT: 110>, <TokenType.DOUBLE: 111>, <TokenType.UDOUBLE: 112>, <TokenType.DECIMAL: 113>, <TokenType.DECIMAL32: 114>, <TokenType.DECIMAL64: 115>, <TokenType.DECIMAL128: 116>, <TokenType.DECIMAL256: 117>, <TokenType.DECFLOAT: 118>, <TokenType.UDECIMAL: 119>, <TokenType.BIGDECIMAL: 120>, <TokenType.CHAR: 121>, <TokenType.NCHAR: 122>, <TokenType.VARCHAR: 123>, <TokenType.NVARCHAR: 124>, <TokenType.BPCHAR: 125>, <TokenType.TEXT: 126>, <TokenType.MEDIUMTEXT: 127>, <TokenType.LONGTEXT: 128>, <TokenType.BLOB: 129>, <TokenType.MEDIUMBLOB: 130>, <TokenType.LONGBLOB: 131>, <TokenType.TINYBLOB: 132>, <TokenType.TINYTEXT: 133>, <TokenType.NAME: 134>, <TokenType.BINARY: 135>, <TokenType.VARBINARY: 136>, <TokenType.JSON: 137>, <TokenType.JSONB: 138>, <TokenType.TIME: 139>, <TokenType.TIMETZ: 140>, <TokenType.TIME_NS: 141>, <TokenType.TIMESTAMP: 142>, <TokenType.TIMESTAMPTZ: 143>, <TokenType.TIMESTAMPLTZ: 144>, <TokenType.TIMESTAMPNTZ: 145>, <TokenType.TIMESTAMP_S: 146>, <TokenType.TIMESTAMP_MS: 147>, <TokenType.TIMESTAMP_NS: 148>, <TokenType.DATETIME: 149>, <TokenType.DATETIME2: 150>, <TokenType.DATETIME64: 151>, <TokenType.SMALLDATETIME: 152>, <TokenType.DATE: 153>, <TokenType.DATE32: 154>, <TokenType.INT4RANGE: 155>, <TokenType.INT4MULTIRANGE: 156>, <TokenType.INT8RANGE: 157>, <TokenType.INT8MULTIRANGE: 158>, <TokenType.NUMRANGE: 159>, <TokenType.NUMMULTIRANGE: 160>, <TokenType.TSRANGE: 161>, <TokenType.TSMULTIRANGE: 162>, <TokenType.TSTZRANGE: 163>, <TokenType.TSTZMULTIRANGE: 164>, <TokenType.DATERANGE: 165>, <TokenType.DATEMULTIRANGE: 166>, <TokenType.UUID: 167>, <TokenType.GEOGRAPHY: 168>, <TokenType.GEOGRAPHYPOINT: 169>, <TokenType.NULLABLE: 170>, <TokenType.GEOMETRY: 171>, <TokenType.POINT: 172>, <TokenType.RING: 173>, <TokenType.LINESTRING: 174>, <TokenType.LOCALTIME: 175>, <TokenType.LOCALTIMESTAMP: 176>, <TokenType.MULTILINESTRING: 178>, <TokenType.POLYGON: 179>, <TokenType.MULTIPOLYGON: 180>, <TokenType.HLLSKETCH: 181>, <TokenType.HSTORE: 182>, <TokenType.SUPER: 183>, <TokenType.SERIAL: 184>, <TokenType.SMALLSERIAL: 185>, <TokenType.BIGSERIAL: 186>, <TokenType.XML: 187>, <TokenType.YEAR: 188>, <TokenType.USERDEFINED: 189>, <TokenType.MONEY: 190>, <TokenType.SMALLMONEY: 191>, <TokenType.ROWVERSION: 192>, <TokenType.IMAGE: 193>, <TokenType.VARIANT: 194>, <TokenType.OBJECT: 195>, <TokenType.INET: 196>, <TokenType.IPADDRESS: 197>, <TokenType.IPPREFIX: 198>, <TokenType.IPV4: 199>, <TokenType.IPV6: 200>, <TokenType.ENUM: 201>, <TokenType.ENUM8: 202>, <TokenType.ENUM16: 203>, <TokenType.FIXEDSTRING: 204>, <TokenType.LOWCARDINALITY: 205>, <TokenType.NESTED: 206>, <TokenType.AGGREGATEFUNCTION: 207>, <TokenType.SIMPLEAGGREGATEFUNCTION: 208>, <TokenType.TDIGEST: 209>, <TokenType.UNKNOWN: 210>, <TokenType.VECTOR: 211>, <TokenType.DYNAMIC: 212>, <TokenType.VOID: 213>, <TokenType.ALL: 216>, <TokenType.ANTI: 217>, <TokenType.ANY: 218>, <TokenType.APPLY: 219>, <TokenType.ARRAY: 220>, <TokenType.ASC: 221>, <TokenType.ASOF: 222>, <TokenType.ATTACH: 223>, <TokenType.AUTO_INCREMENT: 224>, <TokenType.BEGIN: 225>, <TokenType.CACHE: 228>, <TokenType.CASE: 229>, <TokenType.COLLATE: 232>, <TokenType.COMMAND: 233>, <TokenType.COMMENT: 234>, <TokenType.COMMIT: 235>, <TokenType.CONSTRAINT: 237>, <TokenType.COPY: 238>, <TokenType.CUBE: 241>, <TokenType.CURRENT_DATE: 242>, <TokenType.CURRENT_DATETIME: 243>, <TokenType.CURRENT_SCHEMA: 244>, <TokenType.CURRENT_TIME: 245>, <TokenType.CURRENT_TIMESTAMP: 246>, <TokenType.CURRENT_USER: 247>, <TokenType.CURRENT_ROLE: 248>, <TokenType.CURRENT_CATALOG: 249>, <TokenType.DEFAULT: 251>, <TokenType.DELETE: 252>, <TokenType.DESC: 253>, <TokenType.DESCRIBE: 254>, <TokenType.DETACH: 255>, <TokenType.DICTIONARY: 256>, <TokenType.DIV: 259>, <TokenType.END: 262>, <TokenType.ESCAPE: 263>, <TokenType.EXECUTE: 265>, <TokenType.EXISTS: 266>, <TokenType.FALSE: 267>, <TokenType.FILE: 269>, <TokenType.FILE_FORMAT: 270>, <TokenType.FILTER: 271>, <TokenType.FINAL: 272>, <TokenType.FIRST: 273>, <TokenType.FOREIGN_KEY: 276>, <TokenType.FORMAT: 277>, <TokenType.FULL: 279>, <TokenType.FUNCTION: 280>, <TokenType.GET: 281>, <TokenType.INDEX: 292>, <TokenType.INTERVAL: 298>, <TokenType.IS: 302>, <TokenType.ISNULL: 303>, <TokenType.KEEP: 306>, <TokenType.KILL: 308>, <TokenType.LEFT: 311>, <TokenType.LIKE: 312>, <TokenType.LIMIT: 313>, <TokenType.LIST: 314>, <TokenType.LOAD: 315>, <TokenType.LOCK: 316>, <TokenType.MAP: 317>, <TokenType.MATCH: 318>, <TokenType.MERGE: 322>, <TokenType.MODEL: 324>, <TokenType.NATURAL: 325>, <TokenType.NEXT: 326>, <TokenType.NOTHING: 327>, <TokenType.NULL: 329>, <TokenType.OBJECT_IDENTIFIER: 330>, <TokenType.OFFSET: 331>, <TokenType.OPERATOR: 334>, <TokenType.ORDINALITY: 338>, <TokenType.INOUT: 340>, <TokenType.OVER: 342>, <TokenType.OVERLAPS: 343>, <TokenType.OVERWRITE: 344>, <TokenType.PARTITION: 345>, <TokenType.PERCENT: 347>, <TokenType.PIVOT: 348>, <TokenType.PRAGMA: 351>, <TokenType.PROCEDURE: 354>, <TokenType.PSEUDO_TYPE: 356>, <TokenType.PUT: 357>, <TokenType.RANGE: 361>, <TokenType.RECURSIVE: 362>, <TokenType.REFRESH: 363>, <TokenType.RENAME: 364>, <TokenType.REPLACE: 365>, <TokenType.REFERENCES: 368>, <TokenType.RIGHT: 369>, <TokenType.ROLLUP: 372>, <TokenType.ROW: 373>, <TokenType.ROWS: 374>, <TokenType.SEMI: 376>, <TokenType.SEQUENCE: 378>, <TokenType.SET: 380>, <TokenType.SETTINGS: 381>, <TokenType.SHOW: 382>, <TokenType.SOME: 384>, <TokenType.STORAGE_INTEGRATION: 388>, <TokenType.STRAIGHT_JOIN: 389>, <TokenType.STRUCT: 390>, <TokenType.TAG: 393>, <TokenType.TEMPORARY: 394>, <TokenType.TOP: 395>, <TokenType.TRUE: 397>, <TokenType.TRUNCATE: 398>, <TokenType.TRIGGER: 399>, <TokenType.UNNEST: 402>, <TokenType.UNPIVOT: 403>, <TokenType.UPDATE: 404>, <TokenType.USE: 405>, <TokenType.VIEW: 409>, <TokenType.SEMANTIC_VIEW: 410>, <TokenType.VOLATILE: 411>, <TokenType.WINDOW: 414>, <TokenType.UNIQUE: 416>, <TokenType.SINK: 423>, <TokenType.SOURCE: 424>, <TokenType.ANALYZE: 425>, <TokenType.NAMESPACE: 426>, <TokenType.EXPORT: 427>}
AGG_FUNC_MAPPING = {'quantileTDigestWeightedIf': ('quantileTDigestWeighted', 'If'), 'entropyIf': ('entropy', 'If'), 'quantileInterpolatedWeightedIf': ('quantileInterpolatedWeighted', 'If'), 'groupBitmapAndIf': ('groupBitmapAnd', 'If'), 'first_valueIf': ('first_value', 'If'), 'groupBitmapXorIf': ('groupBitmapXor', 'If'), 'argMaxIf': ('argMax', 'If'), 'quantileBFloat16WeightedIf': ('quantileBFloat16Weighted', 'If'), 'minMapIf': ('minMap', 'If'), 'quantilesInterpolatedWeightedIf': ('quantilesInterpolatedWeighted', 'If'), 'kurtPopIf': ('kurtPop', 'If'), 'quantilesTimingIf': ('quantilesTiming', 'If'), 'quantilesDeterministicIf': ('quantilesDeterministic', 'If'), 'quantileGKIf': ('quantileGK', 'If'), 'corrIf': ('corr', 'If'), 'avgIf': ('avg', 'If'), 'anyLastIf': ('anyLast', 'If'), 'argMinIf': ('argMin', 'If'), 'quantileExactLowIf': ('quantileExactLow', 'If'), 'covarSampIf': ('covarSamp', 'If'), 'sparkBarIf': ('sparkBar', 'If'), 'sumCountIf': ('sumCount', 'If'), 'countIf': ('count', 'If'), 'stddevSampIf': ('stddevSamp', 'If'), 'sequenceNextNodeIf': ('sequenceNextNode', 'If'), 'mannWhitneyUTestIf': ('mannWhitneyUTest', 'If'), 'studentTTestIf': ('studentTTest', 'If'), 'sequenceCountIf': ('sequenceCount', 'If'), 'stddevPopIf': ('stddevPop', 'If'), 'quantilesExactExclusiveIf': ('quantilesExactExclusive', 'If'), 'sumWithOverflowIf': ('sumWithOverflow', 'If'), 'maxIf': ('max', 'If'), 'sequenceMatchIf': ('sequenceMatch', 'If'), 'groupBitmapIf': ('groupBitmap', 'If'), 'meanZTestIf': ('meanZTest', 'If'), 'topKIf': ('topK', 'If'), 'anyHeavyIf': ('anyHeavy', 'If'), 'groupArrayMovingAvgIf': ('groupArrayMovingAvg', 'If'), 'varSampIf': ('varSamp', 'If'), 'medianIf': ('median', 'If'), 'exponentialMovingAverageIf': ('exponentialMovingAverage', 'If'), 'deltaSumIf': ('deltaSum', 'If'), 'groupArrayMovingSumIf': ('groupArrayMovingSum', 'If'), 'groupUniqArrayIf': ('groupUniqArray', 'If'), 'quantileIf': ('quantile', 'If'), 'quantileBFloat16If': ('quantileBFloat16', 'If'), 'boundingRatioIf': ('boundingRatio', 'If'), 'quantilesTDigestIf': ('quantilesTDigest', 'If'), 'groupArrayInsertAtIf': ('groupArrayInsertAt', 'If'), 'groupBitOrIf': ('groupBitOr', 'If'), 'quantilesBFloat16WeightedIf': ('quantilesBFloat16Weighted', 'If'), 'quantileDeterministicIf': ('quantileDeterministic', 'If'), 'quantilesTimingWeightedIf': ('quantilesTimingWeighted', 'If'), 'maxIntersectionsIf': ('maxIntersections', 'If'), 'uniqUpToIf': ('uniqUpTo', 'If'), 'quantilesGKIf': ('quantilesGK', 'If'), 'varPopIf': ('varPop', 'If'), 'groupArrayLastIf': ('groupArrayLast', 'If'), 'groupArrayIf': ('groupArray', 'If'), 'retentionIf': ('retention', 'If'), 'quantilesExactWeightedIf': ('quantilesExactWeighted', 'If'), 'groupArraySampleIf': ('groupArraySample', 'If'), 'uniqHLL12If': ('uniqHLL12', 'If'), 'simpleLinearRegressionIf': ('simpleLinearRegression', 'If'), 'sumKahanIf': ('sumKahan', 'If'), 'quantileTDigestIf': ('quantileTDigest', 'If'), 'quantileTimingWeightedIf': ('quantileTimingWeighted', 'If'), 'last_valueIf': ('last_value', 'If'), 'quantilesTDigestWeightedIf': ('quantilesTDigestWeighted', 'If'), 'skewPopIf': ('skewPop', 'If'), 'largestTriangleThreeBucketsIf': ('largestTriangleThreeBuckets', 'If'), 'quantilesExactIf': ('quantilesExact', 'If'), 'groupBitmapOrIf': ('groupBitmapOr', 'If'), 'quantilesBFloat16If': ('quantilesBFloat16', 'If'), 'approx_top_sumIf': ('approx_top_sum', 'If'), 'groupBitAndIf': ('groupBitAnd', 'If'), 'covarPopIf': ('covarPop', 'If'), 'uniqThetaIf': ('uniqTheta', 'If'), 'avgWeightedIf': ('avgWeighted', 'If'), 'quantileExactWeightedIf': ('quantileExactWeighted', 'If'), 'exponentialTimeDecayedAvgIf': ('exponentialTimeDecayedAvg', 'If'), 'theilsUIf': ('theilsU', 'If'), 'welchTTestIf': ('welchTTest', 'If'), 'categoricalInformationValueIf': ('categoricalInformationValue', 'If'), 'quantilesIf': ('quantiles', 'If'), 'skewSampIf': ('skewSamp', 'If'), 'quantileExactHighIf': ('quantileExactHigh', 'If'), 'windowFunnelIf': ('windowFunnel', 'If'), 'uniqCombined64If': ('uniqCombined64', 'If'), 'uniqCombinedIf': ('uniqCombined', 'If'), 'uniqExactIf': ('uniqExact', 'If'), 'stochasticLogisticRegressionIf': ('stochasticLogisticRegression', 'If'), 'quantileTimingIf': ('quantileTiming', 'If'), 'stochasticLinearRegressionIf': ('stochasticLinearRegression', 'If'), 'quantileExactIf': ('quantileExact', 'If'), 'kurtSampIf': ('kurtSamp', 'If'), 'histogramIf': ('histogram', 'If'), 'anyIf': ('any', 'If'), 'uniqIf': ('uniq', 'If'), 'cramersVIf': ('cramersV', 'If'), 'cramersVBiasCorrectedIf': ('cramersVBiasCorrected', 'If'), 'intervalLengthSumIf': ('intervalLengthSum', 'If'), 'contingencyIf': ('contingency', 'If'), 'groupBitXorIf': ('groupBitXor', 'If'), 'topKWeightedIf': ('topKWeighted', 'If'), 'sumIf': ('sum', 'If'), 'minIf': ('min', 'If'), 'quantilesExactHighIf': ('quantilesExactHigh', 'If'), 'kolmogorovSmirnovTestIf': ('kolmogorovSmirnovTest', 'If'), 'maxIntersectionsPositionIf': ('maxIntersectionsPosition', 'If'), 'maxMapIf': ('maxMap', 'If'), 'quantilesExactLowIf': ('quantilesExactLow', 'If'), 'deltaSumTimestampIf': ('deltaSumTimestamp', 'If'), 'sumMapIf': ('sumMap', 'If'), 'rankCorrIf': ('rankCorr', 'If'), 'quantileTDigestWeightedArray': ('quantileTDigestWeighted', 'Array'), 'entropyArray': ('entropy', 'Array'), 'quantileInterpolatedWeightedArray': ('quantileInterpolatedWeighted', 'Array'), 'groupBitmapAndArray': ('groupBitmapAnd', 'Array'), 'first_valueArray': ('first_value', 'Array'), 'groupBitmapXorArray': ('groupBitmapXor', 'Array'), 'argMaxArray': ('argMax', 'Array'), 'quantileBFloat16WeightedArray': ('quantileBFloat16Weighted', 'Array'), 'minMapArray': ('minMap', 'Array'), 'quantilesInterpolatedWeightedArray': ('quantilesInterpolatedWeighted', 'Array'), 'kurtPopArray': ('kurtPop', 'Array'), 'quantilesTimingArray': ('quantilesTiming', 'Array'), 'quantilesDeterministicArray': ('quantilesDeterministic', 'Array'), 'quantileGKArray': ('quantileGK', 'Array'), 'corrArray': ('corr', 'Array'), 'avgArray': ('avg', 'Array'), 'anyLastArray': ('anyLast', 'Array'), 'argMinArray': ('argMin', 'Array'), 'quantileExactLowArray': ('quantileExactLow', 'Array'), 'covarSampArray': ('covarSamp', 'Array'), 'sparkBarArray': ('sparkBar', 'Array'), 'sumCountArray': ('sumCount', 'Array'), 'countArray': ('count', 'Array'), 'stddevSampArray': ('stddevSamp', 'Array'), 'sequenceNextNodeArray': ('sequenceNextNode', 'Array'), 'mannWhitneyUTestArray': ('mannWhitneyUTest', 'Array'), 'studentTTestArray': ('studentTTest', 'Array'), 'sequenceCountArray': ('sequenceCount', 'Array'), 'stddevPopArray': ('stddevPop', 'Array'), 'quantilesExactExclusiveArray': ('quantilesExactExclusive', 'Array'), 'sumWithOverflowArray': ('sumWithOverflow', 'Array'), 'maxArray': ('max', 'Array'), 'sequenceMatchArray': ('sequenceMatch', 'Array'), 'groupBitmapArray': ('groupBitmap', 'Array'), 'meanZTestArray': ('meanZTest', 'Array'), 'topKArray': ('topK', 'Array'), 'anyHeavyArray': ('anyHeavy', 'Array'), 'groupArrayMovingAvgArray': ('groupArrayMovingAvg', 'Array'), 'varSampArray': ('varSamp', 'Array'), 'medianArray': ('median', 'Array'), 'exponentialMovingAverageArray': ('exponentialMovingAverage', 'Array'), 'deltaSumArray': ('deltaSum', 'Array'), 'groupArrayMovingSumArray': ('groupArrayMovingSum', 'Array'), 'groupUniqArrayArray': ('groupUniqArray', 'Array'), 'quantileArray': ('quantile', 'Array'), 'quantileBFloat16Array': ('quantileBFloat16', 'Array'), 'boundingRatioArray': ('boundingRatio', 'Array'), 'quantilesTDigestArray': ('quantilesTDigest', 'Array'), 'groupArrayInsertAtArray': ('groupArrayInsertAt', 'Array'), 'groupBitOrArray': ('groupBitOr', 'Array'), 'quantilesBFloat16WeightedArray': ('quantilesBFloat16Weighted', 'Array'), 'quantileDeterministicArray': ('quantileDeterministic', 'Array'), 'quantilesTimingWeightedArray': ('quantilesTimingWeighted', 'Array'), 'maxIntersectionsArray': ('maxIntersections', 'Array'), 'uniqUpToArray': ('uniqUpTo', 'Array'), 'quantilesGKArray': ('quantilesGK', 'Array'), 'varPopArray': ('varPop', 'Array'), 'groupArrayLastArray': ('groupArrayLast', 'Array'), 'groupArrayArray': ('groupArray', 'Array'), 'retentionArray': ('retention', 'Array'), 'quantilesExactWeightedArray': ('quantilesExactWeighted', 'Array'), 'groupArraySampleArray': ('groupArraySample', 'Array'), 'uniqHLL12Array': ('uniqHLL12', 'Array'), 'simpleLinearRegressionArray': ('simpleLinearRegression', 'Array'), 'sumKahanArray': ('sumKahan', 'Array'), 'quantileTDigestArray': ('quantileTDigest', 'Array'), 'quantileTimingWeightedArray': ('quantileTimingWeighted', 'Array'), 'last_valueArray': ('last_value', 'Array'), 'quantilesTDigestWeightedArray': ('quantilesTDigestWeighted', 'Array'), 'skewPopArray': ('skewPop', 'Array'), 'largestTriangleThreeBucketsArray': ('largestTriangleThreeBuckets', 'Array'), 'quantilesExactArray': ('quantilesExact', 'Array'), 'groupBitmapOrArray': ('groupBitmapOr', 'Array'), 'quantilesBFloat16Array': ('quantilesBFloat16', 'Array'), 'approx_top_sumArray': ('approx_top_sum', 'Array'), 'groupBitAndArray': ('groupBitAnd', 'Array'), 'covarPopArray': ('covarPop', 'Array'), 'uniqThetaArray': ('uniqTheta', 'Array'), 'avgWeightedArray': ('avgWeighted', 'Array'), 'quantileExactWeightedArray': ('quantileExactWeighted', 'Array'), 'exponentialTimeDecayedAvgArray': ('exponentialTimeDecayedAvg', 'Array'), 'theilsUArray': ('theilsU', 'Array'), 'welchTTestArray': ('welchTTest', 'Array'), 'categoricalInformationValueArray': ('categoricalInformationValue', 'Array'), 'quantilesArray': ('quantiles', 'Array'), 'skewSampArray': ('skewSamp', 'Array'), 'quantileExactHighArray': ('quantileExactHigh', 'Array'), 'windowFunnelArray': ('windowFunnel', 'Array'), 'uniqCombined64Array': ('uniqCombined64', 'Array'), 'uniqCombinedArray': ('uniqCombined', 'Array'), 'uniqExactArray': ('uniqExact', 'Array'), 'stochasticLogisticRegressionArray': ('stochasticLogisticRegression', 'Array'), 'quantileTimingArray': ('quantileTiming', 'Array'), 'stochasticLinearRegressionArray': ('stochasticLinearRegression', 'Array'), 'quantileExactArray': ('quantileExact', 'Array'), 'kurtSampArray': ('kurtSamp', 'Array'), 'histogramArray': ('histogram', 'Array'), 'anyArray': ('any', 'Array'), 'uniqArray': ('uniq', 'Array'), 'cramersVArray': ('cramersV', 'Array'), 'cramersVBiasCorrectedArray': ('cramersVBiasCorrected', 'Array'), 'intervalLengthSumArray': ('intervalLengthSum', 'Array'), 'contingencyArray': ('contingency', 'Array'), 'groupBitXorArray': ('groupBitXor', 'Array'), 'topKWeightedArray': ('topKWeighted', 'Array'), 'sumArray': ('sum', 'Array'), 'minArray': ('min', 'Array'), 'quantilesExactHighArray': ('quantilesExactHigh', 'Array'), 'kolmogorovSmirnovTestArray': ('kolmogorovSmirnovTest', 'Array'), 'maxIntersectionsPositionArray': ('maxIntersectionsPosition', 'Array'), 'maxMapArray': ('maxMap', 'Array'), 'quantilesExactLowArray': ('quantilesExactLow', 'Array'), 'deltaSumTimestampArray': ('deltaSumTimestamp', 'Array'), 'sumMapArray': ('sumMap', 'Array'), 'rankCorrArray': ('rankCorr', 'Array'), 'quantileTDigestWeightedArrayIf': ('quantileTDigestWeighted', 'ArrayIf'), 'entropyArrayIf': ('entropy', 'ArrayIf'), 'quantileInterpolatedWeightedArrayIf': ('quantileInterpolatedWeighted', 'ArrayIf'), 'groupBitmapAndArrayIf': ('groupBitmapAnd', 'ArrayIf'), 'first_valueArrayIf': ('first_value', 'ArrayIf'), 'groupBitmapXorArrayIf': ('groupBitmapXor', 'ArrayIf'), 'argMaxArrayIf': ('argMax', 'ArrayIf'), 'quantileBFloat16WeightedArrayIf': ('quantileBFloat16Weighted', 'ArrayIf'), 'minMapArrayIf': ('minMap', 'ArrayIf'), 'quantilesInterpolatedWeightedArrayIf': ('quantilesInterpolatedWeighted', 'ArrayIf'), 'kurtPopArrayIf': ('kurtPop', 'ArrayIf'), 'quantilesTimingArrayIf': ('quantilesTiming', 'ArrayIf'), 'quantilesDeterministicArrayIf': ('quantilesDeterministic', 'ArrayIf'), 'quantileGKArrayIf': ('quantileGK', 'ArrayIf'), 'corrArrayIf': ('corr', 'ArrayIf'), 'avgArrayIf': ('avg', 'ArrayIf'), 'anyLastArrayIf': ('anyLast', 'ArrayIf'), 'argMinArrayIf': ('argMin', 'ArrayIf'), 'quantileExactLowArrayIf': ('quantileExactLow', 'ArrayIf'), 'covarSampArrayIf': ('covarSamp', 'ArrayIf'), 'sparkBarArrayIf': ('sparkBar', 'ArrayIf'), 'sumCountArrayIf': ('sumCount', 'ArrayIf'), 'countArrayIf': ('count', 'ArrayIf'), 'stddevSampArrayIf': ('stddevSamp', 'ArrayIf'), 'sequenceNextNodeArrayIf': ('sequenceNextNode', 'ArrayIf'), 'mannWhitneyUTestArrayIf': ('mannWhitneyUTest', 'ArrayIf'), 'studentTTestArrayIf': ('studentTTest', 'ArrayIf'), 'sequenceCountArrayIf': ('sequenceCount', 'ArrayIf'), 'stddevPopArrayIf': ('stddevPop', 'ArrayIf'), 'quantilesExactExclusiveArrayIf': ('quantilesExactExclusive', 'ArrayIf'), 'sumWithOverflowArrayIf': ('sumWithOverflow', 'ArrayIf'), 'maxArrayIf': ('max', 'ArrayIf'), 'sequenceMatchArrayIf': ('sequenceMatch', 'ArrayIf'), 'groupBitmapArrayIf': ('groupBitmap', 'ArrayIf'), 'meanZTestArrayIf': ('meanZTest', 'ArrayIf'), 'topKArrayIf': ('topK', 'ArrayIf'), 'anyHeavyArrayIf': ('anyHeavy', 'ArrayIf'), 'groupArrayMovingAvgArrayIf': ('groupArrayMovingAvg', 'ArrayIf'), 'varSampArrayIf': ('varSamp', 'ArrayIf'), 'medianArrayIf': ('median', 'ArrayIf'), 'exponentialMovingAverageArrayIf': ('exponentialMovingAverage', 'ArrayIf'), 'deltaSumArrayIf': ('deltaSum', 'ArrayIf'), 'groupArrayMovingSumArrayIf': ('groupArrayMovingSum', 'ArrayIf'), 'groupUniqArrayArrayIf': ('groupUniqArray', 'ArrayIf'), 'quantileArrayIf': ('quantile', 'ArrayIf'), 'quantileBFloat16ArrayIf': ('quantileBFloat16', 'ArrayIf'), 'boundingRatioArrayIf': ('boundingRatio', 'ArrayIf'), 'quantilesTDigestArrayIf': ('quantilesTDigest', 'ArrayIf'), 'groupArrayInsertAtArrayIf': ('groupArrayInsertAt', 'ArrayIf'), 'groupBitOrArrayIf': ('groupBitOr', 'ArrayIf'), 'quantilesBFloat16WeightedArrayIf': ('quantilesBFloat16Weighted', 'ArrayIf'), 'quantileDeterministicArrayIf': ('quantileDeterministic', 'ArrayIf'), 'quantilesTimingWeightedArrayIf': ('quantilesTimingWeighted', 'ArrayIf'), 'maxIntersectionsArrayIf': ('maxIntersections', 'ArrayIf'), 'uniqUpToArrayIf': ('uniqUpTo', 'ArrayIf'), 'quantilesGKArrayIf': ('quantilesGK', 'ArrayIf'), 'varPopArrayIf': ('varPop', 'ArrayIf'), 'groupArrayLastArrayIf': ('groupArrayLast', 'ArrayIf'), 'groupArrayArrayIf': ('groupArray', 'ArrayIf'), 'retentionArrayIf': ('retention', 'ArrayIf'), 'quantilesExactWeightedArrayIf': ('quantilesExactWeighted', 'ArrayIf'), 'groupArraySampleArrayIf': ('groupArraySample', 'ArrayIf'), 'uniqHLL12ArrayIf': ('uniqHLL12', 'ArrayIf'), 'simpleLinearRegressionArrayIf': ('simpleLinearRegression', 'ArrayIf'), 'sumKahanArrayIf': ('sumKahan', 'ArrayIf'), 'quantileTDigestArrayIf': ('quantileTDigest', 'ArrayIf'), 'quantileTimingWeightedArrayIf': ('quantileTimingWeighted', 'ArrayIf'), 'last_valueArrayIf': ('last_value', 'ArrayIf'), 'quantilesTDigestWeightedArrayIf': ('quantilesTDigestWeighted', 'ArrayIf'), 'skewPopArrayIf': ('skewPop', 'ArrayIf'), 'largestTriangleThreeBucketsArrayIf': ('largestTriangleThreeBuckets', 'ArrayIf'), 'quantilesExactArrayIf': ('quantilesExact', 'ArrayIf'), 'groupBitmapOrArrayIf': ('groupBitmapOr', 'ArrayIf'), 'quantilesBFloat16ArrayIf': ('quantilesBFloat16', 'ArrayIf'), 'approx_top_sumArrayIf': ('approx_top_sum', 'ArrayIf'), 'groupBitAndArrayIf': ('groupBitAnd', 'ArrayIf'), 'covarPopArrayIf': ('covarPop', 'ArrayIf'), 'uniqThetaArrayIf': ('uniqTheta', 'ArrayIf'), 'avgWeightedArrayIf': ('avgWeighted', 'ArrayIf'), 'quantileExactWeightedArrayIf': ('quantileExactWeighted', 'ArrayIf'), 'exponentialTimeDecayedAvgArrayIf': ('exponentialTimeDecayedAvg', 'ArrayIf'), 'theilsUArrayIf': ('theilsU', 'ArrayIf'), 'welchTTestArrayIf': ('welchTTest', 'ArrayIf'), 'categoricalInformationValueArrayIf': ('categoricalInformationValue', 'ArrayIf'), 'quantilesArrayIf': ('quantiles', 'ArrayIf'), 'skewSampArrayIf': ('skewSamp', 'ArrayIf'), 'quantileExactHighArrayIf': ('quantileExactHigh', 'ArrayIf'), 'windowFunnelArrayIf': ('windowFunnel', 'ArrayIf'), 'uniqCombined64ArrayIf': ('uniqCombined64', 'ArrayIf'), 'uniqCombinedArrayIf': ('uniqCombined', 'ArrayIf'), 'uniqExactArrayIf': ('uniqExact', 'ArrayIf'), 'stochasticLogisticRegressionArrayIf': ('stochasticLogisticRegression', 'ArrayIf'), 'quantileTimingArrayIf': ('quantileTiming', 'ArrayIf'), 'stochasticLinearRegressionArrayIf': ('stochasticLinearRegression', 'ArrayIf'), 'quantileExactArrayIf': ('quantileExact', 'ArrayIf'), 'kurtSampArrayIf': ('kurtSamp', 'ArrayIf'), 'histogramArrayIf': ('histogram', 'ArrayIf'), 'anyArrayIf': ('any', 'ArrayIf'), 'uniqArrayIf': ('uniq', 'ArrayIf'), 'cramersVArrayIf': ('cramersV', 'ArrayIf'), 'cramersVBiasCorrectedArrayIf': ('cramersVBiasCorrected', 'ArrayIf'), 'intervalLengthSumArrayIf': ('intervalLengthSum', 'ArrayIf'), 'contingencyArrayIf': ('contingency', 'ArrayIf'), 'groupBitXorArrayIf': ('groupBitXor', 'ArrayIf'), 'topKWeightedArrayIf': ('topKWeighted', 'ArrayIf'), 'sumArrayIf': ('sum', 'ArrayIf'), 'minArrayIf': ('min', 'ArrayIf'), 'quantilesExactHighArrayIf': ('quantilesExactHigh', 'ArrayIf'), 'kolmogorovSmirnovTestArrayIf': ('kolmogorovSmirnovTest', 'ArrayIf'), 'maxIntersectionsPositionArrayIf': ('maxIntersectionsPosition', 'ArrayIf'), 'maxMapArrayIf': ('maxMap', 'ArrayIf'), 'quantilesExactLowArrayIf': ('quantilesExactLow', 'ArrayIf'), 'deltaSumTimestampArrayIf': ('deltaSumTimestamp', 'ArrayIf'), 'sumMapArrayIf': ('sumMap', 'ArrayIf'), 'rankCorrArrayIf': ('rankCorr', 'ArrayIf'), 'quantileTDigestWeightedMap': ('quantileTDigestWeighted', 'Map'), 'entropyMap': ('entropy', 'Map'), 'quantileInterpolatedWeightedMap': ('quantileInterpolatedWeighted', 'Map'), 'groupBitmapAndMap': ('groupBitmapAnd', 'Map'), 'first_valueMap': ('first_value', 'Map'), 'groupBitmapXorMap': ('groupBitmapXor', 'Map'), 'argMaxMap': ('argMax', 'Map'), 'quantileBFloat16WeightedMap': ('quantileBFloat16Weighted', 'Map'), 'minMapMap': ('minMap', 'Map'), 'quantilesInterpolatedWeightedMap': ('quantilesInterpolatedWeighted', 'Map'), 'kurtPopMap': ('kurtPop', 'Map'), 'quantilesTimingMap': ('quantilesTiming', 'Map'), 'quantilesDeterministicMap': ('quantilesDeterministic', 'Map'), 'quantileGKMap': ('quantileGK', 'Map'), 'corrMap': ('corr', 'Map'), 'avgMap': ('avg', 'Map'), 'anyLastMap': ('anyLast', 'Map'), 'argMinMap': ('argMin', 'Map'), 'quantileExactLowMap': ('quantileExactLow', 'Map'), 'covarSampMap': ('covarSamp', 'Map'), 'sparkBarMap': ('sparkBar', 'Map'), 'sumCountMap': ('sumCount', 'Map'), 'countMap': ('count', 'Map'), 'stddevSampMap': ('stddevSamp', 'Map'), 'sequenceNextNodeMap': ('sequenceNextNode', 'Map'), 'mannWhitneyUTestMap': ('mannWhitneyUTest', 'Map'), 'studentTTestMap': ('studentTTest', 'Map'), 'sequenceCountMap': ('sequenceCount', 'Map'), 'stddevPopMap': ('stddevPop', 'Map'), 'quantilesExactExclusiveMap': ('quantilesExactExclusive', 'Map'), 'sumWithOverflowMap': ('sumWithOverflow', 'Map'), 'maxMap': ('maxMap', ''), 'sequenceMatchMap': ('sequenceMatch', 'Map'), 'groupBitmapMap': ('groupBitmap', 'Map'), 'meanZTestMap': ('meanZTest', 'Map'), 'topKMap': ('topK', 'Map'), 'anyHeavyMap': ('anyHeavy', 'Map'), 'groupArrayMovingAvgMap': ('groupArrayMovingAvg', 'Map'), 'varSampMap': ('varSamp', 'Map'), 'medianMap': ('median', 'Map'), 'exponentialMovingAverageMap': ('exponentialMovingAverage', 'Map'), 'deltaSumMap': ('deltaSum', 'Map'), 'groupArrayMovingSumMap': ('groupArrayMovingSum', 'Map'), 'groupUniqArrayMap': ('groupUniqArray', 'Map'), 'quantileMap': ('quantile', 'Map'), 'quantileBFloat16Map': ('quantileBFloat16', 'Map'), 'boundingRatioMap': ('boundingRatio', 'Map'), 'quantilesTDigestMap': ('quantilesTDigest', 'Map'), 'groupArrayInsertAtMap': ('groupArrayInsertAt', 'Map'), 'groupBitOrMap': ('groupBitOr', 'Map'), 'quantilesBFloat16WeightedMap': ('quantilesBFloat16Weighted', 'Map'), 'quantileDeterministicMap': ('quantileDeterministic', 'Map'), 'quantilesTimingWeightedMap': ('quantilesTimingWeighted', 'Map'), 'maxIntersectionsMap': ('maxIntersections', 'Map'), 'uniqUpToMap': ('uniqUpTo', 'Map'), 'quantilesGKMap': ('quantilesGK', 'Map'), 'varPopMap': ('varPop', 'Map'), 'groupArrayLastMap': ('groupArrayLast', 'Map'), 'groupArrayMap': ('groupArray', 'Map'), 'retentionMap': ('retention', 'Map'), 'quantilesExactWeightedMap': ('quantilesExactWeighted', 'Map'), 'groupArraySampleMap': ('groupArraySample', 'Map'), 'uniqHLL12Map': ('uniqHLL12', 'Map'), 'simpleLinearRegressionMap': ('simpleLinearRegression', 'Map'), 'sumKahanMap': ('sumKahan', 'Map'), 'quantileTDigestMap': ('quantileTDigest', 'Map'), 'quantileTimingWeightedMap': ('quantileTimingWeighted', 'Map'), 'last_valueMap': ('last_value', 'Map'), 'quantilesTDigestWeightedMap': ('quantilesTDigestWeighted', 'Map'), 'skewPopMap': ('skewPop', 'Map'), 'largestTriangleThreeBucketsMap': ('largestTriangleThreeBuckets', 'Map'), 'quantilesExactMap': ('quantilesExact', 'Map'), 'groupBitmapOrMap': ('groupBitmapOr', 'Map'), 'quantilesBFloat16Map': ('quantilesBFloat16', 'Map'), 'approx_top_sumMap': ('approx_top_sum', 'Map'), 'groupBitAndMap': ('groupBitAnd', 'Map'), 'covarPopMap': ('covarPop', 'Map'), 'uniqThetaMap': ('uniqTheta', 'Map'), 'avgWeightedMap': ('avgWeighted', 'Map'), 'quantileExactWeightedMap': ('quantileExactWeighted', 'Map'), 'exponentialTimeDecayedAvgMap': ('exponentialTimeDecayedAvg', 'Map'), 'theilsUMap': ('theilsU', 'Map'), 'welchTTestMap': ('welchTTest', 'Map'), 'categoricalInformationValueMap': ('categoricalInformationValue', 'Map'), 'quantilesMap': ('quantiles', 'Map'), 'skewSampMap': ('skewSamp', 'Map'), 'quantileExactHighMap': ('quantileExactHigh', 'Map'), 'windowFunnelMap': ('windowFunnel', 'Map'), 'uniqCombined64Map': ('uniqCombined64', 'Map'), 'uniqCombinedMap': ('uniqCombined', 'Map'), 'uniqExactMap': ('uniqExact', 'Map'), 'stochasticLogisticRegressionMap': ('stochasticLogisticRegression', 'Map'), 'quantileTimingMap': ('quantileTiming', 'Map'), 'stochasticLinearRegressionMap': ('stochasticLinearRegression', 'Map'), 'quantileExactMap': ('quantileExact', 'Map'), 'kurtSampMap': ('kurtSamp', 'Map'), 'histogramMap': ('histogram', 'Map'), 'anyMap': ('any', 'Map'), 'uniqMap': ('uniq', 'Map'), 'cramersVMap': ('cramersV', 'Map'), 'cramersVBiasCorrectedMap': ('cramersVBiasCorrected', 'Map'), 'intervalLengthSumMap': ('intervalLengthSum', 'Map'), 'contingencyMap': ('contingency', 'Map'), 'groupBitXorMap': ('groupBitXor', 'Map'), 'topKWeightedMap': ('topKWeighted', 'Map'), 'sumMap': ('sumMap', ''), 'minMap': ('minMap', ''), 'quantilesExactHighMap': ('quantilesExactHigh', 'Map'), 'kolmogorovSmirnovTestMap': ('kolmogorovSmirnovTest', 'Map'), 'maxIntersectionsPositionMap': ('maxIntersectionsPosition', 'Map'), 'maxMapMap': ('maxMap', 'Map'), 'quantilesExactLowMap': ('quantilesExactLow', 'Map'), 'deltaSumTimestampMap': ('deltaSumTimestamp', 'Map'), 'sumMapMap': ('sumMap', 'Map'), 'rankCorrMap': ('rankCorr', 'Map'), 'quantileTDigestWeightedSimpleState': ('quantileTDigestWeighted', 'SimpleState'), 'entropySimpleState': ('entropy', 'SimpleState'), 'quantileInterpolatedWeightedSimpleState': ('quantileInterpolatedWeighted', 'SimpleState'), 'groupBitmapAndSimpleState': ('groupBitmapAnd', 'SimpleState'), 'first_valueSimpleState': ('first_value', 'SimpleState'), 'groupBitmapXorSimpleState': ('groupBitmapXor', 'SimpleState'), 'argMaxSimpleState': ('argMax', 'SimpleState'), 'quantileBFloat16WeightedSimpleState': ('quantileBFloat16Weighted', 'SimpleState'), 'minMapSimpleState': ('minMap', 'SimpleState'), 'quantilesInterpolatedWeightedSimpleState': ('quantilesInterpolatedWeighted', 'SimpleState'), 'kurtPopSimpleState': ('kurtPop', 'SimpleState'), 'quantilesTimingSimpleState': ('quantilesTiming', 'SimpleState'), 'quantilesDeterministicSimpleState': ('quantilesDeterministic', 'SimpleState'), 'quantileGKSimpleState': ('quantileGK', 'SimpleState'), 'corrSimpleState': ('corr', 'SimpleState'), 'avgSimpleState': ('avg', 'SimpleState'), 'anyLastSimpleState': ('anyLast', 'SimpleState'), 'argMinSimpleState': ('argMin', 'SimpleState'), 'quantileExactLowSimpleState': ('quantileExactLow', 'SimpleState'), 'covarSampSimpleState': ('covarSamp', 'SimpleState'), 'sparkBarSimpleState': ('sparkBar', 'SimpleState'), 'sumCountSimpleState': ('sumCount', 'SimpleState'), 'countSimpleState': ('count', 'SimpleState'), 'stddevSampSimpleState': ('stddevSamp', 'SimpleState'), 'sequenceNextNodeSimpleState': ('sequenceNextNode', 'SimpleState'), 'mannWhitneyUTestSimpleState': ('mannWhitneyUTest', 'SimpleState'), 'studentTTestSimpleState': ('studentTTest', 'SimpleState'), 'sequenceCountSimpleState': ('sequenceCount', 'SimpleState'), 'stddevPopSimpleState': ('stddevPop', 'SimpleState'), 'quantilesExactExclusiveSimpleState': ('quantilesExactExclusive', 'SimpleState'), 'sumWithOverflowSimpleState': ('sumWithOverflow', 'SimpleState'), 'maxSimpleState': ('max', 'SimpleState'), 'sequenceMatchSimpleState': ('sequenceMatch', 'SimpleState'), 'groupBitmapSimpleState': ('groupBitmap', 'SimpleState'), 'meanZTestSimpleState': ('meanZTest', 'SimpleState'), 'topKSimpleState': ('topK', 'SimpleState'), 'anyHeavySimpleState': ('anyHeavy', 'SimpleState'), 'groupArrayMovingAvgSimpleState': ('groupArrayMovingAvg', 'SimpleState'), 'varSampSimpleState': ('varSamp', 'SimpleState'), 'medianSimpleState': ('median', 'SimpleState'), 'exponentialMovingAverageSimpleState': ('exponentialMovingAverage', 'SimpleState'), 'deltaSumSimpleState': ('deltaSum', 'SimpleState'), 'groupArrayMovingSumSimpleState': ('groupArrayMovingSum', 'SimpleState'), 'groupUniqArraySimpleState': ('groupUniqArray', 'SimpleState'), 'quantileSimpleState': ('quantile', 'SimpleState'), 'quantileBFloat16SimpleState': ('quantileBFloat16', 'SimpleState'), 'boundingRatioSimpleState': ('boundingRatio', 'SimpleState'), 'quantilesTDigestSimpleState': ('quantilesTDigest', 'SimpleState'), 'groupArrayInsertAtSimpleState': ('groupArrayInsertAt', 'SimpleState'), 'groupBitOrSimpleState': ('groupBitOr', 'SimpleState'), 'quantilesBFloat16WeightedSimpleState': ('quantilesBFloat16Weighted', 'SimpleState'), 'quantileDeterministicSimpleState': ('quantileDeterministic', 'SimpleState'), 'quantilesTimingWeightedSimpleState': ('quantilesTimingWeighted', 'SimpleState'), 'maxIntersectionsSimpleState': ('maxIntersections', 'SimpleState'), 'uniqUpToSimpleState': ('uniqUpTo', 'SimpleState'), 'quantilesGKSimpleState': ('quantilesGK', 'SimpleState'), 'varPopSimpleState': ('varPop', 'SimpleState'), 'groupArrayLastSimpleState': ('groupArrayLast', 'SimpleState'), 'groupArraySimpleState': ('groupArray', 'SimpleState'), 'retentionSimpleState': ('retention', 'SimpleState'), 'quantilesExactWeightedSimpleState': ('quantilesExactWeighted', 'SimpleState'), 'groupArraySampleSimpleState': ('groupArraySample', 'SimpleState'), 'uniqHLL12SimpleState': ('uniqHLL12', 'SimpleState'), 'simpleLinearRegressionSimpleState': ('simpleLinearRegression', 'SimpleState'), 'sumKahanSimpleState': ('sumKahan', 'SimpleState'), 'quantileTDigestSimpleState': ('quantileTDigest', 'SimpleState'), 'quantileTimingWeightedSimpleState': ('quantileTimingWeighted', 'SimpleState'), 'last_valueSimpleState': ('last_value', 'SimpleState'), 'quantilesTDigestWeightedSimpleState': ('quantilesTDigestWeighted', 'SimpleState'), 'skewPopSimpleState': ('skewPop', 'SimpleState'), 'largestTriangleThreeBucketsSimpleState': ('largestTriangleThreeBuckets', 'SimpleState'), 'quantilesExactSimpleState': ('quantilesExact', 'SimpleState'), 'groupBitmapOrSimpleState': ('groupBitmapOr', 'SimpleState'), 'quantilesBFloat16SimpleState': ('quantilesBFloat16', 'SimpleState'), 'approx_top_sumSimpleState': ('approx_top_sum', 'SimpleState'), 'groupBitAndSimpleState': ('groupBitAnd', 'SimpleState'), 'covarPopSimpleState': ('covarPop', 'SimpleState'), 'uniqThetaSimpleState': ('uniqTheta', 'SimpleState'), 'avgWeightedSimpleState': ('avgWeighted', 'SimpleState'), 'quantileExactWeightedSimpleState': ('quantileExactWeighted', 'SimpleState'), 'exponentialTimeDecayedAvgSimpleState': ('exponentialTimeDecayedAvg', 'SimpleState'), 'theilsUSimpleState': ('theilsU', 'SimpleState'), 'welchTTestSimpleState': ('welchTTest', 'SimpleState'), 'categoricalInformationValueSimpleState': ('categoricalInformationValue', 'SimpleState'), 'quantilesSimpleState': ('quantiles', 'SimpleState'), 'skewSampSimpleState': ('skewSamp', 'SimpleState'), 'quantileExactHighSimpleState': ('quantileExactHigh', 'SimpleState'), 'windowFunnelSimpleState': ('windowFunnel', 'SimpleState'), 'uniqCombined64SimpleState': ('uniqCombined64', 'SimpleState'), 'uniqCombinedSimpleState': ('uniqCombined', 'SimpleState'), 'uniqExactSimpleState': ('uniqExact', 'SimpleState'), 'stochasticLogisticRegressionSimpleState': ('stochasticLogisticRegression', 'SimpleState'), 'quantileTimingSimpleState': ('quantileTiming', 'SimpleState'), 'stochasticLinearRegressionSimpleState': ('stochasticLinearRegression', 'SimpleState'), 'quantileExactSimpleState': ('quantileExact', 'SimpleState'), 'kurtSampSimpleState': ('kurtSamp', 'SimpleState'), 'histogramSimpleState': ('histogram', 'SimpleState'), 'anySimpleState': ('any', 'SimpleState'), 'uniqSimpleState': ('uniq', 'SimpleState'), 'cramersVSimpleState': ('cramersV', 'SimpleState'), 'cramersVBiasCorrectedSimpleState': ('cramersVBiasCorrected', 'SimpleState'), 'intervalLengthSumSimpleState': ('intervalLengthSum', 'SimpleState'), 'contingencySimpleState': ('contingency', 'SimpleState'), 'groupBitXorSimpleState': ('groupBitXor', 'SimpleState'), 'topKWeightedSimpleState': ('topKWeighted', 'SimpleState'), 'sumSimpleState': ('sum', 'SimpleState'), 'minSimpleState': ('min', 'SimpleState'), 'quantilesExactHighSimpleState': ('quantilesExactHigh', 'SimpleState'), 'kolmogorovSmirnovTestSimpleState': ('kolmogorovSmirnovTest', 'SimpleState'), 'maxIntersectionsPositionSimpleState': ('maxIntersectionsPosition', 'SimpleState'), 'maxMapSimpleState': ('maxMap', 'SimpleState'), 'quantilesExactLowSimpleState': ('quantilesExactLow', 'SimpleState'), 'deltaSumTimestampSimpleState': ('deltaSumTimestamp', 'SimpleState'), 'sumMapSimpleState': ('sumMap', 'SimpleState'), 'rankCorrSimpleState': ('rankCorr', 'SimpleState'), 'quantileTDigestWeightedState': ('quantileTDigestWeighted', 'State'), 'entropyState': ('entropy', 'State'), 'quantileInterpolatedWeightedState': ('quantileInterpolatedWeighted', 'State'), 'groupBitmapAndState': ('groupBitmapAnd', 'State'), 'first_valueState': ('first_value', 'State'), 'groupBitmapXorState': ('groupBitmapXor', 'State'), 'argMaxState': ('argMax', 'State'), 'quantileBFloat16WeightedState': ('quantileBFloat16Weighted', 'State'), 'minMapState': ('minMap', 'State'), 'quantilesInterpolatedWeightedState': ('quantilesInterpolatedWeighted', 'State'), 'kurtPopState': ('kurtPop', 'State'), 'quantilesTimingState': ('quantilesTiming', 'State'), 'quantilesDeterministicState': ('quantilesDeterministic', 'State'), 'quantileGKState': ('quantileGK', 'State'), 'corrState': ('corr', 'State'), 'avgState': ('avg', 'State'), 'anyLastState': ('anyLast', 'State'), 'argMinState': ('argMin', 'State'), 'quantileExactLowState': ('quantileExactLow', 'State'), 'covarSampState': ('covarSamp', 'State'), 'sparkBarState': ('sparkBar', 'State'), 'sumCountState': ('sumCount', 'State'), 'countState': ('count', 'State'), 'stddevSampState': ('stddevSamp', 'State'), 'sequenceNextNodeState': ('sequenceNextNode', 'State'), 'mannWhitneyUTestState': ('mannWhitneyUTest', 'State'), 'studentTTestState': ('studentTTest', 'State'), 'sequenceCountState': ('sequenceCount', 'State'), 'stddevPopState': ('stddevPop', 'State'), 'quantilesExactExclusiveState': ('quantilesExactExclusive', 'State'), 'sumWithOverflowState': ('sumWithOverflow', 'State'), 'maxState': ('max', 'State'), 'sequenceMatchState': ('sequenceMatch', 'State'), 'groupBitmapState': ('groupBitmap', 'State'), 'meanZTestState': ('meanZTest', 'State'), 'topKState': ('topK', 'State'), 'anyHeavyState': ('anyHeavy', 'State'), 'groupArrayMovingAvgState': ('groupArrayMovingAvg', 'State'), 'varSampState': ('varSamp', 'State'), 'medianState': ('median', 'State'), 'exponentialMovingAverageState': ('exponentialMovingAverage', 'State'), 'deltaSumState': ('deltaSum', 'State'), 'groupArrayMovingSumState': ('groupArrayMovingSum', 'State'), 'groupUniqArrayState': ('groupUniqArray', 'State'), 'quantileState': ('quantile', 'State'), 'quantileBFloat16State': ('quantileBFloat16', 'State'), 'boundingRatioState': ('boundingRatio', 'State'), 'quantilesTDigestState': ('quantilesTDigest', 'State'), 'groupArrayInsertAtState': ('groupArrayInsertAt', 'State'), 'groupBitOrState': ('groupBitOr', 'State'), 'quantilesBFloat16WeightedState': ('quantilesBFloat16Weighted', 'State'), 'quantileDeterministicState': ('quantileDeterministic', 'State'), 'quantilesTimingWeightedState': ('quantilesTimingWeighted', 'State'), 'maxIntersectionsState': ('maxIntersections', 'State'), 'uniqUpToState': ('uniqUpTo', 'State'), 'quantilesGKState': ('quantilesGK', 'State'), 'varPopState': ('varPop', 'State'), 'groupArrayLastState': ('groupArrayLast', 'State'), 'groupArrayState': ('groupArray', 'State'), 'retentionState': ('retention', 'State'), 'quantilesExactWeightedState': ('quantilesExactWeighted', 'State'), 'groupArraySampleState': ('groupArraySample', 'State'), 'uniqHLL12State': ('uniqHLL12', 'State'), 'simpleLinearRegressionState': ('simpleLinearRegression', 'State'), 'sumKahanState': ('sumKahan', 'State'), 'quantileTDigestState': ('quantileTDigest', 'State'), 'quantileTimingWeightedState': ('quantileTimingWeighted', 'State'), 'last_valueState': ('last_value', 'State'), 'quantilesTDigestWeightedState': ('quantilesTDigestWeighted', 'State'), 'skewPopState': ('skewPop', 'State'), 'largestTriangleThreeBucketsState': ('largestTriangleThreeBuckets', 'State'), 'quantilesExactState': ('quantilesExact', 'State'), 'groupBitmapOrState': ('groupBitmapOr', 'State'), 'quantilesBFloat16State': ('quantilesBFloat16', 'State'), 'approx_top_sumState': ('approx_top_sum', 'State'), 'groupBitAndState': ('groupBitAnd', 'State'), 'covarPopState': ('covarPop', 'State'), 'uniqThetaState': ('uniqTheta', 'State'), 'avgWeightedState': ('avgWeighted', 'State'), 'quantileExactWeightedState': ('quantileExactWeighted', 'State'), 'exponentialTimeDecayedAvgState': ('exponentialTimeDecayedAvg', 'State'), 'theilsUState': ('theilsU', 'State'), 'welchTTestState': ('welchTTest', 'State'), 'categoricalInformationValueState': ('categoricalInformationValue', 'State'), 'quantilesState': ('quantiles', 'State'), 'skewSampState': ('skewSamp', 'State'), 'quantileExactHighState': ('quantileExactHigh', 'State'), 'windowFunnelState': ('windowFunnel', 'State'), 'uniqCombined64State': ('uniqCombined64', 'State'), 'uniqCombinedState': ('uniqCombined', 'State'), 'uniqExactState': ('uniqExact', 'State'), 'stochasticLogisticRegressionState': ('stochasticLogisticRegression', 'State'), 'quantileTimingState': ('quantileTiming', 'State'), 'stochasticLinearRegressionState': ('stochasticLinearRegression', 'State'), 'quantileExactState': ('quantileExact', 'State'), 'kurtSampState': ('kurtSamp', 'State'), 'histogramState': ('histogram', 'State'), 'anyState': ('any', 'State'), 'uniqState': ('uniq', 'State'), 'cramersVState': ('cramersV', 'State'), 'cramersVBiasCorrectedState': ('cramersVBiasCorrected', 'State'), 'intervalLengthSumState': ('intervalLengthSum', 'State'), 'contingencyState': ('contingency', 'State'), 'groupBitXorState': ('groupBitXor', 'State'), 'topKWeightedState': ('topKWeighted', 'State'), 'sumState': ('sum', 'State'), 'minState': ('min', 'State'), 'quantilesExactHighState': ('quantilesExactHigh', 'State'), 'kolmogorovSmirnovTestState': ('kolmogorovSmirnovTest', 'State'), 'maxIntersectionsPositionState': ('maxIntersectionsPosition', 'State'), 'maxMapState': ('maxMap', 'State'), 'quantilesExactLowState': ('quantilesExactLow', 'State'), 'deltaSumTimestampState': ('deltaSumTimestamp', 'State'), 'sumMapState': ('sumMap', 'State'), 'rankCorrState': ('rankCorr', 'State'), 'quantileTDigestWeightedMerge': ('quantileTDigestWeighted', 'Merge'), 'entropyMerge': ('entropy', 'Merge'), 'quantileInterpolatedWeightedMerge': ('quantileInterpolatedWeighted', 'Merge'), 'groupBitmapAndMerge': ('groupBitmapAnd', 'Merge'), 'first_valueMerge': ('first_value', 'Merge'), 'groupBitmapXorMerge': ('groupBitmapXor', 'Merge'), 'argMaxMerge': ('argMax', 'Merge'), 'quantileBFloat16WeightedMerge': ('quantileBFloat16Weighted', 'Merge'), 'minMapMerge': ('minMap', 'Merge'), 'quantilesInterpolatedWeightedMerge': ('quantilesInterpolatedWeighted', 'Merge'), 'kurtPopMerge': ('kurtPop', 'Merge'), 'quantilesTimingMerge': ('quantilesTiming', 'Merge'), 'quantilesDeterministicMerge': ('quantilesDeterministic', 'Merge'), 'quantileGKMerge': ('quantileGK', 'Merge'), 'corrMerge': ('corr', 'Merge'), 'avgMerge': ('avg', 'Merge'), 'anyLastMerge': ('anyLast', 'Merge'), 'argMinMerge': ('argMin', 'Merge'), 'quantileExactLowMerge': ('quantileExactLow', 'Merge'), 'covarSampMerge': ('covarSamp', 'Merge'), 'sparkBarMerge': ('sparkBar', 'Merge'), 'sumCountMerge': ('sumCount', 'Merge'), 'countMerge': ('count', 'Merge'), 'stddevSampMerge': ('stddevSamp', 'Merge'), 'sequenceNextNodeMerge': ('sequenceNextNode', 'Merge'), 'mannWhitneyUTestMerge': ('mannWhitneyUTest', 'Merge'), 'studentTTestMerge': ('studentTTest', 'Merge'), 'sequenceCountMerge': ('sequenceCount', 'Merge'), 'stddevPopMerge': ('stddevPop', 'Merge'), 'quantilesExactExclusiveMerge': ('quantilesExactExclusive', 'Merge'), 'sumWithOverflowMerge': ('sumWithOverflow', 'Merge'), 'maxMerge': ('max', 'Merge'), 'sequenceMatchMerge': ('sequenceMatch', 'Merge'), 'groupBitmapMerge': ('groupBitmap', 'Merge'), 'meanZTestMerge': ('meanZTest', 'Merge'), 'topKMerge': ('topK', 'Merge'), 'anyHeavyMerge': ('anyHeavy', 'Merge'), 'groupArrayMovingAvgMerge': ('groupArrayMovingAvg', 'Merge'), 'varSampMerge': ('varSamp', 'Merge'), 'medianMerge': ('median', 'Merge'), 'exponentialMovingAverageMerge': ('exponentialMovingAverage', 'Merge'), 'deltaSumMerge': ('deltaSum', 'Merge'), 'groupArrayMovingSumMerge': ('groupArrayMovingSum', 'Merge'), 'groupUniqArrayMerge': ('groupUniqArray', 'Merge'), 'quantileMerge': ('quantile', 'Merge'), 'quantileBFloat16Merge': ('quantileBFloat16', 'Merge'), 'boundingRatioMerge': ('boundingRatio', 'Merge'), 'quantilesTDigestMerge': ('quantilesTDigest', 'Merge'), 'groupArrayInsertAtMerge': ('groupArrayInsertAt', 'Merge'), 'groupBitOrMerge': ('groupBitOr', 'Merge'), 'quantilesBFloat16WeightedMerge': ('quantilesBFloat16Weighted', 'Merge'), 'quantileDeterministicMerge': ('quantileDeterministic', 'Merge'), 'quantilesTimingWeightedMerge': ('quantilesTimingWeighted', 'Merge'), 'maxIntersectionsMerge': ('maxIntersections', 'Merge'), 'uniqUpToMerge': ('uniqUpTo', 'Merge'), 'quantilesGKMerge': ('quantilesGK', 'Merge'), 'varPopMerge': ('varPop', 'Merge'), 'groupArrayLastMerge': ('groupArrayLast', 'Merge'), 'groupArrayMerge': ('groupArray', 'Merge'), 'retentionMerge': ('retention', 'Merge'), 'quantilesExactWeightedMerge': ('quantilesExactWeighted', 'Merge'), 'groupArraySampleMerge': ('groupArraySample', 'Merge'), 'uniqHLL12Merge': ('uniqHLL12', 'Merge'), 'simpleLinearRegressionMerge': ('simpleLinearRegression', 'Merge'), 'sumKahanMerge': ('sumKahan', 'Merge'), 'quantileTDigestMerge': ('quantileTDigest', 'Merge'), 'quantileTimingWeightedMerge': ('quantileTimingWeighted', 'Merge'), 'last_valueMerge': ('last_value', 'Merge'), 'quantilesTDigestWeightedMerge': ('quantilesTDigestWeighted', 'Merge'), 'skewPopMerge': ('skewPop', 'Merge'), 'largestTriangleThreeBucketsMerge': ('largestTriangleThreeBuckets', 'Merge'), 'quantilesExactMerge': ('quantilesExact', 'Merge'), 'groupBitmapOrMerge': ('groupBitmapOr', 'Merge'), 'quantilesBFloat16Merge': ('quantilesBFloat16', 'Merge'), 'approx_top_sumMerge': ('approx_top_sum', 'Merge'), 'groupBitAndMerge': ('groupBitAnd', 'Merge'), 'covarPopMerge': ('covarPop', 'Merge'), 'uniqThetaMerge': ('uniqTheta', 'Merge'), 'avgWeightedMerge': ('avgWeighted', 'Merge'), 'quantileExactWeightedMerge': ('quantileExactWeighted', 'Merge'), 'exponentialTimeDecayedAvgMerge': ('exponentialTimeDecayedAvg', 'Merge'), 'theilsUMerge': ('theilsU', 'Merge'), 'welchTTestMerge': ('welchTTest', 'Merge'), 'categoricalInformationValueMerge': ('categoricalInformationValue', 'Merge'), 'quantilesMerge': ('quantiles', 'Merge'), 'skewSampMerge': ('skewSamp', 'Merge'), 'quantileExactHighMerge': ('quantileExactHigh', 'Merge'), 'windowFunnelMerge': ('windowFunnel', 'Merge'), 'uniqCombined64Merge': ('uniqCombined64', 'Merge'), 'uniqCombinedMerge': ('uniqCombined', 'Merge'), 'uniqExactMerge': ('uniqExact', 'Merge'), 'stochasticLogisticRegressionMerge': ('stochasticLogisticRegression', 'Merge'), 'quantileTimingMerge': ('quantileTiming', 'Merge'), 'stochasticLinearRegressionMerge': ('stochasticLinearRegression', 'Merge'), 'quantileExactMerge': ('quantileExact', 'Merge'), 'kurtSampMerge': ('kurtSamp', 'Merge'), 'histogramMerge': ('histogram', 'Merge'), 'anyMerge': ('any', 'Merge'), 'uniqMerge': ('uniq', 'Merge'), 'cramersVMerge': ('cramersV', 'Merge'), 'cramersVBiasCorrectedMerge': ('cramersVBiasCorrected', 'Merge'), 'intervalLengthSumMerge': ('intervalLengthSum', 'Merge'), 'contingencyMerge': ('contingency', 'Merge'), 'groupBitXorMerge': ('groupBitXor', 'Merge'), 'topKWeightedMerge': ('topKWeighted', 'Merge'), 'sumMerge': ('sum', 'Merge'), 'minMerge': ('min', 'Merge'), 'quantilesExactHighMerge': ('quantilesExactHigh', 'Merge'), 'kolmogorovSmirnovTestMerge': ('kolmogorovSmirnovTest', 'Merge'), 'maxIntersectionsPositionMerge': ('maxIntersectionsPosition', 'Merge'), 'maxMapMerge': ('maxMap', 'Merge'), 'quantilesExactLowMerge': ('quantilesExactLow', 'Merge'), 'deltaSumTimestampMerge': ('deltaSumTimestamp', 'Merge'), 'sumMapMerge': ('sumMap', 'Merge'), 'rankCorrMerge': ('rankCorr', 'Merge'), 'quantileTDigestWeightedMergeState': ('quantileTDigestWeighted', 'MergeState'), 'entropyMergeState': ('entropy', 'MergeState'), 'quantileInterpolatedWeightedMergeState': ('quantileInterpolatedWeighted', 'MergeState'), 'groupBitmapAndMergeState': ('groupBitmapAnd', 'MergeState'), 'first_valueMergeState': ('first_value', 'MergeState'), 'groupBitmapXorMergeState': ('groupBitmapXor', 'MergeState'), 'argMaxMergeState': ('argMax', 'MergeState'), 'quantileBFloat16WeightedMergeState': ('quantileBFloat16Weighted', 'MergeState'), 'minMapMergeState': ('minMap', 'MergeState'), 'quantilesInterpolatedWeightedMergeState': ('quantilesInterpolatedWeighted', 'MergeState'), 'kurtPopMergeState': ('kurtPop', 'MergeState'), 'quantilesTimingMergeState': ('quantilesTiming', 'MergeState'), 'quantilesDeterministicMergeState': ('quantilesDeterministic', 'MergeState'), 'quantileGKMergeState': ('quantileGK', 'MergeState'), 'corrMergeState': ('corr', 'MergeState'), 'avgMergeState': ('avg', 'MergeState'), 'anyLastMergeState': ('anyLast', 'MergeState'), 'argMinMergeState': ('argMin', 'MergeState'), 'quantileExactLowMergeState': ('quantileExactLow', 'MergeState'), 'covarSampMergeState': ('covarSamp', 'MergeState'), 'sparkBarMergeState': ('sparkBar', 'MergeState'), 'sumCountMergeState': ('sumCount', 'MergeState'), 'countMergeState': ('count', 'MergeState'), 'stddevSampMergeState': ('stddevSamp', 'MergeState'), 'sequenceNextNodeMergeState': ('sequenceNextNode', 'MergeState'), 'mannWhitneyUTestMergeState': ('mannWhitneyUTest', 'MergeState'), 'studentTTestMergeState': ('studentTTest', 'MergeState'), 'sequenceCountMergeState': ('sequenceCount', 'MergeState'), 'stddevPopMergeState': ('stddevPop', 'MergeState'), 'quantilesExactExclusiveMergeState': ('quantilesExactExclusive', 'MergeState'), 'sumWithOverflowMergeState': ('sumWithOverflow', 'MergeState'), 'maxMergeState': ('max', 'MergeState'), 'sequenceMatchMergeState': ('sequenceMatch', 'MergeState'), 'groupBitmapMergeState': ('groupBitmap', 'MergeState'), 'meanZTestMergeState': ('meanZTest', 'MergeState'), 'topKMergeState': ('topK', 'MergeState'), 'anyHeavyMergeState': ('anyHeavy', 'MergeState'), 'groupArrayMovingAvgMergeState': ('groupArrayMovingAvg', 'MergeState'), 'varSampMergeState': ('varSamp', 'MergeState'), 'medianMergeState': ('median', 'MergeState'), 'exponentialMovingAverageMergeState': ('exponentialMovingAverage', 'MergeState'), 'deltaSumMergeState': ('deltaSum', 'MergeState'), 'groupArrayMovingSumMergeState': ('groupArrayMovingSum', 'MergeState'), 'groupUniqArrayMergeState': ('groupUniqArray', 'MergeState'), 'quantileMergeState': ('quantile', 'MergeState'), 'quantileBFloat16MergeState': ('quantileBFloat16', 'MergeState'), 'boundingRatioMergeState': ('boundingRatio', 'MergeState'), 'quantilesTDigestMergeState': ('quantilesTDigest', 'MergeState'), 'groupArrayInsertAtMergeState': ('groupArrayInsertAt', 'MergeState'), 'groupBitOrMergeState': ('groupBitOr', 'MergeState'), 'quantilesBFloat16WeightedMergeState': ('quantilesBFloat16Weighted', 'MergeState'), 'quantileDeterministicMergeState': ('quantileDeterministic', 'MergeState'), 'quantilesTimingWeightedMergeState': ('quantilesTimingWeighted', 'MergeState'), 'maxIntersectionsMergeState': ('maxIntersections', 'MergeState'), 'uniqUpToMergeState': ('uniqUpTo', 'MergeState'), 'quantilesGKMergeState': ('quantilesGK', 'MergeState'), 'varPopMergeState': ('varPop', 'MergeState'), 'groupArrayLastMergeState': ('groupArrayLast', 'MergeState'), 'groupArrayMergeState': ('groupArray', 'MergeState'), 'retentionMergeState': ('retention', 'MergeState'), 'quantilesExactWeightedMergeState': ('quantilesExactWeighted', 'MergeState'), 'groupArraySampleMergeState': ('groupArraySample', 'MergeState'), 'uniqHLL12MergeState': ('uniqHLL12', 'MergeState'), 'simpleLinearRegressionMergeState': ('simpleLinearRegression', 'MergeState'), 'sumKahanMergeState': ('sumKahan', 'MergeState'), 'quantileTDigestMergeState': ('quantileTDigest', 'MergeState'), 'quantileTimingWeightedMergeState': ('quantileTimingWeighted', 'MergeState'), 'last_valueMergeState': ('last_value', 'MergeState'), 'quantilesTDigestWeightedMergeState': ('quantilesTDigestWeighted', 'MergeState'), 'skewPopMergeState': ('skewPop', 'MergeState'), 'largestTriangleThreeBucketsMergeState': ('largestTriangleThreeBuckets', 'MergeState'), 'quantilesExactMergeState': ('quantilesExact', 'MergeState'), 'groupBitmapOrMergeState': ('groupBitmapOr', 'MergeState'), 'quantilesBFloat16MergeState': ('quantilesBFloat16', 'MergeState'), 'approx_top_sumMergeState': ('approx_top_sum', 'MergeState'), 'groupBitAndMergeState': ('groupBitAnd', 'MergeState'), 'covarPopMergeState': ('covarPop', 'MergeState'), 'uniqThetaMergeState': ('uniqTheta', 'MergeState'), 'avgWeightedMergeState': ('avgWeighted', 'MergeState'), 'quantileExactWeightedMergeState': ('quantileExactWeighted', 'MergeState'), 'exponentialTimeDecayedAvgMergeState': ('exponentialTimeDecayedAvg', 'MergeState'), 'theilsUMergeState': ('theilsU', 'MergeState'), 'welchTTestMergeState': ('welchTTest', 'MergeState'), 'categoricalInformationValueMergeState': ('categoricalInformationValue', 'MergeState'), 'quantilesMergeState': ('quantiles', 'MergeState'), 'skewSampMergeState': ('skewSamp', 'MergeState'), 'quantileExactHighMergeState': ('quantileExactHigh', 'MergeState'), 'windowFunnelMergeState': ('windowFunnel', 'MergeState'), 'uniqCombined64MergeState': ('uniqCombined64', 'MergeState'), 'uniqCombinedMergeState': ('uniqCombined', 'MergeState'), 'uniqExactMergeState': ('uniqExact', 'MergeState'), 'stochasticLogisticRegressionMergeState': ('stochasticLogisticRegression', 'MergeState'), 'quantileTimingMergeState': ('quantileTiming', 'MergeState'), 'stochasticLinearRegressionMergeState': ('stochasticLinearRegression', 'MergeState'), 'quantileExactMergeState': ('quantileExact', 'MergeState'), 'kurtSampMergeState': ('kurtSamp', 'MergeState'), 'histogramMergeState': ('histogram', 'MergeState'), 'anyMergeState': ('any', 'MergeState'), 'uniqMergeState': ('uniq', 'MergeState'), 'cramersVMergeState': ('cramersV', 'MergeState'), 'cramersVBiasCorrectedMergeState': ('cramersVBiasCorrected', 'MergeState'), 'intervalLengthSumMergeState': ('intervalLengthSum', 'MergeState'), 'contingencyMergeState': ('contingency', 'MergeState'), 'groupBitXorMergeState': ('groupBitXor', 'MergeState'), 'topKWeightedMergeState': ('topKWeighted', 'MergeState'), 'sumMergeState': ('sum', 'MergeState'), 'minMergeState': ('min', 'MergeState'), 'quantilesExactHighMergeState': ('quantilesExactHigh', 'MergeState'), 'kolmogorovSmirnovTestMergeState': ('kolmogorovSmirnovTest', 'MergeState'), 'maxIntersectionsPositionMergeState': ('maxIntersectionsPosition', 'MergeState'), 'maxMapMergeState': ('maxMap', 'MergeState'), 'quantilesExactLowMergeState': ('quantilesExactLow', 'MergeState'), 'deltaSumTimestampMergeState': ('deltaSumTimestamp', 'MergeState'), 'sumMapMergeState': ('sumMap', 'MergeState'), 'rankCorrMergeState': ('rankCorr', 'MergeState'), 'quantileTDigestWeightedForEach': ('quantileTDigestWeighted', 'ForEach'), 'entropyForEach': ('entropy', 'ForEach'), 'quantileInterpolatedWeightedForEach': ('quantileInterpolatedWeighted', 'ForEach'), 'groupBitmapAndForEach': ('groupBitmapAnd', 'ForEach'), 'first_valueForEach': ('first_value', 'ForEach'), 'groupBitmapXorForEach': ('groupBitmapXor', 'ForEach'), 'argMaxForEach': ('argMax', 'ForEach'), 'quantileBFloat16WeightedForEach': ('quantileBFloat16Weighted', 'ForEach'), 'minMapForEach': ('minMap', 'ForEach'), 'quantilesInterpolatedWeightedForEach': ('quantilesInterpolatedWeighted', 'ForEach'), 'kurtPopForEach': ('kurtPop', 'ForEach'), 'quantilesTimingForEach': ('quantilesTiming', 'ForEach'), 'quantilesDeterministicForEach': ('quantilesDeterministic', 'ForEach'), 'quantileGKForEach': ('quantileGK', 'ForEach'), 'corrForEach': ('corr', 'ForEach'), 'avgForEach': ('avg', 'ForEach'), 'anyLastForEach': ('anyLast', 'ForEach'), 'argMinForEach': ('argMin', 'ForEach'), 'quantileExactLowForEach': ('quantileExactLow', 'ForEach'), 'covarSampForEach': ('covarSamp', 'ForEach'), 'sparkBarForEach': ('sparkBar', 'ForEach'), 'sumCountForEach': ('sumCount', 'ForEach'), 'countForEach': ('count', 'ForEach'), 'stddevSampForEach': ('stddevSamp', 'ForEach'), 'sequenceNextNodeForEach': ('sequenceNextNode', 'ForEach'), 'mannWhitneyUTestForEach': ('mannWhitneyUTest', 'ForEach'), 'studentTTestForEach': ('studentTTest', 'ForEach'), 'sequenceCountForEach': ('sequenceCount', 'ForEach'), 'stddevPopForEach': ('stddevPop', 'ForEach'), 'quantilesExactExclusiveForEach': ('quantilesExactExclusive', 'ForEach'), 'sumWithOverflowForEach': ('sumWithOverflow', 'ForEach'), 'maxForEach': ('max', 'ForEach'), 'sequenceMatchForEach': ('sequenceMatch', 'ForEach'), 'groupBitmapForEach': ('groupBitmap', 'ForEach'), 'meanZTestForEach': ('meanZTest', 'ForEach'), 'topKForEach': ('topK', 'ForEach'), 'anyHeavyForEach': ('anyHeavy', 'ForEach'), 'groupArrayMovingAvgForEach': ('groupArrayMovingAvg', 'ForEach'), 'varSampForEach': ('varSamp', 'ForEach'), 'medianForEach': ('median', 'ForEach'), 'exponentialMovingAverageForEach': ('exponentialMovingAverage', 'ForEach'), 'deltaSumForEach': ('deltaSum', 'ForEach'), 'groupArrayMovingSumForEach': ('groupArrayMovingSum', 'ForEach'), 'groupUniqArrayForEach': ('groupUniqArray', 'ForEach'), 'quantileForEach': ('quantile', 'ForEach'), 'quantileBFloat16ForEach': ('quantileBFloat16', 'ForEach'), 'boundingRatioForEach': ('boundingRatio', 'ForEach'), 'quantilesTDigestForEach': ('quantilesTDigest', 'ForEach'), 'groupArrayInsertAtForEach': ('groupArrayInsertAt', 'ForEach'), 'groupBitOrForEach': ('groupBitOr', 'ForEach'), 'quantilesBFloat16WeightedForEach': ('quantilesBFloat16Weighted', 'ForEach'), 'quantileDeterministicForEach': ('quantileDeterministic', 'ForEach'), 'quantilesTimingWeightedForEach': ('quantilesTimingWeighted', 'ForEach'), 'maxIntersectionsForEach': ('maxIntersections', 'ForEach'), 'uniqUpToForEach': ('uniqUpTo', 'ForEach'), 'quantilesGKForEach': ('quantilesGK', 'ForEach'), 'varPopForEach': ('varPop', 'ForEach'), 'groupArrayLastForEach': ('groupArrayLast', 'ForEach'), 'groupArrayForEach': ('groupArray', 'ForEach'), 'retentionForEach': ('retention', 'ForEach'), 'quantilesExactWeightedForEach': ('quantilesExactWeighted', 'ForEach'), 'groupArraySampleForEach': ('groupArraySample', 'ForEach'), 'uniqHLL12ForEach': ('uniqHLL12', 'ForEach'), 'simpleLinearRegressionForEach': ('simpleLinearRegression', 'ForEach'), 'sumKahanForEach': ('sumKahan', 'ForEach'), 'quantileTDigestForEach': ('quantileTDigest', 'ForEach'), 'quantileTimingWeightedForEach': ('quantileTimingWeighted', 'ForEach'), 'last_valueForEach': ('last_value', 'ForEach'), 'quantilesTDigestWeightedForEach': ('quantilesTDigestWeighted', 'ForEach'), 'skewPopForEach': ('skewPop', 'ForEach'), 'largestTriangleThreeBucketsForEach': ('largestTriangleThreeBuckets', 'ForEach'), 'quantilesExactForEach': ('quantilesExact', 'ForEach'), 'groupBitmapOrForEach': ('groupBitmapOr', 'ForEach'), 'quantilesBFloat16ForEach': ('quantilesBFloat16', 'ForEach'), 'approx_top_sumForEach': ('approx_top_sum', 'ForEach'), 'groupBitAndForEach': ('groupBitAnd', 'ForEach'), 'covarPopForEach': ('covarPop', 'ForEach'), 'uniqThetaForEach': ('uniqTheta', 'ForEach'), 'avgWeightedForEach': ('avgWeighted', 'ForEach'), 'quantileExactWeightedForEach': ('quantileExactWeighted', 'ForEach'), 'exponentialTimeDecayedAvgForEach': ('exponentialTimeDecayedAvg', 'ForEach'), 'theilsUForEach': ('theilsU', 'ForEach'), 'welchTTestForEach': ('welchTTest', 'ForEach'), 'categoricalInformationValueForEach': ('categoricalInformationValue', 'ForEach'), 'quantilesForEach': ('quantiles', 'ForEach'), 'skewSampForEach': ('skewSamp', 'ForEach'), 'quantileExactHighForEach': ('quantileExactHigh', 'ForEach'), 'windowFunnelForEach': ('windowFunnel', 'ForEach'), 'uniqCombined64ForEach': ('uniqCombined64', 'ForEach'), 'uniqCombinedForEach': ('uniqCombined', 'ForEach'), 'uniqExactForEach': ('uniqExact', 'ForEach'), 'stochasticLogisticRegressionForEach': ('stochasticLogisticRegression', 'ForEach'), 'quantileTimingForEach': ('quantileTiming', 'ForEach'), 'stochasticLinearRegressionForEach': ('stochasticLinearRegression', 'ForEach'), 'quantileExactForEach': ('quantileExact', 'ForEach'), 'kurtSampForEach': ('kurtSamp', 'ForEach'), 'histogramForEach': ('histogram', 'ForEach'), 'anyForEach': ('any', 'ForEach'), 'uniqForEach': ('uniq', 'ForEach'), 'cramersVForEach': ('cramersV', 'ForEach'), 'cramersVBiasCorrectedForEach': ('cramersVBiasCorrected', 'ForEach'), 'intervalLengthSumForEach': ('intervalLengthSum', 'ForEach'), 'contingencyForEach': ('contingency', 'ForEach'), 'groupBitXorForEach': ('groupBitXor', 'ForEach'), 'topKWeightedForEach': ('topKWeighted', 'ForEach'), 'sumForEach': ('sum', 'ForEach'), 'minForEach': ('min', 'ForEach'), 'quantilesExactHighForEach': ('quantilesExactHigh', 'ForEach'), 'kolmogorovSmirnovTestForEach': ('kolmogorovSmirnovTest', 'ForEach'), 'maxIntersectionsPositionForEach': ('maxIntersectionsPosition', 'ForEach'), 'maxMapForEach': ('maxMap', 'ForEach'), 'quantilesExactLowForEach': ('quantilesExactLow', 'ForEach'), 'deltaSumTimestampForEach': ('deltaSumTimestamp', 'ForEach'), 'sumMapForEach': ('sumMap', 'ForEach'), 'rankCorrForEach': ('rankCorr', 'ForEach'), 'quantileTDigestWeightedDistinct': ('quantileTDigestWeighted', 'Distinct'), 'entropyDistinct': ('entropy', 'Distinct'), 'quantileInterpolatedWeightedDistinct': ('quantileInterpolatedWeighted', 'Distinct'), 'groupBitmapAndDistinct': ('groupBitmapAnd', 'Distinct'), 'first_valueDistinct': ('first_value', 'Distinct'), 'groupBitmapXorDistinct': ('groupBitmapXor', 'Distinct'), 'argMaxDistinct': ('argMax', 'Distinct'), 'quantileBFloat16WeightedDistinct': ('quantileBFloat16Weighted', 'Distinct'), 'minMapDistinct': ('minMap', 'Distinct'), 'quantilesInterpolatedWeightedDistinct': ('quantilesInterpolatedWeighted', 'Distinct'), 'kurtPopDistinct': ('kurtPop', 'Distinct'), 'quantilesTimingDistinct': ('quantilesTiming', 'Distinct'), 'quantilesDeterministicDistinct': ('quantilesDeterministic', 'Distinct'), 'quantileGKDistinct': ('quantileGK', 'Distinct'), 'corrDistinct': ('corr', 'Distinct'), 'avgDistinct': ('avg', 'Distinct'), 'anyLastDistinct': ('anyLast', 'Distinct'), 'argMinDistinct': ('argMin', 'Distinct'), 'quantileExactLowDistinct': ('quantileExactLow', 'Distinct'), 'covarSampDistinct': ('covarSamp', 'Distinct'), 'sparkBarDistinct': ('sparkBar', 'Distinct'), 'sumCountDistinct': ('sumCount', 'Distinct'), 'countDistinct': ('count', 'Distinct'), 'stddevSampDistinct': ('stddevSamp', 'Distinct'), 'sequenceNextNodeDistinct': ('sequenceNextNode', 'Distinct'), 'mannWhitneyUTestDistinct': ('mannWhitneyUTest', 'Distinct'), 'studentTTestDistinct': ('studentTTest', 'Distinct'), 'sequenceCountDistinct': ('sequenceCount', 'Distinct'), 'stddevPopDistinct': ('stddevPop', 'Distinct'), 'quantilesExactExclusiveDistinct': ('quantilesExactExclusive', 'Distinct'), 'sumWithOverflowDistinct': ('sumWithOverflow', 'Distinct'), 'maxDistinct': ('max', 'Distinct'), 'sequenceMatchDistinct': ('sequenceMatch', 'Distinct'), 'groupBitmapDistinct': ('groupBitmap', 'Distinct'), 'meanZTestDistinct': ('meanZTest', 'Distinct'), 'topKDistinct': ('topK', 'Distinct'), 'anyHeavyDistinct': ('anyHeavy', 'Distinct'), 'groupArrayMovingAvgDistinct': ('groupArrayMovingAvg', 'Distinct'), 'varSampDistinct': ('varSamp', 'Distinct'), 'medianDistinct': ('median', 'Distinct'), 'exponentialMovingAverageDistinct': ('exponentialMovingAverage', 'Distinct'), 'deltaSumDistinct': ('deltaSum', 'Distinct'), 'groupArrayMovingSumDistinct': ('groupArrayMovingSum', 'Distinct'), 'groupUniqArrayDistinct': ('groupUniqArray', 'Distinct'), 'quantileDistinct': ('quantile', 'Distinct'), 'quantileBFloat16Distinct': ('quantileBFloat16', 'Distinct'), 'boundingRatioDistinct': ('boundingRatio', 'Distinct'), 'quantilesTDigestDistinct': ('quantilesTDigest', 'Distinct'), 'groupArrayInsertAtDistinct': ('groupArrayInsertAt', 'Distinct'), 'groupBitOrDistinct': ('groupBitOr', 'Distinct'), 'quantilesBFloat16WeightedDistinct': ('quantilesBFloat16Weighted', 'Distinct'), 'quantileDeterministicDistinct': ('quantileDeterministic', 'Distinct'), 'quantilesTimingWeightedDistinct': ('quantilesTimingWeighted', 'Distinct'), 'maxIntersectionsDistinct': ('maxIntersections', 'Distinct'), 'uniqUpToDistinct': ('uniqUpTo', 'Distinct'), 'quantilesGKDistinct': ('quantilesGK', 'Distinct'), 'varPopDistinct': ('varPop', 'Distinct'), 'groupArrayLastDistinct': ('groupArrayLast', 'Distinct'), 'groupArrayDistinct': ('groupArray', 'Distinct'), 'retentionDistinct': ('retention', 'Distinct'), 'quantilesExactWeightedDistinct': ('quantilesExactWeighted', 'Distinct'), 'groupArraySampleDistinct': ('groupArraySample', 'Distinct'), 'uniqHLL12Distinct': ('uniqHLL12', 'Distinct'), 'simpleLinearRegressionDistinct': ('simpleLinearRegression', 'Distinct'), 'sumKahanDistinct': ('sumKahan', 'Distinct'), 'quantileTDigestDistinct': ('quantileTDigest', 'Distinct'), 'quantileTimingWeightedDistinct': ('quantileTimingWeighted', 'Distinct'), 'last_valueDistinct': ('last_value', 'Distinct'), 'quantilesTDigestWeightedDistinct': ('quantilesTDigestWeighted', 'Distinct'), 'skewPopDistinct': ('skewPop', 'Distinct'), 'largestTriangleThreeBucketsDistinct': ('largestTriangleThreeBuckets', 'Distinct'), 'quantilesExactDistinct': ('quantilesExact', 'Distinct'), 'groupBitmapOrDistinct': ('groupBitmapOr', 'Distinct'), 'quantilesBFloat16Distinct': ('quantilesBFloat16', 'Distinct'), 'approx_top_sumDistinct': ('approx_top_sum', 'Distinct'), 'groupBitAndDistinct': ('groupBitAnd', 'Distinct'), 'covarPopDistinct': ('covarPop', 'Distinct'), 'uniqThetaDistinct': ('uniqTheta', 'Distinct'), 'avgWeightedDistinct': ('avgWeighted', 'Distinct'), 'quantileExactWeightedDistinct': ('quantileExactWeighted', 'Distinct'), 'exponentialTimeDecayedAvgDistinct': ('exponentialTimeDecayedAvg', 'Distinct'), 'theilsUDistinct': ('theilsU', 'Distinct'), 'welchTTestDistinct': ('welchTTest', 'Distinct'), 'categoricalInformationValueDistinct': ('categoricalInformationValue', 'Distinct'), 'quantilesDistinct': ('quantiles', 'Distinct'), 'skewSampDistinct': ('skewSamp', 'Distinct'), 'quantileExactHighDistinct': ('quantileExactHigh', 'Distinct'), 'windowFunnelDistinct': ('windowFunnel', 'Distinct'), 'uniqCombined64Distinct': ('uniqCombined64', 'Distinct'), 'uniqCombinedDistinct': ('uniqCombined', 'Distinct'), 'uniqExactDistinct': ('uniqExact', 'Distinct'), 'stochasticLogisticRegressionDistinct': ('stochasticLogisticRegression', 'Distinct'), 'quantileTimingDistinct': ('quantileTiming', 'Distinct'), 'stochasticLinearRegressionDistinct': ('stochasticLinearRegression', 'Distinct'), 'quantileExactDistinct': ('quantileExact', 'Distinct'), 'kurtSampDistinct': ('kurtSamp', 'Distinct'), 'histogramDistinct': ('histogram', 'Distinct'), 'anyDistinct': ('any', 'Distinct'), 'uniqDistinct': ('uniq', 'Distinct'), 'cramersVDistinct': ('cramersV', 'Distinct'), 'cramersVBiasCorrectedDistinct': ('cramersVBiasCorrected', 'Distinct'), 'intervalLengthSumDistinct': ('intervalLengthSum', 'Distinct'), 'contingencyDistinct': ('contingency', 'Distinct'), 'groupBitXorDistinct': ('groupBitXor', 'Distinct'), 'topKWeightedDistinct': ('topKWeighted', 'Distinct'), 'sumDistinct': ('sum', 'Distinct'), 'minDistinct': ('min', 'Distinct'), 'quantilesExactHighDistinct': ('quantilesExactHigh', 'Distinct'), 'kolmogorovSmirnovTestDistinct': ('kolmogorovSmirnovTest', 'Distinct'), 'maxIntersectionsPositionDistinct': ('maxIntersectionsPosition', 'Distinct'), 'maxMapDistinct': ('maxMap', 'Distinct'), 'quantilesExactLowDistinct': ('quantilesExactLow', 'Distinct'), 'deltaSumTimestampDistinct': ('deltaSumTimestamp', 'Distinct'), 'sumMapDistinct': ('sumMap', 'Distinct'), 'rankCorrDistinct': ('rankCorr', 'Distinct'), 'quantileTDigestWeightedOrDefault': ('quantileTDigestWeighted', 'OrDefault'), 'entropyOrDefault': ('entropy', 'OrDefault'), 'quantileInterpolatedWeightedOrDefault': ('quantileInterpolatedWeighted', 'OrDefault'), 'groupBitmapAndOrDefault': ('groupBitmapAnd', 'OrDefault'), 'first_valueOrDefault': ('first_value', 'OrDefault'), 'groupBitmapXorOrDefault': ('groupBitmapXor', 'OrDefault'), 'argMaxOrDefault': ('argMax', 'OrDefault'), 'quantileBFloat16WeightedOrDefault': ('quantileBFloat16Weighted', 'OrDefault'), 'minMapOrDefault': ('minMap', 'OrDefault'), 'quantilesInterpolatedWeightedOrDefault': ('quantilesInterpolatedWeighted', 'OrDefault'), 'kurtPopOrDefault': ('kurtPop', 'OrDefault'), 'quantilesTimingOrDefault': ('quantilesTiming', 'OrDefault'), 'quantilesDeterministicOrDefault': ('quantilesDeterministic', 'OrDefault'), 'quantileGKOrDefault': ('quantileGK', 'OrDefault'), 'corrOrDefault': ('corr', 'OrDefault'), 'avgOrDefault': ('avg', 'OrDefault'), 'anyLastOrDefault': ('anyLast', 'OrDefault'), 'argMinOrDefault': ('argMin', 'OrDefault'), 'quantileExactLowOrDefault': ('quantileExactLow', 'OrDefault'), 'covarSampOrDefault': ('covarSamp', 'OrDefault'), 'sparkBarOrDefault': ('sparkBar', 'OrDefault'), 'sumCountOrDefault': ('sumCount', 'OrDefault'), 'countOrDefault': ('count', 'OrDefault'), 'stddevSampOrDefault': ('stddevSamp', 'OrDefault'), 'sequenceNextNodeOrDefault': ('sequenceNextNode', 'OrDefault'), 'mannWhitneyUTestOrDefault': ('mannWhitneyUTest', 'OrDefault'), 'studentTTestOrDefault': ('studentTTest', 'OrDefault'), 'sequenceCountOrDefault': ('sequenceCount', 'OrDefault'), 'stddevPopOrDefault': ('stddevPop', 'OrDefault'), 'quantilesExactExclusiveOrDefault': ('quantilesExactExclusive', 'OrDefault'), 'sumWithOverflowOrDefault': ('sumWithOverflow', 'OrDefault'), 'maxOrDefault': ('max', 'OrDefault'), 'sequenceMatchOrDefault': ('sequenceMatch', 'OrDefault'), 'groupBitmapOrDefault': ('groupBitmap', 'OrDefault'), 'meanZTestOrDefault': ('meanZTest', 'OrDefault'), 'topKOrDefault': ('topK', 'OrDefault'), 'anyHeavyOrDefault': ('anyHeavy', 'OrDefault'), 'groupArrayMovingAvgOrDefault': ('groupArrayMovingAvg', 'OrDefault'), 'varSampOrDefault': ('varSamp', 'OrDefault'), 'medianOrDefault': ('median', 'OrDefault'), 'exponentialMovingAverageOrDefault': ('exponentialMovingAverage', 'OrDefault'), 'deltaSumOrDefault': ('deltaSum', 'OrDefault'), 'groupArrayMovingSumOrDefault': ('groupArrayMovingSum', 'OrDefault'), 'groupUniqArrayOrDefault': ('groupUniqArray', 'OrDefault'), 'quantileOrDefault': ('quantile', 'OrDefault'), 'quantileBFloat16OrDefault': ('quantileBFloat16', 'OrDefault'), 'boundingRatioOrDefault': ('boundingRatio', 'OrDefault'), 'quantilesTDigestOrDefault': ('quantilesTDigest', 'OrDefault'), 'groupArrayInsertAtOrDefault': ('groupArrayInsertAt', 'OrDefault'), 'groupBitOrOrDefault': ('groupBitOr', 'OrDefault'), 'quantilesBFloat16WeightedOrDefault': ('quantilesBFloat16Weighted', 'OrDefault'), 'quantileDeterministicOrDefault': ('quantileDeterministic', 'OrDefault'), 'quantilesTimingWeightedOrDefault': ('quantilesTimingWeighted', 'OrDefault'), 'maxIntersectionsOrDefault': ('maxIntersections', 'OrDefault'), 'uniqUpToOrDefault': ('uniqUpTo', 'OrDefault'), 'quantilesGKOrDefault': ('quantilesGK', 'OrDefault'), 'varPopOrDefault': ('varPop', 'OrDefault'), 'groupArrayLastOrDefault': ('groupArrayLast', 'OrDefault'), 'groupArrayOrDefault': ('groupArray', 'OrDefault'), 'retentionOrDefault': ('retention', 'OrDefault'), 'quantilesExactWeightedOrDefault': ('quantilesExactWeighted', 'OrDefault'), 'groupArraySampleOrDefault': ('groupArraySample', 'OrDefault'), 'uniqHLL12OrDefault': ('uniqHLL12', 'OrDefault'), 'simpleLinearRegressionOrDefault': ('simpleLinearRegression', 'OrDefault'), 'sumKahanOrDefault': ('sumKahan', 'OrDefault'), 'quantileTDigestOrDefault': ('quantileTDigest', 'OrDefault'), 'quantileTimingWeightedOrDefault': ('quantileTimingWeighted', 'OrDefault'), 'last_valueOrDefault': ('last_value', 'OrDefault'), 'quantilesTDigestWeightedOrDefault': ('quantilesTDigestWeighted', 'OrDefault'), 'skewPopOrDefault': ('skewPop', 'OrDefault'), 'largestTriangleThreeBucketsOrDefault': ('largestTriangleThreeBuckets', 'OrDefault'), 'quantilesExactOrDefault': ('quantilesExact', 'OrDefault'), 'groupBitmapOrOrDefault': ('groupBitmapOr', 'OrDefault'), 'quantilesBFloat16OrDefault': ('quantilesBFloat16', 'OrDefault'), 'approx_top_sumOrDefault': ('approx_top_sum', 'OrDefault'), 'groupBitAndOrDefault': ('groupBitAnd', 'OrDefault'), 'covarPopOrDefault': ('covarPop', 'OrDefault'), 'uniqThetaOrDefault': ('uniqTheta', 'OrDefault'), 'avgWeightedOrDefault': ('avgWeighted', 'OrDefault'), 'quantileExactWeightedOrDefault': ('quantileExactWeighted', 'OrDefault'), 'exponentialTimeDecayedAvgOrDefault': ('exponentialTimeDecayedAvg', 'OrDefault'), 'theilsUOrDefault': ('theilsU', 'OrDefault'), 'welchTTestOrDefault': ('welchTTest', 'OrDefault'), 'categoricalInformationValueOrDefault': ('categoricalInformationValue', 'OrDefault'), 'quantilesOrDefault': ('quantiles', 'OrDefault'), 'skewSampOrDefault': ('skewSamp', 'OrDefault'), 'quantileExactHighOrDefault': ('quantileExactHigh', 'OrDefault'), 'windowFunnelOrDefault': ('windowFunnel', 'OrDefault'), 'uniqCombined64OrDefault': ('uniqCombined64', 'OrDefault'), 'uniqCombinedOrDefault': ('uniqCombined', 'OrDefault'), 'uniqExactOrDefault': ('uniqExact', 'OrDefault'), 'stochasticLogisticRegressionOrDefault': ('stochasticLogisticRegression', 'OrDefault'), 'quantileTimingOrDefault': ('quantileTiming', 'OrDefault'), 'stochasticLinearRegressionOrDefault': ('stochasticLinearRegression', 'OrDefault'), 'quantileExactOrDefault': ('quantileExact', 'OrDefault'), 'kurtSampOrDefault': ('kurtSamp', 'OrDefault'), 'histogramOrDefault': ('histogram', 'OrDefault'), 'anyOrDefault': ('any', 'OrDefault'), 'uniqOrDefault': ('uniq', 'OrDefault'), 'cramersVOrDefault': ('cramersV', 'OrDefault'), 'cramersVBiasCorrectedOrDefault': ('cramersVBiasCorrected', 'OrDefault'), 'intervalLengthSumOrDefault': ('intervalLengthSum', 'OrDefault'), 'contingencyOrDefault': ('contingency', 'OrDefault'), 'groupBitXorOrDefault': ('groupBitXor', 'OrDefault'), 'topKWeightedOrDefault': ('topKWeighted', 'OrDefault'), 'sumOrDefault': ('sum', 'OrDefault'), 'minOrDefault': ('min', 'OrDefault'), 'quantilesExactHighOrDefault': ('quantilesExactHigh', 'OrDefault'), 'kolmogorovSmirnovTestOrDefault': ('kolmogorovSmirnovTest', 'OrDefault'), 'maxIntersectionsPositionOrDefault': ('maxIntersectionsPosition', 'OrDefault'), 'maxMapOrDefault': ('maxMap', 'OrDefault'), 'quantilesExactLowOrDefault': ('quantilesExactLow', 'OrDefault'), 'deltaSumTimestampOrDefault': ('deltaSumTimestamp', 'OrDefault'), 'sumMapOrDefault': ('sumMap', 'OrDefault'), 'rankCorrOrDefault': ('rankCorr', 'OrDefault'), 'quantileTDigestWeightedOrNull': ('quantileTDigestWeighted', 'OrNull'), 'entropyOrNull': ('entropy', 'OrNull'), 'quantileInterpolatedWeightedOrNull': ('quantileInterpolatedWeighted', 'OrNull'), 'groupBitmapAndOrNull': ('groupBitmapAnd', 'OrNull'), 'first_valueOrNull': ('first_value', 'OrNull'), 'groupBitmapXorOrNull': ('groupBitmapXor', 'OrNull'), 'argMaxOrNull': ('argMax', 'OrNull'), 'quantileBFloat16WeightedOrNull': ('quantileBFloat16Weighted', 'OrNull'), 'minMapOrNull': ('minMap', 'OrNull'), 'quantilesInterpolatedWeightedOrNull': ('quantilesInterpolatedWeighted', 'OrNull'), 'kurtPopOrNull': ('kurtPop', 'OrNull'), 'quantilesTimingOrNull': ('quantilesTiming', 'OrNull'), 'quantilesDeterministicOrNull': ('quantilesDeterministic', 'OrNull'), 'quantileGKOrNull': ('quantileGK', 'OrNull'), 'corrOrNull': ('corr', 'OrNull'), 'avgOrNull': ('avg', 'OrNull'), 'anyLastOrNull': ('anyLast', 'OrNull'), 'argMinOrNull': ('argMin', 'OrNull'), 'quantileExactLowOrNull': ('quantileExactLow', 'OrNull'), 'covarSampOrNull': ('covarSamp', 'OrNull'), 'sparkBarOrNull': ('sparkBar', 'OrNull'), 'sumCountOrNull': ('sumCount', 'OrNull'), 'countOrNull': ('count', 'OrNull'), 'stddevSampOrNull': ('stddevSamp', 'OrNull'), 'sequenceNextNodeOrNull': ('sequenceNextNode', 'OrNull'), 'mannWhitneyUTestOrNull': ('mannWhitneyUTest', 'OrNull'), 'studentTTestOrNull': ('studentTTest', 'OrNull'), 'sequenceCountOrNull': ('sequenceCount', 'OrNull'), 'stddevPopOrNull': ('stddevPop', 'OrNull'), 'quantilesExactExclusiveOrNull': ('quantilesExactExclusive', 'OrNull'), 'sumWithOverflowOrNull': ('sumWithOverflow', 'OrNull'), 'maxOrNull': ('max', 'OrNull'), 'sequenceMatchOrNull': ('sequenceMatch', 'OrNull'), 'groupBitmapOrNull': ('groupBitmap', 'OrNull'), 'meanZTestOrNull': ('meanZTest', 'OrNull'), 'topKOrNull': ('topK', 'OrNull'), 'anyHeavyOrNull': ('anyHeavy', 'OrNull'), 'groupArrayMovingAvgOrNull': ('groupArrayMovingAvg', 'OrNull'), 'varSampOrNull': ('varSamp', 'OrNull'), 'medianOrNull': ('median', 'OrNull'), 'exponentialMovingAverageOrNull': ('exponentialMovingAverage', 'OrNull'), 'deltaSumOrNull': ('deltaSum', 'OrNull'), 'groupArrayMovingSumOrNull': ('groupArrayMovingSum', 'OrNull'), 'groupUniqArrayOrNull': ('groupUniqArray', 'OrNull'), 'quantileOrNull': ('quantile', 'OrNull'), 'quantileBFloat16OrNull': ('quantileBFloat16', 'OrNull'), 'boundingRatioOrNull': ('boundingRatio', 'OrNull'), 'quantilesTDigestOrNull': ('quantilesTDigest', 'OrNull'), 'groupArrayInsertAtOrNull': ('groupArrayInsertAt', 'OrNull'), 'groupBitOrOrNull': ('groupBitOr', 'OrNull'), 'quantilesBFloat16WeightedOrNull': ('quantilesBFloat16Weighted', 'OrNull'), 'quantileDeterministicOrNull': ('quantileDeterministic', 'OrNull'), 'quantilesTimingWeightedOrNull': ('quantilesTimingWeighted', 'OrNull'), 'maxIntersectionsOrNull': ('maxIntersections', 'OrNull'), 'uniqUpToOrNull': ('uniqUpTo', 'OrNull'), 'quantilesGKOrNull': ('quantilesGK', 'OrNull'), 'varPopOrNull': ('varPop', 'OrNull'), 'groupArrayLastOrNull': ('groupArrayLast', 'OrNull'), 'groupArrayOrNull': ('groupArray', 'OrNull'), 'retentionOrNull': ('retention', 'OrNull'), 'quantilesExactWeightedOrNull': ('quantilesExactWeighted', 'OrNull'), 'groupArraySampleOrNull': ('groupArraySample', 'OrNull'), 'uniqHLL12OrNull': ('uniqHLL12', 'OrNull'), 'simpleLinearRegressionOrNull': ('simpleLinearRegression', 'OrNull'), 'sumKahanOrNull': ('sumKahan', 'OrNull'), 'quantileTDigestOrNull': ('quantileTDigest', 'OrNull'), 'quantileTimingWeightedOrNull': ('quantileTimingWeighted', 'OrNull'), 'last_valueOrNull': ('last_value', 'OrNull'), 'quantilesTDigestWeightedOrNull': ('quantilesTDigestWeighted', 'OrNull'), 'skewPopOrNull': ('skewPop', 'OrNull'), 'largestTriangleThreeBucketsOrNull': ('largestTriangleThreeBuckets', 'OrNull'), 'quantilesExactOrNull': ('quantilesExact', 'OrNull'), 'groupBitmapOrOrNull': ('groupBitmapOr', 'OrNull'), 'quantilesBFloat16OrNull': ('quantilesBFloat16', 'OrNull'), 'approx_top_sumOrNull': ('approx_top_sum', 'OrNull'), 'groupBitAndOrNull': ('groupBitAnd', 'OrNull'), 'covarPopOrNull': ('covarPop', 'OrNull'), 'uniqThetaOrNull': ('uniqTheta', 'OrNull'), 'avgWeightedOrNull': ('avgWeighted', 'OrNull'), 'quantileExactWeightedOrNull': ('quantileExactWeighted', 'OrNull'), 'exponentialTimeDecayedAvgOrNull': ('exponentialTimeDecayedAvg', 'OrNull'), 'theilsUOrNull': ('theilsU', 'OrNull'), 'welchTTestOrNull': ('welchTTest', 'OrNull'), 'categoricalInformationValueOrNull': ('categoricalInformationValue', 'OrNull'), 'quantilesOrNull': ('quantiles', 'OrNull'), 'skewSampOrNull': ('skewSamp', 'OrNull'), 'quantileExactHighOrNull': ('quantileExactHigh', 'OrNull'), 'windowFunnelOrNull': ('windowFunnel', 'OrNull'), 'uniqCombined64OrNull': ('uniqCombined64', 'OrNull'), 'uniqCombinedOrNull': ('uniqCombined', 'OrNull'), 'uniqExactOrNull': ('uniqExact', 'OrNull'), 'stochasticLogisticRegressionOrNull': ('stochasticLogisticRegression', 'OrNull'), 'quantileTimingOrNull': ('quantileTiming', 'OrNull'), 'stochasticLinearRegressionOrNull': ('stochasticLinearRegression', 'OrNull'), 'quantileExactOrNull': ('quantileExact', 'OrNull'), 'kurtSampOrNull': ('kurtSamp', 'OrNull'), 'histogramOrNull': ('histogram', 'OrNull'), 'anyOrNull': ('any', 'OrNull'), 'uniqOrNull': ('uniq', 'OrNull'), 'cramersVOrNull': ('cramersV', 'OrNull'), 'cramersVBiasCorrectedOrNull': ('cramersVBiasCorrected', 'OrNull'), 'intervalLengthSumOrNull': ('intervalLengthSum', 'OrNull'), 'contingencyOrNull': ('contingency', 'OrNull'), 'groupBitXorOrNull': ('groupBitXor', 'OrNull'), 'topKWeightedOrNull': ('topKWeighted', 'OrNull'), 'sumOrNull': ('sum', 'OrNull'), 'minOrNull': ('min', 'OrNull'), 'quantilesExactHighOrNull': ('quantilesExactHigh', 'OrNull'), 'kolmogorovSmirnovTestOrNull': ('kolmogorovSmirnovTest', 'OrNull'), 'maxIntersectionsPositionOrNull': ('maxIntersectionsPosition', 'OrNull'), 'maxMapOrNull': ('maxMap', 'OrNull'), 'quantilesExactLowOrNull': ('quantilesExactLow', 'OrNull'), 'deltaSumTimestampOrNull': ('deltaSumTimestamp', 'OrNull'), 'sumMapOrNull': ('sumMap', 'OrNull'), 'rankCorrOrNull': ('rankCorr', 'OrNull'), 'quantileTDigestWeightedResample': ('quantileTDigestWeighted', 'Resample'), 'entropyResample': ('entropy', 'Resample'), 'quantileInterpolatedWeightedResample': ('quantileInterpolatedWeighted', 'Resample'), 'groupBitmapAndResample': ('groupBitmapAnd', 'Resample'), 'first_valueResample': ('first_value', 'Resample'), 'groupBitmapXorResample': ('groupBitmapXor', 'Resample'), 'argMaxResample': ('argMax', 'Resample'), 'quantileBFloat16WeightedResample': ('quantileBFloat16Weighted', 'Resample'), 'minMapResample': ('minMap', 'Resample'), 'quantilesInterpolatedWeightedResample': ('quantilesInterpolatedWeighted', 'Resample'), 'kurtPopResample': ('kurtPop', 'Resample'), 'quantilesTimingResample': ('quantilesTiming', 'Resample'), 'quantilesDeterministicResample': ('quantilesDeterministic', 'Resample'), 'quantileGKResample': ('quantileGK', 'Resample'), 'corrResample': ('corr', 'Resample'), 'avgResample': ('avg', 'Resample'), 'anyLastResample': ('anyLast', 'Resample'), 'argMinResample': ('argMin', 'Resample'), 'quantileExactLowResample': ('quantileExactLow', 'Resample'), 'covarSampResample': ('covarSamp', 'Resample'), 'sparkBarResample': ('sparkBar', 'Resample'), 'sumCountResample': ('sumCount', 'Resample'), 'countResample': ('count', 'Resample'), 'stddevSampResample': ('stddevSamp', 'Resample'), 'sequenceNextNodeResample': ('sequenceNextNode', 'Resample'), 'mannWhitneyUTestResample': ('mannWhitneyUTest', 'Resample'), 'studentTTestResample': ('studentTTest', 'Resample'), 'sequenceCountResample': ('sequenceCount', 'Resample'), 'stddevPopResample': ('stddevPop', 'Resample'), 'quantilesExactExclusiveResample': ('quantilesExactExclusive', 'Resample'), 'sumWithOverflowResample': ('sumWithOverflow', 'Resample'), 'maxResample': ('max', 'Resample'), 'sequenceMatchResample': ('sequenceMatch', 'Resample'), 'groupBitmapResample': ('groupBitmap', 'Resample'), 'meanZTestResample': ('meanZTest', 'Resample'), 'topKResample': ('topK', 'Resample'), 'anyHeavyResample': ('anyHeavy', 'Resample'), 'groupArrayMovingAvgResample': ('groupArrayMovingAvg', 'Resample'), 'varSampResample': ('varSamp', 'Resample'), 'medianResample': ('median', 'Resample'), 'exponentialMovingAverageResample': ('exponentialMovingAverage', 'Resample'), 'deltaSumResample': ('deltaSum', 'Resample'), 'groupArrayMovingSumResample': ('groupArrayMovingSum', 'Resample'), 'groupUniqArrayResample': ('groupUniqArray', 'Resample'), 'quantileResample': ('quantile', 'Resample'), 'quantileBFloat16Resample': ('quantileBFloat16', 'Resample'), 'boundingRatioResample': ('boundingRatio', 'Resample'), 'quantilesTDigestResample': ('quantilesTDigest', 'Resample'), 'groupArrayInsertAtResample': ('groupArrayInsertAt', 'Resample'), 'groupBitOrResample': ('groupBitOr', 'Resample'), 'quantilesBFloat16WeightedResample': ('quantilesBFloat16Weighted', 'Resample'), 'quantileDeterministicResample': ('quantileDeterministic', 'Resample'), 'quantilesTimingWeightedResample': ('quantilesTimingWeighted', 'Resample'), 'maxIntersectionsResample': ('maxIntersections', 'Resample'), 'uniqUpToResample': ('uniqUpTo', 'Resample'), 'quantilesGKResample': ('quantilesGK', 'Resample'), 'varPopResample': ('varPop', 'Resample'), 'groupArrayLastResample': ('groupArrayLast', 'Resample'), 'groupArrayResample': ('groupArray', 'Resample'), 'retentionResample': ('retention', 'Resample'), 'quantilesExactWeightedResample': ('quantilesExactWeighted', 'Resample'), 'groupArraySampleResample': ('groupArraySample', 'Resample'), 'uniqHLL12Resample': ('uniqHLL12', 'Resample'), 'simpleLinearRegressionResample': ('simpleLinearRegression', 'Resample'), 'sumKahanResample': ('sumKahan', 'Resample'), 'quantileTDigestResample': ('quantileTDigest', 'Resample'), 'quantileTimingWeightedResample': ('quantileTimingWeighted', 'Resample'), 'last_valueResample': ('last_value', 'Resample'), 'quantilesTDigestWeightedResample': ('quantilesTDigestWeighted', 'Resample'), 'skewPopResample': ('skewPop', 'Resample'), 'largestTriangleThreeBucketsResample': ('largestTriangleThreeBuckets', 'Resample'), 'quantilesExactResample': ('quantilesExact', 'Resample'), 'groupBitmapOrResample': ('groupBitmapOr', 'Resample'), 'quantilesBFloat16Resample': ('quantilesBFloat16', 'Resample'), 'approx_top_sumResample': ('approx_top_sum', 'Resample'), 'groupBitAndResample': ('groupBitAnd', 'Resample'), 'covarPopResample': ('covarPop', 'Resample'), 'uniqThetaResample': ('uniqTheta', 'Resample'), 'avgWeightedResample': ('avgWeighted', 'Resample'), 'quantileExactWeightedResample': ('quantileExactWeighted', 'Resample'), 'exponentialTimeDecayedAvgResample': ('exponentialTimeDecayedAvg', 'Resample'), 'theilsUResample': ('theilsU', 'Resample'), 'welchTTestResample': ('welchTTest', 'Resample'), 'categoricalInformationValueResample': ('categoricalInformationValue', 'Resample'), 'quantilesResample': ('quantiles', 'Resample'), 'skewSampResample': ('skewSamp', 'Resample'), 'quantileExactHighResample': ('quantileExactHigh', 'Resample'), 'windowFunnelResample': ('windowFunnel', 'Resample'), 'uniqCombined64Resample': ('uniqCombined64', 'Resample'), 'uniqCombinedResample': ('uniqCombined', 'Resample'), 'uniqExactResample': ('uniqExact', 'Resample'), 'stochasticLogisticRegressionResample': ('stochasticLogisticRegression', 'Resample'), 'quantileTimingResample': ('quantileTiming', 'Resample'), 'stochasticLinearRegressionResample': ('stochasticLinearRegression', 'Resample'), 'quantileExactResample': ('quantileExact', 'Resample'), 'kurtSampResample': ('kurtSamp', 'Resample'), 'histogramResample': ('histogram', 'Resample'), 'anyResample': ('any', 'Resample'), 'uniqResample': ('uniq', 'Resample'), 'cramersVResample': ('cramersV', 'Resample'), 'cramersVBiasCorrectedResample': ('cramersVBiasCorrected', 'Resample'), 'intervalLengthSumResample': ('intervalLengthSum', 'Resample'), 'contingencyResample': ('contingency', 'Resample'), 'groupBitXorResample': ('groupBitXor', 'Resample'), 'topKWeightedResample': ('topKWeighted', 'Resample'), 'sumResample': ('sum', 'Resample'), 'minResample': ('min', 'Resample'), 'quantilesExactHighResample': ('quantilesExactHigh', 'Resample'), 'kolmogorovSmirnovTestResample': ('kolmogorovSmirnovTest', 'Resample'), 'maxIntersectionsPositionResample': ('maxIntersectionsPosition', 'Resample'), 'maxMapResample': ('maxMap', 'Resample'), 'quantilesExactLowResample': ('quantilesExactLow', 'Resample'), 'deltaSumTimestampResample': ('deltaSumTimestamp', 'Resample'), 'sumMapResample': ('sumMap', 'Resample'), 'rankCorrResample': ('rankCorr', 'Resample'), 'quantileTDigestWeightedArgMin': ('quantileTDigestWeighted', 'ArgMin'), 'entropyArgMin': ('entropy', 'ArgMin'), 'quantileInterpolatedWeightedArgMin': ('quantileInterpolatedWeighted', 'ArgMin'), 'groupBitmapAndArgMin': ('groupBitmapAnd', 'ArgMin'), 'first_valueArgMin': ('first_value', 'ArgMin'), 'groupBitmapXorArgMin': ('groupBitmapXor', 'ArgMin'), 'argMaxArgMin': ('argMax', 'ArgMin'), 'quantileBFloat16WeightedArgMin': ('quantileBFloat16Weighted', 'ArgMin'), 'minMapArgMin': ('minMap', 'ArgMin'), 'quantilesInterpolatedWeightedArgMin': ('quantilesInterpolatedWeighted', 'ArgMin'), 'kurtPopArgMin': ('kurtPop', 'ArgMin'), 'quantilesTimingArgMin': ('quantilesTiming', 'ArgMin'), 'quantilesDeterministicArgMin': ('quantilesDeterministic', 'ArgMin'), 'quantileGKArgMin': ('quantileGK', 'ArgMin'), 'corrArgMin': ('corr', 'ArgMin'), 'avgArgMin': ('avg', 'ArgMin'), 'anyLastArgMin': ('anyLast', 'ArgMin'), 'argMinArgMin': ('argMin', 'ArgMin'), 'quantileExactLowArgMin': ('quantileExactLow', 'ArgMin'), 'covarSampArgMin': ('covarSamp', 'ArgMin'), 'sparkBarArgMin': ('sparkBar', 'ArgMin'), 'sumCountArgMin': ('sumCount', 'ArgMin'), 'countArgMin': ('count', 'ArgMin'), 'stddevSampArgMin': ('stddevSamp', 'ArgMin'), 'sequenceNextNodeArgMin': ('sequenceNextNode', 'ArgMin'), 'mannWhitneyUTestArgMin': ('mannWhitneyUTest', 'ArgMin'), 'studentTTestArgMin': ('studentTTest', 'ArgMin'), 'sequenceCountArgMin': ('sequenceCount', 'ArgMin'), 'stddevPopArgMin': ('stddevPop', 'ArgMin'), 'quantilesExactExclusiveArgMin': ('quantilesExactExclusive', 'ArgMin'), 'sumWithOverflowArgMin': ('sumWithOverflow', 'ArgMin'), 'maxArgMin': ('max', 'ArgMin'), 'sequenceMatchArgMin': ('sequenceMatch', 'ArgMin'), 'groupBitmapArgMin': ('groupBitmap', 'ArgMin'), 'meanZTestArgMin': ('meanZTest', 'ArgMin'), 'topKArgMin': ('topK', 'ArgMin'), 'anyHeavyArgMin': ('anyHeavy', 'ArgMin'), 'groupArrayMovingAvgArgMin': ('groupArrayMovingAvg', 'ArgMin'), 'varSampArgMin': ('varSamp', 'ArgMin'), 'medianArgMin': ('median', 'ArgMin'), 'exponentialMovingAverageArgMin': ('exponentialMovingAverage', 'ArgMin'), 'deltaSumArgMin': ('deltaSum', 'ArgMin'), 'groupArrayMovingSumArgMin': ('groupArrayMovingSum', 'ArgMin'), 'groupUniqArrayArgMin': ('groupUniqArray', 'ArgMin'), 'quantileArgMin': ('quantile', 'ArgMin'), 'quantileBFloat16ArgMin': ('quantileBFloat16', 'ArgMin'), 'boundingRatioArgMin': ('boundingRatio', 'ArgMin'), 'quantilesTDigestArgMin': ('quantilesTDigest', 'ArgMin'), 'groupArrayInsertAtArgMin': ('groupArrayInsertAt', 'ArgMin'), 'groupBitOrArgMin': ('groupBitOr', 'ArgMin'), 'quantilesBFloat16WeightedArgMin': ('quantilesBFloat16Weighted', 'ArgMin'), 'quantileDeterministicArgMin': ('quantileDeterministic', 'ArgMin'), 'quantilesTimingWeightedArgMin': ('quantilesTimingWeighted', 'ArgMin'), 'maxIntersectionsArgMin': ('maxIntersections', 'ArgMin'), 'uniqUpToArgMin': ('uniqUpTo', 'ArgMin'), 'quantilesGKArgMin': ('quantilesGK', 'ArgMin'), 'varPopArgMin': ('varPop', 'ArgMin'), 'groupArrayLastArgMin': ('groupArrayLast', 'ArgMin'), 'groupArrayArgMin': ('groupArray', 'ArgMin'), 'retentionArgMin': ('retention', 'ArgMin'), 'quantilesExactWeightedArgMin': ('quantilesExactWeighted', 'ArgMin'), 'groupArraySampleArgMin': ('groupArraySample', 'ArgMin'), 'uniqHLL12ArgMin': ('uniqHLL12', 'ArgMin'), 'simpleLinearRegressionArgMin': ('simpleLinearRegression', 'ArgMin'), 'sumKahanArgMin': ('sumKahan', 'ArgMin'), 'quantileTDigestArgMin': ('quantileTDigest', 'ArgMin'), 'quantileTimingWeightedArgMin': ('quantileTimingWeighted', 'ArgMin'), 'last_valueArgMin': ('last_value', 'ArgMin'), 'quantilesTDigestWeightedArgMin': ('quantilesTDigestWeighted', 'ArgMin'), 'skewPopArgMin': ('skewPop', 'ArgMin'), 'largestTriangleThreeBucketsArgMin': ('largestTriangleThreeBuckets', 'ArgMin'), 'quantilesExactArgMin': ('quantilesExact', 'ArgMin'), 'groupBitmapOrArgMin': ('groupBitmapOr', 'ArgMin'), 'quantilesBFloat16ArgMin': ('quantilesBFloat16', 'ArgMin'), 'approx_top_sumArgMin': ('approx_top_sum', 'ArgMin'), 'groupBitAndArgMin': ('groupBitAnd', 'ArgMin'), 'covarPopArgMin': ('covarPop', 'ArgMin'), 'uniqThetaArgMin': ('uniqTheta', 'ArgMin'), 'avgWeightedArgMin': ('avgWeighted', 'ArgMin'), 'quantileExactWeightedArgMin': ('quantileExactWeighted', 'ArgMin'), 'exponentialTimeDecayedAvgArgMin': ('exponentialTimeDecayedAvg', 'ArgMin'), 'theilsUArgMin': ('theilsU', 'ArgMin'), 'welchTTestArgMin': ('welchTTest', 'ArgMin'), 'categoricalInformationValueArgMin': ('categoricalInformationValue', 'ArgMin'), 'quantilesArgMin': ('quantiles', 'ArgMin'), 'skewSampArgMin': ('skewSamp', 'ArgMin'), 'quantileExactHighArgMin': ('quantileExactHigh', 'ArgMin'), 'windowFunnelArgMin': ('windowFunnel', 'ArgMin'), 'uniqCombined64ArgMin': ('uniqCombined64', 'ArgMin'), 'uniqCombinedArgMin': ('uniqCombined', 'ArgMin'), 'uniqExactArgMin': ('uniqExact', 'ArgMin'), 'stochasticLogisticRegressionArgMin': ('stochasticLogisticRegression', 'ArgMin'), 'quantileTimingArgMin': ('quantileTiming', 'ArgMin'), 'stochasticLinearRegressionArgMin': ('stochasticLinearRegression', 'ArgMin'), 'quantileExactArgMin': ('quantileExact', 'ArgMin'), 'kurtSampArgMin': ('kurtSamp', 'ArgMin'), 'histogramArgMin': ('histogram', 'ArgMin'), 'anyArgMin': ('any', 'ArgMin'), 'uniqArgMin': ('uniq', 'ArgMin'), 'cramersVArgMin': ('cramersV', 'ArgMin'), 'cramersVBiasCorrectedArgMin': ('cramersVBiasCorrected', 'ArgMin'), 'intervalLengthSumArgMin': ('intervalLengthSum', 'ArgMin'), 'contingencyArgMin': ('contingency', 'ArgMin'), 'groupBitXorArgMin': ('groupBitXor', 'ArgMin'), 'topKWeightedArgMin': ('topKWeighted', 'ArgMin'), 'sumArgMin': ('sum', 'ArgMin'), 'minArgMin': ('min', 'ArgMin'), 'quantilesExactHighArgMin': ('quantilesExactHigh', 'ArgMin'), 'kolmogorovSmirnovTestArgMin': ('kolmogorovSmirnovTest', 'ArgMin'), 'maxIntersectionsPositionArgMin': ('maxIntersectionsPosition', 'ArgMin'), 'maxMapArgMin': ('maxMap', 'ArgMin'), 'quantilesExactLowArgMin': ('quantilesExactLow', 'ArgMin'), 'deltaSumTimestampArgMin': ('deltaSumTimestamp', 'ArgMin'), 'sumMapArgMin': ('sumMap', 'ArgMin'), 'rankCorrArgMin': ('rankCorr', 'ArgMin'), 'quantileTDigestWeightedArgMax': ('quantileTDigestWeighted', 'ArgMax'), 'entropyArgMax': ('entropy', 'ArgMax'), 'quantileInterpolatedWeightedArgMax': ('quantileInterpolatedWeighted', 'ArgMax'), 'groupBitmapAndArgMax': ('groupBitmapAnd', 'ArgMax'), 'first_valueArgMax': ('first_value', 'ArgMax'), 'groupBitmapXorArgMax': ('groupBitmapXor', 'ArgMax'), 'argMaxArgMax': ('argMax', 'ArgMax'), 'quantileBFloat16WeightedArgMax': ('quantileBFloat16Weighted', 'ArgMax'), 'minMapArgMax': ('minMap', 'ArgMax'), 'quantilesInterpolatedWeightedArgMax': ('quantilesInterpolatedWeighted', 'ArgMax'), 'kurtPopArgMax': ('kurtPop', 'ArgMax'), 'quantilesTimingArgMax': ('quantilesTiming', 'ArgMax'), 'quantilesDeterministicArgMax': ('quantilesDeterministic', 'ArgMax'), 'quantileGKArgMax': ('quantileGK', 'ArgMax'), 'corrArgMax': ('corr', 'ArgMax'), 'avgArgMax': ('avg', 'ArgMax'), 'anyLastArgMax': ('anyLast', 'ArgMax'), 'argMinArgMax': ('argMin', 'ArgMax'), 'quantileExactLowArgMax': ('quantileExactLow', 'ArgMax'), 'covarSampArgMax': ('covarSamp', 'ArgMax'), 'sparkBarArgMax': ('sparkBar', 'ArgMax'), 'sumCountArgMax': ('sumCount', 'ArgMax'), 'countArgMax': ('count', 'ArgMax'), 'stddevSampArgMax': ('stddevSamp', 'ArgMax'), 'sequenceNextNodeArgMax': ('sequenceNextNode', 'ArgMax'), 'mannWhitneyUTestArgMax': ('mannWhitneyUTest', 'ArgMax'), 'studentTTestArgMax': ('studentTTest', 'ArgMax'), 'sequenceCountArgMax': ('sequenceCount', 'ArgMax'), 'stddevPopArgMax': ('stddevPop', 'ArgMax'), 'quantilesExactExclusiveArgMax': ('quantilesExactExclusive', 'ArgMax'), 'sumWithOverflowArgMax': ('sumWithOverflow', 'ArgMax'), 'maxArgMax': ('max', 'ArgMax'), 'sequenceMatchArgMax': ('sequenceMatch', 'ArgMax'), 'groupBitmapArgMax': ('groupBitmap', 'ArgMax'), 'meanZTestArgMax': ('meanZTest', 'ArgMax'), 'topKArgMax': ('topK', 'ArgMax'), 'anyHeavyArgMax': ('anyHeavy', 'ArgMax'), 'groupArrayMovingAvgArgMax': ('groupArrayMovingAvg', 'ArgMax'), 'varSampArgMax': ('varSamp', 'ArgMax'), 'medianArgMax': ('median', 'ArgMax'), 'exponentialMovingAverageArgMax': ('exponentialMovingAverage', 'ArgMax'), 'deltaSumArgMax': ('deltaSum', 'ArgMax'), 'groupArrayMovingSumArgMax': ('groupArrayMovingSum', 'ArgMax'), 'groupUniqArrayArgMax': ('groupUniqArray', 'ArgMax'), 'quantileArgMax': ('quantile', 'ArgMax'), 'quantileBFloat16ArgMax': ('quantileBFloat16', 'ArgMax'), 'boundingRatioArgMax': ('boundingRatio', 'ArgMax'), 'quantilesTDigestArgMax': ('quantilesTDigest', 'ArgMax'), 'groupArrayInsertAtArgMax': ('groupArrayInsertAt', 'ArgMax'), 'groupBitOrArgMax': ('groupBitOr', 'ArgMax'), 'quantilesBFloat16WeightedArgMax': ('quantilesBFloat16Weighted', 'ArgMax'), 'quantileDeterministicArgMax': ('quantileDeterministic', 'ArgMax'), 'quantilesTimingWeightedArgMax': ('quantilesTimingWeighted', 'ArgMax'), 'maxIntersectionsArgMax': ('maxIntersections', 'ArgMax'), 'uniqUpToArgMax': ('uniqUpTo', 'ArgMax'), 'quantilesGKArgMax': ('quantilesGK', 'ArgMax'), 'varPopArgMax': ('varPop', 'ArgMax'), 'groupArrayLastArgMax': ('groupArrayLast', 'ArgMax'), 'groupArrayArgMax': ('groupArray', 'ArgMax'), 'retentionArgMax': ('retention', 'ArgMax'), 'quantilesExactWeightedArgMax': ('quantilesExactWeighted', 'ArgMax'), 'groupArraySampleArgMax': ('groupArraySample', 'ArgMax'), 'uniqHLL12ArgMax': ('uniqHLL12', 'ArgMax'), 'simpleLinearRegressionArgMax': ('simpleLinearRegression', 'ArgMax'), 'sumKahanArgMax': ('sumKahan', 'ArgMax'), 'quantileTDigestArgMax': ('quantileTDigest', 'ArgMax'), 'quantileTimingWeightedArgMax': ('quantileTimingWeighted', 'ArgMax'), 'last_valueArgMax': ('last_value', 'ArgMax'), 'quantilesTDigestWeightedArgMax': ('quantilesTDigestWeighted', 'ArgMax'), 'skewPopArgMax': ('skewPop', 'ArgMax'), 'largestTriangleThreeBucketsArgMax': ('largestTriangleThreeBuckets', 'ArgMax'), 'quantilesExactArgMax': ('quantilesExact', 'ArgMax'), 'groupBitmapOrArgMax': ('groupBitmapOr', 'ArgMax'), 'quantilesBFloat16ArgMax': ('quantilesBFloat16', 'ArgMax'), 'approx_top_sumArgMax': ('approx_top_sum', 'ArgMax'), 'groupBitAndArgMax': ('groupBitAnd', 'ArgMax'), 'covarPopArgMax': ('covarPop', 'ArgMax'), 'uniqThetaArgMax': ('uniqTheta', 'ArgMax'), 'avgWeightedArgMax': ('avgWeighted', 'ArgMax'), 'quantileExactWeightedArgMax': ('quantileExactWeighted', 'ArgMax'), 'exponentialTimeDecayedAvgArgMax': ('exponentialTimeDecayedAvg', 'ArgMax'), 'theilsUArgMax': ('theilsU', 'ArgMax'), 'welchTTestArgMax': ('welchTTest', 'ArgMax'), 'categoricalInformationValueArgMax': ('categoricalInformationValue', 'ArgMax'), 'quantilesArgMax': ('quantiles', 'ArgMax'), 'skewSampArgMax': ('skewSamp', 'ArgMax'), 'quantileExactHighArgMax': ('quantileExactHigh', 'ArgMax'), 'windowFunnelArgMax': ('windowFunnel', 'ArgMax'), 'uniqCombined64ArgMax': ('uniqCombined64', 'ArgMax'), 'uniqCombinedArgMax': ('uniqCombined', 'ArgMax'), 'uniqExactArgMax': ('uniqExact', 'ArgMax'), 'stochasticLogisticRegressionArgMax': ('stochasticLogisticRegression', 'ArgMax'), 'quantileTimingArgMax': ('quantileTiming', 'ArgMax'), 'stochasticLinearRegressionArgMax': ('stochasticLinearRegression', 'ArgMax'), 'quantileExactArgMax': ('quantileExact', 'ArgMax'), 'kurtSampArgMax': ('kurtSamp', 'ArgMax'), 'histogramArgMax': ('histogram', 'ArgMax'), 'anyArgMax': ('any', 'ArgMax'), 'uniqArgMax': ('uniq', 'ArgMax'), 'cramersVArgMax': ('cramersV', 'ArgMax'), 'cramersVBiasCorrectedArgMax': ('cramersVBiasCorrected', 'ArgMax'), 'intervalLengthSumArgMax': ('intervalLengthSum', 'ArgMax'), 'contingencyArgMax': ('contingency', 'ArgMax'), 'groupBitXorArgMax': ('groupBitXor', 'ArgMax'), 'topKWeightedArgMax': ('topKWeighted', 'ArgMax'), 'sumArgMax': ('sum', 'ArgMax'), 'minArgMax': ('min', 'ArgMax'), 'quantilesExactHighArgMax': ('quantilesExactHigh', 'ArgMax'), 'kolmogorovSmirnovTestArgMax': ('kolmogorovSmirnovTest', 'ArgMax'), 'maxIntersectionsPositionArgMax': ('maxIntersectionsPosition', 'ArgMax'), 'maxMapArgMax': ('maxMap', 'ArgMax'), 'quantilesExactLowArgMax': ('quantilesExactLow', 'ArgMax'), 'deltaSumTimestampArgMax': ('deltaSumTimestamp', 'ArgMax'), 'sumMapArgMax': ('sumMap', 'ArgMax'), 'rankCorrArgMax': ('rankCorr', 'ArgMax'), 'quantileTDigestWeighted': ('quantileTDigestWeighted', ''), 'entropy': ('entropy', ''), 'quantileInterpolatedWeighted': ('quantileInterpolatedWeighted', ''), 'groupBitmapAnd': ('groupBitmapAnd', ''), 'first_value': ('first_value', ''), 'groupBitmapXor': ('groupBitmapXor', ''), 'argMax': ('argMax', ''), 'quantileBFloat16Weighted': ('quantileBFloat16Weighted', ''), 'quantilesInterpolatedWeighted': ('quantilesInterpolatedWeighted', ''), 'kurtPop': ('kurtPop', ''), 'quantilesTiming': ('quantilesTiming', ''), 'quantilesDeterministic': ('quantilesDeterministic', ''), 'quantileGK': ('quantileGK', ''), 'corr': ('corr', ''), 'avg': ('avg', ''), 'anyLast': ('anyLast', ''), 'argMin': ('argMin', ''), 'quantileExactLow': ('quantileExactLow', ''), 'covarSamp': ('covarSamp', ''), 'sparkBar': ('sparkBar', ''), 'sumCount': ('sumCount', ''), 'count': ('count', ''), 'stddevSamp': ('stddevSamp', ''), 'sequenceNextNode': ('sequenceNextNode', ''), 'mannWhitneyUTest': ('mannWhitneyUTest', ''), 'studentTTest': ('studentTTest', ''), 'sequenceCount': ('sequenceCount', ''), 'stddevPop': ('stddevPop', ''), 'quantilesExactExclusive': ('quantilesExactExclusive', ''), 'sumWithOverflow': ('sumWithOverflow', ''), 'max': ('max', ''), 'sequenceMatch': ('sequenceMatch', ''), 'groupBitmap': ('groupBitmap', ''), 'meanZTest': ('meanZTest', ''), 'topK': ('topK', ''), 'anyHeavy': ('anyHeavy', ''), 'groupArrayMovingAvg': ('groupArrayMovingAvg', ''), 'varSamp': ('varSamp', ''), 'median': ('median', ''), 'exponentialMovingAverage': ('exponentialMovingAverage', ''), 'deltaSum': ('deltaSum', ''), 'groupArrayMovingSum': ('groupArrayMovingSum', ''), 'groupUniqArray': ('groupUniqArray', ''), 'quantile': ('quantile', ''), 'quantileBFloat16': ('quantileBFloat16', ''), 'boundingRatio': ('boundingRatio', ''), 'quantilesTDigest': ('quantilesTDigest', ''), 'groupArrayInsertAt': ('groupArrayInsertAt', ''), 'groupBitOr': ('groupBitOr', ''), 'quantilesBFloat16Weighted': ('quantilesBFloat16Weighted', ''), 'quantileDeterministic': ('quantileDeterministic', ''), 'quantilesTimingWeighted': ('quantilesTimingWeighted', ''), 'maxIntersections': ('maxIntersections', ''), 'uniqUpTo': ('uniqUpTo', ''), 'quantilesGK': ('quantilesGK', ''), 'varPop': ('varPop', ''), 'groupArrayLast': ('groupArrayLast', ''), 'groupArray': ('groupArray', ''), 'retention': ('retention', ''), 'quantilesExactWeighted': ('quantilesExactWeighted', ''), 'groupArraySample': ('groupArraySample', ''), 'uniqHLL12': ('uniqHLL12', ''), 'simpleLinearRegression': ('simpleLinearRegression', ''), 'sumKahan': ('sumKahan', ''), 'quantileTDigest': ('quantileTDigest', ''), 'quantileTimingWeighted': ('quantileTimingWeighted', ''), 'last_value': ('last_value', ''), 'quantilesTDigestWeighted': ('quantilesTDigestWeighted', ''), 'skewPop': ('skewPop', ''), 'largestTriangleThreeBuckets': ('largestTriangleThreeBuckets', ''), 'quantilesExact': ('quantilesExact', ''), 'groupBitmapOr': ('groupBitmapOr', ''), 'quantilesBFloat16': ('quantilesBFloat16', ''), 'approx_top_sum': ('approx_top_sum', ''), 'groupBitAnd': ('groupBitAnd', ''), 'covarPop': ('covarPop', ''), 'uniqTheta': ('uniqTheta', ''), 'avgWeighted': ('avgWeighted', ''), 'quantileExactWeighted': ('quantileExactWeighted', ''), 'exponentialTimeDecayedAvg': ('exponentialTimeDecayedAvg', ''), 'theilsU': ('theilsU', ''), 'welchTTest': ('welchTTest', ''), 'categoricalInformationValue': ('categoricalInformationValue', ''), 'quantiles': ('quantiles', ''), 'skewSamp': ('skewSamp', ''), 'quantileExactHigh': ('quantileExactHigh', ''), 'windowFunnel': ('windowFunnel', ''), 'uniqCombined64': ('uniqCombined64', ''), 'uniqCombined': ('uniqCombined', ''), 'uniqExact': ('uniqExact', ''), 'stochasticLogisticRegression': ('stochasticLogisticRegression', ''), 'quantileTiming': ('quantileTiming', ''), 'stochasticLinearRegression': ('stochasticLinearRegression', ''), 'quantileExact': ('quantileExact', ''), 'kurtSamp': ('kurtSamp', ''), 'histogram': ('histogram', ''), 'any': ('any', ''), 'uniq': ('uniq', ''), 'cramersV': ('cramersV', ''), 'cramersVBiasCorrected': ('cramersVBiasCorrected', ''), 'intervalLengthSum': ('intervalLengthSum', ''), 'contingency': ('contingency', ''), 'groupBitXor': ('groupBitXor', ''), 'topKWeighted': ('topKWeighted', ''), 'sum': ('sum', ''), 'min': ('min', ''), 'quantilesExactHigh': ('quantilesExactHigh', ''), 'kolmogorovSmirnovTest': ('kolmogorovSmirnovTest', ''), 'maxIntersectionsPosition': ('maxIntersectionsPosition', ''), 'quantilesExactLow': ('quantilesExactLow', ''), 'deltaSumTimestamp': ('deltaSumTimestamp', ''), 'rankCorr': ('rankCorr', '')}
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>>, 'CHAR': <function Parser.<lambda>>, 'CHR': <function Parser.<lambda>>, 'DECODE': <function Parser.<lambda>>, 'EXTRACT': <function Parser.<lambda>>, 'FLOOR': <function Parser.<lambda>>, 'GAP_FILL': <function Parser.<lambda>>, 'INITCAP': <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>>, 'TUPLE': <function ClickHouse.Parser.<lambda>>, 'AND': <function ClickHouse.Parser.<lambda>>, 'OR': <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: 242>: <class 'sqlglot.expressions.CurrentDate'>, <TokenType.CURRENT_DATETIME: 243>: <class 'sqlglot.expressions.CurrentDate'>, <TokenType.CURRENT_TIME: 245>: <class 'sqlglot.expressions.CurrentTime'>, <TokenType.CURRENT_USER: 247>: <class 'sqlglot.expressions.CurrentUser'>, <TokenType.CURRENT_ROLE: 248>: <class 'sqlglot.expressions.CurrentRole'>}
RANGE_PARSERS = {<TokenType.AT_GT: 53>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.BETWEEN: 226>: <function Parser.<lambda>>, <TokenType.GLOB: 282>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.ILIKE: 290>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IN: 291>: <function Parser.<lambda>>, <TokenType.IRLIKE: 301>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IS: 302>: <function Parser.<lambda>>, <TokenType.LIKE: 312>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.LT_AT: 52>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.OVERLAPS: 343>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.RLIKE: 370>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.SIMILAR_TO: 383>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.FOR: 274>: <function Parser.<lambda>>, <TokenType.QMARK_AMP: 65>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.QMARK_PIPE: 66>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.HASH_DASH: 67>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.ADJACENT: 62>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.OPERATOR: 334>: <function Parser.<lambda>>, <TokenType.AMP_LT: 60>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.AMP_GT: 61>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.GLOBAL: 283>: <function ClickHouse.Parser.<lambda>>}
COLUMN_OPERATORS = {<TokenType.DOT: 8>: None, <TokenType.DOTCOLON: 12>: <function Parser.<lambda>>, <TokenType.DCOLON: 13>: <function Parser.<lambda>>, <TokenType.ARROW: 44>: <function Parser.<lambda>>, <TokenType.DARROW: 45>: <function Parser.<lambda>>, <TokenType.HASH_ARROW: 48>: <function Parser.<lambda>>, <TokenType.DHASH_ARROW: 49>: <function Parser.<lambda>>}
JOIN_KINDS = {<TokenType.STRAIGHT_JOIN: 389>, <TokenType.OUTER: 341>, <TokenType.ANTI: 217>, <TokenType.ANY: 218>, <TokenType.ARRAY: 220>, <TokenType.ASOF: 222>, <TokenType.INNER: 294>, <TokenType.CROSS: 240>, <TokenType.SEMI: 376>}
TABLE_ALIAS_TOKENS = {<TokenType.SESSION: 56>, <TokenType.IDENTIFIER: 76>, <TokenType.DATABASE: 77>, <TokenType.COLUMN: 78>, <TokenType.SCHEMA: 80>, <TokenType.TABLE: 81>, <TokenType.WAREHOUSE: 82>, <TokenType.STAGE: 83>, <TokenType.STREAMLIT: 84>, <TokenType.VAR: 85>, <TokenType.BIT: 93>, <TokenType.BOOLEAN: 94>, <TokenType.TINYINT: 95>, <TokenType.UTINYINT: 96>, <TokenType.SMALLINT: 97>, <TokenType.USMALLINT: 98>, <TokenType.MEDIUMINT: 99>, <TokenType.UMEDIUMINT: 100>, <TokenType.INT: 101>, <TokenType.UINT: 102>, <TokenType.BIGINT: 103>, <TokenType.UBIGINT: 104>, <TokenType.BIGNUM: 105>, <TokenType.INT128: 106>, <TokenType.UINT128: 107>, <TokenType.INT256: 108>, <TokenType.UINT256: 109>, <TokenType.FLOAT: 110>, <TokenType.DOUBLE: 111>, <TokenType.UDOUBLE: 112>, <TokenType.DECIMAL: 113>, <TokenType.DECIMAL32: 114>, <TokenType.DECIMAL64: 115>, <TokenType.DECIMAL128: 116>, <TokenType.DECIMAL256: 117>, <TokenType.DECFLOAT: 118>, <TokenType.UDECIMAL: 119>, <TokenType.BIGDECIMAL: 120>, <TokenType.CHAR: 121>, <TokenType.NCHAR: 122>, <TokenType.VARCHAR: 123>, <TokenType.NVARCHAR: 124>, <TokenType.BPCHAR: 125>, <TokenType.TEXT: 126>, <TokenType.MEDIUMTEXT: 127>, <TokenType.LONGTEXT: 128>, <TokenType.BLOB: 129>, <TokenType.MEDIUMBLOB: 130>, <TokenType.LONGBLOB: 131>, <TokenType.TINYBLOB: 132>, <TokenType.TINYTEXT: 133>, <TokenType.NAME: 134>, <TokenType.BINARY: 135>, <TokenType.VARBINARY: 136>, <TokenType.JSON: 137>, <TokenType.JSONB: 138>, <TokenType.TIME: 139>, <TokenType.TIMETZ: 140>, <TokenType.TIME_NS: 141>, <TokenType.TIMESTAMP: 142>, <TokenType.TIMESTAMPTZ: 143>, <TokenType.TIMESTAMPLTZ: 144>, <TokenType.TIMESTAMPNTZ: 145>, <TokenType.TIMESTAMP_S: 146>, <TokenType.TIMESTAMP_MS: 147>, <TokenType.TIMESTAMP_NS: 148>, <TokenType.DATETIME: 149>, <TokenType.DATETIME2: 150>, <TokenType.DATETIME64: 151>, <TokenType.SMALLDATETIME: 152>, <TokenType.DATE: 153>, <TokenType.DATE32: 154>, <TokenType.INT4RANGE: 155>, <TokenType.INT4MULTIRANGE: 156>, <TokenType.INT8RANGE: 157>, <TokenType.INT8MULTIRANGE: 158>, <TokenType.NUMRANGE: 159>, <TokenType.NUMMULTIRANGE: 160>, <TokenType.TSRANGE: 161>, <TokenType.TSMULTIRANGE: 162>, <TokenType.TSTZRANGE: 163>, <TokenType.TSTZMULTIRANGE: 164>, <TokenType.DATERANGE: 165>, <TokenType.DATEMULTIRANGE: 166>, <TokenType.UUID: 167>, <TokenType.GEOGRAPHY: 168>, <TokenType.GEOGRAPHYPOINT: 169>, <TokenType.NULLABLE: 170>, <TokenType.GEOMETRY: 171>, <TokenType.POINT: 172>, <TokenType.RING: 173>, <TokenType.LINESTRING: 174>, <TokenType.LOCALTIME: 175>, <TokenType.LOCALTIMESTAMP: 176>, <TokenType.MULTILINESTRING: 178>, <TokenType.POLYGON: 179>, <TokenType.MULTIPOLYGON: 180>, <TokenType.HLLSKETCH: 181>, <TokenType.HSTORE: 182>, <TokenType.SUPER: 183>, <TokenType.SERIAL: 184>, <TokenType.SMALLSERIAL: 185>, <TokenType.BIGSERIAL: 186>, <TokenType.XML: 187>, <TokenType.YEAR: 188>, <TokenType.USERDEFINED: 189>, <TokenType.MONEY: 190>, <TokenType.SMALLMONEY: 191>, <TokenType.ROWVERSION: 192>, <TokenType.IMAGE: 193>, <TokenType.VARIANT: 194>, <TokenType.OBJECT: 195>, <TokenType.INET: 196>, <TokenType.IPADDRESS: 197>, <TokenType.IPPREFIX: 198>, <TokenType.IPV4: 199>, <TokenType.IPV6: 200>, <TokenType.ENUM: 201>, <TokenType.ENUM8: 202>, <TokenType.ENUM16: 203>, <TokenType.FIXEDSTRING: 204>, <TokenType.LOWCARDINALITY: 205>, <TokenType.NESTED: 206>, <TokenType.AGGREGATEFUNCTION: 207>, <TokenType.SIMPLEAGGREGATEFUNCTION: 208>, <TokenType.TDIGEST: 209>, <TokenType.UNKNOWN: 210>, <TokenType.VECTOR: 211>, <TokenType.DYNAMIC: 212>, <TokenType.VOID: 213>, <TokenType.ALL: 216>, <TokenType.APPLY: 219>, <TokenType.ASC: 221>, <TokenType.ATTACH: 223>, <TokenType.AUTO_INCREMENT: 224>, <TokenType.BEGIN: 225>, <TokenType.CACHE: 228>, <TokenType.CASE: 229>, <TokenType.COLLATE: 232>, <TokenType.COMMAND: 233>, <TokenType.COMMENT: 234>, <TokenType.COMMIT: 235>, <TokenType.CONSTRAINT: 237>, <TokenType.COPY: 238>, <TokenType.CUBE: 241>, <TokenType.CURRENT_DATE: 242>, <TokenType.CURRENT_DATETIME: 243>, <TokenType.CURRENT_SCHEMA: 244>, <TokenType.CURRENT_TIME: 245>, <TokenType.CURRENT_TIMESTAMP: 246>, <TokenType.CURRENT_USER: 247>, <TokenType.CURRENT_ROLE: 248>, <TokenType.DEFAULT: 251>, <TokenType.DELETE: 252>, <TokenType.DESC: 253>, <TokenType.DESCRIBE: 254>, <TokenType.DETACH: 255>, <TokenType.DICTIONARY: 256>, <TokenType.DIV: 259>, <TokenType.END: 262>, <TokenType.ESCAPE: 263>, <TokenType.EXECUTE: 265>, <TokenType.EXISTS: 266>, <TokenType.FALSE: 267>, <TokenType.FILE: 269>, <TokenType.FILE_FORMAT: 270>, <TokenType.FILTER: 271>, <TokenType.FIRST: 273>, <TokenType.FOREIGN_KEY: 276>, <TokenType.FUNCTION: 280>, <TokenType.GET: 281>, <TokenType.INDEX: 292>, <TokenType.INTERVAL: 298>, <TokenType.IS: 302>, <TokenType.ISNULL: 303>, <TokenType.KEEP: 306>, <TokenType.KILL: 308>, <TokenType.LIMIT: 313>, <TokenType.LIST: 314>, <TokenType.LOAD: 315>, <TokenType.MAP: 317>, <TokenType.MATCH: 318>, <TokenType.MERGE: 322>, <TokenType.MODEL: 324>, <TokenType.NEXT: 326>, <TokenType.NOTHING: 327>, <TokenType.NULL: 329>, <TokenType.OBJECT_IDENTIFIER: 330>, <TokenType.OFFSET: 331>, <TokenType.OPERATOR: 334>, <TokenType.ORDINALITY: 338>, <TokenType.INOUT: 340>, <TokenType.OVER: 342>, <TokenType.OVERLAPS: 343>, <TokenType.OVERWRITE: 344>, <TokenType.PARTITION: 345>, <TokenType.PERCENT: 347>, <TokenType.PIVOT: 348>, <TokenType.PRAGMA: 351>, <TokenType.PROCEDURE: 354>, <TokenType.PSEUDO_TYPE: 356>, <TokenType.PUT: 357>, <TokenType.RANGE: 361>, <TokenType.RECURSIVE: 362>, <TokenType.REFRESH: 363>, <TokenType.RENAME: 364>, <TokenType.REPLACE: 365>, <TokenType.REFERENCES: 368>, <TokenType.ROLLUP: 372>, <TokenType.ROW: 373>, <TokenType.ROWS: 374>, <TokenType.SEQUENCE: 378>, <TokenType.SET: 380>, <TokenType.SHOW: 382>, <TokenType.SOME: 384>, <TokenType.STORAGE_INTEGRATION: 388>, <TokenType.STRAIGHT_JOIN: 389>, <TokenType.STRUCT: 390>, <TokenType.TAG: 393>, <TokenType.TEMPORARY: 394>, <TokenType.TOP: 395>, <TokenType.TRUE: 397>, <TokenType.TRUNCATE: 398>, <TokenType.TRIGGER: 399>, <TokenType.UNNEST: 402>, <TokenType.UNPIVOT: 403>, <TokenType.UPDATE: 404>, <TokenType.USE: 405>, <TokenType.VIEW: 409>, <TokenType.SEMANTIC_VIEW: 410>, <TokenType.VOLATILE: 411>, <TokenType.UNIQUE: 416>, <TokenType.SINK: 423>, <TokenType.SOURCE: 424>, <TokenType.ANALYZE: 425>, <TokenType.NAMESPACE: 426>, <TokenType.EXPORT: 427>}
ALIAS_TOKENS = {<TokenType.SESSION: 56>, <TokenType.IDENTIFIER: 76>, <TokenType.DATABASE: 77>, <TokenType.COLUMN: 78>, <TokenType.SCHEMA: 80>, <TokenType.TABLE: 81>, <TokenType.WAREHOUSE: 82>, <TokenType.STAGE: 83>, <TokenType.STREAMLIT: 84>, <TokenType.VAR: 85>, <TokenType.BIT: 93>, <TokenType.BOOLEAN: 94>, <TokenType.TINYINT: 95>, <TokenType.UTINYINT: 96>, <TokenType.SMALLINT: 97>, <TokenType.USMALLINT: 98>, <TokenType.MEDIUMINT: 99>, <TokenType.UMEDIUMINT: 100>, <TokenType.INT: 101>, <TokenType.UINT: 102>, <TokenType.BIGINT: 103>, <TokenType.UBIGINT: 104>, <TokenType.BIGNUM: 105>, <TokenType.INT128: 106>, <TokenType.UINT128: 107>, <TokenType.INT256: 108>, <TokenType.UINT256: 109>, <TokenType.FLOAT: 110>, <TokenType.DOUBLE: 111>, <TokenType.UDOUBLE: 112>, <TokenType.DECIMAL: 113>, <TokenType.DECIMAL32: 114>, <TokenType.DECIMAL64: 115>, <TokenType.DECIMAL128: 116>, <TokenType.DECIMAL256: 117>, <TokenType.DECFLOAT: 118>, <TokenType.UDECIMAL: 119>, <TokenType.BIGDECIMAL: 120>, <TokenType.CHAR: 121>, <TokenType.NCHAR: 122>, <TokenType.VARCHAR: 123>, <TokenType.NVARCHAR: 124>, <TokenType.BPCHAR: 125>, <TokenType.TEXT: 126>, <TokenType.MEDIUMTEXT: 127>, <TokenType.LONGTEXT: 128>, <TokenType.BLOB: 129>, <TokenType.MEDIUMBLOB: 130>, <TokenType.LONGBLOB: 131>, <TokenType.TINYBLOB: 132>, <TokenType.TINYTEXT: 133>, <TokenType.NAME: 134>, <TokenType.BINARY: 135>, <TokenType.VARBINARY: 136>, <TokenType.JSON: 137>, <TokenType.JSONB: 138>, <TokenType.TIME: 139>, <TokenType.TIMETZ: 140>, <TokenType.TIME_NS: 141>, <TokenType.TIMESTAMP: 142>, <TokenType.TIMESTAMPTZ: 143>, <TokenType.TIMESTAMPLTZ: 144>, <TokenType.TIMESTAMPNTZ: 145>, <TokenType.TIMESTAMP_S: 146>, <TokenType.TIMESTAMP_MS: 147>, <TokenType.TIMESTAMP_NS: 148>, <TokenType.DATETIME: 149>, <TokenType.DATETIME2: 150>, <TokenType.DATETIME64: 151>, <TokenType.SMALLDATETIME: 152>, <TokenType.DATE: 153>, <TokenType.DATE32: 154>, <TokenType.INT4RANGE: 155>, <TokenType.INT4MULTIRANGE: 156>, <TokenType.INT8RANGE: 157>, <TokenType.INT8MULTIRANGE: 158>, <TokenType.NUMRANGE: 159>, <TokenType.NUMMULTIRANGE: 160>, <TokenType.TSRANGE: 161>, <TokenType.TSMULTIRANGE: 162>, <TokenType.TSTZRANGE: 163>, <TokenType.TSTZMULTIRANGE: 164>, <TokenType.DATERANGE: 165>, <TokenType.DATEMULTIRANGE: 166>, <TokenType.UUID: 167>, <TokenType.GEOGRAPHY: 168>, <TokenType.GEOGRAPHYPOINT: 169>, <TokenType.NULLABLE: 170>, <TokenType.GEOMETRY: 171>, <TokenType.POINT: 172>, <TokenType.RING: 173>, <TokenType.LINESTRING: 174>, <TokenType.LOCALTIME: 175>, <TokenType.LOCALTIMESTAMP: 176>, <TokenType.MULTILINESTRING: 178>, <TokenType.POLYGON: 179>, <TokenType.MULTIPOLYGON: 180>, <TokenType.HLLSKETCH: 181>, <TokenType.HSTORE: 182>, <TokenType.SUPER: 183>, <TokenType.SERIAL: 184>, <TokenType.SMALLSERIAL: 185>, <TokenType.BIGSERIAL: 186>, <TokenType.XML: 187>, <TokenType.YEAR: 188>, <TokenType.USERDEFINED: 189>, <TokenType.MONEY: 190>, <TokenType.SMALLMONEY: 191>, <TokenType.ROWVERSION: 192>, <TokenType.IMAGE: 193>, <TokenType.VARIANT: 194>, <TokenType.OBJECT: 195>, <TokenType.INET: 196>, <TokenType.IPADDRESS: 197>, <TokenType.IPPREFIX: 198>, <TokenType.IPV4: 199>, <TokenType.IPV6: 200>, <TokenType.ENUM: 201>, <TokenType.ENUM8: 202>, <TokenType.ENUM16: 203>, <TokenType.FIXEDSTRING: 204>, <TokenType.LOWCARDINALITY: 205>, <TokenType.NESTED: 206>, <TokenType.AGGREGATEFUNCTION: 207>, <TokenType.SIMPLEAGGREGATEFUNCTION: 208>, <TokenType.TDIGEST: 209>, <TokenType.UNKNOWN: 210>, <TokenType.VECTOR: 211>, <TokenType.DYNAMIC: 212>, <TokenType.VOID: 213>, <TokenType.ALL: 216>, <TokenType.ANTI: 217>, <TokenType.ANY: 218>, <TokenType.APPLY: 219>, <TokenType.ARRAY: 220>, <TokenType.ASC: 221>, <TokenType.ASOF: 222>, <TokenType.ATTACH: 223>, <TokenType.AUTO_INCREMENT: 224>, <TokenType.BEGIN: 225>, <TokenType.CACHE: 228>, <TokenType.CASE: 229>, <TokenType.COLLATE: 232>, <TokenType.COMMAND: 233>, <TokenType.COMMENT: 234>, <TokenType.COMMIT: 235>, <TokenType.CONSTRAINT: 237>, <TokenType.COPY: 238>, <TokenType.CUBE: 241>, <TokenType.CURRENT_DATE: 242>, <TokenType.CURRENT_DATETIME: 243>, <TokenType.CURRENT_SCHEMA: 244>, <TokenType.CURRENT_TIME: 245>, <TokenType.CURRENT_TIMESTAMP: 246>, <TokenType.CURRENT_USER: 247>, <TokenType.CURRENT_ROLE: 248>, <TokenType.DEFAULT: 251>, <TokenType.DELETE: 252>, <TokenType.DESC: 253>, <TokenType.DESCRIBE: 254>, <TokenType.DETACH: 255>, <TokenType.DICTIONARY: 256>, <TokenType.DIV: 259>, <TokenType.END: 262>, <TokenType.ESCAPE: 263>, <TokenType.EXECUTE: 265>, <TokenType.EXISTS: 266>, <TokenType.FALSE: 267>, <TokenType.FILE: 269>, <TokenType.FILE_FORMAT: 270>, <TokenType.FILTER: 271>, <TokenType.FINAL: 272>, <TokenType.FIRST: 273>, <TokenType.FOREIGN_KEY: 276>, <TokenType.FULL: 279>, <TokenType.FUNCTION: 280>, <TokenType.GET: 281>, <TokenType.INDEX: 292>, <TokenType.INTERVAL: 298>, <TokenType.IS: 302>, <TokenType.ISNULL: 303>, <TokenType.KEEP: 306>, <TokenType.KILL: 308>, <TokenType.LEFT: 311>, <TokenType.LIMIT: 313>, <TokenType.LIST: 314>, <TokenType.LOAD: 315>, <TokenType.LOCK: 316>, <TokenType.MAP: 317>, <TokenType.MATCH: 318>, <TokenType.MERGE: 322>, <TokenType.MODEL: 324>, <TokenType.NATURAL: 325>, <TokenType.NEXT: 326>, <TokenType.NOTHING: 327>, <TokenType.NULL: 329>, <TokenType.OBJECT_IDENTIFIER: 330>, <TokenType.OFFSET: 331>, <TokenType.OPERATOR: 334>, <TokenType.ORDINALITY: 338>, <TokenType.INOUT: 340>, <TokenType.OVER: 342>, <TokenType.OVERLAPS: 343>, <TokenType.OVERWRITE: 344>, <TokenType.PARTITION: 345>, <TokenType.PERCENT: 347>, <TokenType.PIVOT: 348>, <TokenType.PRAGMA: 351>, <TokenType.PROCEDURE: 354>, <TokenType.PSEUDO_TYPE: 356>, <TokenType.PUT: 357>, <TokenType.RANGE: 361>, <TokenType.RECURSIVE: 362>, <TokenType.REFRESH: 363>, <TokenType.RENAME: 364>, <TokenType.REPLACE: 365>, <TokenType.REFERENCES: 368>, <TokenType.RIGHT: 369>, <TokenType.ROLLUP: 372>, <TokenType.ROW: 373>, <TokenType.ROWS: 374>, <TokenType.SEMI: 376>, <TokenType.SEQUENCE: 378>, <TokenType.SET: 380>, <TokenType.SETTINGS: 381>, <TokenType.SHOW: 382>, <TokenType.SOME: 384>, <TokenType.STORAGE_INTEGRATION: 388>, <TokenType.STRUCT: 390>, <TokenType.TAG: 393>, <TokenType.TEMPORARY: 394>, <TokenType.TOP: 395>, <TokenType.TRUE: 397>, <TokenType.TRUNCATE: 398>, <TokenType.TRIGGER: 399>, <TokenType.UNNEST: 402>, <TokenType.UNPIVOT: 403>, <TokenType.UPDATE: 404>, <TokenType.USE: 405>, <TokenType.VIEW: 409>, <TokenType.SEMANTIC_VIEW: 410>, <TokenType.VOLATILE: 411>, <TokenType.WINDOW: 414>, <TokenType.UNIQUE: 416>, <TokenType.SINK: 423>, <TokenType.SOURCE: 424>, <TokenType.ANALYZE: 425>, <TokenType.NAMESPACE: 426>, <TokenType.EXPORT: 427>}
LOG_DEFAULTS_TO_LN = True
QUERY_MODIFIER_PARSERS = {<TokenType.MATCH_RECOGNIZE: 320>: <function Parser.<lambda>>, <TokenType.PREWHERE: 352>: <function Parser.<lambda>>, <TokenType.WHERE: 413>: <function Parser.<lambda>>, <TokenType.GROUP_BY: 285>: <function Parser.<lambda>>, <TokenType.HAVING: 287>: <function Parser.<lambda>>, <TokenType.QUALIFY: 358>: <function Parser.<lambda>>, <TokenType.WINDOW: 414>: <function Parser.<lambda>>, <TokenType.ORDER_BY: 335>: <function Parser.<lambda>>, <TokenType.LIMIT: 313>: <function Parser.<lambda>>, <TokenType.FETCH: 268>: <function Parser.<lambda>>, <TokenType.OFFSET: 331>: <function Parser.<lambda>>, <TokenType.FOR: 274>: <function Parser.<lambda>>, <TokenType.LOCK: 316>: <function Parser.<lambda>>, <TokenType.TABLE_SAMPLE: 392>: <function Parser.<lambda>>, <TokenType.USING: 406>: <function Parser.<lambda>>, <TokenType.CLUSTER_BY: 231>: <function Parser.<lambda>>, <TokenType.DISTRIBUTE_BY: 258>: <function Parser.<lambda>>, <TokenType.SORT_BY: 385>: <function Parser.<lambda>>, <TokenType.CONNECT_BY: 236>: <function Parser.<lambda>>, <TokenType.START_WITH: 387>: <function Parser.<lambda>>, <TokenType.SETTINGS: 381>: <function ClickHouse.Parser.<lambda>>, <TokenType.FORMAT: 277>: <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>>, '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 = {'UNIQUE', 'CHECK', 'PRIMARY KEY', 'BUCKET', 'TRUNCATE', 'INDEX', 'FOREIGN KEY', 'EXCLUDE', 'PERIOD', 'LIKE'}
PLACEHOLDER_PARSERS = {<TokenType.PLACEHOLDER: 349>: <function Parser.<lambda>>, <TokenType.PARAMETER: 55>: <function Parser.<lambda>>, <TokenType.COLON: 11>: <function Parser.<lambda>>, <TokenType.L_BRACE: 5>: <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
TRIGGER_EVENTS
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
FUNCTIONS_WITH_ALIASED_ARGS
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
TRIGGER_TIMING
TRIGGER_DEFERRABLE
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
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
SET_ASSIGNMENT_DELIMITERS
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
ALTER_TABLE_PARTITIONS
ZONE_AWARE_TIMESTAMP_CONSTRUCTOR
MAP_KEYS_ARE_ARBITRARY_EXPRESSIONS
JSON_EXTRACT_REQUIRES_JSON_EXPRESSION
ADD_JOIN_ON_TRUE
SUPPORTS_OMITTED_INTERVAL_SPAN_UNIT
raise_error
validate_expression
reset
errors
error_level
error_message_context
max_errors
dialect
sql
parse
parse_into
check_errors
expression
parse_set_operation
build_cast
class ClickHouse.Generator(sqlglot.generator.Generator):
1067    class Generator(generator.Generator):
1068        QUERY_HINTS = False
1069        STRUCT_DELIMITER = ("(", ")")
1070        NVL2_SUPPORTED = False
1071        TABLESAMPLE_REQUIRES_PARENS = False
1072        TABLESAMPLE_SIZE_IS_ROWS = False
1073        TABLESAMPLE_KEYWORDS = "SAMPLE"
1074        LAST_DAY_SUPPORTS_DATE_PART = False
1075        CAN_IMPLEMENT_ARRAY_ANY = True
1076        SUPPORTS_TO_NUMBER = False
1077        JOIN_HINTS = False
1078        TABLE_HINTS = False
1079        GROUPINGS_SEP = ""
1080        SET_OP_MODIFIERS = False
1081        ARRAY_SIZE_NAME = "LENGTH"
1082        WRAP_DERIVED_VALUES = False
1083
1084        STRING_TYPE_MAPPING = {
1085            exp.DataType.Type.BLOB: "String",
1086            exp.DataType.Type.CHAR: "String",
1087            exp.DataType.Type.LONGBLOB: "String",
1088            exp.DataType.Type.LONGTEXT: "String",
1089            exp.DataType.Type.MEDIUMBLOB: "String",
1090            exp.DataType.Type.MEDIUMTEXT: "String",
1091            exp.DataType.Type.TINYBLOB: "String",
1092            exp.DataType.Type.TINYTEXT: "String",
1093            exp.DataType.Type.TEXT: "String",
1094            exp.DataType.Type.VARBINARY: "String",
1095            exp.DataType.Type.VARCHAR: "String",
1096        }
1097
1098        SUPPORTED_JSON_PATH_PARTS = {
1099            exp.JSONPathKey,
1100            exp.JSONPathRoot,
1101            exp.JSONPathSubscript,
1102        }
1103
1104        TYPE_MAPPING = {
1105            **generator.Generator.TYPE_MAPPING,
1106            **STRING_TYPE_MAPPING,
1107            exp.DataType.Type.ARRAY: "Array",
1108            exp.DataType.Type.BOOLEAN: "Bool",
1109            exp.DataType.Type.BIGINT: "Int64",
1110            exp.DataType.Type.DATE32: "Date32",
1111            exp.DataType.Type.DATETIME: "DateTime",
1112            exp.DataType.Type.DATETIME2: "DateTime",
1113            exp.DataType.Type.SMALLDATETIME: "DateTime",
1114            exp.DataType.Type.DATETIME64: "DateTime64",
1115            exp.DataType.Type.DECIMAL: "Decimal",
1116            exp.DataType.Type.DECIMAL32: "Decimal32",
1117            exp.DataType.Type.DECIMAL64: "Decimal64",
1118            exp.DataType.Type.DECIMAL128: "Decimal128",
1119            exp.DataType.Type.DECIMAL256: "Decimal256",
1120            exp.DataType.Type.TIMESTAMP: "DateTime",
1121            exp.DataType.Type.TIMESTAMPNTZ: "DateTime",
1122            exp.DataType.Type.TIMESTAMPTZ: "DateTime",
1123            exp.DataType.Type.DOUBLE: "Float64",
1124            exp.DataType.Type.ENUM: "Enum",
1125            exp.DataType.Type.ENUM8: "Enum8",
1126            exp.DataType.Type.ENUM16: "Enum16",
1127            exp.DataType.Type.FIXEDSTRING: "FixedString",
1128            exp.DataType.Type.FLOAT: "Float32",
1129            exp.DataType.Type.INT: "Int32",
1130            exp.DataType.Type.MEDIUMINT: "Int32",
1131            exp.DataType.Type.INT128: "Int128",
1132            exp.DataType.Type.INT256: "Int256",
1133            exp.DataType.Type.LOWCARDINALITY: "LowCardinality",
1134            exp.DataType.Type.MAP: "Map",
1135            exp.DataType.Type.NESTED: "Nested",
1136            exp.DataType.Type.NOTHING: "Nothing",
1137            exp.DataType.Type.SMALLINT: "Int16",
1138            exp.DataType.Type.STRUCT: "Tuple",
1139            exp.DataType.Type.TINYINT: "Int8",
1140            exp.DataType.Type.UBIGINT: "UInt64",
1141            exp.DataType.Type.UINT: "UInt32",
1142            exp.DataType.Type.UINT128: "UInt128",
1143            exp.DataType.Type.UINT256: "UInt256",
1144            exp.DataType.Type.USMALLINT: "UInt16",
1145            exp.DataType.Type.UTINYINT: "UInt8",
1146            exp.DataType.Type.IPV4: "IPv4",
1147            exp.DataType.Type.IPV6: "IPv6",
1148            exp.DataType.Type.POINT: "Point",
1149            exp.DataType.Type.RING: "Ring",
1150            exp.DataType.Type.LINESTRING: "LineString",
1151            exp.DataType.Type.MULTILINESTRING: "MultiLineString",
1152            exp.DataType.Type.POLYGON: "Polygon",
1153            exp.DataType.Type.MULTIPOLYGON: "MultiPolygon",
1154            exp.DataType.Type.AGGREGATEFUNCTION: "AggregateFunction",
1155            exp.DataType.Type.SIMPLEAGGREGATEFUNCTION: "SimpleAggregateFunction",
1156            exp.DataType.Type.DYNAMIC: "Dynamic",
1157        }
1158
1159        TRANSFORMS = {
1160            **generator.Generator.TRANSFORMS,
1161            exp.AnyValue: rename_func("any"),
1162            exp.ApproxDistinct: rename_func("uniq"),
1163            exp.ArrayConcat: rename_func("arrayConcat"),
1164            exp.ArrayContains: rename_func("has"),
1165            exp.ArrayFilter: lambda self, e: self.func("arrayFilter", e.expression, e.this),
1166            exp.ArrayRemove: remove_from_array_using_filter,
1167            exp.ArrayReverse: rename_func("arrayReverse"),
1168            exp.ArraySlice: rename_func("arraySlice"),
1169            exp.ArraySum: rename_func("arraySum"),
1170            exp.ArrayMax: rename_func("arrayMax"),
1171            exp.ArrayMin: rename_func("arrayMin"),
1172            exp.ArgMax: arg_max_or_min_no_count("argMax"),
1173            exp.ArgMin: arg_max_or_min_no_count("argMin"),
1174            exp.Array: inline_array_sql,
1175            exp.CastToStrType: rename_func("CAST"),
1176            exp.CurrentDatabase: rename_func("CURRENT_DATABASE"),
1177            exp.CurrentSchemas: rename_func("CURRENT_SCHEMAS"),
1178            exp.CountIf: rename_func("countIf"),
1179            exp.CosineDistance: rename_func("cosineDistance"),
1180            exp.CompressColumnConstraint: lambda self,
1181            e: f"CODEC({self.expressions(e, key='this', flat=True)})",
1182            exp.ComputedColumnConstraint: lambda self,
1183            e: f"{'MATERIALIZED' if e.args.get('persisted') else 'ALIAS'} {self.sql(e, 'this')}",
1184            exp.CurrentDate: lambda self, e: self.func("CURRENT_DATE"),
1185            exp.CurrentVersion: rename_func("VERSION"),
1186            exp.DateAdd: _datetime_delta_sql("DATE_ADD"),
1187            exp.DateDiff: _datetime_delta_sql("DATE_DIFF"),
1188            exp.DateStrToDate: rename_func("toDate"),
1189            exp.DateSub: _datetime_delta_sql("DATE_SUB"),
1190            exp.Explode: rename_func("arrayJoin"),
1191            exp.FarmFingerprint: rename_func("farmFingerprint64"),
1192            exp.Final: lambda self, e: f"{self.sql(e, 'this')} FINAL",
1193            exp.IsNan: rename_func("isNaN"),
1194            exp.JarowinklerSimilarity: jarowinkler_similarity("jaroWinklerSimilarity"),
1195            exp.JSONCast: lambda self, e: f"{self.sql(e, 'this')}.:{self.sql(e, 'to')}",
1196            exp.JSONExtract: json_extract_segments("JSONExtractString", quoted_index=False),
1197            exp.JSONExtractScalar: json_extract_segments("JSONExtractString", quoted_index=False),
1198            exp.JSONPathKey: json_path_key_only_name,
1199            exp.JSONPathRoot: lambda *_: "",
1200            exp.Length: length_or_char_length_sql,
1201            exp.Map: _map_sql,
1202            exp.Median: rename_func("median"),
1203            exp.Nullif: rename_func("nullIf"),
1204            exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}",
1205            exp.Pivot: no_pivot_sql,
1206            exp.Quantile: _quantile_sql,
1207            exp.RegexpLike: lambda self, e: self.func("match", e.this, e.expression),
1208            exp.Rand: rename_func("randCanonical"),
1209            exp.StartsWith: rename_func("startsWith"),
1210            exp.Struct: rename_func("tuple"),
1211            exp.Trunc: rename_func("trunc"),
1212            exp.EndsWith: rename_func("endsWith"),
1213            exp.EuclideanDistance: rename_func("L2Distance"),
1214            exp.StrPosition: lambda self, e: strposition_sql(
1215                self,
1216                e,
1217                func_name="POSITION",
1218                supports_position=True,
1219                use_ansi_position=False,
1220            ),
1221            exp.TimeToStr: lambda self, e: self.func(
1222                "formatDateTime", e.this, self.format_time(e), e.args.get("zone")
1223            ),
1224            exp.TimeStrToTime: _timestrtotime_sql,
1225            exp.TimestampAdd: _datetime_delta_sql("TIMESTAMP_ADD"),
1226            exp.TimestampSub: _datetime_delta_sql("TIMESTAMP_SUB"),
1227            exp.Typeof: rename_func("toTypeName"),
1228            exp.VarMap: _map_sql,
1229            exp.Xor: lambda self, e: self.func("xor", e.this, e.expression, *e.expressions),
1230            exp.MD5Digest: rename_func("MD5"),
1231            exp.MD5: lambda self, e: self.func("LOWER", self.func("HEX", self.func("MD5", e.this))),
1232            exp.SHA: rename_func("SHA1"),
1233            exp.SHA1Digest: rename_func("SHA1"),
1234            exp.SHA2: sha256_sql,
1235            exp.SHA2Digest: sha2_digest_sql,
1236            exp.Split: lambda self, e: self.func(
1237                "splitByString", e.args.get("expression"), e.this, e.args.get("limit")
1238            ),
1239            exp.RegexpSplit: lambda self, e: self.func(
1240                "splitByRegexp", e.args.get("expression"), e.this, e.args.get("limit")
1241            ),
1242            exp.UnixToTime: _unix_to_time_sql,
1243            exp.TimestampTrunc: timestamptrunc_sql(func="dateTrunc", zone=True),
1244            exp.Trim: lambda self, e: trim_sql(self, e, default_trim_type="BOTH"),
1245            exp.Variance: rename_func("varSamp"),
1246            exp.SchemaCommentProperty: lambda self, e: self.naked_property(e),
1247            exp.Stddev: rename_func("stddevSamp"),
1248            exp.Chr: rename_func("CHAR"),
1249            exp.Lag: lambda self, e: self.func(
1250                "lagInFrame", e.this, e.args.get("offset"), e.args.get("default")
1251            ),
1252            exp.Lead: lambda self, e: self.func(
1253                "leadInFrame", e.this, e.args.get("offset"), e.args.get("default")
1254            ),
1255            exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")(
1256                rename_func("editDistance")
1257            ),
1258            exp.ParseDatetime: rename_func("parseDateTime"),
1259        }
1260
1261        PROPERTIES_LOCATION = {
1262            **generator.Generator.PROPERTIES_LOCATION,
1263            exp.OnCluster: exp.Properties.Location.POST_NAME,
1264            exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA,
1265            exp.ToTableProperty: exp.Properties.Location.POST_NAME,
1266            exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED,
1267        }
1268
1269        # There's no list in docs, but it can be found in Clickhouse code
1270        # see `ClickHouse/src/Parsers/ParserCreate*.cpp`
1271        ON_CLUSTER_TARGETS = {
1272            "SCHEMA",  # Transpiled CREATE SCHEMA may have OnCluster property set
1273            "DATABASE",
1274            "TABLE",
1275            "VIEW",
1276            "DICTIONARY",
1277            "INDEX",
1278            "FUNCTION",
1279            "NAMED COLLECTION",
1280        }
1281
1282        # https://clickhouse.com/docs/en/sql-reference/data-types/nullable
1283        NON_NULLABLE_TYPES = {
1284            exp.DataType.Type.ARRAY,
1285            exp.DataType.Type.MAP,
1286            exp.DataType.Type.STRUCT,
1287            exp.DataType.Type.POINT,
1288            exp.DataType.Type.RING,
1289            exp.DataType.Type.LINESTRING,
1290            exp.DataType.Type.MULTILINESTRING,
1291            exp.DataType.Type.POLYGON,
1292            exp.DataType.Type.MULTIPOLYGON,
1293        }
1294
1295        def offset_sql(self, expression: exp.Offset) -> str:
1296            offset = super().offset_sql(expression)
1297
1298            # OFFSET ... FETCH syntax requires a "ROW" or "ROWS" keyword
1299            # https://clickhouse.com/docs/sql-reference/statements/select/offset
1300            parent = expression.parent
1301            if isinstance(parent, exp.Select) and isinstance(parent.args.get("limit"), exp.Fetch):
1302                offset = f"{offset} ROWS"
1303
1304            return offset
1305
1306        def strtodate_sql(self, expression: exp.StrToDate) -> str:
1307            strtodate_sql = self.function_fallback_sql(expression)
1308
1309            if not isinstance(expression.parent, exp.Cast):
1310                # StrToDate returns DATEs in other dialects (eg. postgres), so
1311                # this branch aims to improve the transpilation to clickhouse
1312                return self.cast_sql(exp.cast(expression, "DATE"))
1313
1314            return strtodate_sql
1315
1316        def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str:
1317            this = expression.this
1318
1319            if isinstance(this, exp.StrToDate) and expression.to == exp.DataType.build("datetime"):
1320                return self.sql(this)
1321
1322            return super().cast_sql(expression, safe_prefix=safe_prefix)
1323
1324        def trycast_sql(self, expression: exp.TryCast) -> str:
1325            dtype = expression.to
1326            if not dtype.is_type(*self.NON_NULLABLE_TYPES, check_nullable=True):
1327                # Casting x into Nullable(T) appears to behave similarly to TRY_CAST(x AS T)
1328                dtype.set("nullable", True)
1329
1330            return super().cast_sql(expression)
1331
1332        def _jsonpathsubscript_sql(self, expression: exp.JSONPathSubscript) -> str:
1333            this = self.json_path_part(expression.this)
1334            return str(int(this) + 1) if is_int(this) else this
1335
1336        def likeproperty_sql(self, expression: exp.LikeProperty) -> str:
1337            return f"AS {self.sql(expression, 'this')}"
1338
1339        def _any_to_has(
1340            self,
1341            expression: exp.EQ | exp.NEQ,
1342            default: t.Callable[[t.Any], str],
1343            prefix: str = "",
1344        ) -> str:
1345            if isinstance(expression.left, exp.Any):
1346                arr = expression.left
1347                this = expression.right
1348            elif isinstance(expression.right, exp.Any):
1349                arr = expression.right
1350                this = expression.left
1351            else:
1352                return default(expression)
1353
1354            return prefix + self.func("has", arr.this.unnest(), this)
1355
1356        def eq_sql(self, expression: exp.EQ) -> str:
1357            return self._any_to_has(expression, super().eq_sql)
1358
1359        def neq_sql(self, expression: exp.NEQ) -> str:
1360            return self._any_to_has(expression, super().neq_sql, "NOT ")
1361
1362        def regexpilike_sql(self, expression: exp.RegexpILike) -> str:
1363            # Manually add a flag to make the search case-insensitive
1364            regex = self.func("CONCAT", "'(?i)'", expression.expression)
1365            return self.func("match", expression.this, regex)
1366
1367        def datatype_sql(self, expression: exp.DataType) -> str:
1368            # String is the standard ClickHouse type, every other variant is just an alias.
1369            # Additionally, any supplied length parameter will be ignored.
1370            #
1371            # https://clickhouse.com/docs/en/sql-reference/data-types/string
1372            if expression.this in self.STRING_TYPE_MAPPING:
1373                dtype = "String"
1374            else:
1375                dtype = super().datatype_sql(expression)
1376
1377            # This section changes the type to `Nullable(...)` if the following conditions hold:
1378            # - It's marked as nullable - this ensures we won't wrap ClickHouse types with `Nullable`
1379            #   and change their semantics
1380            # - It's not the key type of a `Map`. This is because ClickHouse enforces the following
1381            #   constraint: "Type of Map key must be a type, that can be represented by integer or
1382            #   String or FixedString (possibly LowCardinality) or UUID or IPv6"
1383            # - It's not a composite type, e.g. `Nullable(Array(...))` is not a valid type
1384            parent = expression.parent
1385            nullable = expression.args.get("nullable")
1386            if nullable is True or (
1387                nullable is None
1388                and not (
1389                    isinstance(parent, exp.DataType)
1390                    and parent.is_type(exp.DataType.Type.MAP, check_nullable=True)
1391                    and expression.index in (None, 0)
1392                )
1393                and not expression.is_type(*self.NON_NULLABLE_TYPES, check_nullable=True)
1394            ):
1395                dtype = f"Nullable({dtype})"
1396
1397            return dtype
1398
1399        def cte_sql(self, expression: exp.CTE) -> str:
1400            if expression.args.get("scalar"):
1401                this = self.sql(expression, "this")
1402                alias = self.sql(expression, "alias")
1403                return f"{this} AS {alias}"
1404
1405            return super().cte_sql(expression)
1406
1407        def after_limit_modifiers(self, expression: exp.Expression) -> t.List[str]:
1408            return super().after_limit_modifiers(expression) + [
1409                (
1410                    self.seg("SETTINGS ") + self.expressions(expression, key="settings", flat=True)
1411                    if expression.args.get("settings")
1412                    else ""
1413                ),
1414                (
1415                    self.seg("FORMAT ") + self.sql(expression, "format")
1416                    if expression.args.get("format")
1417                    else ""
1418                ),
1419            ]
1420
1421        def placeholder_sql(self, expression: exp.Placeholder) -> str:
1422            return f"{{{expression.name}: {self.sql(expression, 'kind')}}}"
1423
1424        def oncluster_sql(self, expression: exp.OnCluster) -> str:
1425            return f"ON CLUSTER {self.sql(expression, 'this')}"
1426
1427        def createable_sql(self, expression: exp.Create, locations: t.DefaultDict) -> str:
1428            if expression.kind in self.ON_CLUSTER_TARGETS and locations.get(
1429                exp.Properties.Location.POST_NAME
1430            ):
1431                this_name = self.sql(
1432                    expression.this if isinstance(expression.this, exp.Schema) else expression,
1433                    "this",
1434                )
1435                this_properties = " ".join(
1436                    [self.sql(prop) for prop in locations[exp.Properties.Location.POST_NAME]]
1437                )
1438                this_schema = self.schema_columns_sql(expression.this)
1439                this_schema = f"{self.sep()}{this_schema}" if this_schema else ""
1440
1441                return f"{this_name}{self.sep()}{this_properties}{this_schema}"
1442
1443            return super().createable_sql(expression, locations)
1444
1445        def create_sql(self, expression: exp.Create) -> str:
1446            # The comment property comes last in CTAS statements, i.e. after the query
1447            query = expression.expression
1448            if isinstance(query, exp.Query):
1449                comment_prop = expression.find(exp.SchemaCommentProperty)
1450                if comment_prop:
1451                    comment_prop.pop()
1452                    query.replace(exp.paren(query))
1453            else:
1454                comment_prop = None
1455
1456            create_sql = super().create_sql(expression)
1457
1458            comment_sql = self.sql(comment_prop)
1459            comment_sql = f" {comment_sql}" if comment_sql else ""
1460
1461            return f"{create_sql}{comment_sql}"
1462
1463        def prewhere_sql(self, expression: exp.PreWhere) -> str:
1464            this = self.indent(self.sql(expression, "this"))
1465            return f"{self.seg('PREWHERE')}{self.sep()}{this}"
1466
1467        def indexcolumnconstraint_sql(self, expression: exp.IndexColumnConstraint) -> str:
1468            this = self.sql(expression, "this")
1469            this = f" {this}" if this else ""
1470            expr = self.sql(expression, "expression")
1471            expr = f" {expr}" if expr else ""
1472            index_type = self.sql(expression, "index_type")
1473            index_type = f" TYPE {index_type}" if index_type else ""
1474            granularity = self.sql(expression, "granularity")
1475            granularity = f" GRANULARITY {granularity}" if granularity else ""
1476
1477            return f"INDEX{this}{expr}{index_type}{granularity}"
1478
1479        def partition_sql(self, expression: exp.Partition) -> str:
1480            return f"PARTITION {self.expressions(expression, flat=True)}"
1481
1482        def partitionid_sql(self, expression: exp.PartitionId) -> str:
1483            return f"ID {self.sql(expression.this)}"
1484
1485        def replacepartition_sql(self, expression: exp.ReplacePartition) -> str:
1486            return (
1487                f"REPLACE {self.sql(expression.expression)} FROM {self.sql(expression, 'source')}"
1488            )
1489
1490        def projectiondef_sql(self, expression: exp.ProjectionDef) -> str:
1491            return f"PROJECTION {self.sql(expression.this)} {self.wrap(expression.expression)}"
1492
1493        def is_sql(self, expression: exp.Is) -> str:
1494            is_sql = super().is_sql(expression)
1495
1496            if isinstance(expression.parent, exp.Not):
1497                # value IS NOT NULL -> NOT (value IS NULL)
1498                is_sql = self.wrap(is_sql)
1499
1500            return is_sql
1501
1502        def in_sql(self, expression: exp.In) -> str:
1503            in_sql = super().in_sql(expression)
1504
1505            if isinstance(expression.parent, exp.Not) and expression.args.get("is_global"):
1506                in_sql = in_sql.replace("GLOBAL IN", "GLOBAL NOT IN", 1)
1507
1508            return in_sql
1509
1510        def not_sql(self, expression: exp.Not) -> str:
1511            if isinstance(expression.this, exp.In):
1512                if expression.this.args.get("is_global"):
1513                    # let `GLOBAL IN` child interpose `NOT`
1514                    return self.sql(expression, "this")
1515
1516                expression.set("this", exp.paren(expression.this, copy=False))
1517
1518            return super().not_sql(expression)
1519
1520        def values_sql(self, expression: exp.Values, values_as_table: bool = True) -> str:
1521            # If the VALUES clause contains tuples of expressions, we need to treat it
1522            # as a table since Clickhouse will automatically alias it as such.
1523            alias = expression.args.get("alias")
1524
1525            if alias and alias.args.get("columns") and expression.expressions:
1526                values = expression.expressions[0].expressions
1527                values_as_table = any(isinstance(value, exp.Tuple) for value in values)
1528            else:
1529                values_as_table = True
1530
1531            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: Always quote except for specials cases. 'safe': Only quote identifiers that are case insensitive.
  • normalize: Whether to normalize identifiers to lowercase. Default: False.
  • pad: The pad size in a formatted string. For example, this affects the indentation of a projection in a query, relative to its nesting level. Default: 2.
  • indent: The indentation size in a formatted string. For example, this affects the indentation of subqueries and filters under a 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.Adjacent'>: <function Generator.<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.CurrentCatalog'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SessionUser'>: <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.EndStatement'>: <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.NetFunc'>: <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.ExtendsLeft'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ExtendsRight'>: <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.ZeroFillColumnConstraint'>: <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.SafeFunc'>: <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.TriggerExecute'>: <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.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.Variadic'>: <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.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.ArrayContains'>: <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.ArrayMax'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.ArrayMin'>: <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.CurrentDatabase'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.CurrentSchemas'>: <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.CurrentVersion'>: <function rename_func.<locals>.<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.JarowinklerSimilarity'>: <function jarowinkler_similarity.<locals>.jarowinklersimilarity_sql>, <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.Struct'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.Trunc'>: <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.SHA1Digest'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.SHA2'>: <function sha256_sql>, <class 'sqlglot.expressions.SHA2Digest'>: <function sha2_digest_sql>, <class 'sqlglot.expressions.Split'>: <function ClickHouse.Generator.<lambda>>, <class 'sqlglot.expressions.RegexpSplit'>: <function ClickHouse.Generator.<lambda>>, <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.RefreshTriggerProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RemoteWithConnectionModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ReturnsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RollupProperty'>: <Location.UNSUPPORTED: 'UNSUPPORTED'>, <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.TriggerProperties'>: <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 = {'TABLE', 'FUNCTION', 'VIEW', 'NAMED COLLECTION', 'DATABASE', 'INDEX', 'DICTIONARY', 'SCHEMA'}
NON_NULLABLE_TYPES = {<Type.STRUCT: 'STRUCT'>, <Type.RING: 'RING'>, <Type.POLYGON: 'POLYGON'>, <Type.LINESTRING: 'LINESTRING'>, <Type.MULTILINESTRING: 'MULTILINESTRING'>, <Type.MULTIPOLYGON: 'MULTIPOLYGON'>, <Type.ARRAY: 'ARRAY'>, <Type.POINT: 'POINT'>, <Type.MAP: 'MAP'>}
def offset_sql(self, expression: sqlglot.expressions.Offset) -> str:
1295        def offset_sql(self, expression: exp.Offset) -> str:
1296            offset = super().offset_sql(expression)
1297
1298            # OFFSET ... FETCH syntax requires a "ROW" or "ROWS" keyword
1299            # https://clickhouse.com/docs/sql-reference/statements/select/offset
1300            parent = expression.parent
1301            if isinstance(parent, exp.Select) and isinstance(parent.args.get("limit"), exp.Fetch):
1302                offset = f"{offset} ROWS"
1303
1304            return offset
def strtodate_sql(self, expression: sqlglot.expressions.StrToDate) -> str:
1306        def strtodate_sql(self, expression: exp.StrToDate) -> str:
1307            strtodate_sql = self.function_fallback_sql(expression)
1308
1309            if not isinstance(expression.parent, exp.Cast):
1310                # StrToDate returns DATEs in other dialects (eg. postgres), so
1311                # this branch aims to improve the transpilation to clickhouse
1312                return self.cast_sql(exp.cast(expression, "DATE"))
1313
1314            return strtodate_sql
def cast_sql( self, expression: sqlglot.expressions.Cast, safe_prefix: Optional[str] = None) -> str:
1316        def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str:
1317            this = expression.this
1318
1319            if isinstance(this, exp.StrToDate) and expression.to == exp.DataType.build("datetime"):
1320                return self.sql(this)
1321
1322            return super().cast_sql(expression, safe_prefix=safe_prefix)
def trycast_sql(self, expression: sqlglot.expressions.TryCast) -> str:
1324        def trycast_sql(self, expression: exp.TryCast) -> str:
1325            dtype = expression.to
1326            if not dtype.is_type(*self.NON_NULLABLE_TYPES, check_nullable=True):
1327                # Casting x into Nullable(T) appears to behave similarly to TRY_CAST(x AS T)
1328                dtype.set("nullable", True)
1329
1330            return super().cast_sql(expression)
def likeproperty_sql(self, expression: sqlglot.expressions.LikeProperty) -> str:
1336        def likeproperty_sql(self, expression: exp.LikeProperty) -> str:
1337            return f"AS {self.sql(expression, 'this')}"
def eq_sql(self, expression: sqlglot.expressions.EQ) -> str:
1356        def eq_sql(self, expression: exp.EQ) -> str:
1357            return self._any_to_has(expression, super().eq_sql)
def neq_sql(self, expression: sqlglot.expressions.NEQ) -> str:
1359        def neq_sql(self, expression: exp.NEQ) -> str:
1360            return self._any_to_has(expression, super().neq_sql, "NOT ")
def regexpilike_sql(self, expression: sqlglot.expressions.RegexpILike) -> str:
1362        def regexpilike_sql(self, expression: exp.RegexpILike) -> str:
1363            # Manually add a flag to make the search case-insensitive
1364            regex = self.func("CONCAT", "'(?i)'", expression.expression)
1365            return self.func("match", expression.this, regex)
def datatype_sql(self, expression: sqlglot.expressions.DataType) -> str:
1367        def datatype_sql(self, expression: exp.DataType) -> str:
1368            # String is the standard ClickHouse type, every other variant is just an alias.
1369            # Additionally, any supplied length parameter will be ignored.
1370            #
1371            # https://clickhouse.com/docs/en/sql-reference/data-types/string
1372            if expression.this in self.STRING_TYPE_MAPPING:
1373                dtype = "String"
1374            else:
1375                dtype = super().datatype_sql(expression)
1376
1377            # This section changes the type to `Nullable(...)` if the following conditions hold:
1378            # - It's marked as nullable - this ensures we won't wrap ClickHouse types with `Nullable`
1379            #   and change their semantics
1380            # - It's not the key type of a `Map`. This is because ClickHouse enforces the following
1381            #   constraint: "Type of Map key must be a type, that can be represented by integer or
1382            #   String or FixedString (possibly LowCardinality) or UUID or IPv6"
1383            # - It's not a composite type, e.g. `Nullable(Array(...))` is not a valid type
1384            parent = expression.parent
1385            nullable = expression.args.get("nullable")
1386            if nullable is True or (
1387                nullable is None
1388                and not (
1389                    isinstance(parent, exp.DataType)
1390                    and parent.is_type(exp.DataType.Type.MAP, check_nullable=True)
1391                    and expression.index in (None, 0)
1392                )
1393                and not expression.is_type(*self.NON_NULLABLE_TYPES, check_nullable=True)
1394            ):
1395                dtype = f"Nullable({dtype})"
1396
1397            return dtype
def cte_sql(self, expression: sqlglot.expressions.CTE) -> str:
1399        def cte_sql(self, expression: exp.CTE) -> str:
1400            if expression.args.get("scalar"):
1401                this = self.sql(expression, "this")
1402                alias = self.sql(expression, "alias")
1403                return f"{this} AS {alias}"
1404
1405            return super().cte_sql(expression)
def after_limit_modifiers(self, expression: sqlglot.expressions.Expression) -> List[str]:
1407        def after_limit_modifiers(self, expression: exp.Expression) -> t.List[str]:
1408            return super().after_limit_modifiers(expression) + [
1409                (
1410                    self.seg("SETTINGS ") + self.expressions(expression, key="settings", flat=True)
1411                    if expression.args.get("settings")
1412                    else ""
1413                ),
1414                (
1415                    self.seg("FORMAT ") + self.sql(expression, "format")
1416                    if expression.args.get("format")
1417                    else ""
1418                ),
1419            ]
def placeholder_sql(self, expression: sqlglot.expressions.Placeholder) -> str:
1421        def placeholder_sql(self, expression: exp.Placeholder) -> str:
1422            return f"{{{expression.name}: {self.sql(expression, 'kind')}}}"
def oncluster_sql(self, expression: sqlglot.expressions.OnCluster) -> str:
1424        def oncluster_sql(self, expression: exp.OnCluster) -> str:
1425            return f"ON CLUSTER {self.sql(expression, 'this')}"
def createable_sql( self, expression: sqlglot.expressions.Create, locations: DefaultDict) -> str:
1427        def createable_sql(self, expression: exp.Create, locations: t.DefaultDict) -> str:
1428            if expression.kind in self.ON_CLUSTER_TARGETS and locations.get(
1429                exp.Properties.Location.POST_NAME
1430            ):
1431                this_name = self.sql(
1432                    expression.this if isinstance(expression.this, exp.Schema) else expression,
1433                    "this",
1434                )
1435                this_properties = " ".join(
1436                    [self.sql(prop) for prop in locations[exp.Properties.Location.POST_NAME]]
1437                )
1438                this_schema = self.schema_columns_sql(expression.this)
1439                this_schema = f"{self.sep()}{this_schema}" if this_schema else ""
1440
1441                return f"{this_name}{self.sep()}{this_properties}{this_schema}"
1442
1443            return super().createable_sql(expression, locations)
def create_sql(self, expression: sqlglot.expressions.Create) -> str:
1445        def create_sql(self, expression: exp.Create) -> str:
1446            # The comment property comes last in CTAS statements, i.e. after the query
1447            query = expression.expression
1448            if isinstance(query, exp.Query):
1449                comment_prop = expression.find(exp.SchemaCommentProperty)
1450                if comment_prop:
1451                    comment_prop.pop()
1452                    query.replace(exp.paren(query))
1453            else:
1454                comment_prop = None
1455
1456            create_sql = super().create_sql(expression)
1457
1458            comment_sql = self.sql(comment_prop)
1459            comment_sql = f" {comment_sql}" if comment_sql else ""
1460
1461            return f"{create_sql}{comment_sql}"
def prewhere_sql(self, expression: sqlglot.expressions.PreWhere) -> str:
1463        def prewhere_sql(self, expression: exp.PreWhere) -> str:
1464            this = self.indent(self.sql(expression, "this"))
1465            return f"{self.seg('PREWHERE')}{self.sep()}{this}"
def indexcolumnconstraint_sql(self, expression: sqlglot.expressions.IndexColumnConstraint) -> str:
1467        def indexcolumnconstraint_sql(self, expression: exp.IndexColumnConstraint) -> str:
1468            this = self.sql(expression, "this")
1469            this = f" {this}" if this else ""
1470            expr = self.sql(expression, "expression")
1471            expr = f" {expr}" if expr else ""
1472            index_type = self.sql(expression, "index_type")
1473            index_type = f" TYPE {index_type}" if index_type else ""
1474            granularity = self.sql(expression, "granularity")
1475            granularity = f" GRANULARITY {granularity}" if granularity else ""
1476
1477            return f"INDEX{this}{expr}{index_type}{granularity}"
def partition_sql(self, expression: sqlglot.expressions.Partition) -> str:
1479        def partition_sql(self, expression: exp.Partition) -> str:
1480            return f"PARTITION {self.expressions(expression, flat=True)}"
def partitionid_sql(self, expression: sqlglot.expressions.PartitionId) -> str:
1482        def partitionid_sql(self, expression: exp.PartitionId) -> str:
1483            return f"ID {self.sql(expression.this)}"
def replacepartition_sql(self, expression: sqlglot.expressions.ReplacePartition) -> str:
1485        def replacepartition_sql(self, expression: exp.ReplacePartition) -> str:
1486            return (
1487                f"REPLACE {self.sql(expression.expression)} FROM {self.sql(expression, 'source')}"
1488            )
def projectiondef_sql(self, expression: sqlglot.expressions.ProjectionDef) -> str:
1490        def projectiondef_sql(self, expression: exp.ProjectionDef) -> str:
1491            return f"PROJECTION {self.sql(expression.this)} {self.wrap(expression.expression)}"
def is_sql(self, expression: sqlglot.expressions.Is) -> str:
1493        def is_sql(self, expression: exp.Is) -> str:
1494            is_sql = super().is_sql(expression)
1495
1496            if isinstance(expression.parent, exp.Not):
1497                # value IS NOT NULL -> NOT (value IS NULL)
1498                is_sql = self.wrap(is_sql)
1499
1500            return is_sql
def in_sql(self, expression: sqlglot.expressions.In) -> str:
1502        def in_sql(self, expression: exp.In) -> str:
1503            in_sql = super().in_sql(expression)
1504
1505            if isinstance(expression.parent, exp.Not) and expression.args.get("is_global"):
1506                in_sql = in_sql.replace("GLOBAL IN", "GLOBAL NOT IN", 1)
1507
1508            return in_sql
def not_sql(self, expression: sqlglot.expressions.Not) -> str:
1510        def not_sql(self, expression: exp.Not) -> str:
1511            if isinstance(expression.this, exp.In):
1512                if expression.this.args.get("is_global"):
1513                    # let `GLOBAL IN` child interpose `NOT`
1514                    return self.sql(expression, "this")
1515
1516                expression.set("this", exp.paren(expression.this, copy=False))
1517
1518            return super().not_sql(expression)
def values_sql( self, expression: sqlglot.expressions.Values, values_as_table: bool = True) -> str:
1520        def values_sql(self, expression: exp.Values, values_as_table: bool = True) -> str:
1521            # If the VALUES clause contains tuples of expressions, we need to treat it
1522            # as a table since Clickhouse will automatically alias it as such.
1523            alias = expression.args.get("alias")
1524
1525            if alias and alias.args.get("columns") and expression.expressions:
1526                values = expression.expressions[0].expressions
1527                values_as_table = any(isinstance(value, exp.Tuple) for value in values)
1528            else:
1529                values_as_table = True
1530
1531            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
INOUT_SEPARATOR
DIRECTED_JOINS
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
SET_ASSIGNMENT_REQUIRES_VARIABLE_KEYWORD
DECLARE_DEFAULT_ASSIGNMENT
UPDATE_STATEMENT_SUPPORTS_FROM
STAR_EXCLUDE_REQUIRES_DERIVED_TABLE
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
pseudocolumn_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
inoutcolumnconstraint_sql
sequenceproperties_sql
triggerproperties_sql
triggerreferencing_sql
triggerevent_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
rollupindex_sql
rollupproperty_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
booland_sql
boolor_sql
order_sql
withfill_sql
cluster_sql
distribute_sql
sort_sql
ordered_sql
matchrecognizemeasure_sql
matchrecognize_sql
query_modifiers
options_modifier
for_modifiers
queryoption_sql
offset_limit_modifiers
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
strtotime_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
match_sql
similarto_sql
lt_sql
lte_sql
mod_sql
mul_sql
nullsafeeq_sql
nullsafeneq_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
converttimezone_sql
json_sql
jsonvalue_sql
conditionalinsert_sql
multitableinserts_sql
oncondition_sql
jsonextractquote_sql
jsonexists_sql
arrayagg_sql
slice_sql
apply_sql
grant_sql
revoke_sql
grantprivilege_sql
grantprincipal_sql
columns_sql
overlay_sql
todouble_sql
string_sql
median_sql
overflowtruncatebehavior_sql
unixseconds_sql
arraysize_sql
attach_sql
detach_sql
attachoption_sql
watermarkcolumnconstraint_sql
encodeproperty_sql
includeproperty_sql
xmlelement_sql
xmlkeyvalueoption_sql
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
install_sql
get_put_sql
translatecharacters_sql
decodecase_sql
semanticview_sql
getextract_sql
datefromunixdate_sql
space_sql
buildproperty_sql
refreshtriggerproperty_sql
modelattribute_sql
directorystage_sql
uuid_sql
initcap_sql
localtime_sql
localtimestamp_sql
weekstart_sql
chr_sql
block_sql
storedprocedure_sql
ifblock_sql
whileblock_sql
execute_sql
executesql_sql