diff options
Diffstat (limited to '')
-rw-r--r-- | sqlglot/dialects/redshift.py | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/sqlglot/dialects/redshift.py b/sqlglot/dialects/redshift.py index 63c14f4..a9c4f62 100644 --- a/sqlglot/dialects/redshift.py +++ b/sqlglot/dialects/redshift.py @@ -8,6 +8,10 @@ from sqlglot.helper import seq_get from sqlglot.tokens import TokenType +def _json_sql(self, e) -> str: + return f'{self.sql(e, "this")}."{e.expression.name}"' + + class Redshift(Postgres): time_format = "'YYYY-MM-DD HH:MI:SS'" time_mapping = { @@ -56,6 +60,7 @@ class Redshift(Postgres): "GEOGRAPHY": TokenType.GEOGRAPHY, "HLLSKETCH": TokenType.HLLSKETCH, "SUPER": TokenType.SUPER, + "SYSDATE": TokenType.CURRENT_TIMESTAMP, "TIME": TokenType.TIMESTAMP, "TIMETZ": TokenType.TIMESTAMPTZ, "TOP": TokenType.TOP, @@ -63,7 +68,14 @@ class Redshift(Postgres): "VARBYTE": TokenType.VARBINARY, } + # Redshift allows # to appear as a table identifier prefix + SINGLE_TOKENS = Postgres.Tokenizer.SINGLE_TOKENS.copy() + SINGLE_TOKENS.pop("#") + class Generator(Postgres.Generator): + LOCKING_READS_SUPPORTED = False + SINGLE_STRING_INTERVAL = True + TYPE_MAPPING = { **Postgres.Generator.TYPE_MAPPING, # type: ignore exp.DataType.Type.BINARY: "VARBYTE", @@ -79,6 +91,7 @@ class Redshift(Postgres): TRANSFORMS = { **Postgres.Generator.TRANSFORMS, # type: ignore **transforms.ELIMINATE_DISTINCT_ON, # type: ignore + 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 ), @@ -87,12 +100,16 @@ class Redshift(Postgres): ), exp.DistKeyProperty: lambda self, e: f"DISTKEY({e.name})", exp.DistStyleProperty: lambda self, e: self.naked_property(e), + exp.JSONExtract: _json_sql, + exp.JSONExtractScalar: _json_sql, exp.SortKeyProperty: lambda self, e: f"{'COMPOUND ' if e.args['compound'] else ''}SORTKEY({self.format_args(*e.this)})", } # Redshift uses the POW | POWER (expr1, expr2) syntax instead of expr1 ^ expr2 (postgres) TRANSFORMS.pop(exp.Pow) + RESERVED_KEYWORDS = {*Postgres.Generator.RESERVED_KEYWORDS, "snapshot"} + def values_sql(self, expression: exp.Values) -> str: """ Converts `VALUES...` expression into a series of unions. |