Skip to content

Commit a790e41

Browse files
authored
Fix(spark)!: avoid redundant casts in FROM/TO_UTC_TIMESTAMP (#4725)
1 parent 7fe40c8 commit a790e41

File tree

3 files changed

+21
-9
lines changed

3 files changed

+21
-9
lines changed

sqlglot/dialects/spark2.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,12 @@ class Parser(Hive.Parser):
185185
"DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))),
186186
"DOUBLE": _build_as_cast("double"),
187187
"FLOAT": _build_as_cast("float"),
188-
"FROM_UTC_TIMESTAMP": lambda args: exp.AtTimeZone(
189-
this=exp.cast(seq_get(args, 0) or exp.Var(this=""), exp.DataType.Type.TIMESTAMP),
188+
"FROM_UTC_TIMESTAMP": lambda args, dialect: exp.AtTimeZone(
189+
this=exp.cast(
190+
seq_get(args, 0) or exp.Var(this=""),
191+
exp.DataType.Type.TIMESTAMP,
192+
dialect=dialect,
193+
),
190194
zone=seq_get(args, 1),
191195
),
192196
"INT": _build_as_cast("int"),
@@ -202,8 +206,12 @@ class Parser(Hive.Parser):
202206
else build_formatted_time(exp.StrToTime, "spark")(args)
203207
),
204208
"TO_UNIX_TIMESTAMP": exp.StrToUnix.from_arg_list,
205-
"TO_UTC_TIMESTAMP": lambda args: exp.FromTimeZone(
206-
this=exp.cast(seq_get(args, 0) or exp.Var(this=""), exp.DataType.Type.TIMESTAMP),
209+
"TO_UTC_TIMESTAMP": lambda args, dialect: exp.FromTimeZone(
210+
this=exp.cast(
211+
seq_get(args, 0) or exp.Var(this=""),
212+
exp.DataType.Type.TIMESTAMP,
213+
dialect=dialect,
214+
),
207215
zone=seq_get(args, 1),
208216
),
209217
"TRUNC": lambda args: exp.DateTrunc(unit=seq_get(args, 1), this=seq_get(args, 0)),

tests/dialects/test_databricks.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,6 @@ def test_databricks(self):
3232
self.validate_identity(
3333
"CREATE TABLE IF NOT EXISTS db.table (a TIMESTAMP, b BOOLEAN GENERATED ALWAYS AS (NOT a IS NULL)) USING DELTA"
3434
)
35-
self.validate_identity(
36-
"SELECT DATE_FORMAT(CAST(FROM_UTC_TIMESTAMP(foo, 'America/Los_Angeles') AS TIMESTAMP), 'yyyy-MM-dd HH:mm:ss') AS foo FROM t",
37-
"SELECT DATE_FORMAT(CAST(FROM_UTC_TIMESTAMP(CAST(foo AS TIMESTAMP), 'America/Los_Angeles') AS TIMESTAMP), 'yyyy-MM-dd HH:mm:ss') AS foo FROM t",
38-
)
3935
self.validate_identity(
4036
"SELECT * FROM sales UNPIVOT INCLUDE NULLS (sales FOR quarter IN (q1 AS `Jan-Mar`))"
4137
)
@@ -54,6 +50,10 @@ def test_databricks(self):
5450
self.validate_identity(
5551
"COPY INTO target FROM `s3://link` FILEFORMAT = AVRO VALIDATE = ALL FILES = ('file1', 'file2') FORMAT_OPTIONS ('opt1'='true', 'opt2'='test') COPY_OPTIONS ('mergeSchema'='true')"
5652
)
53+
self.validate_identity(
54+
"SELECT DATE_FORMAT(CAST(FROM_UTC_TIMESTAMP(foo, 'America/Los_Angeles') AS TIMESTAMP), 'yyyy-MM-dd HH:mm:ss') AS foo FROM t",
55+
"SELECT DATE_FORMAT(CAST(FROM_UTC_TIMESTAMP(CAST(foo AS TIMESTAMP), 'America/Los_Angeles') AS TIMESTAMP), 'yyyy-MM-dd HH:mm:ss') AS foo FROM t",
56+
)
5757
self.validate_identity(
5858
"DATE_DIFF(day, created_at, current_date())",
5959
"DATEDIFF(DAY, created_at, CURRENT_DATE)",
@@ -62,6 +62,10 @@ def test_databricks(self):
6262
r'SELECT r"\\foo.bar\"',
6363
r"SELECT '\\\\foo.bar\\'",
6464
)
65+
self.validate_identity(
66+
"FROM_UTC_TIMESTAMP(x::TIMESTAMP, tz)",
67+
"FROM_UTC_TIMESTAMP(CAST(x AS TIMESTAMP), tz)",
68+
)
6569

6670
self.validate_all(
6771
"CREATE TABLE foo (x INT GENERATED ALWAYS AS (YEAR(y)))",

tests/dialects/test_presto.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ def test_time(self):
406406
},
407407
)
408408
self.validate_all(
409-
"SELECT AT_TIMEZONE(CAST(CAST('2012-10-31 00:00' AS TIMESTAMP WITH TIME ZONE) AS TIMESTAMP), 'America/Sao_Paulo')",
409+
"SELECT AT_TIMEZONE(CAST('2012-10-31 00:00' AS TIMESTAMP WITH TIME ZONE), 'America/Sao_Paulo')",
410410
read={
411411
"spark": "SELECT FROM_UTC_TIMESTAMP(TIMESTAMP '2012-10-31 00:00', 'America/Sao_Paulo')",
412412
},

0 commit comments

Comments
 (0)