Edit on GitHub

sqlglot.parsers.duckdb

  1from __future__ import annotations
  2
  3import typing as t
  4
  5from sqlglot import exp, parser
  6from sqlglot.trie import new_trie
  7from sqlglot.dialects.dialect import (
  8    binary_from_function,
  9    build_default_decimal_type,
 10    build_formatted_time,
 11    build_regexp_extract,
 12    date_trunc_to_time,
 13    pivot_column_names,
 14)
 15from sqlglot.helper import seq_get
 16from sqlglot.parser import IsPredicatePrecedence, binary_range_parser
 17from sqlglot.tokens import TokenType
 18from collections.abc import Collection
 19
 20
 21def _build_list_sort(name: str, desc: bool = False) -> t.Callable[[list], exp.Expr]:
 22    # Orders are case-insensitive strings, e.g. LIST_SORT(x, 'desc', 'nulls first'), and NULLs default to last
 23    def _builder(args: list) -> exp.Expr:
 24        orders = [exp.Literal.string("DESC"), *args[1:]] if desc else args[1:]
 25        order_name = _list_sort_order_name(seq_get(orders, 0), "ASC")
 26        null_order_name = _list_sort_order_name(seq_get(orders, 1), "NULLS LAST")
 27        valid = order_name in ("ASC", "DESC") and null_order_name in ("NULLS FIRST", "NULLS LAST")
 28        if not valid:
 29            return exp.Anonymous(this=name, expressions=args)
 30
 31        return exp.ArraySort(
 32            this=seq_get(args, 0),
 33            asc=exp.false() if order_name == "DESC" else None,
 34            nulls_first=exp.Boolean(this=null_order_name == "NULLS FIRST"),
 35        )
 36
 37    return _builder
 38
 39
 40def _list_sort_order_name(order: exp.Expr | None, default: str) -> str | None:
 41    if order is None:
 42        return default
 43    return order.name.upper() if order.is_string else None
 44
 45
 46def _build_array_prepend(args: list) -> exp.Expr:
 47    return exp.ArrayPrepend(this=seq_get(args, 1), expression=seq_get(args, 0))
 48
 49
 50def _build_date_diff(args: list) -> exp.Expr:
 51    unit = seq_get(args, 0)
 52
 53    # DATE_DIFF counts the unit boundaries crossed, e.g. one month from 2026-01-31 to 2026-02-01,
 54    # except for WEEK, which counts whole 7-day spans
 55    date_part_boundary = (
 56        isinstance(unit, (exp.Literal, exp.Var)) and unit.name.upper() not in ("WEEK", "WEEKS", "W")
 57    ) or None
 58
 59    return exp.DateDiff(
 60        this=seq_get(args, 2),
 61        expression=seq_get(args, 1),
 62        unit=unit,
 63        date_part_boundary=date_part_boundary,
 64    )
 65
 66
 67def _build_generate_series(end_exclusive: bool = False) -> t.Callable[[list], exp.GenerateSeries]:
 68    def _builder(args: list) -> exp.GenerateSeries:
 69        # Check https://duckdb.org/docs/sql/functions/nested.html#range-functions
 70        if len(args) == 1:
 71            # DuckDB uses 0 as a default for the series' start when it's omitted
 72            args.insert(0, exp.Literal.number("0"))
 73
 74        gen_series = exp.GenerateSeries.from_arg_list(args)
 75        gen_series.set("is_end_exclusive", end_exclusive)
 76
 77        return gen_series
 78
 79    return _builder
 80
 81
 82def _build_make_timestamp(args: list) -> exp.Expr:
 83    if len(args) == 1:
 84        return exp.UnixToTime(this=seq_get(args, 0), scale=exp.UnixToTime.MICROS)
 85
 86    return exp.TimestampFromParts(
 87        year=seq_get(args, 0),
 88        month=seq_get(args, 1),
 89        day=seq_get(args, 2),
 90        hour=seq_get(args, 3),
 91        min=seq_get(args, 4),
 92        sec=seq_get(args, 5),
 93    )
 94
 95
 96def _show_parser(*args: t.Any, **kwargs: t.Any) -> t.Callable[[DuckDBParser], exp.Show]:
 97    def _parse(self: DuckDBParser) -> exp.Show:
 98        return self._parse_show_duckdb(*args, **kwargs)
 99
