1
0
Fork 0

Merging upstream version 6.2.8.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-13 14:43:32 +01:00
parent 87ba722f7f
commit a62bbc24c3
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
22 changed files with 361 additions and 98 deletions

View file

@ -213,21 +213,23 @@ class Expression(metaclass=_Expression):
"""
return self.find_ancestor(Select)
def walk(self, bfs=True):
def walk(self, bfs=True, prune=None):
"""
Returns a generator object which visits all nodes in this tree.
Args:
bfs (bool): if set to True the BFS traversal order will be applied,
otherwise the DFS traversal will be used instead.
prune ((node, parent, arg_key) -> bool): callable that returns True if
the generator should stop traversing this branch of the tree.
Returns:
the generator object.
"""
if bfs:
yield from self.bfs()
yield from self.bfs(prune=prune)
else:
yield from self.dfs()
yield from self.dfs(prune=prune)
def dfs(self, parent=None, key=None, prune=None):
"""
@ -506,6 +508,10 @@ class DerivedTable(Expression):
return [select.alias_or_name for select in self.selects]
class UDTF(DerivedTable):
pass
class Annotation(Expression):
arg_types = {
"this": True,
@ -652,7 +658,13 @@ class Delete(Expression):
class Drop(Expression):
arg_types = {"this": False, "kind": False, "exists": False}
arg_types = {
"this": False,
"kind": False,
"exists": False,
"temporary": False,
"materialized": False,
}
class Filter(Expression):
@ -827,7 +839,7 @@ class Join(Expression):
return join
class Lateral(DerivedTable):
class Lateral(UDTF):
arg_types = {"this": True, "outer": False, "alias": False}
@ -915,6 +927,14 @@ class LanguageProperty(Property):
pass
class ExecuteAsProperty(Property):
pass
class VolatilityProperty(Property):
arg_types = {"this": True}
class Properties(Expression):
arg_types = {"expressions": True}
@ -1098,7 +1118,7 @@ class Intersect(Union):
pass
class Unnest(DerivedTable):
class Unnest(UDTF):
arg_types = {
"expressions": True,
"ordinality": False,
@ -1116,8 +1136,12 @@ class Update(Expression):
}
class Values(Expression):
arg_types = {"expressions": True}
class Values(UDTF):
arg_types = {
"expressions": True,
"ordinality": False,
"alias": False,
}
class Var(Expression):
@ -2033,23 +2057,17 @@ class Func(Condition):
@classmethod
def from_arg_list(cls, args):
args_num = len(args)
if cls.is_var_len_args:
all_arg_keys = list(cls.arg_types)
# If this function supports variable length argument treat the last argument as such.
non_var_len_arg_keys = all_arg_keys[:-1] if cls.is_var_len_args else all_arg_keys
num_non_var = len(non_var_len_arg_keys)
all_arg_keys = list(cls.arg_types)
# If this function supports variable length argument treat the last argument as such.
non_var_len_arg_keys = all_arg_keys[:-1] if cls.is_var_len_args else all_arg_keys
args_dict = {arg_key: arg for arg, arg_key in zip(args, non_var_len_arg_keys)}
args_dict[all_arg_keys[-1]] = args[num_non_var:]
else:
args_dict = {arg_key: arg for arg, arg_key in zip(args, cls.arg_types)}
args_dict = {}
arg_idx = 0
for arg_key in non_var_len_arg_keys:
if arg_idx >= args_num:
break
if args[arg_idx] is not None:
args_dict[arg_key] = args[arg_idx]
arg_idx += 1
if arg_idx < args_num and cls.is_var_len_args:
args_dict[all_arg_keys[-1]] = args[arg_idx:]
return cls(**args_dict)
@classmethod