Skip to content

Commit 13014e0

Browse files
authored
fix(postgres)!: move postgres range parsers to global level (#6591)
* move postgres range parsers to global level * moved test * moved tokens, tests to base * undo DAT * removed sqlite test * added token back to postgres * added back @@ test
1 parent c0b3e5c commit 13014e0

File tree

5 files changed

+43
-43
lines changed

5 files changed

+43
-43
lines changed

sqlglot/dialects/postgres.py

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -358,8 +358,6 @@ class Tokenizer(tokens.Tokenizer):
358358
"<@": TokenType.LT_AT,
359359
"?&": TokenType.QMARK_AMP,
360360
"?|": TokenType.QMARK_PIPE,
361-
"&<": TokenType.AMP_LT,
362-
"&>": TokenType.AMP_GT,
363361
"#-": TokenType.HASH_DASH,
364362
"|/": TokenType.PIPE_SLASH,
365363
"||/": TokenType.DPIPE_SLASH,
@@ -376,7 +374,6 @@ class Tokenizer(tokens.Tokenizer):
376374
"NAME": TokenType.NAME,
377375
"OID": TokenType.OBJECT_IDENTIFIER,
378376
"ONLY": TokenType.ONLY,
379-
"OPERATOR": TokenType.OPERATOR,
380377
"REFRESH": TokenType.COMMAND,
381378
"REINDEX": TokenType.COMMAND,
382379
"RESET": TokenType.COMMAND,
@@ -479,12 +476,9 @@ class Parser(parser.Parser):
479476
RANGE_PARSERS = {
480477
**parser.Parser.RANGE_PARSERS,
481478
TokenType.DAMP: binary_range_parser(exp.ArrayOverlaps),
482-
TokenType.AMP_LT: binary_range_parser(exp.ExtendsLeft),
483-
TokenType.AMP_GT: binary_range_parser(exp.ExtendsRight),
484479
TokenType.DAT: lambda self, this: self.expression(
485480
exp.MatchAgainst, this=self._parse_bitwise(), expressions=[this]
486481
),
487-
TokenType.OPERATOR: lambda self, this: self._parse_operator(this),
488482
}
489483

490484
STATEMENT_PARSERS = {
@@ -517,29 +511,6 @@ def _parse_query_parameter(self) -> t.Optional[exp.Expression]:
517511
self._match_text_seq("S")
518512
return self.expression(exp.Placeholder, this=this)
519513

520-
def _parse_operator(self, this: t.Optional[exp.Expression]) -> t.Optional[exp.Expression]:
521-
while True:
522-
if not self._match(TokenType.L_PAREN):
523-
break
524-
525-
op = ""
526-
while self._curr and not self._match(TokenType.R_PAREN):
527-
op += self._curr.text
528-
self._advance()
529-
530-
this = self.expression(
531-
exp.Operator,
532-
comments=self._prev_comments,
533-
this=this,
534-
operator=op,
535-
expression=self._parse_bitwise(),
536-
)
537-
538-
if not self._match(TokenType.OPERATOR):
539-
break
540-
541-
return this
542-
543514
def _parse_date_part(self) -> exp.Expression:
544515
part = self._parse_type()
545516
self._match(TokenType.COMMA)

sqlglot/parser.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -987,6 +987,9 @@ class Parser(metaclass=_Parser):
987987
TokenType.QMARK_AMP: binary_range_parser(exp.JSONBContainsAllTopKeys),
988988
TokenType.QMARK_PIPE: binary_range_parser(exp.JSONBContainsAnyTopKeys),
989989
TokenType.HASH_DASH: binary_range_parser(exp.JSONBDeleteAtPath),
990+
TokenType.OPERATOR: lambda self, this: self._parse_operator(this),
991+
TokenType.AMP_LT: binary_range_parser(exp.ExtendsLeft),
992+
TokenType.AMP_GT: binary_range_parser(exp.ExtendsRight),
990993
}
991994

992995
PIPE_SYNTAX_TRANSFORM_PARSERS = {
@@ -9086,3 +9089,26 @@ def _parse_initcap(self) -> exp.Initcap:
90869089
expr.set("expression", exp.Literal.string(self.dialect.INITCAP_DEFAULT_DELIMITER_CHARS))
90879090

90889091
return expr
9092+
9093+
def _parse_operator(self, this: t.Optional[exp.Expression]) -> t.Optional[exp.Expression]:
9094+
while True:
9095+
if not self._match(TokenType.L_PAREN):
9096+
break
9097+
9098+
op = ""
9099+
while self._curr and not self._match(TokenType.R_PAREN):
9100+
op += self._curr.text
9101+
self._advance()
9102+
9103+
this = self.expression(
9104+
exp.Operator,
9105+
comments=self._prev_comments,
9106+
this=this,
9107+
operator=op,
9108+
expression=self._parse_bitwise(),
9109+
)
9110+
9111+
if not self._match(TokenType.OPERATOR):
9112+
break
9113+
9114+
return this

sqlglot/tokens.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,8 @@ class Tokenizer(metaclass=_Tokenizer):
714714
**{f"{{{{{postfix}": TokenType.BLOCK_START for postfix in ("+", "-")},
715715
**{f"{prefix}}}}}": TokenType.BLOCK_END for prefix in ("+", "-")},
716716
HINT_START: TokenType.HINT,
717+
"&<": TokenType.AMP_LT,
718+
"&>": TokenType.AMP_GT,
717719
"==": TokenType.EQ,
718720
"::": TokenType.DCOLON,
719721
"?::": TokenType.QDCOLON,
@@ -850,6 +852,7 @@ class Tokenizer(metaclass=_Tokenizer):
850852
"PRAGMA": TokenType.PRAGMA,
851853
"PRIMARY KEY": TokenType.PRIMARY_KEY,
852854
"PROCEDURE": TokenType.PROCEDURE,
855+
"OPERATOR": TokenType.OPERATOR,
853856
"QUALIFY": TokenType.QUALIFY,
854857
"RANGE": TokenType.RANGE,
855858
"RECURSIVE": TokenType.RECURSIVE,

tests/dialects/test_dialect.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4840,3 +4840,17 @@ def test_session_user(self):
48404840
self.assertEqual(
48414841
parse_one(func_sql, dialect=dialect).sql(dialect), no_paren_sql
48424842
)
4843+
4844+
def test_operator(self):
4845+
expr = self.validate_identity("1 OPERATOR(+) 2 OPERATOR(*) 3")
4846+
4847+
expr.left.assert_is(exp.Operator)
4848+
expr.left.left.assert_is(exp.Literal)
4849+
expr.left.right.assert_is(exp.Literal)
4850+
expr.right.assert_is(exp.Literal)
4851+
self.assertEqual(expr.sql(dialect="postgres"), "1 OPERATOR(+) 2 OPERATOR(*) 3")
4852+
4853+
self.validate_identity("SELECT operator FROM t")
4854+
self.validate_identity("SELECT 1 OPERATOR(+) 2")
4855+
self.validate_identity("SELECT 1 OPERATOR(+) /* foo */ 2")
4856+
self.validate_identity("SELECT 1 OPERATOR(pg_catalog.+) 2")

tests/dialects/test_postgres.py

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1333,20 +1333,6 @@ def test_array_offset(self):
13331333
],
13341334
)
13351335

1336-
def test_operator(self):
1337-
expr = self.parse_one("1 OPERATOR(+) 2 OPERATOR(*) 3")
1338-
1339-
expr.left.assert_is(exp.Operator)
1340-
expr.left.left.assert_is(exp.Literal)
1341-
expr.left.right.assert_is(exp.Literal)
1342-
expr.right.assert_is(exp.Literal)
1343-
self.assertEqual(expr.sql(dialect="postgres"), "1 OPERATOR(+) 2 OPERATOR(*) 3")
1344-
1345-
self.validate_identity("SELECT operator FROM t")
1346-
self.validate_identity("SELECT 1 OPERATOR(+) 2")
1347-
self.validate_identity("SELECT 1 OPERATOR(+) /* foo */ 2")
1348-
self.validate_identity("SELECT 1 OPERATOR(pg_catalog.+) 2")
1349-
13501336
def test_bool_or(self):
13511337
self.validate_identity(
13521338
"SELECT a, LOGICAL_OR(b) FROM table GROUP BY a",

0 commit comments

Comments
 (0)