summaryrefslogtreecommitdiffstats
path: root/sqlglot/dialects/oracle.py
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2022-09-15 16:46:17 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2022-09-15 16:46:17 +0000
commit28cc22419e32a65fea2d1678400265b8cabc3aff (patch)
treeff9ac1991fd48490b21ef6aa9015a347a165e2d9 /sqlglot/dialects/oracle.py
parentInitial commit. (diff)
downloadsqlglot-28cc22419e32a65fea2d1678400265b8cabc3aff.tar.xz
sqlglot-28cc22419e32a65fea2d1678400265b8cabc3aff.zip
Adding upstream version 6.0.4.upstream/6.0.4
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'sqlglot/dialects/oracle.py')
-rw-r--r--sqlglot/dialects/oracle.py63
1 files changed, 63 insertions, 0 deletions
diff --git a/sqlglot/dialects/oracle.py b/sqlglot/dialects/oracle.py
new file mode 100644
index 0000000..9c8b6f2
--- /dev/null
+++ b/sqlglot/dialects/oracle.py
@@ -0,0 +1,63 @@
+from sqlglot import exp, transforms
+from sqlglot.dialects.dialect import Dialect, no_ilike_sql
+from sqlglot.generator import Generator
+from sqlglot.helper import csv
+from sqlglot.tokens import Tokenizer, TokenType
+
+
+def _limit_sql(self, expression):
+ return self.fetch_sql(exp.Fetch(direction="FIRST", count=expression.expression))
+
+
+class Oracle(Dialect):
+ class Generator(Generator):
+ TYPE_MAPPING = {
+ **Generator.TYPE_MAPPING,
+ exp.DataType.Type.TINYINT: "NUMBER",
+ exp.DataType.Type.SMALLINT: "NUMBER",
+ exp.DataType.Type.INT: "NUMBER",
+ exp.DataType.Type.BIGINT: "NUMBER",
+ exp.DataType.Type.DECIMAL: "NUMBER",
+ exp.DataType.Type.DOUBLE: "DOUBLE PRECISION",
+ exp.DataType.Type.VARCHAR: "VARCHAR2",
+ exp.DataType.Type.NVARCHAR: "NVARCHAR2",
+ exp.DataType.Type.TEXT: "CLOB",
+ exp.DataType.Type.BINARY: "BLOB",
+ }
+
+ TRANSFORMS = {
+ **Generator.TRANSFORMS,
+ **transforms.UNALIAS_GROUP,
+ exp.ILike: no_ilike_sql,
+ exp.Limit: _limit_sql,
+ }
+
+ def query_modifiers(self, expression, *sqls):
+ return csv(
+ *sqls,
+ *[self.sql(sql) for sql in expression.args.get("laterals", [])],
+ *[self.sql(sql) for sql in expression.args.get("joins", [])],
+ self.sql(expression, "where"),
+ self.sql(expression, "group"),
+ self.sql(expression, "having"),
+ self.sql(expression, "qualify"),
+ self.sql(expression, "window"),
+ self.sql(expression, "distribute"),
+ self.sql(expression, "sort"),
+ self.sql(expression, "cluster"),
+ self.sql(expression, "order"),
+ self.sql(expression, "offset"), # offset before limit in oracle
+ self.sql(expression, "limit"),
+ sep="",
+ )
+
+ def offset_sql(self, expression):
+ return f"{super().offset_sql(expression)} ROWS"
+
+ class Tokenizer(Tokenizer):
+ KEYWORDS = {
+ **Tokenizer.KEYWORDS,
+ "TOP": TokenType.TOP,
+ "VARCHAR2": TokenType.VARCHAR,
+ "NVARCHAR2": TokenType.NVARCHAR,
+ }