100    return _parse
101
102
103def _convert_text_type(dtype: exp.DataType) -> exp.DataType:
104    dtype.set("expressions", None)
105    return dtype
106
107
108_parse_regexp_like = binary_range_parser(exp.RegexpLike)
109_parse_regexp_full_match = binary_range_parser(exp.RegexpFullMatch)
110
111
112class DuckDBParser(parser.Parser):
113    SUPPORTS_TABLE_QUERY = True
114
115    IS_PREDICATE_PRECEDENCE = IsPredicatePrecedence.LOW
116
117    MAP_KEYS_ARE_ARBITRARY_EXPRESSIONS = True
118    PIVOT_COLUMN_NAMING = "agg_name_if_aliased_or_multiple"
119
120    SUPPORTS_DIRECTED_JOIN = False
121
122    JOIN_KINDS = parser.Parser.JOIN_KINDS - {TokenType.STRAIGHT_JOIN}
123
124    NO_PAREN_FUNCTIONS = {
125        **parser.Parser.NO_PAREN_FUNCTIONS,
126        TokenType.LOCALTIME: exp.Localtime,
127        TokenType.LOCALTIMESTAMP: exp.Localtimestamp,
128        TokenType.CURRENT_CATALOG: exp.CurrentCatalog,
129        TokenType.SESSION_USER: exp.SessionUser,
130    }
131
132    BITWISE = {k: v for k, v in parser.Parser.BITWISE.items() if k != TokenType.CARET}
133
134    COLUMN_OPERATORS = {
135        k: v
136        for k, v in parser.Parser.COLUMN_OPERATORS.items()
137        if k not in (TokenType.ARROW, TokenType.DARROW)
138    }
139
140    JSON_OPERATORS = {
141        TokenType.ARROW: parser.build_json_extract,
142        TokenType.DARROW: parser.build_json_extract_scalar,
143    }
144
145    RANGE_PARSERS = {
146        **parser.Parser.RANGE_PARSERS,
147        TokenType.DAMP: binary_range_parser(exp.ArrayOverlaps),
148        TokenType.TILDE: lambda self, this: self._parse_tilde(this),
149    }
150
151    EXPONENT = {
152        **parser.Parser.EXPONENT,
153        TokenType.CARET: exp.Pow,
154        TokenType.DSTAR: exp.Pow,
155    }
156
157    FUNCTIONS_WITH_ALIASED_ARGS = {*parser.Parser.FUNCTIONS_WITH_ALIASED_ARGS, "STRUCT_PACK"}
158
159    SHOW_PARSERS = {
160        "TABLES": _show_parser("TABLES"),
161        "ALL TABLES": _show_parser("ALL TABLES"),
162    }
163
164    FUNCTIONS = {
165        **{k: v for k, v in parser.Parser.FUNCTIONS.items() if k not in ("DATE_SUB", "GLOB")},
166        **dict.fromkeys(
167            ("ARRAY_DISTINCT", "LIST_DISTINCT"),
168            lambda args: exp.ArrayDistinct(this=seq_get(args, 0), check_null=False),
169        ),
170        "ANY_VALUE": lambda args: exp.IgnoreNulls(this=exp.AnyValue.from_arg_list(args)),
171        "ARRAY_PREPEND": _build_array_prepend,
172        "ARRAY_REVERSE_SORT": _build_list_sort("ARRAY_REVERSE_SORT", desc=True),
173        "ARRAY_INTERSECT": lambda args: exp.ArrayIntersect(expressions=args),
174        "ARRAY_SORT": _build_list_sort("ARRAY_SORT"),
175        "ARRAY_SLICE": lambda args: exp.ArraySlice(
176            this=seq_get(args, 0),
177            start=seq_get(args, 1),
178            end=seq_get(args, 2),
179            step=seq_get(args, 3),
180            is_length=False,
181        ),
182        "BIT_AND": exp.BitwiseAndAgg.from_arg_list,
183        "BIT_OR": exp.BitwiseOrAgg.from_arg_list,
184        "BIT_XOR": exp.BitwiseXorAgg.from_arg_list,
185        "CURRENT_LOCALTIMESTAMP": exp.Localtimestamp.from_arg_list,
186        "DATEDIFF": _build_date_diff,
187        "DATE_DIFF": _build_date_diff,
188        "DATE_TRUNC": date_trunc_to_time,
189        "DATETRUNC": date_trunc_to_time,
190        "DECODE": lambda args: exp.Decode(
191            this=seq_get(args, 0), charset=exp.Literal.string("utf-8")
192        ),
193        "EDITDIST3": exp.Levenshtein.from_arg_list,
194        "ENCODE": lambda args: exp.Encode(
195            this=seq_get(args, 0), charset=exp.Literal.string("utf-8")
196        ),
197        "EPOCH": exp.TimeToUnix.from_arg_list,
198        "EPOCH_MS": lambda args: exp.UnixToTime(this=seq_get(args, 0), scale=exp.UnixToTime.MILLIS),
199        "FROM_HEX": exp.Unhex.from_arg_list,
200        "GENERATE_SERIES": _build_generate_series(),
201        "GET_CURRENT_TIME": exp.CurrentTime.from_arg_list,
202        "GET_BIT": lambda args: exp.Getbit(
203            this=seq_get(args, 0), expression=seq_get(args, 1), zero_is_msb=True
204        ),
205        "JARO_WINKLER_SIMILARITY": exp.JarowinklerSimilarity.from_arg_list,
206        "JSON": exp.ParseJSON.from_arg_list,
207        "JSON_ARRAY": lambda args: exp.JSONArray(expressions=args),
208        "JSON_EXTRACT_PATH": parser.build_extract_json_with_path(exp.JSONExtract),
209        "JSON_EXTRACT_STRING": parser.build_extract_json_with_path(exp.JSONExtractScalar),
210        "LIST": exp.ArrayAgg.from_arg_list,
211        "LIST_APPEND": exp.ArrayAppend.from_arg_list,
212        "LIST_CONCAT": parser.build_array_concat,
213        "LIST_CONTAINS": exp.ArrayContains.from_arg_list,
214        "LIST_COSINE_DISTANCE": exp.CosineDistance.from_arg_list,
215        "LIST_DISTANCE": exp.EuclideanDistance.from_arg_list,
216        "LIST_FILTER": exp.ArrayFilter.from_arg_list,
217        "LIST_HAS": exp.ArrayContains.from_arg_list,
218        "LIST_HAS_ANY": exp.ArrayOverlaps.from_arg_list,
219        "LIST_MAX": exp.ArrayMax.from_arg_list,
220        "LIST_MIN": exp.ArrayMin.from_arg_list,
221        "LIST_PREPEND": _build_array_prepend,
222        "LIST_REVERSE_SORT": _build_list_sort("LIST_REVERSE_SORT", desc=True),
223        "LIST_SORT": _build_list_sort("LIST_SORT"),
224        "LIST_TRANSFORM": exp.Transform.from_arg_list,
225        "LIST_VALUE": lambda args: exp.Array(
226            expressions=args, value_constructor=len(args) == 1 and isinstance(args[0], exp.Query)
227        ),
228        "MAKE_DATE": exp.DateFromParts.from_arg_list,
229        "MAKE_TIME": exp.TimeFromParts.from_arg_list,
230        "MAKE_TIMESTAMP": _build_make_timestamp,
231        "QUANTILE_CONT": exp.PercentileCont.from_arg_list,
232        "QUANTILE_DISC": exp.PercentileDisc.from_arg_list,
233        "RANGE": _build_generate_series(end_exclusive=True),
234        "REGEXP_EXTRACT": build_regexp_extract(exp.RegexpExtract),
235        "REGEXP_EXTRACT_ALL": build_regexp_extract(exp.RegexpExtractAll),
236        "REGEXP_MATCHES": exp.RegexpLike.from_arg_list,
237        "REGEXP_REPLACE": lambda args: exp.RegexpReplace(
238            this=seq_get(args, 0),
239            expression=seq_get(args, 1),
240            replacement=seq_get(args, 2),
241            modifiers=seq_get(args, 3),
242            single_replace=True,
243        ),
244        "SHA256": lambda args: exp.SHA2(this=seq_get(args, 0), length=exp.Literal.number(256)),
245        "STRFTIME": build_formatted_time(exp.TimeToStr),
246        "STRING_SPLIT": exp.Split.from_arg_list,
247        "STRING_SPLIT_REGEX": exp.RegexpSplit.from_arg_list,
248        "STRING_TO_ARRAY": exp.Split.from_arg_list,
249        "STRPTIME": build_formatted_time(exp.StrToTime),
250        "STRUCT_PACK": exp.Struct.from_arg_list,
251        "STR_SPLIT": exp.Split.from_arg_list,
252        "STR_SPLIT_REGEX": exp.RegexpSplit.from_arg_list,
253        "TODAY": exp.CurrentDate.from_arg_list,
254        "TIME_BUCKET": exp.DateBin.from_arg_list,
255        "TO_TIMESTAMP": exp.UnixToTime.from_arg_list,
256        "UNNEST": exp.Explode.from_arg_list,
257        "VERSION": exp.CurrentVersion.from_arg_list,
258        "XOR": binary_from_function(exp.BitwiseXor),
259    }
260
261    FUNCTION_PARSERS = {
262        **{k: v for k, v in parser.Parser.FUNCTION_PARSERS.items() if k != "DECODE"},
263        **dict.fromkeys(
264            ("GROUP_CONCAT", "LISTAGG", "STRINGAGG"), lambda self: self._parse_string_agg()
265        ),
266        "APPROX_QUANTILE": lambda self: self._parse_distinct_arg_function(exp.ApproxQuantile),
267        "MAX": lambda self: self._parse_min_max(exp.Max),
268        "MIN": lambda self: self._parse_min_max(exp.Min),
269        "QUANTILE": lambda self: self._parse_distinct_arg_function(exp.Quantile),
270        "QUANTILE_CONT": lambda self: self._parse_distinct_arg_function(exp.PercentileCont),
271        "QUANTILE_DISC": lambda self: self._parse_distinct_arg_function(exp.PercentileDisc),
272    }
273
274    NO_PAREN_FUNCTION_PARSERS = {
275        **parser.Parser.NO_PAREN_FUNCTION_PARSERS,
276        "MAP": lambda self: self._parse_map(),
277        "@": lambda self: exp.Abs(this=self._parse_bitwise()),
278    }
279
280    PLACEHOLDER_PARSERS = {
281        **parser.Parser.PLACEHOLDER_PARSERS,
282        TokenType.PARAMETER: lambda self: (
283            self.expression(
284                exp.Placeholder(
285                    this=self._identifier_expression(quoted=True)
286                    if self._prev.token_type == TokenType.IDENTIFIER
287                    else self._prev.text
288                )
289            )
290            if self._match(TokenType.NUMBER) or self._match_set(self.ID_VAR_TOKENS)
291            else None
292        ),
293    }
294
295    TYPE_CONVERTERS = {
296        # https://duckdb.org/docs/sql/data_types/numeric
297        exp.DType.DECIMAL: build_default_decimal_type(precision=18, scale=3),
298        # https://duckdb.org/docs/sql/data_types/text
299        exp.DType.TEXT: _convert_text_type,
300    }
301
302    STATEMENT_PARSERS = {
303        **parser.Parser.STATEMENT_PARSERS,
304        TokenType.ATTACH: lambda self: self._parse_attach_detach(),
305        TokenType.CONNECT: lambda self: self.expression(
306            exp.ConnectTo(this=self._parse_string() or self._parse_id_var())
307        ),
308        TokenType.DETACH: lambda self: self._parse_attach_detach(is_attach=False),
309        TokenType.DISCONNECT: lambda self: self.expression(exp.Disconnect()),
310        TokenType.FORCE: lambda self: self._parse_force(),
311        TokenType.INSTALL: lambda self: self._parse_install(),
312        TokenType.SHOW: lambda self: self._parse_show(),
313    }
314
315    SET_PARSERS = {
316        **parser.Parser.SET_PARSERS,
317        "VARIABLE": lambda self: self._parse_set_item_assignment("VARIABLE"),
318    }
319
320    SHOW_TRIE = new_trie(key.split(" ") for key in SHOW_PARSERS)
321    SET_TRIE = new_trie(key.split(" ") for key in SET_PARSERS)
322
323    def _parse_min_max(self, func: type[exp.Min] | type[exp.Max]) -> exp.Min | exp.Max:
324        expression = self._parse_distinct_arg_function(func)
325        if len(expression.expressions) > 1:
326            self.raise_error(f"Expected at most 2 arguments for {func.__name__}")
327        expression.set("count", seq_get(expression.expressions, 0))
328        expression.set("expressions", None)
329        return expression
330
331    def _parse_tilde(self, this: exp.Expr | None) -> exp.Expr | None:
332        # ~ and !~ match anywhere in the string since DuckDB 2.0, and the whole string before it
333        # https://duckdb.org/docs/2.0/sql/functions/pattern_matching
334        if self.dialect.version >= (2, 0):
335            return _parse_regexp_like(self, this)
336        return _parse_regexp_full_match(self, this)
337
338    def _parse_trigger_execute(self) -> exp.Expr | None:
339        body = self._try_parse(self._parse_statement)
340        return body if not self._curr else None
341
342    def _parse_function_properties(self) -> exp.Properties | None:
343        if self._match(TokenType.TABLE):
344            return exp.Properties(
345                expressions=[
346                    exp.ReturnsProperty(
347                        this=exp.Schema(this=exp.var("TABLE")),
348                        is_table=True,
349                    ),
350                ]
351            )
352        return super()._parse_function_properties()
353
354    def _parse_lambda(self, alias: bool = False) -> exp.Expr | None:
355        index = self._index
356        if not self._match_text_seq("LAMBDA"):
357            return super()._parse_lambda(alias=alias)
358
359        expressions = self._parse_csv(self._parse_lambda_arg)
360        if not self._match(TokenType.COLON):
361            self._retreat(index)
362            return None
363
364        this = self._replace_lambda(self._parse_assignment(), expressions)
365        return self.expression(exp.Lambda(this=this, expressions=expressions))
366
367    def _parse_expression(self) -> exp.Expr | None:
368        # DuckDB supports prefix aliases, e.g. foo: 1
369        if self._next.token_type == TokenType.COLON:
370            alias = self._parse_id_var(tokens=self.ALIAS_TOKENS)
371            self._match(TokenType.COLON)
372            comments = self._prev_comments
373
374            this = self._parse_assignment()
375            if isinstance(this, exp.Expr):
376                # Moves the comment next to the alias in `alias: expr /* comment */`
377                comments += this.pop_comments() or []
378
379            return self.expression(exp.Alias(this=this, alias=alias), comments=comments)
380
381        return super()._parse_expression()
382
383    def _parse_table(
384        self,
385        schema: bool = False,
386        joins: bool = False,
387        alias_tokens: Collection[TokenType] | None = None,
388        parse_bracket: bool = False,
389        is_db_reference: bool = False,
390        parse_partition: bool = False,
391        consume_pipe: bool = False,
392    ) -> exp.Expr | None:
393        # DuckDB supports prefix aliases, e.g. FROM foo: bar
394        if self._next.token_type == TokenType.COLON:
395            alias = self._parse_table_alias(alias_tokens=alias_tokens or self.TABLE_ALIAS_TOKENS)
396            self._match(TokenType.COLON)
397            comments = self._prev_comments
398        else:
399            alias = None
400            comments = []
401
402        table = super()._parse_table(
403            schema=schema,
404            joins=joins,
405            alias_tokens=alias_tokens,
406            parse_bracket=parse_bracket,
407            is_db_reference=is_db_reference,
408            parse_partition=parse_partition,
409        )
410        if isinstance(table, exp.Expr) and isinstance(alias, exp.TableAlias):
411            # Moves the comment next to the alias in `alias: table /* comment */`
412            comments += table.pop_comments() or []
413            alias.comments = alias.pop_comments() + comments
414            table.set("alias", alias)
415
416        return table
417
418    def _parse_table_alias(
419        self, alias_tokens: Collection[TokenType] | None = None
420    ) -> exp.TableAlias | None:
421        if (
422            self._match_text_seq("NEAREST", advance=False)
423            and self._next.token_type == TokenType.NUMBER
424        ) or self._match_text_seq("APPROX", "NEAREST", advance=False):
425            return None
426
427        return super()._parse_table_alias(alias_tokens=alias_tokens)
428
429    def _parse_join(
430        self,
431        skip_join_token: bool = False,
432        parse_bracket: bool = False,
433        alias_tokens: Collection[TokenType] | None = None,
434    ) -> exp.Join | None:
435        join_type = None
436        if self._match_text_seq("JOIN", "BY", "(", "TYPE"):
437            join_type = self._parse_var(any_token=True)
438            self._match_r_paren()
439            skip_join_token = True
440
441        join = super()._parse_join(
442            skip_join_token=skip_join_token,
443            parse_bracket=parse_bracket,
444            alias_tokens=alias_tokens,
445        )
446        if not join:
447            return join
448
449        if join_type:
450            parts = join_type.name.upper().removesuffix("_JOIN").split("_")
451            if parts[0] in ("LEFT", "RIGHT", "FULL"):
452                join.set("side", parts.pop(0))
453            join.set("kind", " ".join(parts) or None)
454
455        approximate = self._match_text_seq("APPROX", "NEAREST")
456        if approximate or self._match_text_seq("NEAREST"):
457            count = self._parse_number()
458
459            if not self._match_text_seq("BY"):
460                self.raise_error("Expected BY after NEAREST count")
461            if not self._match_texts(("DISTANCE", "SIMILARITY")):
462                self.raise_error("Expected DISTANCE or SIMILARITY after BY")
463
464            similarity = self._prev.text.upper() == "SIMILARITY"
465            join.set(
466                "nearest",
467                self.expression(
468                    exp.Nearest(
469                        this=self._parse_disjunction(),
470                        count=count,
471                        approximate=approximate,
472                        similarity=similarity,
473                    )
474                ),
475            )
476
477        return join
478
479    def _parse_table_sample(self, as_modifier: bool = False) -> exp.TableSample | None:
480        # https://duckdb.org/docs/sql/samples.html
481        sample = super()._parse_table_sample(as_modifier=as_modifier)
482        if sample and not sample.args.get("method"):
483            if sample.args.get("size"):
484                sample.set("method", exp.var("RESERVOIR"))
485            else:
486                sample.set("method", exp.var("SYSTEM"))
487
488        return sample
489
490    def _parse_bracket(self, this: exp.Expr | None = None) -> exp.Expr | None:
491        bracket = super()._parse_bracket(this)
492
493        if self.dialect.version < (1, 2) and isinstance(bracket, exp.Bracket):
494            # https://duckdb.org/2025/02/05/announcing-duckdb-120.html#breaking-changes
495            bracket.set("returns_list_for_maps", True)
496
497        return bracket
498
499    def _parse_map(self) -> exp.ToMap | exp.Map:
500        if self._match(TokenType.L_BRACE, advance=False):
501            return self.expression(exp.ToMap(this=self._parse_bracket()))
502
503        args = self._parse_wrapped_csv(self._parse_assignment)
504        return self.expression(exp.Map(keys=seq_get(args, 0), values=seq_get(args, 1)))
505
506    def _parse_struct_types(self, type_required: bool = False) -> exp.Expr | None:
507        return self._parse_field_def()
508
509    def _pivot_column_names(self, aggregations: list[exp.Expr]) -> list[str]:
510        if len(aggregations) == 1:
511            return super()._pivot_column_names(aggregations)
512        return pivot_column_names(aggregations, dialect="duckdb")
513
514    def _parse_attach_detach(self, is_attach: bool = True) -> exp.Attach | exp.Detach:
515        def _parse_attach_option() -> exp.AttachOption:
516            return self.expression(
517                exp.AttachOption(
518                    this=self._parse_var(any_token=True),
519                    expression=self._parse_field(any_token=True),
520                )
521            )
522
523        self._match(TokenType.DATABASE)
524        exists = self._parse_exists(not_=is_attach)
525        this = self._parse_alias(self._parse_primary_or_var(), explicit=True)
526
527        if self._match(TokenType.L_PAREN, advance=False):
528            expressions = self._parse_wrapped_csv(_parse_attach_option)
529        else:
530            expressions = None
531
532        return (
533            self.expression(exp.Attach(this=this, exists=exists, expressions=expressions))
534            if is_attach
535            else self.expression(exp.Detach(this=this, exists=exists))
536        )
537
538    def _parse_show_duckdb(self, this: str) -> exp.Show:
539        from_ = self._parse_table(schema=True) if self._match(TokenType.FROM) else None
540        return self.expression(exp.Show(this=this, from_=from_))
541
542    def _parse_force(self) -> exp.Install | exp.Command:
543        # FORCE can only be followed by INSTALL or CHECKPOINT
544        # In the case of CHECKPOINT, we fallback
545        if not self._match(TokenType.INSTALL):
546            return self._parse_as_command(self._prev)
547
548        return self._parse_install(force=True)
549
550    def _parse_install(self, force: bool = False) -> exp.Install:
551        return self.expression(
552            exp.Install(
553                this=self._parse_id_var(),
554                from_=self._parse_var_or_string() if self._match(TokenType.FROM) else None,
555                force=force,
556            )
557        )
558
559    def _parse_primary(self) -> exp.Expr | None:
560        if self._match_pair(TokenType.HASH, TokenType.NUMBER):
561            return exp.PositionalColumn(this=exp.Literal.number(self._prev.text))
562
563        return super()._parse_primary()
class DuckDBParser(sqlglot.parser.Parser):
113class DuckDBParser(parser.Parser):
114    SUPPORTS_TABLE_QUERY = True
115
116    IS_PREDICATE_PRECEDENCE = IsPredicatePrecedence.LOW
117
118    MAP_KEYS_ARE_ARBITRARY_EXPRESSIONS = True
119    PIVOT_COLUMN_NAMING = "agg_name_if_aliased_or_multiple"
120
121    SUPPORTS_DIRECTED_JOIN = False
122
123    JOIN_KINDS = parser.Parser.JOIN_KINDS - {TokenType.STRAIGHT_JOIN}
124
125    NO_PAREN_FUNCTIONS = {
126        **parser.Parser.NO_PAREN_FUNCTIONS,
127        TokenType.LOCALTIME: exp.Localtime,
128        TokenType.LOCALTIMESTAMP: exp.Localtimestamp,
129        TokenType.CURRENT_CATALOG: exp.CurrentCatalog,
130        TokenType.SESSION_USER: exp.SessionUser,
131    }
132
133    BITWISE = {k: v for k, v in parser.Parser.BITWISE.items() if k != TokenType.CARET}
134
135    COLUMN_OPERATORS = {
136        k: v
137        for k, v in parser.Parser.COLUMN_OPERATORS.items()
138        if k not in (TokenType.ARROW, TokenType.DARROW)
139    }
140
141    JSON_OPERATORS = {
142        TokenType.ARROW: parser.build_json_extract,
143        TokenType.DARROW: parser.build_json_extract_scalar,
144    }
145
146    RANGE_PARSERS = {
147        **parser.Parser.RANGE_PARSERS,
148        TokenType.DAMP: binary_range_parser(exp.ArrayOverlaps),
149        TokenType.TILDE: lambda self, this: self._parse_tilde(this),
150    }
151
152    EXPONENT = {
153        **parser.Parser.EXPONENT,
154        TokenType.CARET: exp.Pow,
155        TokenType.DSTAR: exp.Pow,
156    }
157
158    FUNCTIONS_WITH_ALIASED_ARGS = {*parser.Parser.FUNCTIONS_WITH_ALIASED_ARGS, "STRUCT_PACK"}
159
160    SHOW_PARSERS = {
161        "TABLES": _show_parser("TABLES"),
162        "ALL TABLES": _show_parser("ALL TABLES"),
163    }
164
165    FUNCTIONS = {
166        **{k: v for k, v in parser.Parser.FUNCTIONS.items() if k not in ("DATE_SUB", "GLOB")},
167        **dict.fromkeys(
168            ("ARRAY_DISTINCT", "LIST_DISTINCT"),
169            lambda args: exp.ArrayDistinct(this=seq_get(args, 0), check_null=False),
170        ),
171        "ANY_VALUE": lambda args: exp.IgnoreNulls(this=exp.AnyValue.from_arg_list(args)),
172        "ARRAY_PREPEND": _build_array_prepend,
173        "ARRAY_REVERSE_SORT": _build_list_sort("ARRAY_REVERSE_SORT", desc=True),
174        "ARRAY_INTERSECT": lambda args: exp.ArrayIntersect(expressions=args),
175        "ARRAY_SORT": _build_list_sort("ARRAY_SORT"),
176        "ARRAY_SLICE": lambda args: exp.ArraySlice(
177            this=seq_get(args, 0),
178            start=seq_get(args, 1),
179            end=seq_get(args, 2),
180            step=seq_get(args, 3),
181            is_length=False,
182        ),
183        "BIT_AND": exp.BitwiseAndAgg.from_arg_list,
184        "BIT_OR": exp.BitwiseOrAgg.from_arg_list,
185        "BIT_XOR": exp.BitwiseXorAgg.from_arg_list,
186        "CURRENT_LOCALTIMESTAMP": exp.Localtimestamp.from_arg_list,
187        "DATEDIFF": _build_date_diff,
188        "DATE_DIFF": _build_date_diff,
189        "DATE_TRUNC": date_trunc_to_time,
190        "DATETRUNC": date_trunc_to_time,
191        "DECODE": lambda args: exp.Decode(
192            this=seq_get(args, 0), charset=exp.Literal.string("utf-8")
193        ),
194        "EDITDIST3": exp.Levenshtein.from_arg_list,
195        "ENCODE": lambda args: exp.Encode(
196            this=seq_get(args, 0), charset=exp.Literal.string("utf-8")
197        ),
198        "EPOCH": exp.TimeToUnix.from_arg_list,
199        "EPOCH_MS": lambda args: exp.UnixToTime(this=seq_get(args, 0), scale=exp.UnixToTime.MILLIS),
200        "FROM_HEX": exp.Unhex.from_arg_list,
201        "GENERATE_SERIES": _build_generate_series(),
202        "GET_CURRENT_TIME": exp.CurrentTime.from_arg_list,
203        "GET_BIT": lambda args: exp.Getbit(
204            this=seq_get(args, 0), expression=seq_get(args, 1), zero_is_msb=True
205        ),
206        "JARO_WINKLER_SIMILARITY": exp.JarowinklerSimilarity.from_arg_list,
207        "JSON": exp.ParseJSON.from_arg_list,
208        "JSON_ARRAY": lambda args: exp.JSONArray(expressions=args),
209        "JSON_EXTRACT_PATH": parser.build_extract_json_with_path(exp.JSONExtract),
210        "JSON_EXTRACT_STRING": parser.build_extract_json_with_path(exp.JSONExtractScalar),
211        "LIST": exp.ArrayAgg.from_arg_list,
212        "LIST_APPEND": exp.ArrayAppend.from_arg_list,
213        "LIST_CONCAT": parser.build_array_concat,
214        "LIST_CONTAINS": exp.ArrayContains.from_arg_list,
215        "LIST_COSINE_DISTANCE": exp.CosineDistance.from_arg_list,
216        "LIST_DISTANCE": exp.EuclideanDistance.from_arg_list,
217        "LIST_FILTER": exp.ArrayFilter.from_arg_list,
218        "LIST_HAS": exp.ArrayContains.from_arg_list,
219        "LIST_HAS_ANY": exp.ArrayOverlaps.from_arg_list,
220        "LIST_MAX": exp.ArrayMax.from_arg_list,
221        "LIST_MIN": exp.ArrayMin.from_arg_list,
222        "LIST_PREPEND": _build_array_prepend,
223        "LIST_REVERSE_SORT": _build_list_sort("LIST_REVERSE_SORT", desc=True),
224        "LIST_SORT": _build_list_sort("LIST_SORT"),
225        "LIST_TRANSFORM": exp.Transform.from_arg_list,
226        "LIST_VALUE": lambda args: exp.Array(
227            expressions=args, value_constructor=len(args) == 1 and isinstance(args[0], exp.Query)
228        ),
229        "MAKE_DATE": exp.DateFromParts.from_arg_list,
230        "MAKE_TIME": exp.TimeFromParts.from_arg_list,
231        "MAKE_TIMESTAMP": _build_make_timestamp,
232        "QUANTILE_CONT": exp.PercentileCont.from_arg_list,
233        "QUANTILE_DISC": exp.PercentileDisc.from_arg_list,
234        "RANGE": _build_generate_series(end_exclusive=True),
235        "REGEXP_EXTRACT": build_regexp_extract(exp.RegexpExtract),
236        "REGEXP_EXTRACT_ALL": build_regexp_extract(exp.RegexpExtractAll),
237        "REGEXP_MATCHES": exp.RegexpLike.from_arg_list,
238        "REGEXP_REPLACE": lambda args: exp.RegexpReplace(
239            this=seq_get(args, 0),
240            expression=seq_get(args, 1),
241            replacement=seq_get(args, 2),
242            modifiers=seq_get(args, 3),
243            single_replace=True,
244        ),
245        "SHA256": lambda args: exp.SHA2(this=seq_get(args, 0), length=exp.Literal.number(256)),
246        "STRFTIME": build_formatted_time(exp.TimeToStr),
247        "STRING_SPLIT": exp.Split.from_arg_list,
248        "STRING_SPLIT_REGEX": exp.RegexpSplit.from_arg_list,
249        "STRING_TO_ARRAY": exp.Split.from_arg_list,
250        "STRPTIME": build_formatted_time(exp.StrToTime),
251        "STRUCT_PACK": exp.Struct.from_arg_list,
252        "STR_SPLIT": exp.Split.from_arg_list,
253        "STR_SPLIT_REGEX": exp.RegexpSplit.from_arg_list,
254        "TODAY": exp.CurrentDate.from_arg_list,
255        "TIME_BUCKET": exp.DateBin.from_arg_list,
256        "TO_TIMESTAMP": exp.UnixToTime.from_arg_list,
257        "UNNEST": exp.Explode.from_arg_list,
258        "VERSION": exp.CurrentVersion.from_arg_list,
259        "XOR": binary_from_function(exp.BitwiseXor),
260    }
261
262    FUNCTION_PARSERS = {
263        **{k: v for k, v in parser.Parser.FUNCTION_PARSERS.items() if k != "DECODE"},
264        **dict.fromkeys(
265            ("GROUP_CONCAT", "LISTAGG", "STRINGAGG"), lambda self: self._parse_string_agg()
266        ),
267        "APPROX_QUANTILE": lambda self: self._parse_distinct_arg_function(exp.ApproxQuantile),
268        "MAX": lambda self: self._parse_min_max(exp.Max),
269        "MIN": lambda self: self._parse_min_max(exp.Min),
270        "QUANTILE": lambda self: self._parse_distinct_arg_function(exp.Quantile),
271        "QUANTILE_CONT": lambda self: self._parse_distinct_arg_function(exp.PercentileCont),
272        "QUANTILE_DISC": lambda self: self._parse_distinct_arg_function(exp.PercentileDisc),
273    }
274
275    NO_PAREN_FUNCTION_PARSERS = {
276        **parser.Parser.NO_PAREN_FUNCTION_PARSERS,
277        "MAP": lambda self: self._parse_map(),
278        "@": lambda self: exp.Abs(this=self._parse_bitwise()),
279    }
280
281    PLACEHOLDER_PARSERS = {
282        **parser.Parser.PLACEHOLDER_PARSERS,
283        TokenType.PARAMETER: lambda self: (
284            self.expression(
285                exp.Placeholder(
286                    this=self._identifier_expression(quoted=True)
287                    if self._prev.token_type == TokenType.IDENTIFIER
288                    else self._prev.text
289                )
290            )
291            if self._match(TokenType.NUMBER) or self._match_set(self.ID_VAR_TOKENS)
292            else None
293        ),
294    }
295
296    TYPE_CONVERTERS = {
297        # https://duckdb.org/docs/sql/data_types/numeric
298        exp.DType.DECIMAL: build_default_decimal_type(precision=18, scale=3),
299        # https://duckdb.org/docs/sql/data_types/text
300        exp.DType.TEXT: _convert_text_type,
301    }
302
303    STATEMENT_PARSERS = {
304        **parser.Parser.STATEMENT_PARSERS,
305        TokenType.ATTACH: lambda self: self._parse_attach_detach(),
306        TokenType.CONNECT: lambda self: self.expression(
307            exp.ConnectTo(this=self._parse_string() or self._parse_id_var())
308        ),
309        TokenType.DETACH: lambda self: self._parse_attach_detach(is_attach=False),
310        TokenType.DISCONNECT: lambda self: self.expression(exp.Disconnect()),
311        TokenType.FORCE: lambda self: self._parse_force(),
312        TokenType.INSTALL: lambda self: self._parse_install(),
313        TokenType.SHOW: lambda self: self._parse_show(),
314    }
315
316    SET_PARSERS = {
317        **parser.Parser.SET_PARSERS,
318        "VARIABLE": lambda self: self._parse_set_item_assignment("VARIABLE"),
319    }
320
321    SHOW_TRIE = new_trie(key.split(" ") for key in SHOW_PARSERS)
322    SET_TRIE = new_trie(key.split(" ") for key in SET_PARSERS)
323
324    def _parse_min_max(self, func: type[exp.Min] | type[exp.Max]) -> exp.Min | exp.Max:
325        expression = self._parse_distinct_arg_function(func)
326        if len(expression.expressions) > 1:
327            self.raise_error(f"Expected at most 2 arguments for {func.__name__}")
328        expression.set("count", seq_get(expression.expressions, 0))
329        expression.set("expressions", None)
330        return expression
331
332    def _parse_tilde(self, this: exp.Expr | None) -> exp.Expr | None:
333        # ~ and !~ match anywhere in the string since DuckDB 2.0, and the whole string before it
334        # https://duckdb.org/docs/2.0/sql/functions/pattern_matching
335        if self.dialect.version >= (2, 0):
336            return _parse_regexp_like(self, this)
337        return _parse_regexp_full_match(self, this)
338
339    def _parse_trigger_execute(self) -> exp.Expr | None:
340        body = self._try_parse(self._parse_statement)
341        return body if not self._curr else None
342
343    def _parse_function_properties(self) -> exp.Properties | None:
344        if self._match(TokenType.TABLE):
345            return exp.Properties(
346                expressions=[
347                    exp.ReturnsProperty(
348                        this=exp.Schema(this=exp.var("TABLE")),
349                        is_table=True,
350                    ),
351                ]
352            )
353        return super()._parse_function_properties()
354
355    def _parse_lambda(self, alias: bool = False) -> exp.Expr | None:
356        index = self._index
357        if not self._match_text_seq("LAMBDA"):
358            return super()._parse_lambda(alias=alias)
359
360        expressions = self._parse_csv(self._parse_lambda_arg)
361        if not self._match(TokenType.COLON):
362            self._retreat(index)
363            return None
364
365        this = self._replace_lambda(self._parse_assignment(), expressions)
366        return self.expression(exp.Lambda(this=this, expressions=expressions))
367
368    def _parse_expression(self) -> exp.Expr | None:
369        # DuckDB supports prefix aliases, e.g. foo: 1
370        if self._next.token_type == TokenType.COLON:
371            alias = self._parse_id_var(tokens=self.ALIAS_TOKENS)
372            self._match(TokenType.COLON)
373            comments = self._prev_comments
374
375            this = self._parse_assignment()
376            if isinstance(this, exp.Expr):
377                # Moves the comment next to the alias in `alias: expr /* comment */`
378                comments += this.pop_comments() or []
379
380            return self.expression(exp.Alias(this=this, alias=alias), comments=comments)
381
382        return super()._parse_expression()
383
384    def _parse_table(
385        self,
386        schema: bool = False,
387        joins: bool = False,
388        alias_tokens: Collection[TokenType] | None = None,
389        parse_bracket: bool = False,
390        is_db_reference: bool = False,
391        parse_partition: bool = False,
392        consume_pipe: bool = False,
393    ) -> exp.Expr | None:
394        # DuckDB supports prefix aliases, e.g. FROM foo: bar
395        if self._next.token_type == TokenType.COLON:
396            alias = self._parse_table_alias(alias_tokens=alias_tokens or self.TABLE_ALIAS_TOKENS)
397            self._match(TokenType.COLON)
398            comments = self._prev_comments
399        else:
400            alias = None
401            comments = []
402
403        table = super()._parse_table(
404            schema=schema,
405            joins=joins,
406            alias_tokens=alias_tokens,
407            parse_bracket=parse_bracket,
408            is_db_reference=is_db_reference,
409            parse_partition=parse_partition,
410        )
411        if isinstance(table, exp.Expr) and isinstance(alias, exp.TableAlias):
412            # Moves the comment next to the alias in `alias: table /* comment */`
413            comments += table.pop_comments() or []
414            alias.comments = alias.pop_comments() + comments
415            table.set("alias", alias)
416
417        return table
418
419    def _parse_table_alias(
420        self, alias_tokens: Collection[TokenType] | None = None
421    ) -> exp.TableAlias | None:
422        if (
423            self._match_text_seq("NEAREST", advance=False)
424            and self._next.token_type == TokenType.NUMBER
425        ) or self._match_text_seq("APPROX", "NEAREST", advance=False):
426            return None
427
428        return super()._parse_table_alias(alias_tokens=alias_tokens)
429
430    def _parse_join(
431        self,
432        skip_join_token: bool = False,
433        parse_bracket: bool = False,
434        alias_tokens: Collection[TokenType] | None = None,
435    ) -> exp.Join | None:
436        join_type = None
437        if self._match_text_seq("JOIN", "BY", "(", "TYPE"):
438            join_type = self._parse_var(any_token=True)
439            self._match_r_paren()
440            skip_join_token = True
441
442        join = super()._parse_join(
443            skip_join_token=skip_join_token,
444            parse_bracket=parse_bracket,
445            alias_tokens=alias_tokens,
446        )
447        if not join:
448            return join
449
450        if join_type:
451            parts = join_type.name.upper().removesuffix("_JOIN").split("_")
452            if parts[0] in ("LEFT", "RIGHT", "FULL"):
453                join.set("side", parts.pop(0))
454            join.set("kind", " ".join(parts) or None)
455
456        approximate = self._match_text_seq("APPROX", "NEAREST")
457        if approximate or self._match_text_seq("NEAREST"):
458            count = self._parse_number()
459
460            if not self._match_text_seq("BY"):
461                self.raise_error("Expected BY after NEAREST count")
462            if not self._match_texts(("DISTANCE", "SIMILARITY")):
463                self.raise_error("Expected DISTANCE or SIMILARITY after BY")
464
465            similarity = self._prev.text.upper() == "SIMILARITY"
466            join.set(
467                "nearest",
468                self.expression(
469                    exp.Nearest(
470                        this=self._parse_disjunction(),
471                        count=count,
472                        approximate=approximate,
473                        similarity=similarity,
474                    )
475                ),
476            )
477
478        return join
479
480    def _parse_table_sample(self, as_modifier: bool = False) -> exp.TableSample | None:
481        # https://duckdb.org/docs/sql/samples.html
482        sample = super()._parse_table_sample(as_modifier=as_modifier)
483        if sample and not sample.args.get("method"):
484            if sample.args.get("size"):
485                sample.set("method", exp.var("RESERVOIR"))
486            else:
487                sample.set("method", exp.var("SYSTEM"))
488
489        return sample
490
491    def _parse_bracket(self, this: exp.Expr | None = None) -> exp.Expr | None:
492        bracket = super()._parse_bracket(this)
493
494        if self.dialect.version < (1, 2) and isinstance(bracket, exp.Bracket):
495            # https://duckdb.org/2025/02/05/announcing-duckdb-120.html#breaking-changes
496            bracket.set("returns_list_for_maps", True)
497
498        return bracket
499
500    def _parse_map(self) -> exp.ToMap | exp.Map:
501        if self._match(TokenType.L_BRACE, advance=False):
502            return self.expression(exp.ToMap(this=self._parse_bracket()))
503
504        args = self._parse_wrapped_csv(self._parse_assignment)
505        return self.expression(exp.Map(keys=seq_get(args, 0), values=seq_get(args, 1)))
506
507    def _parse_struct_types(self, type_required: bool = False) -> exp.Expr | None:
508        return self._parse_field_def()
509
510    def _pivot_column_names(self, aggregations: list[exp.Expr]) -> list[str]:
511        if len(aggregations) == 1:
512            return super()._pivot_column_names(aggregations)
513        return pivot_column_names(aggregations, dialect="duckdb")
514
515    def _parse_attach_detach(self, is_attach: bool = True) -> exp.Attach | exp.Detach:
516        def _parse_attach_option() -> exp.AttachOption:
517            return self.expression(
518                exp.AttachOption(
519                    this=self._parse_var(any_token=True),
520                    expression=self._parse_field(any_token=True),
521                )
522            )
523
524        self._match(TokenType.DATABASE)
525        exists = self._parse_exists(not_=is_attach)
526        this = self._parse_alias(self._parse_primary_or_var(), explicit=True)
527
528        if self._match(TokenType.L_PAREN, advance=False):
529            expressions = self._parse_wrapped_csv(_parse_attach_option)
530        else:
531            expressions = None
532
533        return (
534            self.expression(exp.Attach(this=this, exists=exists, expressions=expressions))
535            if is_attach
536            else self.expression(exp.Detach(this=this, exists=exists))
537        )
538
539    def _parse_show_duckdb(self, this: str) -> exp.Show:
540        from_ = self._parse_table(schema=True) if self._match(TokenType.FROM) else None
541        return self.expression(exp.Show(this=this, from_=from_))
542
543    def _parse_force(self) -> exp.Install | exp.Command:
544        # FORCE can only be followed by INSTALL or CHECKPOINT
545        # In the case of CHECKPOINT, we fallback
546        if not self._match(TokenType.INSTALL):
547            return self._parse_as_command(self._prev)
548
549        return self._parse_install(force=True)
550
551    def _parse_install(self, force: bool = False) -> exp.Install:
552        return self.expression(
553            exp.Install(
554                this=self._parse_id_var(),
555                from_=self._parse_var_or_string() if self._match(TokenType.FROM) else None,
556                force=force,
557            )
558        )
559
560    def _parse_primary(self) -> exp.Expr | None:
561        if self._match_pair(TokenType.HASH, TokenType.NUMBER):
562            return exp.PositionalColumn(this=exp.Literal.number(self._prev.text))
563
564        return super()._parse_primary()

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
  • max_nodes: Maximum number of AST nodes to prevent memory exhaustion. Set to -1 (default) to disable the check.
