summaryrefslogtreecommitdiffstats
path: root/sqlglot/dialects/redshift.py
diff options
context:
space:
mode:
authorDaniel Baumann <mail@daniel-baumann.ch>2023-12-10 10:46:01 +0000
committerDaniel Baumann <mail@daniel-baumann.ch>2023-12-10 10:46:01 +0000
commit8fe30fd23dc37ec3516e530a86d1c4b604e71241 (patch)
tree6e2ebbf565b0351fd0f003f488a8339e771ad90c /sqlglot/dialects/redshift.py
parentReleasing debian version 19.0.1-1. (diff)
downloadsqlglot-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/redshift.py')
-rw-r--r--sqlglot/dialects/redshift.py50
1 files changed, 24 insertions, 26 deletions
diff --git a/sqlglot/dialects/redshift.py b/sqlglot/dialects/redshift.py
index 6c7ba35..7382e7c 100644
--- a/sqlglot/dialects/redshift.py
+++ b/sqlglot/dialects/redshift.py
@@ -4,8 +4,10 @@ import typing as t
from sqlglot import exp, transforms
from sqlglot.dialects.dialect import (
+ NormalizationStrategy,
concat_to_dpipe_sql,
concat_ws_to_dpipe_sql,
+ date_delta_sql,
generatedasidentitycolumnconstraint_sql,
rename_func,
ts_or_ds_to_date_sql,
@@ -14,30 +16,28 @@ from sqlglot.dialects.postgres import Postgres
from sqlglot.helper import seq_get
from sqlglot.tokens import TokenType
+if t.TYPE_CHECKING:
+ from sqlglot._typing import E
+
def _json_sql(self: Redshift.Generator, expression: exp.JSONExtract | exp.JSONExtractScalar) -> str:
return f'{self.sql(expression, "this")}."{expression.expression.name}"'
-def _parse_date_add(args: t.List) -> exp.DateAdd:
- return exp.DateAdd(
- this=exp.TsOrDsToDate(this=seq_get(args, 2)),
- expression=seq_get(args, 1),
- unit=seq_get(args, 0),
- )
+def _parse_date_delta(expr_type: t.Type[E]) -> t.Callable[[t.List], E]:
+ def _parse_delta(args: t.List) -> E:
+ expr = expr_type(this=seq_get(args, 2), expression=seq_get(args, 1), unit=seq_get(args, 0))
+ if expr_type is exp.TsOrDsAdd:
+ expr.set("return_type", exp.DataType.build("TIMESTAMP"))
+ return expr
-def _parse_datediff(args: t.List) -> exp.DateDiff:
- return exp.DateDiff(
- this=exp.TsOrDsToDate(this=seq_get(args, 2)),
- expression=exp.TsOrDsToDate(this=seq_get(args, 1)),
- unit=seq_get(args, 0),
- )
+ return _parse_delta
class Redshift(Postgres):
# https://docs.aws.amazon.com/redshift/latest/dg/r_names.html
- RESOLVES_IDENTIFIERS_AS_UPPERCASE = None
+ NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE
SUPPORTS_USER_DEFINED_TYPES = False
INDEX_OFFSET = 0
@@ -52,15 +52,16 @@ class Redshift(Postgres):
class Parser(Postgres.Parser):
FUNCTIONS = {
**Postgres.Parser.FUNCTIONS,
- "ADD_MONTHS": lambda args: exp.DateAdd(
- this=exp.TsOrDsToDate(this=seq_get(args, 0)),
+ "ADD_MONTHS": lambda args: exp.TsOrDsAdd(
+ this=seq_get(args, 0),
expression=seq_get(args, 1),
unit=exp.var("month"),
+ return_type=exp.DataType.build("TIMESTAMP"),
),
- "DATEADD": _parse_date_add,
- "DATE_ADD": _parse_date_add,
- "DATEDIFF": _parse_datediff,
- "DATE_DIFF": _parse_datediff,
+ "DATEADD": _parse_date_delta(exp.TsOrDsAdd),
+ "DATE_ADD": _parse_date_delta(exp.TsOrDsAdd),
+ "DATEDIFF": _parse_date_delta(exp.TsOrDsDiff),
+ "DATE_DIFF": _parse_date_delta(exp.TsOrDsDiff),
"LISTAGG": exp.GroupConcat.from_arg_list,
"STRTOL": exp.FromBase.from_arg_list,
}
@@ -169,12 +170,8 @@ class Redshift(Postgres):
exp.ConcatWs: concat_ws_to_dpipe_sql,
exp.ApproxDistinct: lambda self, e: f"APPROXIMATE COUNT(DISTINCT {self.sql(e, 'this')})",
exp.CurrentTimestamp: lambda self, e: "SYSDATE",
- exp.DateAdd: lambda self, e: self.func(
- "DATEADD", exp.var(e.text("unit") or "day"), e.expression, e.this
- ),
- exp.DateDiff: lambda self, e: self.func(
- "DATEDIFF", exp.var(e.text("unit") or "day"), e.expression, e.this
- ),
+ exp.DateAdd: date_delta_sql("DATEADD"),
+ exp.DateDiff: date_delta_sql("DATEDIFF"),
exp.DistKeyProperty: lambda self, e: f"DISTKEY({e.name})",
exp.DistStyleProperty: lambda self, e: self.naked_property(e),
exp.FromBase: rename_func("STRTOL"),
@@ -183,11 +180,12 @@ class Redshift(Postgres):
exp.JSONExtractScalar: _json_sql,
exp.GroupConcat: rename_func("LISTAGG"),
exp.ParseJSON: rename_func("JSON_PARSE"),
- exp.SafeConcat: concat_to_dpipe_sql,
exp.Select: transforms.preprocess(
[transforms.eliminate_distinct_on, transforms.eliminate_semi_and_anti_joins]
),
exp.SortKeyProperty: lambda self, e: f"{'COMPOUND ' if e.args['compound'] else ''}SORTKEY({self.format_args(*e.this)})",
+ exp.TsOrDsAdd: date_delta_sql("DATEADD"),
+ exp.TsOrDsDiff: date_delta_sql("DATEDIFF"),
exp.TsOrDsToDate: ts_or_ds_to_date_sql("redshift"),
}