From 514b3a52384fc9164bc5c63fda6b779d68e427b0 Mon Sep 17 00:00:00 2001 From: Sandeep Date: Fri, 7 Jun 2024 21:27:26 +0530 Subject: [PATCH] Fix(redshift): add support for Oracle style outer join markers #3611 (#3612) Co-authored-by: Sandeep <11992084+sandband@users.noreply.github.com> --- sqlglot/dialects/redshift.py | 8 ++++++++ tests/dialects/test_redshift.py | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/sqlglot/dialects/redshift.py b/sqlglot/dialects/redshift.py index df6985df42..0dd372e7d3 100644 --- a/sqlglot/dialects/redshift.py +++ b/sqlglot/dialects/redshift.py @@ -115,6 +115,12 @@ def _parse_approximate_count(self) -> t.Optional[exp.ApproxDistinct]: self._retreat(index) return None + def _parse_column(self) -> t.Optional[exp.Expression]: + column = super()._parse_column() + if column: + column.set("join_mark", self._match(TokenType.JOIN_MARKER)) + return column + class Tokenizer(Postgres.Tokenizer): BIT_STRINGS = [] HEX_STRINGS = [] @@ -128,6 +134,7 @@ class Tokenizer(Postgres.Tokenizer): "UNLOAD": TokenType.COMMAND, "VARBYTE": TokenType.VARBINARY, "MINUS": TokenType.EXCEPT, + "(+)": TokenType.JOIN_MARKER, } KEYWORDS.pop("VALUES") @@ -148,6 +155,7 @@ class Generator(Postgres.Generator): HEX_FUNC = "TO_HEX" # Redshift doesn't have `WITH` as part of their with_properties so we remove it WITH_PROPERTIES_PREFIX = " " + COLUMN_JOIN_MARKS_SUPPORTED = True TYPE_MAPPING = { **Postgres.Generator.TYPE_MAPPING, diff --git a/tests/dialects/test_redshift.py b/tests/dialects/test_redshift.py index 6e1830fb92..69793c7310 100644 --- a/tests/dialects/test_redshift.py +++ b/tests/dialects/test_redshift.py @@ -588,3 +588,9 @@ def test_column_unnesting(self): self.assertEqual( ast.sql("redshift"), "SELECT * FROM x AS a, a.b AS c, c.d.e AS f, f.g.h.i.j.k AS l" ) + + def test_join_markers(self): + self.validate_identity( + "select a.foo, b.bar, a.baz from a, b where a.baz = b.baz (+)", + "SELECT a.foo, b.bar, a.baz FROM a, b WHERE a.baz = b.baz (+)", + )