Модели пишут SQL-движок на чистом Python. Он должен отвечать так же, как SQLite: с теми же значениями, теми же типами и в том же порядке строк. Ответ каждой модели проверяют 464 скрытых теста и 5 замеров скорости, а эталоном служит настоящий SQLite.
28 октября 2026. 10 прогонов, 6 моделей, ещё 6 исключены из рейтинга.
Безупречно справились двое.Claude Opus 5.5, запущенный агентом Claude Code, прошёл все 464 теста, а Kimi K3.1 Pro прошёл 460. Оба уложились в лимит скорости во всех пяти замерах. Протокол агента проверен: он ни разу не читал файлы и не запускал код.
Один и тот же Opus 5.5 набирает от 2% до 100%.Всё решает глубина размышления. Агентом он думал около 118 тысяч токенов. Через API с адаптивным мышлением модель на этой задаче не думала совсем, даже на effort max, и прошла от 8 до 274 тестов.
Четыре модели из шести в рейтинге споткнулись об одну строку.Это DeepSeek Flash (регистр имён функций), GPT-6.1 Sol (COUNT(*)), Qwen3.8-Max (CASE WHEN) и Opus через API (сравнение токенов). С правкой Qwen проходит 462 теста, GPT 445, DeepSeek Flash 431. Архитектура у них сильная, подвела невнимательность. GPT-6.1 Terra и DeepSeek V4 Pro и вовсе сдали код с синтаксической ошибкой.
Долгое размышление не гарантирует кода.GLM 5.3 потратил на рассуждение весь лимит API в 131 тысячу токенов и не написал ни строки, поэтому его прогон вне рейтинга. Qwen думал 47 минут и написал почти идеальный код с одной опечаткой.
Локальной модели пока далеко до облачных.Strata (Qwen3.8-Flash-Next в квантовании Q2 на домашнем ПК) с лимитом 128K дописала код до конца, но её токенайзер сломан в основе. Итог 32 теста из 464.
| Место | Модель | Тесты | Ловушки | Случайные | Ошибки | Скорость | Время | Рассуждение | Всего токенов | Токенов/с | Строк кода | С правкой |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 🥇 1 | Claude Opus 5.5 (агент, effort max) | 464 (100.0%) | 56/56 | 400/400 | 8/8 | 5/5 | 54 мин 49 с | 368.6K* | 379.4K | 115* | 1390 | — |
| 🥈 2 | Claude Opus 5.5 (агент) | 464 (100.0%) | 56/56 | 400/400 | 8/8 | 5/5 | 32 мин 03 с | 118K* | 138.8K | 72* | 1868 | — |
| 🥉 3 | Kimi K3.1 Pro | 460 (99.1%) | 54/56 | 398/400 | 8/8 | 5/5 | 23 мин 40 с | 25K | 35.4K | 25 | 1456 | — |
| 4 | GPT-6.1 Sol | 376 (81.0%) | 40/56 | 328/400 | 8/8 | 2/5 | 6 мин 00 с | скрыто | 16.8K | 47 | 1185 | 445, скорость 5/5 |
| 5 | Qwen3.8-Max | 294 (63.4%) | 52/56 | 234/400 | 8/8 | 5/5 | 47 мин 30 с | 98.6K | 114.3K | 40 | 2090 | 462, скорость 5/5 |
| 6 | Claude Opus 5.5 (effort max) | 274 (59.1%) | 11/56 | 255/400 | 8/8 | 1/5 | 2 мин 25 с | 0 | 18.5K | 128 | 1556 | — |
| 7 | DeepSeek Flash (V4.1) | 104 (22.4%) | 31/56 | 65/400 | 8/8 | 1/5 | 5 мин 49 с | 56.6K | 69.7K | 200 | 1990 | 431, скорость 4/5 |
| 8 | Strata Q2, лимит 128K | 32 (6.9%) | 21/56 | 3/400 | 8/8 | 0/5 | 35 мин 20 с | 95.9K* | 110.8K | 52 | 1941 | — |
| 9 | Claude Opus 5.5 (шлюз, chat) | 8 (1.7%) | 0/56 | 0/400 | 8/8 | 0/5 | 1 мин 47 с | скрыто | 14K | 131 | 1140 | 278, скорость 1/5 |
| 10 | Claude Opus 5.5 (effort high) | 8 (1.7%) | 0/56 | 0/400 | 8/8 | 0/5 | 2 мин 06 с | 0 | 14.7K | 116 | 1265 | 24, скорость 1/5 |
В колонке «С правкой» указан результат того же кода после исправления одной-двух строк, он нужен только для понимания. Звёздочка означает оценку. «Токенов/с» показывает, как быстро модель пишет: все токены ответа, включая рассуждение, делённые на полное время ответа.
От отправки задания до последнего символа ответа. Зависит и от загрузки серверов провайдера.
claude-opus-5-5effort: max не рассуждал вовсе и прошёл 274 теста. Протокол соблюдён: одно чтение задания и одна запись решения.claude-opus-5-5kimi-k3.1-pro0.1+0.2 || '' даёт '0.3', а 1e20 даёт '1.0e+20'. Kimi делает это через repr Python и получает '0.30000000000000004'. Ещё ROUND(2.675, 2) у него дал 2.68 вместо 2.67, потому что SQLite округляет двоичное значение, а не десятичную запись. Kimi оказался самым медленным из облачных моделей (около 24 минут), но самым экономным по токенам.gpt-6.1-solCOUNT(*) хранится как узел ("*",), а две функции обхода дерева, _resolve и _replace_alias, его не знают. Поэтому любой запрос с COUNT(*) заканчивается ошибкой «bad expression», в том числе три замера скорости. С правкой двух строк код проходит 445 тестов и 5 замеров из 5, это второе место по качеству кода. Остальные промахи связаны с теми же тонкостями SQLite, что у Kimi, плюс SUBSTR с началом 0 и неверное деление в семи случайных запросах. Модель быстрая: 6 минут и 17 тысяч токенов.qwen3.8-maxCASE WHEN без операнда, это 168 тестов. Проверка if not self.match_kw("WHEN") сдвигает указатель и съедает первый WHEN. С правкой этой строки код проходит 462 теста и 5 замеров из 5, это лучший результат с правкой. Остальной код почти безупречен. Это самый долгий облачный прогон: 47 минут и 99 тысяч токенов рассуждения.claude-opus-5-5max решило не думать: токенов рассуждения ноль, код пошёл с 4-й секунды, прогон занял 2,5 минуты. В части запросов не находятся колонки с алиасом таблицы (Column not found: e.dept_id), не работает ORDER BY по колонке не из SELECT, а JOIN сделан вложенными циклами и не укладывается в лимит скорости. Ошибок в одну строку нет, просто код менее тщательный.deepseek-flash"COUNT" и "ABS" в верхнем. Поэтому не работает ни одна функция и ни один агрегат. С правкой одной строки код проходит 431 тест и 4 замера скорости из 5. Архитектура хорошая, есть hash join и правильная работа с NULL, но модель ни разу мысленно не прогнала SELECT COUNT(*).qwen3.8-flash-next-q2_0t.col. С лимитом 128K модель уложилась: 35 минут, около 111 тысяч токенов, из них примерно 97 тысяч на рассуждение (сервер не отдаёт разбивку, это оценка по длине текста), 1941 строка кода. Но токенайзер сломан в основе. Точку в e.id он принимает за начало числа, и на этом падает 401 тест, а операторы ., = в части позиций и % он не знает вовсе. После правки двух строк результат тот же, 32 теста, то есть ошибка не в одной строке. Для локальной модели в квантовании Q2 это честная попытка, но до облачных моделей ей далеко.claude-opus-5-5consume('IDENT') сравнивает *значение* токена со словом «IDENT» вместо *типа*, поэтому падает любой FROM <таблица>. С правкой одной строки код проходит 278 тестов и 1 замер скорости из 5: JOIN вложенными циклами не укладывается в 60 секунд. Ответ пришёл за 1 мин 47 с, это 14 тысяч токенов, и первый текст появился на 3-й секунде, то есть почти без рассуждения. Через chat/completions шлюза не видно, как передаётся глубина рассуждения, поэтому Opus перезапущен через нативный /v1/messages.claude-opus-5-5consume('IDENT') сравнивает значение токена со словом «IDENT». Сам код при этом другой, то есть кэша не было. Значит, это устойчивая привычка модели. С правкой код проходит лишь 24 теста, дальше ломаются другие места.Нужно написать один модуль на Python 3.12 с функцией run_query(tables, sql). Пользоваться можно только стандартной библиотекой, модуль sqlite3 и eval/exec запрещены. Движок должен понимать SELECT и DISTINCT, INNER, LEFT и CROSS JOIN, WHERE, GROUP BY, HAVING, ORDER BY по выражению, алиасу и номеру колонки, LIMIT и OFFSET, агрегаты внутри выражений, CASE, LIKE, BETWEEN, IN, IS и функции ABS, LOWER, UPPER, LENGTH, COALESCE, IFNULL, NULLIF, ROUND, SUBSTR. Значения, их типы (int, float, str, None), число строк и порядок должны совпадать с SQLite 3.45 без type affinity и без ICU. JOIN двух таблиц по 50 000 строк должен укладываться в 3 секунды.
Напиши на Python 3.12 мини-движок SQL: один модуль, только стандартная библиотека. Модуль `sqlite3` и любые внешние СУБД/библиотеки использовать НЕЛЬЗЯ. eval/exec/compile тоже нельзя.
## Интерфейс
```python
def run_query(tables: dict[str, tuple[list[str], list[tuple]]], sql: str) -> list[tuple]:
...
```
- `tables`: имя таблицы → (список имён колонок, список строк). Значения в ячейках: `int`, `float`, `str` или `None`.
- Возвращает строки результата — список кортежей.
- Ошибочный SQL, несуществующая таблица/колонка/функция, неверное число аргументов функции → `ValueError`.
## Главное требование
Результат (значения, ТИПЫ значений int/float/str/None, число строк, порядок при ORDER BY) должен совпадать с тем, что вернул бы **SQLite 3.45**, если создать таблицы без объявленных типов колонок (`CREATE TABLE t(a, b, c)`, т.е. без type affinity), вставить те же значения и выполнить тот же запрос. SQLite собран без ICU. Всё, что явно не описано ниже, — как в SQLite.
## Поддерживаемый SQL
Ключевые слова, имена функций, таблиц и колонок — регистронезависимы. В конце запроса может стоять `;`.
```
SELECT [DISTINCT] <список>
FROM <таблица> [[AS] <алиас>]
{ [INNER] JOIN <таблица> [[AS] <алиас>] ON <выражение>
| LEFT [OUTER] JOIN <таблица> [[AS] <алиас>] ON <выражение>
| CROSS JOIN <таблица> [[AS] <алиас>] }*
[WHERE <выражение>]
[GROUP BY <выражение>, ...]
[HAVING <выражение>]
[ORDER BY <выражение> [ASC|DESC], ...]
[LIMIT <целое> [OFFSET <целое>]]
```
- `<список>`: `*`, `<алиас>.*`, выражения с необязательным `[AS] <имя>`.
- Колонки: `col` или `t.col` (t — имя таблицы или её алиас).
- GROUP BY и ORDER BY могут ссылаться на алиас из списка SELECT; ORDER BY — ещё и на номер колонки результата (с 1).
Выражения:
- литералы: целые (`42`), вещественные (`1.5`, `.5`, `2.`), строки `'it''s'`, `NULL`;
- унарные `-`, `+`, `NOT`;
- бинарные: `||`, `*`, `/`, `%`, `+`, `-`, `<`, `<=`, `>`, `>=`, `=`, `==`, `!=`, `<>`, `IS`, `IS NOT`, `AND`, `OR` — с приоритетами SQLite;
- `x IS NULL`, `x IS NOT NULL`, `x [NOT] BETWEEN a AND b`, `x [NOT] IN (a, b, ...)`, `x [NOT] LIKE pattern`;
- `CASE WHEN c THEN v ... [ELSE v] END` и `CASE x WHEN v THEN r ... [ELSE r] END`;
- скобки;
- скалярные функции: `ABS`, `LOWER`, `UPPER`, `LENGTH`, `COALESCE` (2+ аргумента), `IFNULL`, `NULLIF`, `ROUND(x)`, `ROUND(x, n)`, `SUBSTR(s, start)`, `SUBSTR(s, start, len)`;
- агрегаты: `COUNT(*)`, `COUNT(x)`, `COUNT(DISTINCT x)`, `SUM`, `AVG`, `MIN`, `MAX`. Агрегаты могут входить в выражения (`SUM(a) * 2 + 1`, `CASE WHEN COUNT(*) > 1 THEN ...`), встречаться в HAVING и ORDER BY, в том числе такие, которых нет в списке SELECT. Запрос с агрегатами без GROUP BY возвращает ровно одну строку — даже по пустой таблице.
## Что НЕ будет проверяться
Подзапросы; неоднозначные неквалифицированные колонки; «голые» колонки вне GROUP BY в агрегатном запросе; HAVING без GROUP BY; арифметика над строками; сравнение числа со строкой; `%` с вещественными операндами; переполнение int64; порядок строк без ORDER BY; порядок строк с равными ключами ORDER BY.
## Производительность
Таблицы до 50 000 строк. JOIN двух таблиц по 50 000 строк по условию равенства колонок (возможно, с дополнительными условиями через AND), затем WHERE/GROUP BY/ORDER BY — не дольше 3 секунд на обычном ПК.
## Формат ответа
Ответь ТОЛЬКО кодом модуля в одном блоке ```python.
% с отрицательными числами, ROUND(2.5) и ROUND(0.125, 2), NOT IN со списком, где есть NULL, трёхзначная логика AND, OR и NOT. Ещё есть LOWER и UPPER, которые в SQLite меняют регистр только у латиницы, LIKE, который не различает регистр тоже только у латиницы, отрицательные аргументы SUBSTR, превращение дробей в текст при || (0.1+0.2 даёт '0.3'), сортировка NULL, агрегаты по пустой таблице, LEFT JOIN с условием в ON и соединение таблицы с самой собой.ValueError: синтаксическая ошибка, неизвестная таблица, колонка или функция, неверное число аргументов.stream.py), рассуждение было включено. У Qwen для этого служит enable_thinking, у GLM thinking: enabled, у GPT, Grok и Gemini reasoning_effort: high. Opus получал thinking: adaptive и effort high или max через нативный /v1/messages. Kimi и DeepSeek работали в режиме по умолчанию./v1/messages: через chat Opus на задаче не рассуждал. Gemini через шлюз не рассуждает ни при каких параметрах.% над дробями, потому что задание явно исключает эти случаи.high, ни на max: токенов рассуждения ноль, код пошёл с 4-й секунды. Остальные модели тратили на рассуждение от 25 до 130 тысяч токенов.COUNT(*)), Qwen (CASE WHEN) и Opus через API (consume('IDENT')). Ни одна из них не прогнала в голове простейший запрос.effort: max добавлен 29.10.2026, после основного прогона, по тому же протоколу: одно чтение задания и одна запись решения, без запуска кода. Его запустили, чтобы сравнить с Opus через API на том же effort: max: через партнёрский шлюз модель рассуждает заметно меньше. Его время и токены посчитаны по журналу агента.Перед основной задачей была разминка: калькулятор выражений на fractions.Fraction с приоритетами **, унарным минусом, % как в Python, функциями, переменными и ошибками с позицией. Его проверяли 68 скрытых тестов из папки warmup/.
kimi -p прошёл 68 тестов из 68 за 3 мин 19 с.Эти прогоны не попали в рейтинг: результат определила не модель, а условия запуска. Ответы и код сохранены в папке.
"!=", 4 вместо "!=": 4. Это ошибка самой модели. С исправлением одного символа код проходит 260 тестов из 464 и 1 замер скорости из 5, дальше ломается проверка зарезервированных имён.| Модель | Разработчик | ID | Доступ | Лимит ответа |
|---|---|---|---|---|
| Kimi K3.1 Pro | Moonshot AI | kimi-k3.1-pro | API api.moonshot.ai (через VPN роутера) | 128K |
| DeepSeek Flash (V4.1) | DeepSeek | deepseek-flash | API api.deepseek.com | 384K |
| DeepSeek V4 Pro | DeepSeek | deepseek-v4-pro | API api.deepseek.com | 384K |
| Qwen3.8-Max | Alibaba | qwen3.8-max | API token-plan.maas.qwencloudapi.com | 131.1K |
| GLM 5.3 | Z.ai (Zhipu) | glm-5.3 | API api.z.ai | 131.1K |
| GPT-6.1 Sol | OpenAI | gpt-6.1-sol | партнёрский шлюз | 128K |
| GPT-6.1 Terra | OpenAI | gpt-6.1-terra | партнёрский шлюз, reasoning_effort: high | 128K |
| Claude Opus 5.5 (effort max) | Anthropic | claude-opus-5-5 | партнёрский шлюз, нативный /v1/messages, thinking: adaptive, effort: max | 128K |
| Claude Opus 5.5 (effort high) | Anthropic | claude-opus-5-5 | партнёрский шлюз, нативный /v1/messages, thinking: adaptive, effort: high | 128K |
| Claude Opus 5.5 (шлюз, chat) | Anthropic | claude-opus-5-5 | партнёрский шлюз, /v1/chat/completions, reasoning_effort: high | 128K |
| Claude Opus 5.5 (агент) | Anthropic | claude-opus-5-5 | субагент Claude Code, чистый контекст, без запуска кода | — |
| Claude Opus 5.5 (агент, effort max) | Anthropic | claude-opus-5-5 | субагент Claude Code, effort: max, чистый контекст, без запуска кода | — |
| Gemini 3.8 Flash | gemini-3.8-flash | партнёрский шлюз | 128K | |
| Strata Q2, лимит 128K | локальный ПК | qwen3.8-flash-next-q2_0 | Strata на 127.0.0.1:8080 | 128K |
| Strata Q2, лимит 64K | локальный ПК | qwen3.8-flash-next-q2_0 | Strata на 127.0.0.1:8080 | 64K |
| Grok 4.7 | xAI | grok-4.7 | партнёрский шлюз, reasoning_effort: high | 128K |