perf(maintenance): skip sqlparse on oversized virtual-dataset SQL

sqlparse raises SQLParseError above MAX_GROUPING_TOKENS=10000 tokens
(~25KB of typical SQL). The try/except fallback already handled it, but paid
~1s per oversized SQL for a parse doomed to fail. Add _SQLPARSE_SKIP_THRESHOLD
(30k chars) to bypass sqlparse for oversized text (~15x faster, 1.2s->0.08s for
a 212KB SQL) while keeping literal filtering for SQL under the threshold.

Tests: oversized-SQL skip-threshold behavior.
This commit is contained in:
2026-08-03 23:52:03 +07:00
parent 02a97bfc9c
commit 4d282b43e2
3 changed files with 62 additions and 26 deletions

View File

@@ -132,6 +132,13 @@ Superset отклоняет его HTTP 400. Для `is_not_null` значени
`schema.table`. Это best-effort сопоставление (допускает возможные false positives из
строковых литералов) вместо жёсткого отказа всего скана.
**Оптимизация:** для SQL длиннее `_SQLPARSE_SKIP_THRESHOLD = 30_000` символов
sqlparse пропускается сразу — замеры показывают, что после ~25КБ типичного SQL
10000 токенов превышаются гарантированно, а неудачная попытка `sqlparse.parse`
стоит ~1с на датасет. Пропуск экономит это время (для 212КБ датасета падение
времени извлечения с ~1.2с до ~0.08с), не меняя результат (regex-fallback всё равно
используется). На SQL до порога литеральное фильтрование сохраняется.
### Отклонённая альтернатива
Поднимать `MAX_GROUPING_TOKENS` в `sqlparse` (монакий-патч или правка константы) —