Skip to content

Commit bdeb4b5

Browse files
switched to Func, variety of tweaks
1 parent 97453f5 commit bdeb4b5

4 files changed

Lines changed: 9 additions & 15 deletions

File tree

sqlglot/expressions/core.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1807,8 +1807,9 @@ def output_name(self) -> str:
18071807
return self.name
18081808

18091809

1810-
class DynamicIdentifier(Expression):
1811-
arg_types = {"this": True}
1810+
# https://docs.snowflake.com/en/sql-reference/identifier-literal
1811+
class DynamicIdentifier(Expression, Func):
1812+
pass
18121813

18131814

18141815
class Opclass(Expression):

sqlglot/generator.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from sqlglot import exp
1010
from sqlglot.errors import ErrorLevel, UnsupportedError, concat_messages
1111
from sqlglot.expressions import apply_index_offset
12+
from sqlglot.expressions.core import maybe_parse
1213
from sqlglot.helper import csv, name_sequence, seq_get
1314
from sqlglot.jsonpath import ALL_JSON_PATH_PARTS, JSON_PATH_PART_TRANSFORMS
1415
from sqlglot.time import format_time
@@ -1948,7 +1949,8 @@ def index_sql(self, expression: exp.Index) -> str:
19481949
def dynamicidentifier_sql(self, expression: exp.DynamicIdentifier) -> str:
19491950
this = expression.this
19501951
if this and this.is_string:
1951-
return this.name
1952+
return maybe_parse(this.name).sql(self.dialect)
1953+
self.unsupported("IDENTIFIER() with non-literal arguments is not supported")
19521954
return self.func("IDENTIFIER", this)
19531955

19541956
def identifier_sql(self, expression: exp.Identifier) -> str:

sqlglot/generators/snowflake.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,7 @@ class SnowflakeGenerator(generator.Generator):
475475
exp.DayOfWeekIso: rename_func("DAYOFWEEKISO"),
476476
exp.DayOfYear: rename_func("DAYOFYEAR"),
477477
exp.DotProduct: rename_func("VECTOR_INNER_PRODUCT"),
478+
exp.DynamicIdentifier: rename_func("IDENTIFIER"),
478479
exp.Explode: rename_func("FLATTEN"),
479480
exp.Extract: lambda self, e: self.func(
480481
"DATE_PART", map_date_part(e.this, self.dialect), e.expression
@@ -616,9 +617,6 @@ class SnowflakeGenerator(generator.Generator):
616617
),
617618
}
618619

619-
def dynamicidentifier_sql(self, expression: exp.DynamicIdentifier) -> str:
620-
return self.func("IDENTIFIER", expression.this)
621-
622620
def sortarray_sql(self, expression: exp.SortArray) -> str:
623621
asc = expression.args.get("asc")
624622
nulls_first = expression.args.get("nulls_first")

sqlglot/parsers/snowflake.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,7 @@ class SnowflakeParser(parser.Parser):
723723
expression=seq_get(args, 1) or exp.Literal.string(" "),
724724
),
725725
"SYSTIMESTAMP": exp.CurrentTimestamp.from_arg_list,
726+
"IDENTIFIER": exp.DynamicIdentifier.from_arg_list,
726727
"UNICODE": lambda args: exp.Unicode(this=seq_get(args, 0), empty_is_zero=True),
727728
"WEEKISO": exp.WeekOfYear.from_arg_list,
728729
"WEEKOFYEAR": exp.Week.from_arg_list,
@@ -733,7 +734,6 @@ class SnowflakeParser(parser.Parser):
733734
**parser.Parser.FUNCTION_PARSERS,
734735
"DATE_PART": lambda self: self._parse_date_part(),
735736
"DIRECTORY": lambda self: self._parse_directory(),
736-
"IDENTIFIER": lambda self: self._parse_identifier_function(),
737737
"OBJECT_CONSTRUCT_KEEP_NULL": lambda self: self._parse_json_object(),
738738
"LISTAGG": lambda self: self._parse_string_agg(),
739739
"SEMANTIC_VIEW": lambda self: self._parse_semantic_view(),
@@ -1143,13 +1143,6 @@ def _parse_table(
11431143

11441144
return table
11451145

1146-
def _fold_identifier_literal(self, arg: exp.Expr | None) -> exp.Expr:
1147-
return self.expression(exp.DynamicIdentifier(this=arg))
1148-
1149-
def _parse_identifier_function(self) -> exp.Expr:
1150-
arg = self._parse_string() or super()._parse_id_var()
1151-
return self._fold_identifier_literal(arg)
1152-
11531146
def _parse_id_var(
11541147
self,
11551148
any_token: bool = True,
@@ -1160,7 +1153,7 @@ def _parse_id_var(
11601153
super()._parse_id_var(any_token=any_token, tokens=tokens) or self._parse_string()
11611154
)
11621155
self._match_r_paren()
1163-
return self._fold_identifier_literal(identifier)
1156+
return self.expression(exp.DynamicIdentifier(this=identifier))
11641157

11651158
return super()._parse_id_var(any_token=any_token, tokens=tokens)
11661159

0 commit comments

Comments
 (0)