|
4 | 4 | import logging |
5 | 5 | import re |
6 | 6 | import typing as t |
| 7 | +from builtins import type as Type |
7 | 8 | from collections import defaultdict |
| 9 | +from collections.abc import Sequence |
8 | 10 |
|
9 | 11 | from sqlglot import exp |
10 | 12 | from sqlglot.errors import ( |
|
17 | 19 | ) |
18 | 20 | from sqlglot.expressions import apply_index_offset |
19 | 21 | from sqlglot.helper import ensure_list, i64, seq_get |
20 | | -from sqlglot.trie import new_trie |
21 | 22 | from sqlglot.time import format_time |
22 | 23 | from sqlglot.tokens import Token, Tokenizer, TokenType |
23 | | -from sqlglot.trie import TrieResult, in_trie |
24 | | -from collections.abc import Sequence |
25 | | -from builtins import type as Type |
| 24 | +from sqlglot.trie import TrieResult, in_trie, new_trie |
26 | 25 |
|
27 | 26 | if t.TYPE_CHECKING: |
28 | | - from sqlglot.expressions import ExpOrStr |
29 | | - from sqlglot._typing import E, BuilderArgs |
30 | | - from sqlglot.dialects.dialect import Dialect, DialectType |
31 | | - |
32 | 27 | from re import Pattern |
33 | 28 |
|
| 29 | + from sqlglot._typing import BuilderArgs, E |
| 30 | + from sqlglot.dialects.dialect import Dialect, DialectType |
| 31 | + from sqlglot.expressions import ExpOrStr |
| 32 | + |
34 | 33 | T = t.TypeVar("T") |
35 | 34 | TCeilFloor = t.TypeVar("TCeilFloor", exp.Ceil, exp.Floor) |
36 | 35 |
|
@@ -1236,6 +1235,7 @@ class Parser: |
1236 | 1235 | exp.BackupProperty(this=self._parse_var(any_token=True)) |
1237 | 1236 | ), |
1238 | 1237 | "BLOCKCOMPRESSION": lambda self: self._parse_blockcompression(), |
| 1238 | + "CALLED": lambda self: self._parse_called_on_null_input_property(), |
1239 | 1239 | "CHARSET": lambda self, **kwargs: self._parse_character_set(**kwargs), |
1240 | 1240 | "CHARACTER SET": lambda self, **kwargs: self._parse_character_set(**kwargs), |
1241 | 1241 | "CHECKSUM": lambda self: self._parse_checksum(), |
@@ -2900,6 +2900,13 @@ def _parse_settings_property(self) -> exp.SettingsProperty: |
2900 | 2900 | exp.SettingsProperty(expressions=self._parse_csv(self._parse_assignment)) |
2901 | 2901 | ) |
2902 | 2902 |
|
| 2903 | + def _parse_called_on_null_input_property(self) -> exp.CalledOnNullInputProperty | None: |
| 2904 | + if not self._match_text_seq("ON", "NULL", "INPUT"): |
| 2905 | + self._retreat(self._index - 1) |
| 2906 | + return None |
| 2907 | + |
| 2908 | + return self.expression(exp.CalledOnNullInputProperty()) |
| 2909 | + |
2903 | 2910 | def _parse_volatile_property(self) -> exp.VolatileProperty | exp.StabilityProperty: |
2904 | 2911 | if self._index >= 2: |
2905 | 2912 | pre_volatile_token = self._tokens[self._index - 2] |
|
0 commit comments