SUPPORTS_TABLE_QUERY = True
IS_PREDICATE_PRECEDENCE = <IsPredicatePrecedence.LOW: 4>
MAP_KEYS_ARE_ARBITRARY_EXPRESSIONS = True
PIVOT_COLUMN_NAMING = 'agg_name_if_aliased_or_multiple'
SUPPORTS_DIRECTED_JOIN = False
JOIN_KINDS = {<TokenType.ANTI: 223>, <TokenType.SEMI: 393>, <TokenType.INNER: 303>, <TokenType.CROSS: 247>, <TokenType.OUTER: 351>}
NO_PAREN_FUNCTIONS = {<TokenType.CURRENT_DATE: 249>: <class 'sqlglot.expressions.temporal.CurrentDate'>, <TokenType.CURRENT_DATETIME: 250>: <class 'sqlglot.expressions.temporal.CurrentDate'>, <TokenType.CURRENT_TIME: 252>: <class 'sqlglot.expressions.temporal.CurrentTime'>, <TokenType.CURRENT_TIMESTAMP: 253>: <class 'sqlglot.expressions.temporal.CurrentTimestamp'>, <TokenType.CURRENT_USER: 254>: <class 'sqlglot.expressions.functions.CurrentUser'>, <TokenType.CURRENT_ROLE: 256>: <class 'sqlglot.expressions.functions.CurrentRole'>, <TokenType.LOCALTIME: 180>: <class 'sqlglot.expressions.temporal.Localtime'>, <TokenType.LOCALTIMESTAMP: 181>: <class 'sqlglot.expressions.temporal.Localtimestamp'>, <TokenType.CURRENT_CATALOG: 257>: <class 'sqlglot.expressions.functions.CurrentCatalog'>, <TokenType.SESSION_USER: 61>: <class 'sqlglot.expressions.functions.SessionUser'>}
BITWISE = {<TokenType.AMP: 36>: <class 'sqlglot.expressions.core.BitwiseAnd'>, <TokenType.PIPE: 39>: <class 'sqlglot.expressions.core.BitwiseOr'>}
COLUMN_OPERATORS = {<TokenType.DOT: 8>: None, <TokenType.DOTCOLON: 12>: <function Parser.<lambda>>, <TokenType.DCOLON: 14>: <function Parser.<lambda>>, <TokenType.HASH_ARROW: 49>: <function Parser.<lambda>>, <TokenType.DHASH_ARROW: 50>: <function Parser.<lambda>>, <TokenType.PLACEHOLDER: 361>: <function Parser.<lambda>>}
JSON_OPERATORS = {<TokenType.ARROW: 45>: <function build_json_extract>, <TokenType.DARROW: 46>: <function build_json_extract_scalar>}
RANGE_PARSERS = {<TokenType.AT_GT: 56>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.BETWEEN: 232>: <function Parser.<lambda>>, <TokenType.GLOB: 291>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.ILIKE: 299>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IN: 300>: <function Parser.<lambda>>, <TokenType.IRLIKE: 311>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IS: 312>: <function Parser.<lambda>>, <TokenType.LIKE: 322>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.LT_AT: 55>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.OVERLAPS: 353>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.RLIKE: 385>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.SIMILAR_TO: 400>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.FOR: 283>: <function Parser.<lambda>>, <TokenType.QMARK_AMP: 68>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.QMARK_PIPE: 69>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.HASH_DASH: 70>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.AT_QMARK: 54>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.ADJACENT: 65>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.OPERATOR: 344>: <function Parser.<lambda>>, <TokenType.AMP_LT: 63>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.AMP_GT: 64>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.CARET_AT: 43>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.DAMP: 62>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.TILDE: 44>: <function DuckDBParser.<lambda>>}
EXPONENT = {<TokenType.CARET: 42>: <class 'sqlglot.expressions.core.Pow'>, <TokenType.DSTAR: 67>: <class 'sqlglot.expressions.core.Pow'>}
FUNCTIONS_WITH_ALIASED_ARGS = {'STRUCT', 'STRUCT_PACK'}
SHOW_PARSERS = {'TABLES': <function _show_parser.<locals>._parse>, 'ALL TABLES': <function _show_parser.<locals>._parse>}
FUNCTIONS = {'AI_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.AIAgg'>>, 'AI_CLASSIFY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIClassify'>>, 'AI_EMBED': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIEmbed'>>, 'A_I_FORECAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIForecast'>>, 'AI_GENERATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIGenerate'>>, 'AI_SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AISimilarity'>>, 'AI_SUMMARIZE_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.AISummarizeAgg'>>, 'ABS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Abs'>>, 'ACOS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Acos'>>, 'ACOSH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Acosh'>>, 'ADD_MONTHS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.AddMonths'>>, 'AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Agg'>>, 'AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.And'>>, 'ANONYMOUS_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.AnonymousAggFunc'>>, 'ANY_VALUE': <function DuckDBParser.<lambda>>, 'APPLY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Apply'>>, 'APPROX_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.ApproxDistinct'>>, 'APPROX_COUNT_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.ApproxDistinct'>>, 'APPROX_PERCENTILE_ACCUMULATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxPercentileAccumulate'>>, 'APPROX_PERCENTILE_COMBINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxPercentileCombine'>>, 'APPROX_PERCENTILE_ESTIMATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxPercentileEstimate'>>, 'APPROX_QUANTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxQuantile'>>, 'APPROX_QUANTILES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxQuantiles'>>, 'APPROX_TOP_K': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopK'>>, 'APPROX_TOP_K_ACCUMULATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopKAccumulate'>>, 'APPROX_TOP_K_COMBINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopKCombine'>>, 'APPROX_TOP_K_ESTIMATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopKEstimate'>>, 'APPROX_TOP_SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopSum'>>, 'APPROXIMATE_SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproximateSimilarity'>>, 'APPROXIMATE_JACCARD_INDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproximateSimilarity'>>, 'ARG_MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMax'>>, 'ARGMAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMax'>>, 'MAX_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMax'>>, 'ARG_MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMin'>>, 'ARGMIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMin'>>, 'MIN_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMin'>>, 'ARRAY': <function Parser.<lambda>>, 'ARRAY_AGG': <function Parser.<lambda>>, 'ARRAY_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayAll'>>, 'ARRAY_ANY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayAny'>>, 'ARRAY_APPEND': <function build_array_append>, 'ARRAY_COMPACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.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.aggregate.ArrayConcatAgg'>>, 'ARRAY_CONSTRUCT_COMPACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayConstructCompact'>>, 'ARRAY_CONTAINED_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContainedBy'>>, 'ARRAY_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContains'>>, 'ARRAY_HAS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContains'>>, 'ARRAY_CONTAINS_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContainsAll'>>, 'ARRAY_HAS_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContainsAll'>>, 'ARRAY_DISTINCT': <function DuckDBParser.<lambda>>, 'ARRAY_EXCEPT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayExcept'>>, 'FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayFilter'>>, 'ARRAY_FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayFilter'>>, 'ARRAY_FIRST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayFirst'>>, 'ARRAY_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayInsert'>>, 'ARRAY_INTERSECT': <function DuckDBParser.<lambda>>, 'ARRAY_INTERSECTION': <function Parser.<lambda>>, 'ARRAY_LAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayLast'>>, 'ARRAY_MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayMax'>>, 'ARRAY_MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayMin'>>, 'ARRAY_OVERLAPS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayOverlaps'>>, 'ARRAY_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayPosition'>>, '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.array.ArrayRemoveAt'>>, 'ARRAY_REVERSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayReverse'>>, 'ARRAY_SIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySize'>>, 'ARRAY_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySize'>>, 'ARRAY_SLICE': <function DuckDBParser.<lambda>>, 'ARRAY_SORT': <function _build_list_sort.<locals>._builder>, 'ARRAY_SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySum'>>, 'ARRAY_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayToString'>>, 'ARRAY_JOIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayToString'>>, 'ARRAY_UNION_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArrayUnionAgg'>>, 'ARRAY_UNIQUE_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArrayUniqueAgg'>>, 'ARRAYS_ZIP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraysZip'>>, 'ASCII': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Ascii'>>, 'ASIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Asin'>>, 'ASINH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Asinh'>>, 'ATAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Atan'>>, 'ATAN2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Atan2'>>, 'ATANH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Atanh'>>, 'AVG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Avg'>>, 'BASE64_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Base64DecodeBinary'>>, 'BASE64_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Base64DecodeString'>>, 'BASE64_ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Base64Encode'>>, 'BIT_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.BitLength'>>, 'BITMAP_BIT_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapBitPosition'>>, 'BITMAP_BUCKET_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapBucketNumber'>>, 'BITMAP_CONSTRUCT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapConstructAgg'>>, 'BITMAP_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapCount'>>, 'BITMAP_OR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapOrAgg'>>, 'BITWISE_AND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseAndAgg'>>, 'BITWISE_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseCount'>>, 'BITWISE_OR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseOrAgg'>>, 'BITWISE_XOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseXorAgg'>>, 'BOOLAND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Booland'>>, 'BOOLNOT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Boolnot'>>, 'BOOLOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Boolor'>>, 'BOOLXOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BoolxorAgg'>>, 'BYTE_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ByteLength'>>, 'CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Case'>>, 'CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Cast'>>, 'CAST_TO_STR_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CastToStrType'>>, 'CBRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Cbrt'>>, 'CEIL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Ceil'>>, 'CEILING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Ceil'>>, 'CHECK_JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.CheckJson'>>, 'CHECK_XML': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CheckXml'>>, 'CHR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Chr'>>, 'CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Chr'>>, 'CITY_HASH64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.CityHash64'>>, '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.string.CodePointsToBytes'>>, 'CODE_POINTS_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.CodePointsToString'>>, 'COLLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Collate'>>, 'COLLATION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Collation'>>, 'COLUMNS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Columns'>>, 'COMBINED_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.CombinedAggFunc'>>, 'COMBINED_PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.CombinedParameterizedAgg'>>, 'COMPRESS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Compress'>>, 'CONCAT': <function Parser.<lambda>>, 'CONCAT_WS': <function Parser.<lambda>>, 'CONNECT_BY_ROOT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ConnectByRoot'>>, 'CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Contains'>>, 'CONVERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Convert'>>, 'CONVERT_TIMEZONE': <function build_convert_timezone>, 'CONVERT_TO_CHARSET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ConvertToCharset'>>, 'CORR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Corr'>>, 'COS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Cos'>>, 'COSH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Cosh'>>, 'COSINE_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.CosineDistance'>>, 'COT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Cot'>>, 'COTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Coth'>>, 'COUNT': <function Parser.<lambda>>, 'COUNT_IF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CountIf'>>, 'COUNTIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CountIf'>>, 'COVAR_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CovarPop'>>, 'COVAR_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CovarSamp'>>, 'CSC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Csc'>>, 'CSCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Csch'>>, 'CUME_DIST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CumeDist'>>, 'CURRENT_ACCOUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentAccount'>>, 'CURRENT_ACCOUNT_NAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentAccountName'>>, 'CURRENT_AVAILABLE_ROLES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentAvailableRoles'>>, 'CURRENT_CATALOG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentCatalog'>>, 'CURRENT_CLIENT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentClient'>>, 'CURRENT_DATABASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentDatabase'>>, 'CURRENT_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentDate'>>, 'CURRENT_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentDatetime'>>, 'CURRENT_IP_ADDRESS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentIpAddress'>>, 'CURRENT_ORGANIZATION_NAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentOrganizationName'>>, 'CURRENT_ORGANIZATION_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentOrganizationUser'>>, 'CURRENT_REGION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentRegion'>>, 'CURRENT_ROLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentRole'>>, 'CURRENT_ROLE_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentRoleType'>>, 'CURRENT_SCHEMA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentSchema'>>, 'CURRENT_SCHEMAS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentSchemas'>>, 'CURRENT_SECONDARY_ROLES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentSecondaryRoles'>>, 'CURRENT_SESSION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentSession'>>, 'CURRENT_STATEMENT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentStatement'>>, 'CURRENT_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTime'>>, 'CURRENT_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTimestamp'>>, 'CURRENT_TIMESTAMP_L_T_Z': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTimestampLTZ'>>, 'CURRENT_TIMEZONE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTimezone'>>, 'CURRENT_TRANSACTION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentTransaction'>>, 'CURRENT_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentUser'>>, 'CURRENT_USER_ID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentUserId'>>, 'CURRENT_VERSION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentVersion'>>, 'CURRENT_WAREHOUSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentWarehouse'>>, 'DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Date'>>, 'DATE_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateAdd'>>, 'DATE_BIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateBin'>>, 'DATEDIFF': <function _build_date_diff>, 'DATE_DIFF': <function _build_date_diff>, 'DATE_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateFromParts'>>, 'DATEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateFromParts'>>, 'DATE_FROM_UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateFromUnixDate'>>, 'DATE_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateStrToDate'>>, 'DATE_TO_DATE_STR': <function Parser.<lambda>>, 'DATE_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateToDi'>>, 'DATE_TRUNC': <function date_trunc_to_time>, 'DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Datetime'>>, 'DATETIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DatetimeAdd'>>, 'DATETIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DatetimeDiff'>>, 'DATETIME_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DatetimeSub'>>, 'DATETIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DatetimeTrunc'>>, 'DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Day'>>, 'DAY_OF_MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfMonth'>>, 'DAYOFMONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfMonth'>>, 'DAY_OF_WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfWeek'>>, 'DAYOFWEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfWeek'>>, 'DAYOFWEEK_ISO': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfWeekIso'>>, 'ISODOW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfWeekIso'>>, 'DAY_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfYear'>>, 'DAYOFYEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfYear'>>, 'DAYNAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Dayname'>>, 'DECODE': <function DuckDBParser.<lambda>>, 'DECODE_CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.DecodeCase'>>, 'DECOMPRESS_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.DecompressBinary'>>, 'DECOMPRESS_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.DecompressString'>>, 'DECRYPT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Decrypt'>>, 'DECRYPT_RAW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.DecryptRaw'>>, 'DEGREES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Degrees'>>, 'DENSE_RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.DenseRank'>>, 'DI_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DiToDate'>>, 'DOT_PRODUCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.DotProduct'>>, 'DYNAMIC_IDENTIFIER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.DynamicIdentifier'>>, 'ELT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Elt'>>, 'ENCODE': <function DuckDBParser.<lambda>>, 'ENCRYPT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Encrypt'>>, 'ENCRYPT_RAW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.EncryptRaw'>>, 'ENDS_WITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.EndsWith'>>, 'ENDSWITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.EndsWith'>>, 'EQUAL_NULL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.EqualNull'>>, 'EUCLIDEAN_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.EuclideanDistance'>>, 'EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Exists'>>, 'EXP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Exp'>>, 'EXPLODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Explode'>>, 'EXPLODING_GENERATE_SERIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ExplodingGenerateSeries'>>, 'EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Extract'>>, 'FACTORIAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Factorial'>>, 'FARM_FINGERPRINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.FarmFingerprint'>>, 'FARMFINGERPRINT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.FarmFingerprint'>>, 'FEATURES_AT_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.FeaturesAtTime'>>, 'FIRST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.First'>>, 'FIRST_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.FirstValue'>>, 'FLATTEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Flatten'>>, 'FLOAT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Float64'>>, 'FLOOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Floor'>>, 'FORMAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Format'>>, 'FROM_BASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.FromBase'>>, 'FROM_BASE32': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.FromBase32'>>, 'FROM_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.FromBase64'>>, 'FROM_ISO8601_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.FromISO8601Date'>>, 'FROM_ISO8601_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.FromISO8601Timestamp'>>, 'FROM_ISO8601_TIMESTAMP_NANOS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.FromISO8601TimestampNanos'>>, 'FROM_JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.FromJson'>>, 'GAP_FILL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.GapFill'>>, 'GENERATE_BOOL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GenerateBool'>>, 'GENERATE_DATE_ARRAY': <function Parser.<lambda>>, 'GENERATE_DOUBLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GenerateDouble'>>, 'GENERATE_EMBEDDING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GenerateEmbedding'>>, 'GENERATE_INT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GenerateInt'>>, 'GENERATE_SERIES': <function _build_generate_series.<locals>._builder>, 'GENERATE_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GenerateTable'>>, 'GENERATE_TEXT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GenerateText'>>, 'GENERATE_TIMESTAMP_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.GenerateTimestampArray'>>, 'GENERATOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Generator'>>, 'GET_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.GetExtract'>>, 'GET_IGNORE_CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GetIgnoreCase'>>, 'GETBIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Getbit'>>, 'GET_BIT': <function DuckDBParser.<lambda>>, 'GREATEST': <function Parser.<lambda>>, 'GROUP_CONCAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.GroupConcat'>>, 'GROUPING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Grouping'>>, 'GROUPING_ID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.GroupingId'>>, 'HASH_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.HashAgg'>>, 'HEX': <function build_hex>, 'HEX_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.HexDecodeString'>>, 'HLL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.Hll'>>, 'HOST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Host'>>, 'HOUR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Hour'>>, 'IF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.If'>>, 'IIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.If'>>, 'INITCAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Initcap'>>, 'INLINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Inline'>>, 'INT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Int64'>>, 'IS_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.IsArray'>>, 'IS_ASCII': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.IsAscii'>>, 'IS_INF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.IsInf'>>, 'ISINF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.IsInf'>>, 'IS_NAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.IsNan'>>, 'ISNAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.IsNan'>>, 'IS_NULL_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.IsNullValue'>>, 'J_S_O_N_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONArray'>>, 'J_S_O_N_ARRAY_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONArrayAgg'>>, 'JSON_ARRAY_APPEND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONArrayAppend'>>, 'JSON_ARRAY_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONArrayContains'>>, 'JSON_ARRAY_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONArrayInsert'>>, 'JSONB_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBContains'>>, 'J_S_O_N_B_CONTAINS_ALL_TOP_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBContainsAllTopKeys'>>, 'J_S_O_N_B_CONTAINS_ANY_TOP_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBContainsAnyTopKeys'>>, 'J_S_O_N_B_CONTAINS_TOP_KEY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBContainsTopKey'>>, 'J_S_O_N_B_DELETE_AT_PATH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBDeleteAtPath'>>, 'JSONB_EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBExists'>>, 'JSONB_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBExtract'>>, 'JSONB_EXTRACT_SCALAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBExtractScalar'>>, 'J_S_O_N_B_OBJECT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBObjectAgg'>>, 'J_S_O_N_B_PATH_EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBPathExists'>>, 'J_S_O_N_BOOL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBool'>>, 'J_S_O_N_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.JSONCast'>>, 'J_S_O_N_EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONExists'>>, 'JSON_EXTRACT': <function build_extract_json_with_path.<locals>._builder>, 'JSON_EXTRACT_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONExtractArray'>>, 'JSON_EXTRACT_SCALAR': <function build_extract_json_with_path.<locals>._builder>, 'JSON_FORMAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONFormat'>>, 'JSON_KEYS': <function Parser.<lambda>>, 'J_S_O_N_KEYS_AT_DEPTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONKeysAtDepth'>>, 'J_S_O_N_OBJECT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONObject'>>, 'J_S_O_N_OBJECT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONObjectAgg'>>, 'JSON_REMOVE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONRemove'>>, 'JSON_SET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONSet'>>, 'JSON_STRIP_NULLS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONStripNulls'>>, 'J_S_O_N_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONTable'>>, 'JSON_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONType'>>, 'J_S_O_N_VALUE_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.query.JSONValueArray'>>, 'JAROWINKLER_SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.JarowinklerSimilarity'>>, 'JUSTIFY_DAYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.JustifyDays'>>, 'JUSTIFY_HOURS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.JustifyHours'>>, 'JUSTIFY_INTERVAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.JustifyInterval'>>, 'KURTOSIS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Kurtosis'>>, 'LAG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Lag'>>, 'LAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Last'>>, 'LAST_DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.LastDay'>>, 'LAST_DAY_OF_MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.LastDay'>>, 'LAST_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LastValue'>>, 'LAX_BOOL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.LaxBool'>>, 'LAX_FLOAT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.LaxFloat64'>>, 'LAX_INT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.LaxInt64'>>, 'LAX_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.LaxString'>>, 'LEAD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Lead'>>, 'LEAST': <function Parser.<lambda>>, 'LEFT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Left'>>, 'LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Length'>>, 'LEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Length'>>, 'CHAR_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Length'>>, 'CHARACTER_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Length'>>, 'LEVENSHTEIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Levenshtein'>>, 'LIST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArrayAgg'>>, 'LN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Ln'>>, 'LOCALTIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Localtime'>>, 'LOCALTIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Localtimestamp'>>, 'LOG': <function build_logarithm>, 'LOGICAL_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LogicalAnd'>>, 'BOOL_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LogicalAnd'>>, 'BOOLAND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LogicalAnd'>>, 'LOGICAL_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LogicalOr'>>, 'BOOL_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LogicalOr'>>, 'BOOLOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LogicalOr'>>, 'LOWER': <function build_lower>, 'LCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Lower'>>, 'LOWER_HEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.LowerHex'>>, 'MD5': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5'>>, 'MD5_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5Digest'>>, 'M_D5_NUMBER_LOWER64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5NumberLower64'>>, 'M_D5_NUMBER_UPPER64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5NumberUpper64'>>, 'M_L_FORECAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.MLForecast'>>, 'M_L_TRANSLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.MLTranslate'>>, 'MAKE_INTERVAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.MakeInterval'>>, 'MANHATTAN_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.ManhattanDistance'>>, 'MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Map'>>, 'MAP_CAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapCat'>>, 'MAP_CONTAINS_KEY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapContainsKey'>>, 'MAP_DELETE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapDelete'>>, 'MAP_FROM_ENTRIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapFromEntries'>>, 'MAP_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapInsert'>>, 'MAP_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapKeys'>>, 'MAP_PICK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapPick'>>, 'MAP_SIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapSize'>>, 'MATCH_AGAINST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MatchAgainst'>>, 'MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Max'>>, 'MEDIAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Median'>>, 'MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Min'>>, 'MINHASH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Minhash'>>, 'MINHASH_COMBINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.MinhashCombine'>>, 'MINUTE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Minute'>>, 'MODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Mode'>>, 'MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Month'>>, 'MONTHNAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Monthname'>>, 'MONTHS_BETWEEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.MonthsBetween'>>, 'NANVL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Nanvl'>>, 'NEGATIVE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Negative'>>, 'NET_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.NetFunc'>>, 'NEXT_DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.NextDay'>>, 'NEXT_VALUE_FOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ddl.NextValueFor'>>, 'NORMAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Normal'>>, 'NORMALIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Normalize'>>, 'NTH_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.NthValue'>>, 'NTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Ntile'>>, 'NULLIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Nullif'>>, 'NUMBER_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.NumberToStr'>>, 'NVL2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Nvl2'>>, 'OBJECT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ObjectAgg'>>, 'OBJECT_ID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.ObjectId'>>, 'OBJECT_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.ObjectInsert'>>, 'OBJECT_TRANSFORM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ObjectTransform'>>, 'OPEN_J_S_O_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.OpenJSON'>>, 'OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.Or'>>, 'OVERLAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Overlay'>>, 'PAD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Pad'>>, 'PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.ParameterizedAgg'>>, 'PARSE_BIGNUMERIC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ParseBignumeric'>>, 'PARSE_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.ParseDatetime'>>, 'PARSE_IP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ParseIp'>>, 'PARSE_JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.ParseJSON'>>, 'JSON_PARSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.ParseJSON'>>, 'PARSE_NUMERIC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ParseNumeric'>>, 'PARSE_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.ParseTime'>>, 'PARSE_URL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ParseUrl'>>, 'PERCENT_RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.PercentRank'>>, 'PERCENTILE_CONT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.PercentileCont'>>, 'PERCENTILE_DISC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.PercentileDisc'>>, 'PI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Pi'>>, 'POSEXPLODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Posexplode'>>, 'POSEXPLODE_OUTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.PosexplodeOuter'>>, 'POWER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.Pow'>>, 'POW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.Pow'>>, 'PREDICT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Predict'>>, 'PREVIOUS_DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.PreviousDay'>>, 'QUANTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Quantile'>>, 'QUARTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Quarter'>>, 'RADIANS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Radians'>>, 'RAND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Rand'>>, 'RANDOM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Rand'>>, 'RANDN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Randn'>>, 'RANDSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Randstr'>>, 'RANGE_BUCKET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.RangeBucket'>>, 'RANGE_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.RangeN'>>, 'RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Rank'>>, 'READ_CSV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ReadCSV'>>, 'READ_PARQUET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ReadParquet'>>, 'REDUCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Reduce'>>, 'REG_DOMAIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.RegDomain'>>, 'REGEXP_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpCount'>>, 'REGEXP_EXTRACT': <function build_regexp_extract.<locals>._builder>, 'REGEXP_EXTRACT_ALL': <function build_regexp_extract.<locals>._builder>, 'REGEXP_FULL_MATCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpFullMatch'>>, 'REGEXP_I_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpILike'>>, 'REGEXP_INSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpInstr'>>, 'REGEXP_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.RegexpLike'>>, 'REGEXP_REPLACE': <function DuckDBParser.<lambda>>, 'REGEXP_SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpSplit'>>, 'REGEXP_SUBSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpSubstr'>>, 'REGR_AVGX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrAvgx'>>, 'REGR_AVGY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrAvgy'>>, 'REGR_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrCount'>>, 'REGR_INTERCEPT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrIntercept'>>, 'REGR_R2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrR2'>>, 'REGR_SLOPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrSlope'>>, 'REGR_SXX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrSxx'>>, 'REGR_SXY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrSxy'>>, 'REGR_SYY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrSyy'>>, 'REGR_VALX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrValx'>>, 'REGR_VALY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrValy'>>, 'REPEAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Repeat'>>, 'REPLACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Replace'>>, 'REVERSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Reverse'>>, 'RIGHT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Right'>>, 'RINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Rint'>>, 'ROUND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Round'>>, 'ROW_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RowNumber'>>, 'RTRIMMED_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RtrimmedLength'>>, 'SHA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA'>>, 'SHA1': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA'>>, 'S_H_A1_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA1Digest'>>, 'SHA2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA2'>>, 'S_H_A2_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA2Digest'>>, 'SAFE_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeAdd'>>, 'SAFE_CONVERT_BYTES_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SafeConvertBytesToString'>>, 'SAFE_DIVIDE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeDivide'>>, 'SAFE_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.SafeFunc'>>, 'SAFE_MULTIPLY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeMultiply'>>, 'SAFE_NEGATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeNegate'>>, 'SAFE_SUBTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeSubtract'>>, 'SEARCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Search'>>, 'SEARCH_IP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SearchIp'>>, 'SEC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sec'>>, 'SECH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sech'>>, 'SECOND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Second'>>, 'SECRET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Secret'>>, 'SEQ1': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Seq1'>>, 'SEQ2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Seq2'>>, 'SEQ4': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Seq4'>>, 'SEQ8': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Seq8'>>, 'SESSION_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.SessionUser'>>, 'SHUFFLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Shuffle'>>, 'SIGN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sign'>>, 'SIGNUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sign'>>, 'SIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sin'>>, 'SINH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sinh'>>, 'SKEWNESS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Skewness'>>, 'SOUNDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Soundex'>>, 'SOUNDEX_P123': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SoundexP123'>>, 'SPACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Space'>>, 'SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Split'>>, 'SPLIT_PART': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SplitPart'>>, 'SPLIT_TO_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.SplitToTable'>>, 'SQRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sqrt'>>, 'ST_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StDistance'>>, 'ST_POINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StPoint'>>, 'ST_MAKEPOINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StPoint'>>, 'STACK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Stack'>>, 'STANDARD_HASH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StandardHash'>>, 'STAR_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StarMap'>>, 'STARTS_WITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StartsWith'>>, 'STARTSWITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StartsWith'>>, 'STDDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Stddev'>>, 'STDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Stddev'>>, 'STDDEV_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.StddevPop'>>, 'STDDEV_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.StddevSamp'>>, 'STR_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StrPosition'>>, 'STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.StrToDate'>>, 'STR_TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StrToMap'>>, 'STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.StrToTime'>>, 'STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.StrToUnix'>>, 'STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.String'>>, 'STRING_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Split'>>, 'SPLIT_BY_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StringToArray'>>, 'STRIP_NULL_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.StripNullValue'>>, 'STRTOK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Strtok'>>, 'STRTOK_SPLIT_TO_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StrtokSplitToTable'>>, 'STRTOK_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StrtokToArray'>>, 'STRUCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Struct'>>, 'STRUCT_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StructExtract'>>, 'STUFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Stuff'>>, 'INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Stuff'>>, 'SUBSTRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Substring'>>, 'SUBSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Substring'>>, 'SUBSTRING_INDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SubstringIndex'>>, 'SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Sum'>>, 'SYSTIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Systimestamp'>>, 'TAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Tan'>>, 'TANH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Tanh'>>, 'TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Time'>>, 'TIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeAdd'>>, 'TIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeDiff'>>, 'TIME_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeFromParts'>>, 'TIMEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeFromParts'>>, 'TIME_SLICE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeSlice'>>, 'TIME_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeStrToDate'>>, 'TIME_STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeStrToTime'>>, 'TIME_STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeStrToUnix'>>, 'TIME_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeSub'>>, 'TIME_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeToStr'>>, 'TIME_TO_TIME_STR': <function Parser.<lambda>>, 'TIME_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeToUnix'>>, 'TIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeTrunc'>>, 'TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Timestamp'>>, 'TIMESTAMP_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampAdd'>>, 'TIMESTAMPDIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampDiff'>>, 'TIMESTAMP_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampDiff'>>, 'TIMESTAMP_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampFromParts'>>, 'TIMESTAMPFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampFromParts'>>, 'TIMESTAMP_LTZ_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampLtzFromParts'>>, 'TIMESTAMPLTZFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampLtzFromParts'>>, 'TIMESTAMP_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampSub'>>, 'TIMESTAMP_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampTrunc'>>, 'TIMESTAMP_TZ_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampTzFromParts'>>, 'TIMESTAMPTZFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampTzFromParts'>>, 'TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ToArray'>>, 'TO_BASE32': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToBase32'>>, 'TO_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToBase64'>>, 'TO_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToBinary'>>, 'TO_BOOLEAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ToBoolean'>>, 'TO_CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToChar'>>, 'TO_CODE_POINTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToCodePoints'>>, 'TO_DAYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.ToDays'>>, 'TO_DECFLOAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToDecfloat'>>, 'TO_DOUBLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToDouble'>>, 'TO_FILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToFile'>>, 'TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ToMap'>>, 'TO_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToNumber'>>, 'TO_VARIANT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ToVariant'>>, 'TRANSFORM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Transform'>>, 'TRANSLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Translate'>>, 'TRIM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Trim'>>, 'TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Trunc'>>, 'TRUNCATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Trunc'>>, 'TRY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Try'>>, 'TRY_BASE64_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryBase64DecodeBinary'>>, 'TRY_BASE64_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryBase64DecodeString'>>, 'TRY_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.TryCast'>>, 'TRY_HEX_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryHexDecodeBinary'>>, 'TRY_HEX_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryHexDecodeString'>>, 'TRY_TO_DECFLOAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryToDecfloat'>>, 'TS_OR_DI_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDiToDi'>>, 'TS_OR_DS_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsAdd'>>, 'TS_OR_DS_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsDiff'>>, 'TS_OR_DS_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.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.temporal.TsOrDsToDatetime'>>, 'TS_OR_DS_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsToTime'>>, 'TS_OR_DS_TO_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsToTimestamp'>>, 'TYPEOF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.Typeof'>>, 'UNHEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Unhex'>>, 'UNICODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Unicode'>>, 'UNIFORM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Uniform'>>, 'UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixDate'>>, 'UNIX_MICROS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixMicros'>>, 'UNIX_MILLIS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixMillis'>>, 'UNIX_SECONDS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixSeconds'>>, 'UNIX_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixToStr'>>, 'UNIX_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixToTime'>>, 'UNIX_TO_TIME_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixToTimeStr'>>, 'UNNEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Explode'>>, 'UPPER': <function build_upper>, 'UCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Upper'>>, 'UTC_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UtcDate'>>, 'UTC_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UtcTime'>>, 'UTC_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UtcTimestamp'>>, 'UUID': <function Parser.<lambda>>, 'GEN_RANDOM_UUID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Uuid'>>, 'GENERATE_UUID': <function Parser.<lambda>>, 'UUID_STRING': <function Parser.<lambda>>, 'VAR_MAP': <function build_var_map>, 'VARIANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Variance'>>, 'VARIANCE_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Variance'>>, 'VAR_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Variance'>>, 'VARIANCE_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.VariancePop'>>, 'VAR_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.VariancePop'>>, 'VECTOR_SEARCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.VectorSearch'>>, 'WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Week'>>, 'WEEK_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.WeekOfYear'>>, 'WEEKOFYEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.WeekOfYear'>>, 'WEEK_START': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.WeekStart'>>, 'WEIGHT_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.WeightString'>>, 'WIDTH_BUCKET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.WidthBucket'>>, 'XMLELEMENT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.XMLElement'>>, 'XMLGET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.XMLGet'>>, 'X_M_L_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.XMLTable'>>, 'XOR': <function binary_from_function.<locals>.<lambda>>, 'YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Year'>>, 'YEAR_OF_WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.YearOfWeek'>>, 'YEAROFWEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.YearOfWeek'>>, 'YEAR_OF_WEEK_ISO': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.YearOfWeekIso'>>, 'YEAROFWEEKISO': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.YearOfWeekIso'>>, 'ZIPF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Zipf'>>, 'EXPLODE_OUTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array._ExplodeOuter'>>, 'SORT_ARRAY': <function build_sort_array>, 'ARRAYAGG': <function Parser.<lambda>>, 'JSON_EXTRACT_PATH_TEXT': <function build_extract_json_with_path.<locals>._builder>, 'LIKE': <function build_like>, 'LOG2': <function Parser.<lambda>>, 'LOG10': <function Parser.<lambda>>, 'LPAD': <function Parser.<lambda>>, 'LEFTPAD': <function Parser.<lambda>>, 'LTRIM': <function Parser.<lambda>>, 'MOD': <function build_mod>, 'RIGHTPAD': <function Parser.<lambda>>, 'RPAD': <function Parser.<lambda>>, 'RTRIM': <function Parser.<lambda>>, 'SCOPE_RESOLUTION': <function Parser.<lambda>>, 'STRPOS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StrPosition'>>, 'CHARINDEX': <function Parser.<lambda>>, 'INSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StrPosition'>>, 'LOCATE': <function Parser.<lambda>>, 'TO_HEX': <function build_hex>, 'LIST_DISTINCT': <function DuckDBParser.<lambda>>, 'ARRAY_REVERSE_SORT': <function _build_list_sort.<locals>._builder>, 'BIT_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseAndAgg'>>, 'BIT_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseOrAgg'>>, 'BIT_XOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseXorAgg'>>, 'CURRENT_LOCALTIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Localtimestamp'>>, 'DATETRUNC': <function date_trunc_to_time>, 'EDITDIST3': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Levenshtein'>>, 'EPOCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeToUnix'>>, 'EPOCH_MS': <function DuckDBParser.<lambda>>, 'FROM_HEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Unhex'>>, 'GET_CURRENT_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTime'>>, 'JARO_WINKLER_SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.JarowinklerSimilarity'>>, 'JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.ParseJSON'>>, 'JSON_ARRAY': <function DuckDBParser.<lambda>>, 'JSON_EXTRACT_PATH': <function build_extract_json_with_path.<locals>._builder>, 'JSON_EXTRACT_STRING': <function build_extract_json_with_path.<locals>._builder>, 'LIST_APPEND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayAppend'>>, 'LIST_CONCAT': <function build_array_concat>, 'LIST_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContains'>>, 'LIST_COSINE_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.CosineDistance'>>, 'LIST_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.EuclideanDistance'>>, 'LIST_FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayFilter'>>, 'LIST_HAS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContains'>>, 'LIST_HAS_ANY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayOverlaps'>>, 'LIST_MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayMax'>>, 'LIST_MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayMin'>>, 'LIST_PREPEND': <function _build_array_prepend>, 'LIST_REVERSE_SORT': <function _build_list_sort.<locals>._builder>, 'LIST_SORT': <function _build_list_sort.<locals>._builder>, 'LIST_TRANSFORM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Transform'>>, 'LIST_VALUE': <function DuckDBParser.<lambda>>, 'MAKE_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateFromParts'>>, 'MAKE_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeFromParts'>>, 'MAKE_TIMESTAMP': <function _build_make_timestamp>, 'QUANTILE_CONT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.PercentileCont'>>, 'QUANTILE_DISC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.PercentileDisc'>>, 'RANGE': <function _build_generate_series.<locals>._builder>, 'REGEXP_MATCHES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.RegexpLike'>>, 'SHA256': <function DuckDBParser.<lambda>>, 'STRFTIME': <function build_formatted_time.<locals>._builder>, 'STRING_SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Split'>>, 'STRING_SPLIT_REGEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpSplit'>>, 'STRPTIME': <function build_formatted_time.<locals>._builder>, 'STRUCT_PACK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Struct'>>, 'STR_SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Split'>>, 'STR_SPLIT_REGEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpSplit'>>, 'TODAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentDate'>>, 'TIME_BUCKET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateBin'>>, 'TO_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixToTime'>>, 'VERSION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentVersion'>>}
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>>, '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>>, 'MATCH': <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>>, 'WEIGHT_STRING': <function Parser.<lambda>>, 'XMLELEMENT': <function Parser.<lambda>>, 'XMLTABLE': <function Parser.<lambda>>, 'GROUP_CONCAT': <function DuckDBParser.<lambda>>, 'LISTAGG': <function DuckDBParser.<lambda>>, 'STRINGAGG': <function DuckDBParser.<lambda>>, 'APPROX_QUANTILE': <function DuckDBParser.<lambda>>, 'MAX': <function DuckDBParser.<lambda>>, 'MIN': <function DuckDBParser.<lambda>>, 'QUANTILE': <function DuckDBParser.<lambda>>, 'QUANTILE_CONT': <function DuckDBParser.<lambda>>, 'QUANTILE_DISC': <function DuckDBParser.<lambda>>}
NO_PAREN_FUNCTION_PARSERS = {'ANY': <function Parser.<lambda>>, 'CASE': <function Parser.<lambda>>, 'CONNECT_BY_ROOT': <function Parser.<lambda>>, 'IF': <function Parser.<lambda>>, 'MAP': <function DuckDBParser.<lambda>>, '@': <function DuckDBParser.<lambda>>}
PLACEHOLDER_PARSERS = {<TokenType.PLACEHOLDER: 361>: <function Parser.<lambda>>, <TokenType.PARAMETER: 58>: <function DuckDBParser.<lambda>>, <TokenType.COLON: 11>: <function Parser.<lambda>>}
TYPE_CONVERTERS = {<DType.DECIMAL: 'DECIMAL'>: <function build_default_decimal_type.<locals>._builder>, <DType.TEXT: 'TEXT'>: <function _convert_text_type>}
STATEMENT_PARSERS = {<TokenType.ALTER: 221>: <function Parser.<lambda>>, <TokenType.ANALYZE: 444>: <function Parser.<lambda>>, <TokenType.BEGIN: 231>: <function Parser.<lambda>>, <TokenType.CACHE: 234>: <function Parser.<lambda>>, <TokenType.COMMENT: 240>: <function Parser.<lambda>>, <TokenType.COMMIT: 241>: <function Parser.<lambda>>, <TokenType.COPY: 245>: <function Parser.<lambda>>, <TokenType.CREATE: 246>: <function Parser.<lambda>>, <TokenType.DECLARE: 258>: <function Parser.<lambda>>, <TokenType.DELETE: 260>: <function Parser.<lambda>>, <TokenType.DESC: 261>: <function Parser.<lambda>>, <TokenType.DESCRIBE: 262>: <function Parser.<lambda>>, <TokenType.DROP: 269>: <function Parser.<lambda>>, <TokenType.GRANT: 293>: <function Parser.<lambda>>, <TokenType.REVOKE: 382>: <function Parser.<lambda>>, <TokenType.INSERT: 304>: <function Parser.<lambda>>, <TokenType.KILL: 318>: <function Parser.<lambda>>, <TokenType.LOAD: 325>: <function Parser.<lambda>>, <TokenType.MERGE: 332>: <function Parser.<lambda>>, <TokenType.PIVOT: 360>: <function Parser.<lambda>>, <TokenType.PRAGMA: 365>: <function Parser.<lambda>>, <TokenType.REFRESH: 378>: <function Parser.<lambda>>, <TokenType.ROLLBACK: 387>: <function Parser.<lambda>>, <TokenType.SET: 397>: <function Parser.<lambda>>, <TokenType.TRUNCATE: 416>: <function Parser.<lambda>>, <TokenType.UNCACHE: 419>: <function Parser.<lambda>>, <TokenType.UNPIVOT: 423>: <function Parser.<lambda>>, <TokenType.UPDATE: 424>: <function Parser.<lambda>>, <TokenType.USE: 425>: <function Parser.<lambda>>, <TokenType.SEMICOLON: 19>: <function Parser.<lambda>>, <TokenType.ATTACH: 229>: <function DuckDBParser.<lambda>>, <TokenType.CONNECT: 242>: <function DuckDBParser.<lambda>>, <TokenType.DETACH: 263>: <function DuckDBParser.<lambda>>, <TokenType.DISCONNECT: 264>: <function DuckDBParser.<lambda>>, <TokenType.FORCE: 284>: <function DuckDBParser.<lambda>>, <TokenType.INSTALL: 305>: <function DuckDBParser.<lambda>>, <TokenType.SHOW: 399>: <function DuckDBParser.<lambda>>}
SET_PARSERS = {'GLOBAL': <function Parser.<lambda>>, 'LOCAL': <function Parser.<lambda>>, 'SESSION': <function Parser.<lambda>>, 'TRANSACTION': <function Parser.<lambda>>, 'VARIABLE': <function DuckDBParser.<lambda>>}
SHOW_TRIE = {'TABLES': {0: True}, 'ALL': {'TABLES': {0: True}}}
SET_TRIE = {'GLOBAL': {0: True}, 'LOCAL': {0: True}, 'SESSION': {0: True}, 'TRANSACTION': {0: True}, 'VARIABLE': {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
SUBQUERY_TOKENS
RESERVED_TOKENS
TEXT_MATCH_EXCLUDED_TOKENS
DB_CREATABLES
CREATABLES
TRIGGER_EVENTS
ALTERABLES
ID_VAR_TOKENS
TABLE_ALIAS_TOKENS
ALIAS_TOKENS
COLON_PLACEHOLDER_TOKENS
ARRAY_CONSTRUCTORS
COMMENT_TABLE_ALIAS_TOKENS
UPDATE_ALIAS_TOKENS
TRIM_TYPES
IDENTIFIER_TOKENS
BRACKETS
COLUMN_POSTFIX_TOKENS
TABLE_POSTFIX_TOKENS
FUNC_TOKENS
CONJUNCTION
ASSIGNMENT
DISJUNCTION
EQUALITY
COMPARISON
TERM
FACTOR
TIMES
TIMESTAMPS
SET_OPERATIONS
JOIN_METHODS
JOIN_SIDES
JOIN_HINTS
TABLE_TERMINATORS
LAMBDAS
TYPED_LAMBDA_ARGS
LAMBDA_ARG_TERMINATORS
CAST_COLUMN_OPERATORS
EXPRESSION_PARSERS
UNARY_PARSERS
STRING_PARSERS
NUMERIC_PARSERS
PRIMARY_PARSERS
PIPE_SYNTAX_TRANSFORM_PARSERS
PROPERTY_PARSERS
CONSTRAINT_PARSERS
ALTER_PARSERS
ALTER_ALTER_PARSERS
SCHEMA_UNNAMED_CONSTRAINTS
RESERVED_CONSTRAINT_KINDS
INVALID_FUNC_NAME_TOKENS
KEY_VALUE_DEFINITIONS
QUERY_MODIFIER_PARSERS
QUERY_MODIFIER_TOKENS
TYPE_LITERAL_PARSERS
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
VERSION_PHRASES
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
ADD_CONSTRAINT_KEYWORDS
DISTINCT_TOKENS
UNNEST_OFFSET_ALIAS_TOKENS
SELECT_START_TOKENS
COPY_INTO_VARLEN_OPTIONS
IS_PREDICATE_TOKENS
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
SECURITY_PROPERTY_KEYWORDS
MODIFIABLES
STRICT_CAST
PREFIXED_PIVOT_COLUMNS
IDENTIFY_PIVOT_STRINGS
UNPIVOT_VALUE_COLUMNS_FIRST
LOG_DEFAULTS_TO_LN
TABLESAMPLE_CSV
DEFAULT_SAMPLING_METHOD
SET_REQUIRES_ASSIGNMENT_DELIMITER
TRIM_PATTERN_FIRST
STRING_ALIASES
MODIFIERS_ATTACHED_TO_SET_OP
SET_OP_MODIFIERS
NO_PAREN_IF_COMMANDS
JSON_ARROWS_REQUIRE_JSON_TYPE
COLON_IS_VARIANT_EXTRACT
COLON_CHAIN_IS_SINGLE_EXTRACT
VALUES_FOLLOWED_BY_PAREN
SUPPORTS_IMPLICIT_UNNEST
SUPPORTS_DIGIT_PREFIXED_FIELD_NAMES
INTERVAL_SPANS
SUPPORTS_PARTITION_SELECTION
WRAPPED_TRANSFORM_COLUMN_CONSTRAINT
OPTIONAL_ALIAS_TOKEN_CTE
ALTER_RENAME_REQUIRES_COLUMN
ALTER_DROP_REQUIRES_COLUMN
ALTER_TABLE_PARTITIONS
ALTER_TABLE_MIXED_ACTIONS
ALTER_TABLE_REQUIRES_ACTION
ALTER_COLUMN_TYPE_REQUIRES_KEYWORD
JOINS_HAVE_EQUAL_PRECEDENCE
ZONE_AWARE_TIMESTAMP_CONSTRUCTOR
JSON_EXTRACT_REQUIRES_JSON_EXPRESSION
ADD_JOIN_ON_TRUE
SUPPORTS_OMITTED_INTERVAL_SPAN_UNIT
ADJACENT_STRINGS_CANNOT_BE_CONNECTED
SUPPORTS_NTH_VALUE_FROM_MODIFIER
QUOTED_TYPES_TO_PRESERVE
error_level
error_message_context
max_errors
max_nodes
dialect
sql
errors
reset
raise_error
validate_expression
parse
parse_into
check_errors
expression
parse_set_operation
build_cast