summaryrefslogtreecommitdiffstats
path: root/sqlglot/dialects/snowflake.py
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-03-03 14:11:07 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-03-03 14:11:07 +0000
commit42a1548cecf48d18233f56e3385cf9c89abcb9c2 (patch)
tree5e0fff4ecbd1fd7dd1022a7580139038df2a824c /sqlglot/dialects/snowflake.py
parentReleasing debian version 21.1.2-1. (diff)
downloadsqlglot-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.py40
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)))