diff --git a/sqlglot/dialects/teradata.py b/sqlglot/dialects/teradata.py index e8162c2e84..7e1de1cac8 100644 --- a/sqlglot/dialects/teradata.py +++ b/sqlglot/dialects/teradata.py @@ -112,6 +112,8 @@ class Parser(parser.Parser): FUNCTION_PARSERS = { **parser.Parser.FUNCTION_PARSERS, + # https://docs.teradata.com/r/SQL-Functions-Operators-Expressions-and-Predicates/June-2017/Data-Type-Conversions/TRYCAST + "TRYCAST": parser.Parser.FUNCTION_PARSERS["TRY_CAST"], "RANGE_N": lambda self: self._parse_rangen(), "TRANSLATE": lambda self: self._parse_translate(self.STRICT_CAST), } @@ -192,6 +194,9 @@ def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> return super().cast_sql(expression, safe_prefix=safe_prefix) + def trycast_sql(self, expression: exp.TryCast) -> str: + return self.cast_sql(expression, safe_prefix="TRY") + def tablesample_sql( self, expression: exp.TableSample, seed_prefix: str = "SEED", sep=" AS " ) -> str: diff --git a/tests/dialects/test_teradata.py b/tests/dialects/test_teradata.py index 14703c4e74..32ddcedb13 100644 --- a/tests/dialects/test_teradata.py +++ b/tests/dialects/test_teradata.py @@ -191,3 +191,14 @@ def test_cast(self): }, ) self.validate_identity("CAST('1992-01' AS FORMAT 'YYYY-DD')") + + self.validate_all( + "TRYCAST('-2.5' AS DECIMAL(5, 2))", + read={ + "snowflake": "TRY_CAST('-2.5' AS DECIMAL(5, 2))", + }, + write={ + "snowflake": "TRY_CAST('-2.5' AS DECIMAL(5, 2))", + "teradata": "TRYCAST('-2.5' AS DECIMAL(5, 2))", + }, + )