diff options
author | Daniel Baumann <mail@daniel-baumann.ch> | 2023-12-10 10:46:01 +0000 |
---|---|---|
committer | Daniel Baumann <mail@daniel-baumann.ch> | 2023-12-10 10:46:01 +0000 |
commit | 8fe30fd23dc37ec3516e530a86d1c4b604e71241 (patch) | |
tree | 6e2ebbf565b0351fd0f003f488a8339e771ad90c /sqlglot/dialects/oracle.py | |
parent | Releasing debian version 19.0.1-1. (diff) | |
download | sqlglot-8fe30fd23dc37ec3516e530a86d1c4b604e71241.tar.xz sqlglot-8fe30fd23dc37ec3516e530a86d1c4b604e71241.zip |
Merging upstream version 20.1.0.
Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
Diffstat (limited to 'sqlglot/dialects/oracle.py')
-rw-r--r-- | sqlglot/dialects/oracle.py | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/sqlglot/dialects/oracle.py b/sqlglot/dialects/oracle.py index 6bdd8d6..51dbd53 100644 --- a/sqlglot/dialects/oracle.py +++ b/sqlglot/dialects/oracle.py @@ -3,7 +3,14 @@ from __future__ import annotations import typing as t from sqlglot import exp, generator, parser, tokens, transforms -from sqlglot.dialects.dialect import Dialect, no_ilike_sql, rename_func, trim_sql +from sqlglot.dialects.dialect import ( + Dialect, + NormalizationStrategy, + format_time_lambda, + no_ilike_sql, + rename_func, + trim_sql, +) from sqlglot.helper import seq_get from sqlglot.tokens import TokenType @@ -30,12 +37,25 @@ def _parse_xml_table(self: Oracle.Parser) -> exp.XMLTable: 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: + this = seq_get(args, 0) + + if this and not this.type: + from sqlglot.optimizer.annotate_types import annotate_types + + annotate_types(this) + if this.is_type(*exp.DataType.TEMPORAL_TYPES): + return format_time_lambda(exp.TimeToStr, "oracle", default=True)(args) + + return exp.ToChar.from_arg_list(args) + + class Oracle(Dialect): ALIAS_POST_TABLESAMPLE = True LOCKING_READS_SUPPORTED = True # See section 8: https://docs.oracle.com/cd/A97630_01/server.920/a96540/sql_elements9a.htm - RESOLVES_IDENTIFIERS_AS_UPPERCASE = True + NORMALIZATION_STRATEGY = NormalizationStrategy.UPPERCASE # https://docs.oracle.com/database/121/SQLRF/sql_elements004.htm#SQLRF00212 # https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes @@ -64,11 +84,13 @@ class Oracle(Dialect): } class Parser(parser.Parser): + ALTER_TABLE_ADD_REQUIRED_FOR_EACH_COLUMN = False WINDOW_BEFORE_PAREN_TOKENS = {TokenType.OVER, TokenType.KEEP} FUNCTIONS = { **parser.Parser.FUNCTIONS, "SQUARE": lambda args: exp.Pow(this=seq_get(args, 0), expression=exp.Literal.number(2)), + "TO_CHAR": to_char, } FUNCTION_PARSERS: t.Dict[str, t.Callable] = { @@ -130,6 +152,7 @@ class Oracle(Dialect): TABLE_HINTS = False COLUMN_JOIN_MARKS_SUPPORTED = True DATA_TYPE_SPECIFIERS_ALLOWED = True + ALTER_TABLE_INCLUDE_COLUMN_KEYWORD = False LIMIT_FETCH = "FETCH" @@ -192,6 +215,12 @@ class Oracle(Dialect): ) return f"XMLTABLE({self.sep('')}{self.indent(this + passing + by_ref + columns)}{self.seg(')', sep='')}" + def add_column_sql(self, expression: exp.AlterTable) -> str: + actions = self.expressions(expression, key="actions", flat=True) + if len(expression.args.get("actions", [])) > 1: + return f"ADD ({actions})" + return f"ADD {actions}" + class Tokenizer(tokens.Tokenizer): VAR_SINGLE_TOKENS = {"@", "$", "#"} |