From 237d0ebb0686210cebbfb22ac0a4048e947a0843 Mon Sep 17 00:00:00 2001 From: maximsmol <1472826+maximsmol@users.noreply.github.com> Date: Sun, 10 May 2026 19:27:59 -0700 Subject: [PATCH 1/2] fix: sqlparse max tokens exceeded Signed-off-by: maximsmol <1472826+maximsmol@users.noreply.github.com> --- pgcli/packages/parseutils/__init__.py | 2 ++ pgcli/packages/parseutils/ctes.py | 3 +++ pgcli/packages/parseutils/tables.py | 3 +++ pgcli/packages/parseutils/utils.py | 3 +++ pgcli/packages/prioritization.py | 2 ++ pgcli/packages/sqlcompletion.py | 2 ++ pgcli/pgexecute.py | 3 +++ 7 files changed, 18 insertions(+) diff --git a/pgcli/packages/parseutils/__init__.py b/pgcli/packages/parseutils/__init__.py index 76a930ce0..434a4cc73 100644 --- a/pgcli/packages/parseutils/__init__.py +++ b/pgcli/packages/parseutils/__init__.py @@ -1,5 +1,7 @@ import sqlparse +sqlparse.engine.grouping.MAX_GROUPING_DEPTH = None +sqlparse.engine.grouping.MAX_GROUPING_TOKENS = None BASE_KEYWORDS = [ "drop", diff --git a/pgcli/packages/parseutils/ctes.py b/pgcli/packages/parseutils/ctes.py index a6a364a02..978a3211f 100644 --- a/pgcli/packages/parseutils/ctes.py +++ b/pgcli/packages/parseutils/ctes.py @@ -1,9 +1,12 @@ +import sqlparse from sqlparse import parse from sqlparse.tokens import Keyword, CTE, DML from sqlparse.sql import Identifier, IdentifierList, Parenthesis from collections import namedtuple from .meta import TableMetadata, ColumnMetadata +sqlparse.engine.grouping.MAX_GROUPING_DEPTH = None +sqlparse.engine.grouping.MAX_GROUPING_TOKENS = None # TableExpression is a namedtuple representing a CTE, used internally # name: cte alias assigned in the query diff --git a/pgcli/packages/parseutils/tables.py b/pgcli/packages/parseutils/tables.py index bf67df09c..4c1c71a1f 100644 --- a/pgcli/packages/parseutils/tables.py +++ b/pgcli/packages/parseutils/tables.py @@ -3,6 +3,9 @@ from sqlparse.sql import IdentifierList, Identifier, Function from sqlparse.tokens import Keyword, DML, Punctuation +sqlparse.engine.grouping.MAX_GROUPING_DEPTH = None +sqlparse.engine.grouping.MAX_GROUPING_TOKENS = None + TableReference = namedtuple("TableReference", ["schema", "name", "alias", "is_function"]) TableReference.ref = property( lambda self: self.alias or (self.name if self.name.islower() or self.name[0] == '"' else '"' + self.name + '"') diff --git a/pgcli/packages/parseutils/utils.py b/pgcli/packages/parseutils/utils.py index 6d577430a..b3f3cf4b8 100644 --- a/pgcli/packages/parseutils/utils.py +++ b/pgcli/packages/parseutils/utils.py @@ -3,6 +3,9 @@ from sqlparse.sql import Identifier from sqlparse.tokens import Token, Error +sqlparse.engine.grouping.MAX_GROUPING_DEPTH = None +sqlparse.engine.grouping.MAX_GROUPING_TOKENS = None + cleanup_regex = { # This matches only alphanumerics and underscores. "alphanum_underscore": re.compile(r"(\w+)$"), diff --git a/pgcli/packages/prioritization.py b/pgcli/packages/prioritization.py index f5a9cb577..5466bd684 100644 --- a/pgcli/packages/prioritization.py +++ b/pgcli/packages/prioritization.py @@ -4,6 +4,8 @@ from collections import defaultdict from .pgliterals.main import get_literals +sqlparse.engine.grouping.MAX_GROUPING_DEPTH = None +sqlparse.engine.grouping.MAX_GROUPING_TOKENS = None white_space_regex = re.compile("\\s+", re.MULTILINE) diff --git a/pgcli/packages/sqlcompletion.py b/pgcli/packages/sqlcompletion.py index 20194ab14..88b8c0a64 100644 --- a/pgcli/packages/sqlcompletion.py +++ b/pgcli/packages/sqlcompletion.py @@ -7,6 +7,8 @@ from .parseutils.ctes import isolate_query_ctes from pgspecial.main import parse_special_command +sqlparse.engine.grouping.MAX_GROUPING_DEPTH = None +sqlparse.engine.grouping.MAX_GROUPING_TOKENS = None Special = namedtuple("Special", []) Database = namedtuple("Database", []) diff --git a/pgcli/pgexecute.py b/pgcli/pgexecute.py index 2864c8645..fbb8e09d3 100644 --- a/pgcli/pgexecute.py +++ b/pgcli/pgexecute.py @@ -9,6 +9,9 @@ from psycopg.conninfo import make_conninfo import sqlparse +sqlparse.engine.grouping.MAX_GROUPING_DEPTH = None +sqlparse.engine.grouping.MAX_GROUPING_TOKENS = None + from .packages.parseutils.meta import FunctionMetadata, ForeignKey _logger = logging.getLogger(__name__) From 087d82d0e204b2f08dcd18ee0a74c2e0a2b57f64 Mon Sep 17 00:00:00 2001 From: maximsmol <1472826+maximsmol@users.noreply.github.com> Date: Sun, 10 May 2026 19:29:10 -0700 Subject: [PATCH 2/2] changelog Signed-off-by: maximsmol <1472826+maximsmol@users.noreply.github.com> --- changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.rst b/changelog.rst index c1f1b8a2d..bc894f13f 100644 --- a/changelog.rst +++ b/changelog.rst @@ -14,6 +14,7 @@ Bug fixes: ---------- * Add `VERSION` to built-in function completion so `SELECT VERSION();` is suggested. * Hide timezone notice at startup when local and server timezones are the same. +* Let `sqlparse` accept arbitrarily-large queries. 4.4.0 (2025-12-24) ==================