diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2023-06-16 09:41:18 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2023-06-16 09:41:18 +0000 |
commit | 67578a7602a5be7eb51f324086c8d49bcf8b7498 (patch) | |
tree | 0b7515c922d1c383cea24af5175379cfc8edfd15 /sqlglot/dialects/duckdb.py | |
parent | Releasing debian version 15.2.0-1. (diff) | |
download | sqlglot-67578a7602a5be7eb51f324086c8d49bcf8b7498.tar.xz sqlglot-67578a7602a5be7eb51f324086c8d49bcf8b7498.zip |
Merging upstream version 16.2.1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'sqlglot/dialects/duckdb.py')
-rw-r--r-- | sqlglot/dialects/duckdb.py | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/sqlglot/dialects/duckdb.py b/sqlglot/dialects/duckdb.py index f31da73..f0c1820 100644 --- a/sqlglot/dialects/duckdb.py +++ b/sqlglot/dialects/duckdb.py @@ -56,11 +56,7 @@ def _sort_array_reverse(args: t.List) -> exp.Expression: def _parse_date_diff(args: t.List) -> exp.Expression: - return exp.DateDiff( - this=seq_get(args, 2), - expression=seq_get(args, 1), - unit=seq_get(args, 0), - ) + return exp.DateDiff(this=seq_get(args, 2), expression=seq_get(args, 1), unit=seq_get(args, 0)) def _struct_sql(self: generator.Generator, expression: exp.Struct) -> str: @@ -90,7 +86,7 @@ def _regexp_extract_sql(self: generator.Generator, expression: exp.RegexpExtract class DuckDB(Dialect): - null_ordering = "nulls_are_last" + NULL_ORDERING = "nulls_are_last" class Tokenizer(tokens.Tokenizer): KEYWORDS = { @@ -118,6 +114,8 @@ class DuckDB(Dialect): } class Parser(parser.Parser): + CONCAT_NULL_OUTPUTS_STRING = True + FUNCTIONS = { **parser.Parser.FUNCTIONS, "ARRAY_LENGTH": exp.ArraySize.from_arg_list, @@ -127,10 +125,7 @@ class DuckDB(Dialect): "DATE_DIFF": _parse_date_diff, "EPOCH": exp.TimeToUnix.from_arg_list, "EPOCH_MS": lambda args: exp.UnixToTime( - this=exp.Div( - this=seq_get(args, 0), - expression=exp.Literal.number(1000), - ) + this=exp.Div(this=seq_get(args, 0), expression=exp.Literal.number(1000)) ), "LIST_REVERSE_SORT": _sort_array_reverse, "LIST_SORT": exp.SortArray.from_arg_list, @@ -191,8 +186,8 @@ class DuckDB(Dialect): "DATE_DIFF", f"'{e.args.get('unit', 'day')}'", e.expression, e.this ), exp.DateStrToDate: datestrtodate_sql, - exp.DateToDi: lambda self, e: f"CAST(STRFTIME({self.sql(e, 'this')}, {DuckDB.dateint_format}) AS INT)", - exp.DiToDate: lambda self, e: f"CAST(STRPTIME(CAST({self.sql(e, 'this')} AS TEXT), {DuckDB.dateint_format}) AS DATE)", + exp.DateToDi: lambda self, e: f"CAST(STRFTIME({self.sql(e, 'this')}, {DuckDB.DATEINT_FORMAT}) AS INT)", + exp.DiToDate: lambda self, e: f"CAST(STRPTIME(CAST({self.sql(e, 'this')} AS TEXT), {DuckDB.DATEINT_FORMAT}) AS DATE)", exp.Explode: rename_func("UNNEST"), exp.IntDiv: lambda self, e: self.binary(e, "//"), exp.JSONExtract: arrow_json_extract_sql, @@ -242,11 +237,27 @@ class DuckDB(Dialect): STAR_MAPPING = {**generator.Generator.STAR_MAPPING, "except": "EXCLUDE"} + UNWRAPPED_INTERVAL_VALUES = (exp.Column, exp.Literal, exp.Paren) + PROPERTIES_LOCATION = { **generator.Generator.PROPERTIES_LOCATION, exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, } + def interval_sql(self, expression: exp.Interval) -> str: + multiplier: t.Optional[int] = None + unit = expression.text("unit").lower() + + if unit.startswith("week"): + multiplier = 7 + if unit.startswith("quarter"): + multiplier = 90 + + if multiplier: + return f"({multiplier} * {super().interval_sql(exp.Interval(this=expression.this, unit=exp.var('day')))})" + + return super().interval_sql(expression) + def tablesample_sql( self, expression: exp.TableSample, seed_prefix: str = "SEED", sep: str = " AS " ) -> str: |