diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-02-20 09:38:01 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-02-20 09:38:01 +0000 |
commit | ccb96d1393ae2c16620ea8e8dc749d9642b94e9b (patch) | |
tree | d21a77d0cc7da73a84cd6d6ef8212602f5d762e8 /sqlglot/dialects/oracle.py | |
parent | Releasing debian version 21.1.1-1. (diff) | |
download | sqlglot-ccb96d1393ae2c16620ea8e8dc749d9642b94e9b.tar.xz sqlglot-ccb96d1393ae2c16620ea8e8dc749d9642b94e9b.zip |
Merging upstream version 21.1.2.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'sqlglot/dialects/oracle.py')
-rw-r--r-- | sqlglot/dialects/oracle.py | 62 |
1 files changed, 31 insertions, 31 deletions
diff --git a/sqlglot/dialects/oracle.py b/sqlglot/dialects/oracle.py index de693b9..fcb3aab 100644 --- a/sqlglot/dialects/oracle.py +++ b/sqlglot/dialects/oracle.py @@ -6,7 +6,7 @@ from sqlglot import exp, generator, parser, tokens, transforms from sqlglot.dialects.dialect import ( Dialect, NormalizationStrategy, - format_time_lambda, + build_formatted_time, no_ilike_sql, rename_func, trim_sql, @@ -18,26 +18,7 @@ if t.TYPE_CHECKING: from sqlglot._typing import E -def _parse_xml_table(self: Oracle.Parser) -> exp.XMLTable: - this = self._parse_string() - - passing = None - columns = None - - 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(self._parse_column) - - by_ref = self._match_text_seq("RETURNING", "SEQUENCE", "BY", "REF") - - if self._match_text_seq("COLUMNS"): - columns = self._parse_csv(self._parse_field_def) - - return self.expression(exp.XMLTable, this=this, passing=passing, columns=columns, by_ref=by_ref) - - -def to_char(args: t.List) -> exp.TimeToStr | exp.ToChar: +def _build_timetostr_or_tochar(args: t.List) -> exp.TimeToStr | exp.ToChar: this = seq_get(args, 0) if this and not this.type: @@ -45,7 +26,7 @@ def to_char(args: t.List) -> exp.TimeToStr | exp.ToChar: annotate_types(this) if this.is_type(*exp.DataType.TEMPORAL_TYPES): - return format_time_lambda(exp.TimeToStr, "oracle", default=True)(args) + return build_formatted_time(exp.TimeToStr, "oracle", default=True)(args) return exp.ToChar.from_arg_list(args) @@ -93,9 +74,9 @@ class Oracle(Dialect): FUNCTIONS = { **parser.Parser.FUNCTIONS, "SQUARE": lambda args: exp.Pow(this=seq_get(args, 0), expression=exp.Literal.number(2)), - "TO_CHAR": to_char, - "TO_TIMESTAMP": format_time_lambda(exp.StrToTime, "oracle"), - "TO_DATE": format_time_lambda(exp.StrToDate, "oracle"), + "TO_CHAR": _build_timetostr_or_tochar, + "TO_TIMESTAMP": build_formatted_time(exp.StrToTime, "oracle"), + "TO_DATE": build_formatted_time(exp.StrToDate, "oracle"), } FUNCTION_PARSERS: t.Dict[str, t.Callable] = { @@ -109,7 +90,7 @@ class Oracle(Dialect): this=self._parse_format_json(self._parse_bitwise()), order=self._parse_order(), ), - "XMLTABLE": _parse_xml_table, + "XMLTABLE": lambda self: self._parse_xml_table(), } QUERY_MODIFIER_PARSERS = { @@ -127,6 +108,26 @@ class Oracle(Dialect): # Reference: https://stackoverflow.com/a/336455 DISTINCT_TOKENS = {TokenType.DISTINCT, TokenType.UNIQUE} + def _parse_xml_table(self) -> exp.XMLTable: + this = self._parse_string() + + passing = None + columns = None + + 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(self._parse_column) + + by_ref = self._match_text_seq("RETURNING", "SEQUENCE", "BY", "REF") + + if self._match_text_seq("COLUMNS"): + columns = self._parse_csv(self._parse_field_def) + + return self.expression( + exp.XMLTable, this=this, passing=passing, columns=columns, by_ref=by_ref + ) + def _parse_json_array(self, expr_type: t.Type[E], **kwargs) -> E: return self.expression( expr_type, @@ -200,18 +201,17 @@ class Oracle(Dialect): transforms.eliminate_qualify, ] ), - exp.StrToTime: lambda self, - e: f"TO_TIMESTAMP({self.sql(e, 'this')}, {self.format_time(e)})", - exp.StrToDate: lambda self, e: f"TO_DATE({self.sql(e, 'this')}, {self.format_time(e)})", + exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)), + exp.StrToDate: lambda self, e: self.func("TO_DATE", e.this, self.format_time(e)), exp.Subquery: lambda self, e: self.subquery_sql(e, sep=" "), exp.Substring: rename_func("SUBSTR"), exp.Table: lambda self, e: self.table_sql(e, sep=" "), exp.TableSample: lambda self, e: self.tablesample_sql(e, sep=" "), - exp.TimeToStr: lambda self, e: f"TO_CHAR({self.sql(e, 'this')}, {self.format_time(e)})", + exp.TimeToStr: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)), 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)", + e: f"TO_DATE('1970-01-01', 'YYYY-MM-DD') + ({self.sql(e, 'this')} / 86400)", } PROPERTIES_LOCATION = { |