Skip to content

Commit 499d132

Browse files
fpatzgeorgesittas
andauthored
fix(postgres): preserve contained-by operator direction CODEX (#7768)
* fix(postgres): preserve contained-by operator direction CODEX * Update sqlglot/expressions/array.py --------- Co-authored-by: Jo <46752250+georgesittas@users.noreply.github.com>
1 parent 719a34c commit 499d132

6 files changed

Lines changed: 14 additions & 6 deletions

File tree

sqlglot/expressions/array.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ class ArrayContainsAll(Expression, Binary, Func):
114114
_sql_names = ["ARRAY_CONTAINS_ALL", "ARRAY_HAS_ALL"]
115115

116116

117+
class ArrayContainedBy(Expression, Binary, Func):
118+
pass
119+
120+
117121
class ArrayExcept(Expression, Func):
118122
arg_types = {"this": True, "expression": True, "is_multiset": False}
119123

sqlglot/generator.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ class Generator:
140140
),
141141
exp.AnalyzeColumns: lambda self, e: self.sql(e, "this"),
142142
exp.AnalyzeWith: lambda self, e: self.expressions(e, prefix="WITH ", sep=" "),
143+
exp.ArrayContainedBy: lambda self, e: self.binary(e, "<@"),
143144
exp.ArrayContainsAll: lambda self, e: self.binary(e, "@>"),
144145
exp.ArrayOverlaps: lambda self, e: self.binary(e, "&&"),
145146
exp.AssumeColumnConstraint: lambda self, e: f"ASSUME ({self.sql(e, 'this')})",

sqlglot/generators/mysql.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,10 @@ def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str:
653653
self.unsupported("Array operations are not supported by MySQL")
654654
return self.function_fallback_sql(expression)
655655

656+
def arraycontainedby_sql(self, expression: exp.ArrayContainedBy) -> str:
657+
self.unsupported("Array operations are not supported by MySQL")
658+
return self.function_fallback_sql(expression)
659+
656660
def dpipe_sql(self, expression: exp.DPipe) -> str:
657661
return self.func("CONCAT", *expression.flatten())
658662

sqlglot/parser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1192,7 +1192,7 @@ class Parser:
11921192
TokenType.IRLIKE: binary_range_parser(exp.RegexpILike),
11931193
TokenType.IS: lambda self, this: self._parse_is(this),
11941194
TokenType.LIKE: binary_range_parser(exp.Like),
1195-
TokenType.LT_AT: binary_range_parser(exp.ArrayContainsAll, reverse_args=True),
1195+
TokenType.LT_AT: binary_range_parser(exp.ArrayContainedBy),
11961196
TokenType.OVERLAPS: binary_range_parser(exp.Overlaps),
11971197
TokenType.RLIKE: binary_range_parser(exp.RegexpLike),
11981198
TokenType.SIMILAR_TO: binary_range_parser(exp.SimilarTo),

tests/dialects/test_duckdb.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1350,8 +1350,8 @@ def test_duckdb(self):
13501350
self.validate_identity("a ** b", "POWER(a, b)")
13511351
self.validate_identity("a ~~~ b", "a GLOB b")
13521352
self.validate_identity("a ~~ b", "a LIKE b")
1353-
self.validate_identity("a @> b")
1354-
self.validate_identity("a <@ b", "b @> a")
1353+
self.validate_identity("a @> b").assert_is(exp.ArrayContainsAll)
1354+
self.validate_identity("a <@ b").assert_is(exp.ArrayContainedBy)
13551355
self.validate_identity("a && b").assert_is(exp.ArrayOverlaps)
13561356
self.validate_identity("a ^@ b", "STARTS_WITH(a, b)")
13571357
self.validate_identity(

tests/dialects/test_postgres.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,9 +213,8 @@ def test_postgres(self):
213213
"SELECT SUBSTRING('Thomas' FOR 3 FROM 2)",
214214
"SELECT SUBSTRING('Thomas' FROM 2 FOR 3)",
215215
)
216-
self.validate_identity(
217-
"SELECT ARRAY[1, 2, 3] <@ ARRAY[1, 2]",
218-
"SELECT ARRAY[1, 2] @> ARRAY[1, 2, 3]",
216+
self.validate_identity("SELECT ARRAY[1, 2, 3] <@ ARRAY[1, 2]").expressions[0].assert_is(
217+
exp.ArrayContainedBy
219218
)
220219
self.validate_identity(
221220
"SELECT DATE_PART('isodow'::varchar(6), current_date)",

0 commit comments

Comments
 (0)