1
0
Fork 0

Merging upstream version 18.11.2.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-13 21:04:58 +01:00
parent 15b8b39545
commit c37998973e
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
88 changed files with 52059 additions and 46960 deletions

View file

@ -52,6 +52,9 @@ class _Expression(type):
return klass
SQLGLOT_META = "sqlglot.meta"
class Expression(metaclass=_Expression):
"""
The base class for all expressions in a syntax tree. Each Expression encapsulates any necessary
@ -266,7 +269,14 @@ class Expression(metaclass=_Expression):
if self.comments is None:
self.comments = []
if comments:
self.comments.extend(comments)
for comment in comments:
_, *meta = comment.split(SQLGLOT_META)
if meta:
for kv in "".join(meta).split(","):
k, *v = kv.split("=")
value = v[0].strip() if v else True
self.meta[k.strip()] = value
self.comments.append(comment)
def append(self, arg_key: str, value: t.Any) -> None:
"""
@ -1036,11 +1046,14 @@ class Create(DDL):
"indexes": False,
"no_schema_binding": False,
"begin": False,
"end": False,
"clone": False,
}
# https://docs.snowflake.com/en/sql-reference/sql/create-clone
# https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_table_clone_statement
# https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_table_copy
class Clone(Expression):
arg_types = {
"this": True,
@ -1048,6 +1061,7 @@ class Clone(Expression):
"kind": False,
"shallow": False,
"expression": False,
"copy": False,
}
@ -1610,6 +1624,11 @@ class Identifier(Expression):
return self.name
# https://www.postgresql.org/docs/current/indexes-opclass.html
class Opclass(Expression):
arg_types = {"this": True, "expression": True}
class Index(Expression):
arg_types = {
"this": False,
@ -2156,6 +2175,10 @@ class QueryTransform(Expression):
}
class SampleProperty(Property):
arg_types = {"this": True}
class SchemaCommentProperty(Property):
arg_types = {"this": True}
@ -2440,6 +2463,8 @@ class Table(Expression):
"hints": False,
"system_time": False,
"version": False,
"format": False,
"pattern": False,
}
@property
@ -2465,17 +2490,17 @@ class Table(Expression):
return []
@property
def parts(self) -> t.List[Identifier]:
def parts(self) -> t.List[Expression]:
"""Return the parts of a table in order catalog, db, table."""
parts: t.List[Identifier] = []
parts: t.List[Expression] = []
for arg in ("catalog", "db", "this"):
part = self.args.get(arg)
if isinstance(part, Identifier):
parts.append(part)
elif isinstance(part, Dot):
if isinstance(part, Dot):
parts.extend(part.flatten())
elif isinstance(part, Expression):
parts.append(part)
return parts
@ -2910,6 +2935,7 @@ class Select(Subqueryable):
prefix="OFFSET",
dialect=dialect,
copy=copy,
into_arg="expression",
**opts,
)
@ -3572,6 +3598,7 @@ class DataType(Expression):
UINT128 = auto()
UINT256 = auto()
UMEDIUMINT = auto()
UDECIMAL = auto()
UNIQUEIDENTIFIER = auto()
UNKNOWN = auto() # Sentinel value, useful for type annotation
USERDEFINED = "USER-DEFINED"
@ -3693,13 +3720,13 @@ class DataType(Expression):
# https://www.postgresql.org/docs/15/datatype-pseudo.html
class PseudoType(Expression):
pass
class PseudoType(DataType):
arg_types = {"this": True}
# https://www.postgresql.org/docs/15/datatype-oid.html
class ObjectIdentifier(Expression):
pass
class ObjectIdentifier(DataType):
arg_types = {"this": True}
# WHERE x <OP> EXISTS|ALL|ANY|SOME(SELECT ...)
@ -4027,10 +4054,20 @@ class TimeUnit(Expression):
return self.args.get("unit")
class IntervalOp(TimeUnit):
arg_types = {"unit": True, "expression": True}
def interval(self):
return Interval(
this=self.expression.copy(),
unit=self.unit.copy(),
)
# https://www.oracletutorial.com/oracle-basics/oracle-interval/
# https://trino.io/docs/current/language/types.html#interval-day-to-second
# https://docs.databricks.com/en/sql/language-manual/data-types/interval-type.html
class IntervalSpan(Expression):
class IntervalSpan(DataType):
arg_types = {"this": True, "expression": True}
@ -4269,7 +4306,7 @@ class CastToStrType(Func):
arg_types = {"this": True, "to": True}
class Collate(Binary):
class Collate(Binary, Func):
pass
@ -4284,6 +4321,12 @@ class Coalesce(Func):
_sql_names = ["COALESCE", "IFNULL", "NVL"]
class Chr(Func):
arg_types = {"this": True, "charset": False, "expressions": False}
is_var_len_args = True
_sql_names = ["CHR", "CHAR"]
class Concat(Func):
arg_types = {"expressions": True}
is_var_len_args = True
@ -4326,11 +4369,11 @@ class CurrentUser(Func):
arg_types = {"this": False}
class DateAdd(Func, TimeUnit):
class DateAdd(Func, IntervalOp):
arg_types = {"this": True, "expression": True, "unit": False}
class DateSub(Func, TimeUnit):
class DateSub(Func, IntervalOp):
arg_types = {"this": True, "expression": True, "unit": False}
@ -4347,11 +4390,11 @@ class DateTrunc(Func):
return self.args["unit"]
class DatetimeAdd(Func, TimeUnit):
class DatetimeAdd(Func, IntervalOp):
arg_types = {"this": True, "expression": True, "unit": False}
class DatetimeSub(Func, TimeUnit):
class DatetimeSub(Func, IntervalOp):
arg_types = {"this": True, "expression": True, "unit": False}
@ -4375,6 +4418,10 @@ class DayOfYear(Func):
_sql_names = ["DAY_OF_YEAR", "DAYOFYEAR"]
class ToDays(Func):
pass
class WeekOfYear(Func):
_sql_names = ["WEEK_OF_YEAR", "WEEKOFYEAR"]
@ -6160,7 +6207,7 @@ def table_name(table: Table | str, dialect: DialectType = None) -> str:
The table name.
"""
table = maybe_parse(table, into=Table)
table = maybe_parse(table, into=Table, dialect=dialect)
if not table:
raise ValueError(f"Cannot parse {table}")