diff options
Diffstat (limited to 'sqlglot/dialects/postgres.py')
-rw-r--r-- | sqlglot/dialects/postgres.py | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/sqlglot/dialects/postgres.py b/sqlglot/dialects/postgres.py index c47ff51..2132778 100644 --- a/sqlglot/dialects/postgres.py +++ b/sqlglot/dialects/postgres.py @@ -1,6 +1,8 @@ from __future__ import annotations -from sqlglot import exp, generator, parser, tokens +import typing as t + +from sqlglot import exp, generator, parser, tokens, transforms from sqlglot.dialects.dialect import ( Dialect, arrow_json_extract_scalar_sql, @@ -20,7 +22,6 @@ from sqlglot.dialects.dialect import ( from sqlglot.helper import seq_get from sqlglot.parser import binary_range_parser from sqlglot.tokens import TokenType -from sqlglot.transforms import preprocess, remove_target_from_merge DATE_DIFF_FACTOR = { "MICROSECOND": " * 1000000", @@ -274,8 +275,7 @@ class Postgres(Dialect): TokenType.HASH: exp.BitwiseXor, } - FACTOR = { - **parser.Parser.FACTOR, + EXPONENT = { TokenType.CARET: exp.Pow, } @@ -286,6 +286,12 @@ class Postgres(Dialect): TokenType.LT_AT: binary_range_parser(exp.ArrayContained), } + def _parse_factor(self) -> t.Optional[exp.Expression]: + return self._parse_tokens(self._parse_exponent, self.FACTOR) + + def _parse_exponent(self) -> t.Optional[exp.Expression]: + return self._parse_tokens(self._parse_unary, self.EXPONENT) + def _parse_date_part(self) -> exp.Expression: part = self._parse_type() self._match(TokenType.COMMA) @@ -316,7 +322,7 @@ class Postgres(Dialect): TRANSFORMS = { **generator.Generator.TRANSFORMS, # type: ignore exp.BitwiseXor: lambda self, e: self.binary(e, "#"), - exp.ColumnDef: preprocess( + exp.ColumnDef: transforms.preprocess( [ _auto_increment_to_serial, _serial_to_generated, @@ -341,7 +347,7 @@ class Postgres(Dialect): exp.ArrayOverlaps: lambda self, e: self.binary(e, "&&"), exp.ArrayContains: lambda self, e: self.binary(e, "@>"), exp.ArrayContained: lambda self, e: self.binary(e, "<@"), - exp.Merge: preprocess([remove_target_from_merge]), + exp.Merge: transforms.preprocess([transforms.remove_target_from_merge]), exp.RegexpLike: lambda self, e: self.binary(e, "~"), exp.RegexpILike: lambda self, e: self.binary(e, "~*"), exp.StrPosition: str_position_sql, |