AURORA-1922: алиас подзапроса в 0012 для PostgreSQL 15 #221

Open
aep wants to merge 2 commits from feat/205-aurora-1922-pg15-migration-0012 into test
Owner

Closes #205

Задача: AURORA-1922

Что сделано

  • Миграция 0012_del_project.sql (v3.can_delete_project): в подзапросе select count(*) from ( ... ) в FROM не было алиаса. PostgreSQL 15.12 такое не принимает («subquery in FROM must have an alias»), миграция падала на контуре. PostgreSQL 16 принимает, поэтому проблема не была видна. Добавлен алиас AS active_reports на закрывающей скобке подзапроса; смысл не меняется.
  • Регрессионный unit-тест api/tests/unit/test_sql_migrations_pg15_compat.py (без БД): сканирует alembic/versions/sql/*.sql и alembic/versions/*.py, требует алиас у каждого подзапроса в FROM. Падал на 0012_del_project.sql:27 до правки. Включена самопроверка сканера на синтетическом тексте.

Почему правится старая миграция

Новая миграция не поможет: 0012 выполняется раньше, и падение происходит на нём. На базах, где 0012 уже применена, правка ничего не меняет (функция уже создана; переопределения по CREATE OR REPLACE в более поздних миграциях содержат тот же код, но это вне данного PR). Правка нужна только для чистого развёртывания миграций на PG15.

На PostgreSQL 16 и 15 результат одинаковый

  • PG 15.12 (dfip-pg15): alembic upgrade head с нуля проходит до 0049; полный pytest --init_db: 202 passed, 3 failed, 4 skipped.
  • PG 16.15 (временный контейнер, остановлен после проверки): то же самое, 202 passed, 3 failed, 4 skipped.
  • Три падения исходные, не связаны с PR: test_backend_calls_form3_add_project_and_add_line_functions, test_export_full_form_ignores_non_applicable_params_for_other_sheets, test_export_form_payload_forwards_ignore_flag.
  • Было 200 passed; +2 новых теста (регрессия и самопроверка сканера).

Тесты

  • pytest tests/unit/test_sql_migrations_pg15_compat.py: 2 passed (до правки регрессия падала).
  • Полный набор на PG15 и PG16: 202 passed / 3 failed (исходные) / 4 skipped.

Проверить руками

  • Нет (бэкенд, без UI).

Замер до/после

Не применимо (миграция, не производительность).

Rulings I made

  • R-1: алиас назван active_reports (имя по смыслу подзапроса). Обоснование: имя не влияет на результат. Цена ошибки: минимальная, переименование без последствий.
  • R-2: сканер проверяет только FROM ( (как в ТЗ), JOIN ( не проверяется. Список «не алиас» расширен сверх ТЗ (RIGHT, FULL, OUTER, NATURAL, FOR, FETCH, USING, LATERAL, TABLESAMPLE). Обоснование: эти слова стоят после подзапроса и алиасом не являются. Цена ошибки: при появлении JOIN (select ...) без алиаса тест его не поймает.

🤖 Generated with Claude Code

Closes #205 Задача: AURORA-1922 ## Что сделано - Миграция `0012_del_project.sql` (`v3.can_delete_project`): в подзапросе `select count(*) from ( ... )` в FROM не было алиаса. PostgreSQL 15.12 такое не принимает («subquery in FROM must have an alias»), миграция падала на контуре. PostgreSQL 16 принимает, поэтому проблема не была видна. Добавлен алиас `AS active_reports` на закрывающей скобке подзапроса; смысл не меняется. - Регрессионный unit-тест `api/tests/unit/test_sql_migrations_pg15_compat.py` (без БД): сканирует `alembic/versions/sql/*.sql` и `alembic/versions/*.py`, требует алиас у каждого подзапроса в FROM. Падал на `0012_del_project.sql:27` до правки. Включена самопроверка сканера на синтетическом тексте. ## Почему правится старая миграция Новая миграция не поможет: 0012 выполняется раньше, и падение происходит на нём. На базах, где 0012 уже применена, правка ничего не меняет (функция уже создана; переопределения по `CREATE OR REPLACE` в более поздних миграциях содержат тот же код, но это вне данного PR). Правка нужна только для чистого развёртывания миграций на PG15. ## На PostgreSQL 16 и 15 результат одинаковый - PG 15.12 (`dfip-pg15`): `alembic upgrade head` с нуля проходит до 0049; полный pytest `--init_db`: 202 passed, 3 failed, 4 skipped. - PG 16.15 (временный контейнер, остановлен после проверки): то же самое, 202 passed, 3 failed, 4 skipped. - Три падения исходные, не связаны с PR: `test_backend_calls_form3_add_project_and_add_line_functions`, `test_export_full_form_ignores_non_applicable_params_for_other_sheets`, `test_export_form_payload_forwards_ignore_flag`. - Было 200 passed; +2 новых теста (регрессия и самопроверка сканера). ## Тесты - `pytest tests/unit/test_sql_migrations_pg15_compat.py`: 2 passed (до правки регрессия падала). - Полный набор на PG15 и PG16: 202 passed / 3 failed (исходные) / 4 skipped. ## Проверить руками - Нет (бэкенд, без UI). ## Замер до/после Не применимо (миграция, не производительность). ## Rulings I made - R-1: алиас назван `active_reports` (имя по смыслу подзапроса). Обоснование: имя не влияет на результат. Цена ошибки: минимальная, переименование без последствий. - R-2: сканер проверяет только `FROM (` (как в ТЗ), `JOIN (` не проверяется. Список «не алиас» расширен сверх ТЗ (RIGHT, FULL, OUTER, NATURAL, FOR, FETCH, USING, LATERAL, TABLESAMPLE). Обоснование: эти слова стоят после подзапроса и алиасом не являются. Цена ошибки: при появлении `JOIN (select ...)` без алиаса тест его не поймает. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 2 commits 2026-10-28 17:10:44 +03:00
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
На PostgreSQL 15 подзапрос в FROM без алиаса не принимается, миграция
падала. Добавлен алиас active_reports, смысл не меняется. Правка старой
миграции: 0012 выполняется раньше любой новой, на базах, где 0012 уже
применена, ничего не меняет.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This pull request can be merged automatically.
You are not authorized to merge this pull request.

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/205-aurora-1922-pg15-migration-0012:feat/205-aurora-1922-pg15-migration-0012
git checkout feat/205-aurora-1922-pg15-migration-0012
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/DFiP_Budget_planing#221
No description provided.