From fb7e79eb4c8d6e22b7324de4bb1ea9cd11b8da7c Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 7 Apr 2023 14:35:04 +0200 Subject: Merging upstream version 11.5.2. Signed-off-by: Daniel Baumann --- sqlglot/dialects/bigquery.py | 3 +++ sqlglot/dialects/clickhouse.py | 13 +++++++++---- sqlglot/dialects/hive.py | 4 ++++ sqlglot/dialects/mysql.py | 6 +++--- sqlglot/dialects/oracle.py | 2 -- sqlglot/dialects/redshift.py | 3 --- sqlglot/dialects/snowflake.py | 9 +++++++-- sqlglot/dialects/tsql.py | 2 ++ 8 files changed, 28 insertions(+), 14 deletions(-) (limited to 'sqlglot/dialects') diff --git a/sqlglot/dialects/bigquery.py b/sqlglot/dialects/bigquery.py index a3f9e6d..701377b 100644 --- a/sqlglot/dialects/bigquery.py +++ b/sqlglot/dialects/bigquery.py @@ -221,6 +221,9 @@ class BigQuery(Dialect): **generator.Generator.TRANSFORMS, # type: ignore **transforms.REMOVE_PRECISION_PARAMETERIZED_TYPES, # type: ignore exp.ArraySize: rename_func("ARRAY_LENGTH"), + exp.AtTimeZone: lambda self, e: self.func( + "TIMESTAMP", self.func("DATETIME", e.this, e.args.get("zone")) + ), exp.DateAdd: _date_add_sql("DATE", "ADD"), exp.DateSub: _date_add_sql("DATE", "SUB"), exp.DatetimeAdd: _date_add_sql("DATETIME", "ADD"), diff --git a/sqlglot/dialects/clickhouse.py b/sqlglot/dialects/clickhouse.py index 89e2296..b06462c 100644 --- a/sqlglot/dialects/clickhouse.py +++ b/sqlglot/dialects/clickhouse.py @@ -46,18 +46,22 @@ class ClickHouse(Dialect): time=seq_get(args, 1), decay=seq_get(params, 0), ), - "MAP": parse_var_map, - "HISTOGRAM": lambda params, args: exp.Histogram( - this=seq_get(args, 0), bins=seq_get(params, 0) - ), "GROUPUNIQARRAY": lambda params, args: exp.GroupUniqArray( this=seq_get(args, 0), size=seq_get(params, 0) ), + "HISTOGRAM": lambda params, args: exp.Histogram( + this=seq_get(args, 0), bins=seq_get(params, 0) + ), + "MAP": parse_var_map, + "MATCH": exp.RegexpLike.from_arg_list, "QUANTILE": lambda params, args: exp.Quantile(this=args, quantile=params), "QUANTILES": lambda params, args: exp.Quantiles(parameters=params, expressions=args), "QUANTILEIF": lambda params, args: exp.QuantileIf(parameters=params, expressions=args), } + FUNCTION_PARSERS = parser.Parser.FUNCTION_PARSERS.copy() + FUNCTION_PARSERS.pop("MATCH") + RANGE_PARSERS = { **parser.Parser.RANGE_PARSERS, TokenType.GLOBAL: lambda self, this: self._match(TokenType.IN) @@ -135,6 +139,7 @@ class ClickHouse(Dialect): exp.Quantile: lambda self, e: f"quantile{self._param_args_sql(e, 'quantile', 'this')}", exp.Quantiles: lambda self, e: f"quantiles{self._param_args_sql(e, 'parameters', 'expressions')}", exp.QuantileIf: lambda self, e: f"quantileIf{self._param_args_sql(e, 'parameters', 'expressions')}", + exp.RegexpLike: lambda self, e: f"match({self.format_args(e.this, e.expression)})", exp.StrPosition: lambda self, e: f"position({self.format_args(e.this, e.args.get('substr'), e.args.get('position'))})", exp.VarMap: lambda self, e: _lower_func(var_map_sql(self, e)), } diff --git a/sqlglot/dialects/hive.py b/sqlglot/dialects/hive.py index 68137ae..c39656e 100644 --- a/sqlglot/dialects/hive.py +++ b/sqlglot/dialects/hive.py @@ -261,6 +261,7 @@ class Hive(Dialect): "SIZE": exp.ArraySize.from_arg_list, "SPLIT": exp.RegexpSplit.from_arg_list, "TO_DATE": format_time_lambda(exp.TsOrDsToDate, "hive"), + "TO_JSON": exp.JSONFormat.from_arg_list, "UNIX_TIMESTAMP": format_time_lambda(exp.StrToUnix, "hive", True), "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), } @@ -281,6 +282,7 @@ class Hive(Dialect): exp.DataType.Type.DATETIME: "TIMESTAMP", exp.DataType.Type.VARBINARY: "BINARY", exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", + exp.DataType.Type.BIT: "BOOLEAN", } TRANSFORMS = { @@ -305,6 +307,7 @@ class Hive(Dialect): exp.Join: _unnest_to_explode_sql, exp.JSONExtract: rename_func("GET_JSON_OBJECT"), exp.JSONExtractScalar: rename_func("GET_JSON_OBJECT"), + exp.JSONFormat: rename_func("TO_JSON"), exp.Map: var_map_sql, exp.Max: max_or_greatest, exp.Min: min_or_least, @@ -343,6 +346,7 @@ class Hive(Dialect): exp.SerdeProperties: lambda self, e: self.properties(e, prefix="WITH SERDEPROPERTIES"), exp.NumberToStr: rename_func("FORMAT_NUMBER"), exp.LastDateOfMonth: rename_func("LAST_DAY"), + exp.National: lambda self, e: self.sql(e, "this"), } PROPERTIES_LOCATION = { diff --git a/sqlglot/dialects/mysql.py b/sqlglot/dialects/mysql.py index 5dfa811..d64efbf 100644 --- a/sqlglot/dialects/mysql.py +++ b/sqlglot/dialects/mysql.py @@ -429,7 +429,7 @@ class MySQL(Dialect): LIMIT_FETCH = "LIMIT" - def show_sql(self, expression): + def show_sql(self, expression: exp.Show) -> str: this = f" {expression.name}" full = " FULL" if expression.args.get("full") else "" global_ = " GLOBAL" if expression.args.get("global") else "" @@ -469,13 +469,13 @@ class MySQL(Dialect): return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}" - def _prefixed_sql(self, prefix, expression, arg): + def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: sql = self.sql(expression, arg) if not sql: return "" return f" {prefix} {sql}" - def _oldstyle_limit_sql(self, expression): + def _oldstyle_limit_sql(self, expression: exp.Show) -> str: limit = self.sql(expression, "limit") offset = self.sql(expression, "offset") if limit: diff --git a/sqlglot/dialects/oracle.py b/sqlglot/dialects/oracle.py index fad6c4a..3819b76 100644 --- a/sqlglot/dialects/oracle.py +++ b/sqlglot/dialects/oracle.py @@ -70,7 +70,6 @@ class Oracle(Dialect): class Parser(parser.Parser): FUNCTIONS = { **parser.Parser.FUNCTIONS, # type: ignore - "DECODE": exp.Matches.from_arg_list, "SQUARE": lambda args: exp.Pow(this=seq_get(args, 0), expression=exp.Literal.number(2)), } @@ -122,7 +121,6 @@ class Oracle(Dialect): **transforms.UNALIAS_GROUP, # type: ignore exp.Hint: lambda self, e: f" /*+ {self.expressions(e).strip()} */", exp.ILike: no_ilike_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.Substring: rename_func("SUBSTR"), diff --git a/sqlglot/dialects/redshift.py b/sqlglot/dialects/redshift.py index ebd5216..63c14f4 100644 --- a/sqlglot/dialects/redshift.py +++ b/sqlglot/dialects/redshift.py @@ -3,7 +3,6 @@ from __future__ import annotations import typing as t from sqlglot import exp, transforms -from sqlglot.dialects.dialect import rename_func from sqlglot.dialects.postgres import Postgres from sqlglot.helper import seq_get from sqlglot.tokens import TokenType @@ -30,7 +29,6 @@ class Redshift(Postgres): expression=seq_get(args, 1), unit=seq_get(args, 0), ), - "DECODE": exp.Matches.from_arg_list, "NVL": exp.Coalesce.from_arg_list, } @@ -89,7 +87,6 @@ class Redshift(Postgres): ), exp.DistKeyProperty: lambda self, e: f"DISTKEY({e.name})", exp.DistStyleProperty: lambda self, e: self.naked_property(e), - exp.Matches: rename_func("DECODE"), exp.SortKeyProperty: lambda self, e: f"{'COMPOUND ' if e.args['compound'] else ''}SORTKEY({self.format_args(*e.this)})", } diff --git a/sqlglot/dialects/snowflake.py b/sqlglot/dialects/snowflake.py index c50961c..34bc3bd 100644 --- a/sqlglot/dialects/snowflake.py +++ b/sqlglot/dialects/snowflake.py @@ -179,6 +179,10 @@ class Snowflake(Dialect): "ARRAYAGG": exp.ArrayAgg.from_arg_list, "ARRAY_CONSTRUCT": exp.Array.from_arg_list, "ARRAY_TO_STRING": exp.ArrayJoin.from_arg_list, + "CONVERT_TIMEZONE": lambda args: exp.AtTimeZone( + this=seq_get(args, 1), + zone=seq_get(args, 0), + ), "DATE_TRUNC": date_trunc_to_time, "DATEADD": lambda args: exp.DateAdd( this=seq_get(args, 2), @@ -190,7 +194,6 @@ class Snowflake(Dialect): expression=seq_get(args, 1), unit=seq_get(args, 0), ), - "DECODE": exp.Matches.from_arg_list, "DIV0": _div0_to_if, "IFF": exp.If.from_arg_list, "NULLIFZERO": _nullifzero_to_if, @@ -275,6 +278,9 @@ class Snowflake(Dialect): exp.Array: inline_array_sql, exp.ArrayConcat: rename_func("ARRAY_CAT"), exp.ArrayJoin: rename_func("ARRAY_TO_STRING"), + exp.AtTimeZone: lambda self, e: self.func( + "CONVERT_TIMEZONE", e.args.get("zone"), e.this + ), exp.DateAdd: lambda self, e: self.func("DATEADD", e.text("unit"), e.expression, e.this), exp.DateDiff: lambda self, e: self.func( "DATEDIFF", e.text("unit"), e.expression, e.this @@ -287,7 +293,6 @@ class Snowflake(Dialect): exp.LogicalAnd: rename_func("BOOLAND_AGG"), exp.VarMap: lambda self, e: var_map_sql(self, e, "OBJECT_CONSTRUCT"), exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}", - exp.Matches: rename_func("DECODE"), exp.StrPosition: lambda self, e: self.func( "POSITION", e.args.get("substr"), e.this, e.args.get("position") ), diff --git a/sqlglot/dialects/tsql.py b/sqlglot/dialects/tsql.py index 8e9b6c3..b8a227b 100644 --- a/sqlglot/dialects/tsql.py +++ b/sqlglot/dialects/tsql.py @@ -294,6 +294,8 @@ class TSQL(Dialect): "REPLICATE": exp.Repeat.from_arg_list, "SQUARE": lambda args: exp.Pow(this=seq_get(args, 0), expression=exp.Literal.number(2)), "SYSDATETIME": exp.CurrentTimestamp.from_arg_list, + "SUSER_NAME": exp.CurrentUser.from_arg_list, + "SUSER_SNAME": exp.CurrentUser.from_arg_list, } VAR_LENGTH_DATATYPES = { -- cgit v1.2.3