Skip to content

Commit 43a3d9f

Browse files
baruchoxmanclaudegeorgesittas
authored
fix(presto): transpile FROM_ISO8601_DATE to cast [CLAUDE] (#7778)
FROM_ISO8601_DATE is a Presto/Trino function parsing an ISO 8601 string into a date. It wasn't recognized as a dedicated expression, so it parsed as Anonymous and passed through unchanged to all dialects. Add a FromISO8601Date expression, transpile it to CAST(... AS DATE) in the base Generator, and keep the native function for Presto/Trino. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-authored-by: Jo <46752250+georgesittas@users.noreply.github.com>
1 parent 7db4d25 commit 43a3d9f

4 files changed

Lines changed: 20 additions & 0 deletions

File tree

sqlglot/expressions/temporal.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,10 @@ class FromISO8601Timestamp(Expression, Func):
437437
_sql_names = ["FROM_ISO8601_TIMESTAMP"]
438438

439439

440+
class FromISO8601Date(Expression, Func):
441+
_sql_names = ["FROM_ISO8601_DATE"]
442+
443+
440444
class ParseDatetime(Expression, Func):
441445
arg_types = {"this": True, "format": False, "zone": False, "default_year": False}
442446

sqlglot/generator.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3991,6 +3991,9 @@ def fromtimezone_sql(self, expression: exp.FromTimeZone) -> str:
39913991
zone = self.sql(expression, "zone")
39923992
return f"{this} AT TIME ZONE {zone} AT TIME ZONE 'UTC'"
39933993

3994+
def fromiso8601date_sql(self, expression: exp.FromISO8601Date) -> str:
3995+
return self.sql(exp.cast(expression.this, exp.DType.DATE))
3996+
39943997
def fromiso8601timestamp_sql(self, expression: exp.FromISO8601Timestamp) -> str:
39953998
return self.sql(exp.cast(expression.this, exp.DType.TIMESTAMPTZ))
39963999

sqlglot/generators/presto.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ class PrestoGenerator(generator.Generator):
304304
exp.Encode: lambda self, e: encode_decode_sql(self, e, "TO_UTF8"),
305305
exp.FileFormatProperty: lambda self, e: f"format={self.sql(exp.Literal.string(e.name))}",
306306
exp.First: _first_last_sql,
307+
exp.FromISO8601Date: rename_func("FROM_ISO8601_DATE"),
307308
exp.FromISO8601Timestamp: rename_func("FROM_ISO8601_TIMESTAMP"),
308309
exp.FromTimeZone: lambda self, e: (
309310
f"WITH_TIMEZONE({self.sql(e, 'this')}, {self.sql(e, 'zone')}) AT TIME ZONE 'UTC'"

tests/dialects/test_presto.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,18 @@ def test_cast(self):
4545
"bigquery": "SELECT CAST('2020-05-11T11:15:05' AS TIMESTAMP)",
4646
},
4747
)
48+
self.validate_all(
49+
"SELECT FROM_ISO8601_DATE('2020-05-11')",
50+
write={
51+
"duckdb": "SELECT CAST('2020-05-11' AS DATE)",
52+
"presto": "SELECT FROM_ISO8601_DATE('2020-05-11')",
53+
"trino": "SELECT FROM_ISO8601_DATE('2020-05-11')",
54+
"snowflake": "SELECT CAST('2020-05-11' AS DATE)",
55+
"spark": "SELECT CAST('2020-05-11' AS DATE)",
56+
"databricks": "SELECT CAST('2020-05-11' AS DATE)",
57+
"bigquery": "SELECT CAST('2020-05-11' AS DATE)",
58+
},
59+
)
4860
self.validate_all(
4961
"CAST(x AS INTERVAL YEAR TO MONTH)",
5062
write={

0 commit comments

Comments
 (0)