1
0
Fork 0

Merging upstream version 17.11.0.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-13 20:51:40 +01:00
parent 2bd548fc43
commit 14ca349bca
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
69 changed files with 30974 additions and 30030 deletions

View file

@ -248,7 +248,6 @@ class Parser(metaclass=_Parser):
TokenType.FILTER,
TokenType.FORMAT,
TokenType.FULL,
TokenType.IF,
TokenType.IS,
TokenType.ISNULL,
TokenType.INTERVAL,
@ -708,14 +707,10 @@ class Parser(metaclass=_Parser):
SCHEMA_UNNAMED_CONSTRAINTS = {"CHECK", "FOREIGN KEY", "LIKE", "PRIMARY KEY", "UNIQUE"}
NO_PAREN_FUNCTION_PARSERS = {
TokenType.ANY: lambda self: self.expression(exp.Any, this=self._parse_bitwise()),
TokenType.CASE: lambda self: self._parse_case(),
TokenType.IF: lambda self: self._parse_if(),
TokenType.NEXT_VALUE_FOR: lambda self: self.expression(
exp.NextValueFor,
this=self._parse_column(),
order=self._match(TokenType.OVER) and self._parse_wrapped(self._parse_order),
),
"ANY": lambda self: self.expression(exp.Any, this=self._parse_bitwise()),
"CASE": lambda self: self._parse_case(),
"IF": lambda self: self._parse_if(),
"NEXT": lambda self: self._parse_next_value_for(),
}
FUNCTIONS_WITH_ALIASED_ARGS = {"STRUCT"}
@ -1162,7 +1157,7 @@ class Parser(metaclass=_Parser):
def _parse_exists(self, not_: bool = False) -> t.Optional[bool]:
return (
self._match(TokenType.IF)
self._match_text_seq("IF")
and (not not_ or self._match(TokenType.NOT))
and self._match(TokenType.EXISTS)
)
@ -1935,6 +1930,9 @@ class Parser(metaclass=_Parser):
# https://prestodb.io/docs/current/sql/values.html
return self.expression(exp.Tuple, expressions=[self._parse_conjunction()])
def _parse_projections(self) -> t.List[t.Optional[exp.Expression]]:
return self._parse_expressions()
def _parse_select(
self, nested: bool = False, table: bool = False, parse_subquery_alias: bool = True
) -> t.Optional[exp.Expression]:
@ -1974,14 +1972,14 @@ class Parser(metaclass=_Parser):
self.raise_error("Cannot specify both ALL and DISTINCT after SELECT")
limit = self._parse_limit(top=True)
expressions = self._parse_expressions()
projections = self._parse_projections()
this = self.expression(
exp.Select,
kind=kind,
hint=hint,
distinct=distinct,
expressions=expressions,
expressions=projections,
limit=limit,
)
this.comments = comments
@ -3021,8 +3019,12 @@ class Parser(metaclass=_Parser):
while True:
if self._match_set(self.BITWISE):
this = self.expression(
self.BITWISE[self._prev.token_type], this=this, expression=self._parse_term()
self.BITWISE[self._prev.token_type],
this=this,
expression=self._parse_term(),
)
elif self._match(TokenType.DQMARK):
this = self.expression(exp.Coalesce, this=this, expressions=self._parse_term())
elif self._match_pair(TokenType.LT, TokenType.LT):
this = self.expression(
exp.BitwiseLeftShift, this=this, expression=self._parse_term()
@ -3322,9 +3324,13 @@ class Parser(metaclass=_Parser):
return None
token_type = self._curr.token_type
this = self._curr.text
upper = this.upper()
if optional_parens and self._match_set(self.NO_PAREN_FUNCTION_PARSERS):
return self.NO_PAREN_FUNCTION_PARSERS[token_type](self)
parser = self.NO_PAREN_FUNCTION_PARSERS.get(upper)
if optional_parens and parser:
self._advance()
return parser(self)
if not self._next or self._next.token_type != TokenType.L_PAREN:
if optional_parens and token_type in self.NO_PAREN_FUNCTIONS:
@ -3336,12 +3342,9 @@ class Parser(metaclass=_Parser):
if token_type not in self.FUNC_TOKENS:
return None
this = self._curr.text
upper = this.upper()
self._advance(2)
parser = self.FUNCTION_PARSERS.get(upper)
if parser and not anonymous:
this = parser(self)
else:
@ -3368,7 +3371,7 @@ class Parser(metaclass=_Parser):
else:
this = self.expression(exp.Anonymous, this=this, expressions=args)
self._match(TokenType.R_PAREN, expression=this)
self._match_r_paren(this)
return self._parse_window(this)
def _parse_function_parameter(self) -> t.Optional[exp.Expression]:
@ -3703,7 +3706,11 @@ class Parser(metaclass=_Parser):
self.expression(exp.Slice, expression=self._parse_conjunction())
]
else:
expressions = self._parse_csv(lambda: self._parse_slice(self._parse_conjunction()))
expressions = self._parse_csv(
lambda: self._parse_slice(
self._parse_alias(self._parse_conjunction(), explicit=True)
)
)
# https://duckdb.org/docs/sql/data_types/struct.html#creating-structs
if bracket_kind == TokenType.L_BRACE:
@ -3770,6 +3777,17 @@ class Parser(metaclass=_Parser):
return self._parse_window(this)
def _parse_next_value_for(self) -> t.Optional[exp.Expression]:
if not self._match_text_seq("VALUE", "FOR"):
self._retreat(self._index - 1)
return None
return self.expression(
exp.NextValueFor,
this=self._parse_column(),
order=self._match(TokenType.OVER) and self._parse_wrapped(self._parse_order),
)
def _parse_extract(self) -> exp.Extract:
this = self._parse_function() or self._parse_var() or self._parse_type()