summaryrefslogtreecommitdiffstats
path: root/sqlglot/dialects/teradata.py
diff options
context:
space:
mode:
Diffstat (limited to 'sqlglot/dialects/teradata.py')
-rw-r--r--sqlglot/dialects/teradata.py45
1 files changed, 44 insertions, 1 deletions
diff --git a/sqlglot/dialects/teradata.py b/sqlglot/dialects/teradata.py
index 123da04..e3eec71 100644
--- a/sqlglot/dialects/teradata.py
+++ b/sqlglot/dialects/teradata.py
@@ -1,11 +1,33 @@
from __future__ import annotations
-from sqlglot import exp, generator, parser
+from sqlglot import exp, generator, parser, tokens
from sqlglot.dialects.dialect import Dialect
from sqlglot.tokens import TokenType
class Teradata(Dialect):
+ class Tokenizer(tokens.Tokenizer):
+ # https://docs.teradata.com/r/Teradata-Database-SQL-Functions-Operators-Expressions-and-Predicates/March-2017/Comparison-Operators-and-Functions/Comparison-Operators/ANSI-Compliance
+ KEYWORDS = {
+ **tokens.Tokenizer.KEYWORDS,
+ "BYTEINT": TokenType.SMALLINT,
+ "SEL": TokenType.SELECT,
+ "INS": TokenType.INSERT,
+ "MOD": TokenType.MOD,
+ "LT": TokenType.LT,
+ "LE": TokenType.LTE,
+ "GT": TokenType.GT,
+ "GE": TokenType.GTE,
+ "^=": TokenType.NEQ,
+ "NE": TokenType.NEQ,
+ "NOT=": TokenType.NEQ,
+ "ST_GEOMETRY": TokenType.GEOMETRY,
+ }
+
+ # teradata does not support % for modulus
+ SINGLE_TOKENS = {**tokens.Tokenizer.SINGLE_TOKENS}
+ SINGLE_TOKENS.pop("%")
+
class Parser(parser.Parser):
CHARSET_TRANSLATORS = {
"GRAPHIC_TO_KANJISJIS",
@@ -42,6 +64,14 @@ class Teradata(Dialect):
"UNICODE_TO_UNICODE_NFKD",
}
+ FUNC_TOKENS = {*parser.Parser.FUNC_TOKENS}
+ FUNC_TOKENS.remove(TokenType.REPLACE)
+
+ STATEMENT_PARSERS = {
+ **parser.Parser.STATEMENT_PARSERS, # type: ignore
+ TokenType.REPLACE: lambda self: self._parse_create(),
+ }
+
FUNCTION_PARSERS = {
**parser.Parser.FUNCTION_PARSERS, # type: ignore
"TRANSLATE": lambda self: self._parse_translate(self.STRICT_CAST),
@@ -76,6 +106,11 @@ class Teradata(Dialect):
)
class Generator(generator.Generator):
+ TYPE_MAPPING = {
+ **generator.Generator.TYPE_MAPPING, # type: ignore
+ exp.DataType.Type.GEOMETRY: "ST_GEOMETRY",
+ }
+
PROPERTIES_LOCATION = {
**generator.Generator.PROPERTIES_LOCATION, # type: ignore
exp.PartitionedByProperty: exp.Properties.Location.POST_INDEX,
@@ -93,3 +128,11 @@ class Teradata(Dialect):
where_sql = self.sql(expression, "where")
sql = f"UPDATE {this}{from_sql} SET {set_sql}{where_sql}"
return self.prepend_ctes(expression, sql)
+
+ def mod_sql(self, expression: exp.Mod) -> str:
+ return self.binary(expression, "MOD")
+
+ def datatype_sql(self, expression: exp.DataType) -> str:
+ type_sql = super().datatype_sql(expression)
+ prefix_sql = expression.args.get("prefix")
+ return f"SYSUDTLIB.{type_sql}" if prefix_sql else type_sql