From 0adbbf7ad8f16700adc48c6757c07768199860d9 Mon Sep 17 00:00:00 2001 From: Vaggelis Danias Date: Tue, 1 Oct 2024 18:41:12 +0300 Subject: [PATCH] feat(duckdb): Parse ** and ^ operators as POW (#4193) --- sqlglot/dialects/duckdb.py | 8 ++++++++ tests/dialects/test_duckdb.py | 2 ++ 2 files changed, 10 insertions(+) diff --git a/sqlglot/dialects/duckdb.py b/sqlglot/dialects/duckdb.py index 467152fb1..8eb766b3c 100644 --- a/sqlglot/dialects/duckdb.py +++ b/sqlglot/dialects/duckdb.py @@ -289,6 +289,7 @@ class Tokenizer(tokens.Tokenizer): KEYWORDS = { **tokens.Tokenizer.KEYWORDS, "//": TokenType.DIV, + "**": TokenType.DSTAR, "ATTACH": TokenType.COMMAND, "BINARY": TokenType.VARBINARY, "BITSTRING": TokenType.BIT, @@ -325,6 +326,13 @@ class Parser(parser.Parser): **parser.Parser.BITWISE, TokenType.TILDA: exp.RegexpLike, } + BITWISE.pop(TokenType.CARET) + + EXPONENT = { + **parser.Parser.EXPONENT, + TokenType.CARET: exp.Pow, + TokenType.DSTAR: exp.Pow, + } FUNCTIONS_WITH_ALIASED_ARGS = {*parser.Parser.FUNCTIONS_WITH_ALIASED_ARGS, "STRUCT_PACK"} diff --git a/tests/dialects/test_duckdb.py b/tests/dialects/test_duckdb.py index fe919b0a9..5925789ed 100644 --- a/tests/dialects/test_duckdb.py +++ b/tests/dialects/test_duckdb.py @@ -864,6 +864,8 @@ def test_duckdb(self): "redshift": UnsupportedError, }, ) + self.validate_identity("a ^ b", "POWER(a, b)") + self.validate_identity("a ** b", "POWER(a, b)") def test_array_index(self): with self.assertLogs(helper_logger) as cm: