diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-03-03 14:11:07 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-03-03 14:11:07 +0000 |
commit | 42a1548cecf48d18233f56e3385cf9c89abcb9c2 (patch) | |
tree | 5e0fff4ecbd1fd7dd1022a7580139038df2a824c /sqlglot/dialects/snowflake.py | |
parent | Releasing debian version 21.1.2-1. (diff) | |
download | sqlglot-42a1548cecf48d18233f56e3385cf9c89abcb9c2.tar.xz sqlglot-42a1548cecf48d18233f56e3385cf9c89abcb9c2.zip |
Merging upstream version 22.2.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'sqlglot/dialects/snowflake.py')
-rw-r--r-- | sqlglot/dialects/snowflake.py | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/sqlglot/dialects/snowflake.py b/sqlglot/dialects/snowflake.py index c773e50..20fdfb7 100644 --- a/sqlglot/dialects/snowflake.py +++ b/sqlglot/dialects/snowflake.py @@ -21,7 +21,7 @@ from sqlglot.dialects.dialect import ( var_map_sql, ) from sqlglot.expressions import Literal -from sqlglot.helper import is_int, seq_get +from sqlglot.helper import flatten, is_int, seq_get from sqlglot.tokens import TokenType if t.TYPE_CHECKING: @@ -66,7 +66,7 @@ def _build_object_construct(args: t.List) -> t.Union[exp.StarMap, exp.Struct]: return exp.Struct( expressions=[ - t.cast(exp.Condition, k).eq(v) for k, v in zip(expression.keys, expression.values) + exp.PropertyEQ(this=k, expression=v) for k, v in zip(expression.keys, expression.values) ] ) @@ -409,8 +409,16 @@ class Snowflake(Dialect): "TERSE OBJECTS": _show_parser("OBJECTS"), "TABLES": _show_parser("TABLES"), "TERSE TABLES": _show_parser("TABLES"), + "VIEWS": _show_parser("VIEWS"), + "TERSE VIEWS": _show_parser("VIEWS"), "PRIMARY KEYS": _show_parser("PRIMARY KEYS"), "TERSE PRIMARY KEYS": _show_parser("PRIMARY KEYS"), + "IMPORTED KEYS": _show_parser("IMPORTED KEYS"), + "TERSE IMPORTED KEYS": _show_parser("IMPORTED KEYS"), + "UNIQUE KEYS": _show_parser("UNIQUE KEYS"), + "TERSE UNIQUE KEYS": _show_parser("UNIQUE KEYS"), + "SEQUENCES": _show_parser("SEQUENCES"), + "TERSE SEQUENCES": _show_parser("SEQUENCES"), "COLUMNS": _show_parser("COLUMNS"), "USERS": _show_parser("USERS"), "TERSE USERS": _show_parser("USERS"), @@ -424,11 +432,13 @@ class Snowflake(Dialect): FLATTEN_COLUMNS = ["SEQ", "KEY", "PATH", "INDEX", "VALUE", "THIS"] + SCHEMA_KINDS = {"OBJECTS", "TABLES", "VIEWS", "SEQUENCES", "UNIQUE KEYS", "IMPORTED KEYS"} + def _parse_colon_get_path( self: parser.Parser, this: t.Optional[exp.Expression] ) -> t.Optional[exp.Expression]: while True: - path = self._parse_bitwise() + path = self._parse_bitwise() or self._parse_var(any_token=True) # The cast :: operator has a lower precedence than the extraction operator :, so # we rearrange the AST appropriately to avoid casting the 2nd argument of GET_PATH @@ -535,7 +545,7 @@ class Snowflake(Dialect): return table def _parse_table_parts( - self, schema: bool = False, is_db_reference: bool = False + self, schema: bool = False, is_db_reference: bool = False, wildcard: bool = False ) -> exp.Table: # https://docs.snowflake.com/en/user-guide/querying-stage if self._match(TokenType.STRING, advance=False): @@ -603,7 +613,7 @@ class Snowflake(Dialect): if self._curr: scope = self._parse_table_parts() elif self._curr: - scope_kind = "SCHEMA" if this in ("OBJECTS", "TABLES") else "TABLE" + scope_kind = "SCHEMA" if this in self.SCHEMA_KINDS else "TABLE" scope = self._parse_table_parts() return self.expression( @@ -758,10 +768,6 @@ class Snowflake(Dialect): "POSITION", e.args.get("substr"), e.this, e.args.get("position") ), exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)), - exp.Struct: lambda self, e: self.func( - "OBJECT_CONSTRUCT", - *(arg for expression in e.expressions for arg in expression.flatten()), - ), exp.Stuff: rename_func("INSERT"), exp.TimestampDiff: lambda self, e: self.func( "TIMESTAMPDIFF", e.unit, e.expression, e.this @@ -937,3 +943,19 @@ class Snowflake(Dialect): def cluster_sql(self, expression: exp.Cluster) -> str: return f"CLUSTER BY ({self.expressions(expression, flat=True)})" + + def struct_sql(self, expression: exp.Struct) -> str: + keys = [] + values = [] + + for i, e in enumerate(expression.expressions): + if isinstance(e, exp.PropertyEQ): + keys.append( + exp.Literal.string(e.name) if isinstance(e.this, exp.Identifier) else e.this + ) + values.append(e.expression) + else: + keys.append(exp.Literal.string(f"_{i}")) + values.append(e) + + return self.func("OBJECT_CONSTRUCT", *flatten(zip(keys, values))) |