From 755c51de291e3ab1860b6b39e489b81d31a4760f Mon Sep 17 00:00:00 2001 From: Afros Rajabov Date: Wed, 27 May 2026 15:17:30 +0700 Subject: [PATCH 1/5] fix(postgres): parse schema-qualified COMMENT ON TYPE and VIEW --- sqlglot/parser.py | 4 ++++ tests/dialects/test_postgres.py | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/sqlglot/parser.py b/sqlglot/parser.py index 50c242056f..53dd0d7c3d 100644 --- a/sqlglot/parser.py +++ b/sqlglot/parser.py @@ -2190,8 +2190,12 @@ def _parse_comment(self, allow_exists: bool = True) -> exp.Expr: this = self._parse_user_defined_function(kind=kind.token_type) elif kind.token_type == TokenType.TABLE: this = self._parse_table(alias_tokens=self.COMMENT_TABLE_ALIAS_TOKENS) + elif kind.token_type == TokenType.VIEW: + this = self._parse_table(alias_tokens=self.COMMENT_TABLE_ALIAS_TOKENS) elif kind.token_type == TokenType.COLUMN: this = self._parse_column() + elif kind.token_type == TokenType.TYPE: + this = self._parse_table_parts(schema=True) else: this = self._parse_id_var() diff --git a/tests/dialects/test_postgres.py b/tests/dialects/test_postgres.py index cba9d48874..e1ba58fb1d 100644 --- a/tests/dialects/test_postgres.py +++ b/tests/dialects/test_postgres.py @@ -69,6 +69,10 @@ def test_postgres(self): self.validate_identity("SELECT CASE WHEN SUBSTRING('abcdefg') IN ('ab') THEN 1 ELSE 0 END") self.validate_identity("COMMENT ON TABLE mytable IS 'this'") self.validate_identity("COMMENT ON MATERIALIZED VIEW my_view IS 'this'") + self.validate_identity("COMMENT ON TYPE mood IS 'x'") + self.validate_identity("COMMENT ON TYPE foo.mood IS 'x'") + self.validate_identity("COMMENT ON VIEW foo.bat IS 'x'") + self.validate_identity("COMMENT ON MATERIALIZED VIEW foo.my_view IS 'x'") self.validate_identity("SELECT e'\\xDEADBEEF'") self.validate_identity("SELECT CAST(e'\\176' AS BYTEA)") self.validate_identity("SELECT * FROM x WHERE SUBSTRING('Thomas' FROM '...$') IN ('mas')") From a6d7685cfb485544380fd2e422c03f4b1078086b Mon Sep 17 00:00:00 2001 From: Afros Rajabov Date: Wed, 27 May 2026 15:29:17 +0700 Subject: [PATCH 2/5] fix(postgres): parse schema-qualified COMMENT ON SEQUENCE --- sqlglot/parser.py | 2 ++ tests/dialects/test_postgres.py | 1 + 2 files changed, 3 insertions(+) diff --git a/sqlglot/parser.py b/sqlglot/parser.py index 53dd0d7c3d..7f1fa09bd8 100644 --- a/sqlglot/parser.py +++ b/sqlglot/parser.py @@ -2192,6 +2192,8 @@ def _parse_comment(self, allow_exists: bool = True) -> exp.Expr: this = self._parse_table(alias_tokens=self.COMMENT_TABLE_ALIAS_TOKENS) elif kind.token_type == TokenType.VIEW: this = self._parse_table(alias_tokens=self.COMMENT_TABLE_ALIAS_TOKENS) + elif kind.token_type == TokenType.SEQUENCE: + this = self._parse_table(alias_tokens=self.COMMENT_TABLE_ALIAS_TOKENS) elif kind.token_type == TokenType.COLUMN: this = self._parse_column() elif kind.token_type == TokenType.TYPE: diff --git a/tests/dialects/test_postgres.py b/tests/dialects/test_postgres.py index e1ba58fb1d..59475b2c66 100644 --- a/tests/dialects/test_postgres.py +++ b/tests/dialects/test_postgres.py @@ -73,6 +73,7 @@ def test_postgres(self): self.validate_identity("COMMENT ON TYPE foo.mood IS 'x'") self.validate_identity("COMMENT ON VIEW foo.bat IS 'x'") self.validate_identity("COMMENT ON MATERIALIZED VIEW foo.my_view IS 'x'") + self.validate_identity("COMMENT ON SEQUENCE public.seq IS 'x'") self.validate_identity("SELECT e'\\xDEADBEEF'") self.validate_identity("SELECT CAST(e'\\176' AS BYTEA)") self.validate_identity("SELECT * FROM x WHERE SUBSTRING('Thomas' FROM '...$') IN ('mas')") From e8769e6005c7bf19a06bd276fdb239d9080b1809 Mon Sep 17 00:00:00 2001 From: Afros Rajabov Date: Wed, 27 May 2026 15:43:58 +0700 Subject: [PATCH 3/5] fix(postgres): parse schema-qualified COMMENT ON INDEX --- sqlglot/parser.py | 2 ++ tests/dialects/test_postgres.py | 1 + 2 files changed, 3 insertions(+) diff --git a/sqlglot/parser.py b/sqlglot/parser.py index 7f1fa09bd8..72c23b514d 100644 --- a/sqlglot/parser.py +++ b/sqlglot/parser.py @@ -2194,6 +2194,8 @@ def _parse_comment(self, allow_exists: bool = True) -> exp.Expr: this = self._parse_table(alias_tokens=self.COMMENT_TABLE_ALIAS_TOKENS) elif kind.token_type == TokenType.SEQUENCE: this = self._parse_table(alias_tokens=self.COMMENT_TABLE_ALIAS_TOKENS) + elif kind.token_type == TokenType.INDEX: + this = self._parse_table(alias_tokens=self.COMMENT_TABLE_ALIAS_TOKENS) elif kind.token_type == TokenType.COLUMN: this = self._parse_column() elif kind.token_type == TokenType.TYPE: diff --git a/tests/dialects/test_postgres.py b/tests/dialects/test_postgres.py index 59475b2c66..9c368c008d 100644 --- a/tests/dialects/test_postgres.py +++ b/tests/dialects/test_postgres.py @@ -74,6 +74,7 @@ def test_postgres(self): self.validate_identity("COMMENT ON VIEW foo.bat IS 'x'") self.validate_identity("COMMENT ON MATERIALIZED VIEW foo.my_view IS 'x'") self.validate_identity("COMMENT ON SEQUENCE public.seq IS 'x'") + self.validate_identity("COMMENT ON INDEX public.idx IS 'x'") self.validate_identity("SELECT e'\\xDEADBEEF'") self.validate_identity("SELECT CAST(e'\\176' AS BYTEA)") self.validate_identity("SELECT * FROM x WHERE SUBSTRING('Thomas' FROM '...$') IN ('mas')") From e8e5054286598c07e1342f8c39eff934526def18 Mon Sep 17 00:00:00 2001 From: Afros Rajabov Date: Wed, 27 May 2026 18:04:48 +0700 Subject: [PATCH 4/5] fix: fallback to _parse_table_parts --- sqlglot/parser.py | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/sqlglot/parser.py b/sqlglot/parser.py index 72c23b514d..7ccc9807c5 100644 --- a/sqlglot/parser.py +++ b/sqlglot/parser.py @@ -2188,20 +2188,10 @@ def _parse_comment(self, allow_exists: bool = True) -> exp.Expr: if kind.token_type in (TokenType.FUNCTION, TokenType.PROCEDURE): this = self._parse_user_defined_function(kind=kind.token_type) - elif kind.token_type == TokenType.TABLE: - this = self._parse_table(alias_tokens=self.COMMENT_TABLE_ALIAS_TOKENS) - elif kind.token_type == TokenType.VIEW: - this = self._parse_table(alias_tokens=self.COMMENT_TABLE_ALIAS_TOKENS) - elif kind.token_type == TokenType.SEQUENCE: - this = self._parse_table(alias_tokens=self.COMMENT_TABLE_ALIAS_TOKENS) - elif kind.token_type == TokenType.INDEX: - this = self._parse_table(alias_tokens=self.COMMENT_TABLE_ALIAS_TOKENS) elif kind.token_type == TokenType.COLUMN: this = self._parse_column() - elif kind.token_type == TokenType.TYPE: - this = self._parse_table_parts(schema=True) else: - this = self._parse_id_var() + this = self._parse_table_parts(schema=True) self._match(TokenType.IS) From 6d0d863fc049accfff2fe0d67fe9c8b71d2140d7 Mon Sep 17 00:00:00 2001 From: Afros Rajabov Date: Wed, 27 May 2026 21:58:27 +0700 Subject: [PATCH 5/5] fix: TABLE route --- sqlglot/parser.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sqlglot/parser.py b/sqlglot/parser.py index 7ccc9807c5..eb81f5e0dd 100644 --- a/sqlglot/parser.py +++ b/sqlglot/parser.py @@ -2188,6 +2188,8 @@ def _parse_comment(self, allow_exists: bool = True) -> exp.Expr: if kind.token_type in (TokenType.FUNCTION, TokenType.PROCEDURE): this = self._parse_user_defined_function(kind=kind.token_type) + elif kind.token_type == TokenType.TABLE: + this = self._parse_table(alias_tokens=self.COMMENT_TABLE_ALIAS_TOKENS) elif kind.token_type == TokenType.COLUMN: this = self._parse_column() else: