Skip to content

Commit b8bf13e

Browse files
fix(redshift): support OBJECT_TRANSFORM function (#7601)
* added parser support for OBJECT_TRANSFORM * add OBJECT_TRANSFORM tests * return formatting tweak
1 parent 7408448 commit b8bf13e

4 files changed

Lines changed: 28 additions & 1 deletion

File tree

sqlglot-integration-tests

sqlglot/expressions/functions.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,10 @@ class Nullif(Expression, Func):
148148
arg_types = {"this": True, "expression": True}
149149

150150

151+
class ObjectTransform(Expression, Func):
152+
arg_types = {"this": True, "keep": False, "set_": False}
153+
154+
151155
class Nvl2(Expression, Func):
152156
arg_types = {"this": True, "true": True, "false": False}
153157

sqlglot/generators/redshift.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,14 @@ class RedshiftGenerator(PostgresGenerator):
270270
"without",
271271
}
272272

273+
def objecttransform_sql(self, expression: exp.ObjectTransform) -> str:
274+
this = self.sql(expression, "this")
275+
keep = self.expressions(expression, key="keep", flat=True)
276+
set_ = self.expressions(expression, key="set_", flat=True)
277+
keep_sql = " KEEP " + keep if keep else ""
278+
set_sql = " SET " + set_ if set_ else ""
279+
return f"OBJECT_TRANSFORM({this}{keep_sql}{set_sql})"
280+
273281
def approxquantile_sql(self, expression: exp.ApproxQuantile) -> str:
274282
return "APPROXIMATE " + self.sql(
275283
exp.WithinGroup(

sqlglot/parsers/redshift.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ class RedshiftParser(PostgresParser):
6666
"SYSDATE": lambda self: self.expression(exp.CurrentTimestamp(sysdate=True)),
6767
}
6868

69+
FUNCTION_PARSERS = {
70+
**PostgresParser.FUNCTION_PARSERS,
71+
"OBJECT_TRANSFORM": lambda self: self._parse_object_transform(),
72+
}
73+
6974
SUPPORTS_IMPLICIT_UNNEST = True
7075

7176
def _parse_table(
@@ -96,6 +101,16 @@ def _parse_convert(self, strict: bool, safe: bool | None = None) -> exp.Expr | N
96101
this = self._parse_bitwise()
97102
return self.expression(exp.TryCast(this=this, to=to, safe=safe))
98103

104+
def _parse_object_transform(self) -> exp.ObjectTransform:
105+
this = self._parse_column()
106+
keep: list[exp.Expr] = []
107+
set_: list[exp.Expr] = []
108+
if self._match(TokenType.KEEP):
109+
keep = self._parse_csv(self._parse_primary)
110+
if self._match(TokenType.SET):
111+
set_ = self._parse_csv(self._parse_expression)
112+
return self.expression(exp.ObjectTransform(this=this, keep=keep, set_=set_))
113+
99114
def _parse_approximate_count(self) -> exp.ApproxDistinct | exp.ApproxQuantile | None:
100115
index = self._index - 1
101116
func = self._parse_function()

0 commit comments

Comments
 (0)