Adding upstream version 22.2.0.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
b01402dc30
commit
f1aa09959c
148 changed files with 68457 additions and 63176 deletions
|
@ -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)))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue