Skip to content

Commit 3016c85

Browse files
baruchoxmanclaude
andcommitted
fix(presto): transpile FROM_ISO8601_DATE to cast [CLAUDE]
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>
1 parent e3cd4a4 commit 3016c85

4 files changed

Lines changed: 18 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}
442446

sqlglot/generator.py

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

3741+
def fromiso8601date_sql(self, expression: exp.FromISO8601Date) -> str:
3742+
return self.sql(exp.cast(expression.this, exp.DType.DATE))
3743+
37413744
def add_sql(self, expression: exp.Add) -> str:
37423745
return self.binary(expression, "+")
37433746

sqlglot/generators/presto.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ class PrestoGenerator(generator.Generator):
308308
exp.Encode: lambda self, e: encode_decode_sql(self, e, "TO_UTF8"),
309309
exp.FileFormatProperty: lambda self, e: f"format={self.sql(exp.Literal.string(e.name))}",
310310
exp.First: _first_last_sql,
311+
exp.FromISO8601Date: rename_func("FROM_ISO8601_DATE"),
311312
exp.FromTimeZone: lambda self, e: (
312313
f"WITH_TIMEZONE({self.sql(e, 'this')}, {self.sql(e, 'zone')}) AT TIME ZONE 'UTC'"
313314
),

tests/dialects/test_presto.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,16 @@ def test_cast(self):
4040
"presto": "SELECT FROM_ISO8601_TIMESTAMP('2020-05-11T11:15:05')",
4141
},
4242
)
43+
self.validate_all(
44+
"SELECT FROM_ISO8601_DATE('2020-05-11')",
45+
write={
46+
"duckdb": "SELECT CAST('2020-05-11' AS DATE)",
47+
"presto": "SELECT FROM_ISO8601_DATE('2020-05-11')",
48+
"trino": "SELECT FROM_ISO8601_DATE('2020-05-11')",
49+
"snowflake": "SELECT CAST('2020-05-11' AS DATE)",
50+
"spark": "SELECT CAST('2020-05-11' AS DATE)",
51+
},
52+
)
4353
self.validate_all(
4454
"CAST(x AS INTERVAL YEAR TO MONTH)",
4555
write={

0 commit comments

Comments
 (0)