From 1e295d6372cd987bebef70733085f69e3784b28e Mon Sep 17 00:00:00 2001 From: vaggelisd Date: Mon, 28 Jul 2025 10:59:20 +0300 Subject: [PATCH] fix: Do not consume BUCKET/TRUNCATE as partitioning keywords --- sqlglot/parser.py | 9 ++++++++- tests/fixtures/identity.sql | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/sqlglot/parser.py b/sqlglot/parser.py index e14c727f81..be18cda23e 100644 --- a/sqlglot/parser.py +++ b/sqlglot/parser.py @@ -1136,7 +1136,14 @@ class Parser(metaclass=_Parser): "TRUNCATE": lambda self: self._parse_partitioned_by_bucket_or_truncate(), } - def _parse_partitioned_by_bucket_or_truncate(self) -> exp.Expression: + def _parse_partitioned_by_bucket_or_truncate(self) -> t.Optional[exp.Expression]: + if not self._match(TokenType.L_PAREN, advance=False): + # Partitioning by bucket or truncate follows the syntax: + # PARTITION BY (BUCKET(..) | TRUNCATE(..)) + # If we don't have parenthesis after each keyword, we should instead parse this as an identifier + self._retreat(self._index - 1) + return None + klass = ( exp.PartitionedByBucket if self._prev.text.upper() == "BUCKET" diff --git a/tests/fixtures/identity.sql b/tests/fixtures/identity.sql index eb509010f7..a6e8ac9151 100644 --- a/tests/fixtures/identity.sql +++ b/tests/fixtures/identity.sql @@ -552,6 +552,8 @@ CREATE TABLE a.b AS SELECT a FROM a.c CREATE TABLE IF NOT EXISTS x AS SELECT a FROM d CREATE TABLE z (a INT, b VARCHAR, c VARCHAR(100), d DECIMAL(5, 3)) CREATE TABLE z (end INT) +CREATE TABLE z (bucket INT) +CREATE TABLE z (truncate INT) CREATE TABLE z (a ARRAY, b MAP, c DECIMAL(5, 3)) CREATE TABLE z (a INT, b VARCHAR COMMENT 'z', c VARCHAR(100) COMMENT 'z', d DECIMAL(5, 3)) CREATE TABLE z (a INT(11) DEFAULT UUID())