diff options
Diffstat (limited to 'sqlglot/dialects/oracle.py')
-rw-r--r-- | sqlglot/dialects/oracle.py | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/sqlglot/dialects/oracle.py b/sqlglot/dialects/oracle.py index 74baa8a..795bbeb 100644 --- a/sqlglot/dialects/oracle.py +++ b/sqlglot/dialects/oracle.py @@ -82,8 +82,17 @@ class Oracle(Dialect): "XMLTABLE": _parse_xml_table, } + INTEGER_DIVISION = False + + def _parse_column(self) -> t.Optional[exp.Expression]: + column = super()._parse_column() + if column: + column.set("join_mark", self._match(TokenType.JOIN_MARKER)) + return column + class Generator(generator.Generator): LOCKING_READS_SUPPORTED = True + INTEGER_DIVISION = False TYPE_MAPPING = { **generator.Generator.TYPE_MAPPING, # type: ignore @@ -108,6 +117,8 @@ class Oracle(Dialect): exp.Trim: trim_sql, exp.Matches: rename_func("DECODE"), exp.StrToTime: lambda self, e: f"TO_TIMESTAMP({self.sql(e, 'this')}, {self.format_time(e)})", + exp.Subquery: lambda self, e: self.subquery_sql(e, sep=" "), + exp.Table: lambda self, e: self.table_sql(e, sep=" "), exp.TimeToStr: lambda self, e: f"TO_CHAR({self.sql(e, 'this')}, {self.format_time(e)})", exp.UnixToTime: lambda self, e: f"TO_DATE('1970-01-01','YYYY-MM-DD') + ({self.sql(e, 'this')} / 86400)", exp.Substring: rename_func("SUBSTR"), @@ -139,8 +150,9 @@ class Oracle(Dialect): def offset_sql(self, expression: exp.Offset) -> str: return f"{super().offset_sql(expression)} ROWS" - def table_sql(self, expression: exp.Table, sep: str = " ") -> str: - return super().table_sql(expression, sep=sep) + def column_sql(self, expression: exp.Column) -> str: + column = super().column_sql(expression) + return f"{column} (+)" if expression.args.get("join_mark") else column def xmltable_sql(self, expression: exp.XMLTable) -> str: this = self.sql(expression, "this") @@ -156,6 +168,7 @@ class Oracle(Dialect): class Tokenizer(tokens.Tokenizer): KEYWORDS = { **tokens.Tokenizer.KEYWORDS, + "(+)": TokenType.JOIN_MARKER, "COLUMNS": TokenType.COLUMN, "MATCH_RECOGNIZE": TokenType.MATCH_RECOGNIZE, "MINUS": TokenType.EXCEPT, |