From 67c28dbe67209effad83d93b850caba5ee1e20e3 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 3 May 2023 11:12:28 +0200 Subject: Merging upstream version 11.7.1. Signed-off-by: Daniel Baumann --- sqlglot/dialects/oracle.py | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) (limited to 'sqlglot/dialects/oracle.py') diff --git a/sqlglot/dialects/oracle.py b/sqlglot/dialects/oracle.py index 3819b76..9ccd02e 100644 --- a/sqlglot/dialects/oracle.py +++ b/sqlglot/dialects/oracle.py @@ -7,11 +7,6 @@ from sqlglot.dialects.dialect import Dialect, no_ilike_sql, rename_func, trim_sq from sqlglot.helper import seq_get from sqlglot.tokens import TokenType -PASSING_TABLE_ALIAS_TOKENS = parser.Parser.TABLE_ALIAS_TOKENS - { - TokenType.COLUMN, - TokenType.RETURNING, -} - def _parse_xml_table(self) -> exp.XMLTable: this = self._parse_string() @@ -22,9 +17,7 @@ def _parse_xml_table(self) -> exp.XMLTable: if self._match_text_seq("PASSING"): # The BY VALUE keywords are optional and are provided for semantic clarity self._match_text_seq("BY", "VALUE") - passing = self._parse_csv( - lambda: self._parse_table(alias_tokens=PASSING_TABLE_ALIAS_TOKENS) - ) + passing = self._parse_csv(self._parse_column) by_ref = self._match_text_seq("RETURNING", "SEQUENCE", "BY", "REF") @@ -68,6 +61,8 @@ class Oracle(Dialect): } class Parser(parser.Parser): + WINDOW_BEFORE_PAREN_TOKENS = {TokenType.OVER, TokenType.KEEP} + FUNCTIONS = { **parser.Parser.FUNCTIONS, # type: ignore "SQUARE": lambda args: exp.Pow(this=seq_get(args, 0), expression=exp.Literal.number(2)), @@ -78,6 +73,12 @@ class Oracle(Dialect): "XMLTABLE": _parse_xml_table, } + TYPE_LITERAL_PARSERS = { + exp.DataType.Type.DATE: lambda self, this, _: self.expression( + exp.DateStrToDate, this=this + ) + } + def _parse_column(self) -> t.Optional[exp.Expression]: column = super()._parse_column() if column: @@ -100,6 +101,8 @@ class Oracle(Dialect): class Generator(generator.Generator): LOCKING_READS_SUPPORTED = True + JOIN_HINTS = False + TABLE_HINTS = False TYPE_MAPPING = { **generator.Generator.TYPE_MAPPING, # type: ignore @@ -119,6 +122,9 @@ class Oracle(Dialect): TRANSFORMS = { **generator.Generator.TRANSFORMS, # type: ignore **transforms.UNALIAS_GROUP, # type: ignore + exp.DateStrToDate: lambda self, e: self.func( + "TO_DATE", e.this, exp.Literal.string("YYYY-MM-DD") + ), exp.Hint: lambda self, e: f" /*+ {self.expressions(e).strip()} */", exp.ILike: no_ilike_sql, exp.StrToTime: lambda self, e: f"TO_TIMESTAMP({self.sql(e, 'this')}, {self.format_time(e)})", @@ -129,6 +135,12 @@ class Oracle(Dialect): exp.ToChar: lambda self, e: self.function_fallback_sql(e), exp.Trim: trim_sql, exp.UnixToTime: lambda self, e: f"TO_DATE('1970-01-01','YYYY-MM-DD') + ({self.sql(e, 'this')} / 86400)", + exp.IfNull: rename_func("NVL"), + } + + PROPERTIES_LOCATION = { + **generator.Generator.PROPERTIES_LOCATION, # type: ignore + exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, } LIMIT_FETCH = "FETCH" @@ -142,9 +154,9 @@ class Oracle(Dialect): def xmltable_sql(self, expression: exp.XMLTable) -> str: this = self.sql(expression, "this") - passing = self.expressions(expression, "passing") + passing = self.expressions(expression, key="passing") passing = f"{self.sep()}PASSING{self.seg(passing)}" if passing else "" - columns = self.expressions(expression, "columns") + columns = self.expressions(expression, key="columns") columns = f"{self.sep()}COLUMNS{self.seg(columns)}" if columns else "" by_ref = ( f"{self.sep()}RETURNING SEQUENCE BY REF" if expression.args.get("by_ref") else "" -- cgit v1.2.3