← На главную

PostHog с Claude Code переписал SQL-парсер на Rust — ускорение до 454 раз

24.06.2026 18:05 · hackernews

Автор статьи переписал SQL-парсер для PostHog с помощью нескольких параллельных сессий Claude Code. Итог — 16 тысяч строк «ручного» кода парсера, 5 тысяч строк тулзов и ускорение примерно в 70 раз (а в проде — до 454 раз). Новый парсер по сути эквивалентен старому для всех реалистичных запросов, расходится только на сумасшедших примерах вроде SELECT SELECT FROM FROM WHERE WHERE AND AND — а это, кстати, валидный SQL.

Зачем PostHog вообще парсер? Сервис транслирует пользовательский SQL в ClickHouse SQL, чтобы абстрагироваться от физического хранения данных, оптимизировать запросы и контролировать доступ. До этого использовался ANTLR — мощный генератор парсеров с C++ версией. Проблема в том, что ANTLR интерпретирует грамматику через ATN (аналог NFA со стеком), и обход графа на этапе исполнения всегда медленнее ручного рекурсивного спуска.

С AI стало реально написать эффективный парсер вручную. Автор параллельно тестировал два подхода: один нацелен на максимальную производительность (рекурсивный спуск с Pratt expression), второй — на максимальную совместимость с ANTLR. Оба сработали одинаково хорошо.

Ключевым элементом стал оракул — старый C++ парсер. Автор выстроил разработку как TDD: находил расхождение, фиксил новый парсер, повторял. Для генерации тестов использовал Hypothesis (property-based testing). Пришлось написать ещё один парсер — для .g4 файлов, чтобы генератор умел создавать интересный SQL. Позже добавил coverage-guided генерацию — необязательно для точности, но помогло выловить редкие кейсы.

Когда PBT нашёл расхождение, автор просил Claude загрузить в контекст исходную грамматику и C++ код, прежде чем писать фикс. Это решило проблему «забывчивости» модели. Финальный цикл работал почти автономно: генерация тестов, сжатие через ShrinkRay, анализ и фикс, прогон регрессии, повтор.

В какой-то момент новый парсер запустили в production в теневом режиме. После миллионов успешных парсингов без единого расхождения его включили в основной трафик.

Формально получился «ручной» предиктивный рекурсивно-спускаемый парсер с Pratt expression, LL(2) и локальным ordered-choice backtracking. Весь код написан Claude Opus 4.7 на Rust в мае 2026 года. Ни одной строки вручную, но это не «vibe-coding» — полноценная инженерия с PBT и фаззингом. Автор считает, что такой подход скоро станет нормой: парсер-генератор играет роль оракула, а LLM «руками» пишет быструю версию.

Читать оригинал →