Skip to content

Commit 22bb9a0

Browse files
authored
Fix!: stop normalizing qualified anonymous functions (#3969)
1 parent 48b214d commit 22bb9a0

File tree

4 files changed

+18
-7
lines changed

4 files changed

+18
-7
lines changed

sqlglot/dialects/tsql.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,12 +351,13 @@ def _timestrtotime_sql(self: TSQL.Generator, expression: exp.TimeStrToTime):
351351

352352

353353
class TSQL(Dialect):
354-
NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE
355-
TIME_FORMAT = "'yyyy-mm-dd hh:mm:ss'"
356354
SUPPORTS_SEMI_ANTI_JOIN = False
357355
LOG_BASE_FIRST = False
358356
TYPED_DIVISION = True
359357
CONCAT_COALESCE = True
358+
NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE
359+
360+
TIME_FORMAT = "'yyyy-mm-dd hh:mm:ss'"
360361

361362
TIME_MAPPING = {
362363
"year": "%Y",

sqlglot/generator.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2888,7 +2888,12 @@ def reference_sql(self, expression: exp.Reference) -> str:
28882888
return f"REFERENCES {this}{expressions}{options}"
28892889

28902890
def anonymous_sql(self, expression: exp.Anonymous) -> str:
2891-
return self.func(self.sql(expression, "this"), *expression.expressions)
2891+
# We don't normalize qualified functions such as a.b.foo(), because they can be case-sensitive
2892+
parent = expression.parent
2893+
is_qualified = isinstance(parent, exp.Dot) and expression is parent.expression
2894+
return self.func(
2895+
self.sql(expression, "this"), *expression.expressions, normalize=not is_qualified
2896+
)
28922897

28932898
def paren_sql(self, expression: exp.Paren) -> str:
28942899
sql = self.seg(self.indent(self.sql(expression, "this")), sep="")
@@ -3397,8 +3402,10 @@ def func(
33973402
*args: t.Optional[exp.Expression | str],
33983403
prefix: str = "(",
33993404
suffix: str = ")",
3405+
normalize: bool = True,
34003406
) -> str:
3401-
return f"{self.normalize_func(name)}{prefix}{self.format_args(*args)}{suffix}"
3407+
name = self.normalize_func(name) if normalize else name
3408+
return f"{name}{prefix}{self.format_args(*args)}{suffix}"
34023409

34033410
def format_args(self, *args: t.Optional[str | exp.Expression]) -> str:
34043411
arg_sqls = tuple(

tests/dialects/test_oracle.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ def test_xml_table(self):
362362
FROM XMLTABLE(
363363
'ROWSET/ROW'
364364
PASSING
365-
dbms_xmlgen.GETXMLTYPE('SELECT table_name, column_name, data_default FROM user_tab_columns')
365+
dbms_xmlgen.getxmltype('SELECT table_name, column_name, data_default FROM user_tab_columns')
366366
COLUMNS
367367
table_name VARCHAR2(128) PATH '*[1]',
368368
column_name VARCHAR2(128) PATH '*[2]',

tests/dialects/test_tsql.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ def test_tsql(self):
3131
self.validate_identity("1 AND true", "1 <> 0 AND (1 = 1)")
3232
self.validate_identity("CAST(x AS int) OR y", "CAST(x AS INTEGER) <> 0 OR y <> 0")
3333
self.validate_identity("TRUNCATE TABLE t1 WITH (PARTITIONS(1, 2 TO 5, 10 TO 20, 84))")
34+
self.validate_identity(
35+
"SELECT TOP 10 s.RECORDID, n.c.value('(/*:FORM_ROOT/*:SOME_TAG)[1]', 'float') AS SOME_TAG_VALUE FROM source_table.dbo.source_data AS s(nolock) CROSS APPLY FormContent.nodes('/*:FORM_ROOT') AS N(C)"
36+
)
3437
self.validate_identity(
3538
"CREATE CLUSTERED INDEX [IX_OfficeTagDetail_TagDetailID] ON [dbo].[OfficeTagDetail]([TagDetailID] ASC)"
3639
)
@@ -1577,8 +1580,8 @@ def test_lateral_table_valued_function(self):
15771580
self.validate_all(
15781581
"SELECT t.x, y.z FROM x OUTER APPLY a.b.tvfTest(t.x)y(z)",
15791582
write={
1580-
"spark": "SELECT t.x, y.z FROM x LEFT JOIN LATERAL a.b.TVFTEST(t.x) AS y(z)",
1581-
"tsql": "SELECT t.x, y.z FROM x OUTER APPLY a.b.TVFTEST(t.x) AS y(z)",
1583+
"spark": "SELECT t.x, y.z FROM x LEFT JOIN LATERAL a.b.tvfTest(t.x) AS y(z)",
1584+
"tsql": "SELECT t.x, y.z FROM x OUTER APPLY a.b.tvfTest(t.x) AS y(z)",
15821585
},
15831586
)
15841587

0 commit comments

Comments
 (0)