diff options
Diffstat (limited to '')
-rw-r--r-- | sqlglot/expressions.py | 86 |
1 files changed, 68 insertions, 18 deletions
diff --git a/sqlglot/expressions.py b/sqlglot/expressions.py index 5b012b1..99ebfb3 100644 --- a/sqlglot/expressions.py +++ b/sqlglot/expressions.py @@ -2145,6 +2145,22 @@ class PartitionedByProperty(Property): arg_types = {"this": True} +# https://www.postgresql.org/docs/current/sql-createtable.html +class PartitionBoundSpec(Expression): + # this -> IN / MODULUS, expression -> REMAINDER, from_expressions -> FROM (...), to_expressions -> TO (...) + arg_types = { + "this": False, + "expression": False, + "from_expressions": False, + "to_expressions": False, + } + + +class PartitionedOfProperty(Property): + # this -> parent_table (schema), expression -> FOR VALUES ... / DEFAULT + arg_types = {"this": True, "expression": True} + + class RemoteWithConnectionModelProperty(Property): arg_types = {"this": True} @@ -2486,6 +2502,7 @@ class Table(Expression): "format": False, "pattern": False, "index": False, + "ordinality": False, } @property @@ -2649,11 +2666,7 @@ class Update(Expression): class Values(UDTF): - arg_types = { - "expressions": True, - "ordinality": False, - "alias": False, - } + arg_types = {"expressions": True, "alias": False} class Var(Expression): @@ -3501,7 +3514,7 @@ class Star(Expression): class Parameter(Condition): - arg_types = {"this": True, "wrapped": False} + arg_types = {"this": True, "expression": False} class SessionParameter(Condition): @@ -5036,7 +5049,7 @@ class FromBase(Func): class Struct(Func): - arg_types = {"expressions": True} + arg_types = {"expressions": False} is_var_len_args = True @@ -5171,7 +5184,7 @@ class Use(Expression): class Merge(Expression): - arg_types = {"this": True, "using": True, "on": True, "expressions": True} + arg_types = {"this": True, "using": True, "on": True, "expressions": True, "with": False} class When(Func): @@ -5459,7 +5472,12 @@ def _wrap(expression: E, kind: t.Type[Expression]) -> E | Paren: def union( - left: ExpOrStr, right: ExpOrStr, distinct: bool = True, dialect: DialectType = None, **opts + left: ExpOrStr, + right: ExpOrStr, + distinct: bool = True, + dialect: DialectType = None, + copy: bool = True, + **opts, ) -> Union: """ Initializes a syntax tree from one UNION expression. @@ -5475,19 +5493,25 @@ def union( If an `Expression` instance is passed, it will be used as-is. distinct: set the DISTINCT flag if and only if this is true. dialect: the dialect used to parse the input expression. + copy: whether or not to copy the expression. opts: other options to use to parse the input expressions. Returns: The new Union instance. """ - left = maybe_parse(sql_or_expression=left, dialect=dialect, **opts) - right = maybe_parse(sql_or_expression=right, dialect=dialect, **opts) + left = maybe_parse(sql_or_expression=left, dialect=dialect, copy=copy, **opts) + right = maybe_parse(sql_or_expression=right, dialect=dialect, copy=copy, **opts) return Union(this=left, expression=right, distinct=distinct) def intersect( - left: ExpOrStr, right: ExpOrStr, distinct: bool = True, dialect: DialectType = None, **opts + left: ExpOrStr, + right: ExpOrStr, + distinct: bool = True, + dialect: DialectType = None, + copy: bool = True, + **opts, ) -> Intersect: """ Initializes a syntax tree from one INTERSECT expression. @@ -5503,19 +5527,25 @@ def intersect( If an `Expression` instance is passed, it will be used as-is. distinct: set the DISTINCT flag if and only if this is true. dialect: the dialect used to parse the input expression. + copy: whether or not to copy the expression. opts: other options to use to parse the input expressions. Returns: The new Intersect instance. """ - left = maybe_parse(sql_or_expression=left, dialect=dialect, **opts) - right = maybe_parse(sql_or_expression=right, dialect=dialect, **opts) + left = maybe_parse(sql_or_expression=left, dialect=dialect, copy=copy, **opts) + right = maybe_parse(sql_or_expression=right, dialect=dialect, copy=copy, **opts) return Intersect(this=left, expression=right, distinct=distinct) def except_( - left: ExpOrStr, right: ExpOrStr, distinct: bool = True, dialect: DialectType = None, **opts + left: ExpOrStr, + right: ExpOrStr, + distinct: bool = True, + dialect: DialectType = None, + copy: bool = True, + **opts, ) -> Except: """ Initializes a syntax tree from one EXCEPT expression. @@ -5531,13 +5561,14 @@ def except_( If an `Expression` instance is passed, it will be used as-is. distinct: set the DISTINCT flag if and only if this is true. dialect: the dialect used to parse the input expression. + copy: whether or not to copy the expression. opts: other options to use to parse the input expressions. Returns: The new Except instance. """ - left = maybe_parse(sql_or_expression=left, dialect=dialect, **opts) - right = maybe_parse(sql_or_expression=right, dialect=dialect, **opts) + left = maybe_parse(sql_or_expression=left, dialect=dialect, copy=copy, **opts) + right = maybe_parse(sql_or_expression=right, dialect=dialect, copy=copy, **opts) return Except(this=left, expression=right, distinct=distinct) @@ -5861,7 +5892,7 @@ def to_identifier(name, quoted=None, copy=True): Args: name: The name to turn into an identifier. quoted: Whether or not force quote the identifier. - copy: Whether or not to copy a passed in Identefier node. + copy: Whether or not to copy name if it's an Identifier. Returns: The identifier ast node. @@ -5882,6 +5913,25 @@ def to_identifier(name, quoted=None, copy=True): return identifier +def parse_identifier(name: str, dialect: DialectType = None) -> Identifier: + """ + Parses a given string into an identifier. + + Args: + name: The name to parse into an identifier. + dialect: The dialect to parse against. + + Returns: + The identifier ast node. + """ + try: + expression = maybe_parse(name, dialect=dialect, into=Identifier) + except ParseError: + expression = to_identifier(name) + + return expression + + INTERVAL_STRING_RE = re.compile(r"\s*([0-9]+)\s*([a-zA-Z]+)\s*") |