fix(sql): escape apostrophe in migration 99 COMMENT (deploy hotfix) #224

Merged
lekss361 merged 1 commit from fix/migration-99-apostrophe into main 2026-05-16 18:24:18 +00:00
Owner

Summary

Hotfix для упавшего deploy после merge PR #222 (feat/94-pr3-denorm-entities).

Ошибка:

→ Applying migration: 99_nspd_entities_denorm.sql
ERROR: syntax error at or near "а"
LINE 2: '3-сегментный квартал последнего harvest'а. Используется...
                                                  ^
FAILED on migration: 99_nspd_entities_denorm.sql

Unescaped апостроф в COMMENT ON COLUMN ... IS '...harvest'а...' закрывает SQL literal раньше времени → парсер видит а вне строки.

Fix: harvest'аharvest''а (стандартный SQL-escape).

Других unescaped апострофов в SQL literals в этом файле нет — остальные 3 находятся в SQL-комментариях (--), безопасно.

Test plan

  • git diff — изменение только в одной строке (line 75)
  • Auto-deploy после merge — миграция 99 должна примениться (BEGIN / CREATE TABLE / COMMENT × N / COMMIT)
  • Verify через SSH tunnel: SELECT 1 FROM _schema_migrations WHERE filename = '99_nspd_entities_denorm.sql';
  • Verify table exists: \d nspd_parcels and \d nspd_buildings
## Summary Hotfix для упавшего deploy после merge PR #222 (`feat/94-pr3-denorm-entities`). **Ошибка:** ``` → Applying migration: 99_nspd_entities_denorm.sql ERROR: syntax error at or near "а" LINE 2: '3-сегментный квартал последнего harvest'а. Используется... ^ FAILED on migration: 99_nspd_entities_denorm.sql ``` Unescaped апостроф в `COMMENT ON COLUMN ... IS '...harvest'а...'` закрывает SQL literal раньше времени → парсер видит `а` вне строки. **Fix:** `harvest'а` → `harvest''а` (стандартный SQL-escape). Других unescaped апострофов в SQL literals в этом файле нет — остальные 3 находятся в SQL-комментариях (`--`), безопасно. ## Test plan - [x] `git diff` — изменение только в одной строке (line 75) - [ ] Auto-deploy после merge — миграция 99 должна примениться (BEGIN / CREATE TABLE / COMMENT × N / COMMIT) - [ ] Verify через SSH tunnel: `SELECT 1 FROM _schema_migrations WHERE filename = '99_nspd_entities_denorm.sql';` - [ ] Verify table exists: `\d nspd_parcels` and `\d nspd_buildings`
lekss361 added 1 commit 2026-05-16 18:23:08 +00:00
PR #222 deploy failed на 99_nspd_entities_denorm.sql:
  ERROR: syntax error at or near "а"
  LINE 2: '3-сегментный квартал последнего harvest'а. Используется...

Unescaped apostrophe в COMMENT string closes literal early.
Fix: harvest'а → harvest''а (SQL escape).

Других unescaped апострофов в SQL литералах нет (другие 3 — в SQL комментариях
'--' , безопасно).
lekss361 merged commit ea7a8f4aeb into main 2026-05-16 18:24:18 +00:00
Author
Owner

Merged via deep-code-reviewer — verdict APPROVE.

Все 5 чекпоинтов подтверждены:

  1. SQL escape '' корректен (SQL standard / PostgreSQL).
  2. Других unescaped апострофов в SQL literals в файле нет — остальные находятся в -- комментариях (lines 3-4, 58, 103, 131).
  3. Idempotency: BEGIN/COMMIT + CREATE TABLE IF NOT EXISTS + CREATE INDEX IF NOT EXISTS — ре-apply безопасен.
  4. _schema_migrations не получил insert (предыдущая транзакция откатилась) — миграция будет re-picked.
  5. Scope минимален: 1 файл, 1 строка, 1 коммит.

Auto-deploy сейчас должен подхватить fix → migration 99 применится → containers обновятся на images из PR #222.

Verify post-deploy:

  • SELECT filename FROM _schema_migrations WHERE filename = '99_nspd_entities_denorm.sql';
  • \d nspd_parcels / \d nspd_buildings
Merged via deep-code-reviewer — verdict APPROVE. Все 5 чекпоинтов подтверждены: 1. SQL escape `''` корректен (SQL standard / PostgreSQL). 2. Других unescaped апострофов в SQL literals в файле нет — остальные находятся в `--` комментариях (lines 3-4, 58, 103, 131). 3. Idempotency: `BEGIN/COMMIT` + `CREATE TABLE IF NOT EXISTS` + `CREATE INDEX IF NOT EXISTS` — ре-apply безопасен. 4. `_schema_migrations` не получил insert (предыдущая транзакция откатилась) — миграция будет re-picked. 5. Scope минимален: 1 файл, 1 строка, 1 коммит. Auto-deploy сейчас должен подхватить fix → migration 99 применится → containers обновятся на images из PR #222. Verify post-deploy: - `SELECT filename FROM _schema_migrations WHERE filename = '99_nspd_entities_denorm.sql';` - `\d nspd_parcels` / `\d nspd_buildings`
Author
Owner

Deep review — verdict APPROVE

Хотфикс корректный. Проверено:

  • Diff L75: harvest'аharvest''а — стандартный SQL-escape (PostgreSQL doubled-quote), парсер увидит литерал harvest'а внутри строки. Fix точечный, scope минимальный.
  • Прошёлся по всем апострофам в 99_nspd_entities_denorm.sql — других unescaped апострофов в SQL literals нет:
    • L66–69, L72, L78–79, L139–142, L145–146, L149–150, L165, L168–169 — литералы чистые (внутри нет одиночных ').
    • L3, L26, L58, L100, L103, L107, L131 — апострофы только в ---комментариях, парсер игнорирует.
    • L145 "Многоквартирный дом" и "Нежилое здание" — двойные кавычки (literal embedded), не апострофы.
  • Idempotency сохранена: BEGIN/COMMIT обёртка + CREATE TABLE IF NOT EXISTS + CREATE INDEX IF NOT EXISTS. После предыдущего падения миграция откатилась атомарно → re-apply безопасный, _schema_migrations запись не появилась.
  • Migration order по правилу sql.md соблюдён (миграция первая, новые таблицы только потом читаются кодом из PR #222).

PR уже merged автором (commit ea7a8f4). После авто-деплоя верифицировать:

  • SELECT 1 FROM _schema_migrations WHERE filename = '99_nspd_entities_denorm.sql';
  • \d nspd_parcels / \d nspd_buildings
## Deep review — verdict APPROVE Хотфикс корректный. Проверено: - Diff L75: `harvest'а` → `harvest''а` — стандартный SQL-escape (PostgreSQL doubled-quote), парсер увидит литерал `harvest'а` внутри строки. Fix точечный, scope минимальный. - Прошёлся по всем апострофам в `99_nspd_entities_denorm.sql` — других unescaped апострофов **в SQL literals** нет: - L66–69, L72, L78–79, L139–142, L145–146, L149–150, L165, L168–169 — литералы чистые (внутри нет одиночных `'`). - L3, L26, L58, L100, L103, L107, L131 — апострофы только в `--`-комментариях, парсер игнорирует. - L145 `"Многоквартирный дом"` и `"Нежилое здание"` — двойные кавычки (literal embedded), не апострофы. - Idempotency сохранена: `BEGIN/COMMIT` обёртка + `CREATE TABLE IF NOT EXISTS` + `CREATE INDEX IF NOT EXISTS`. После предыдущего падения миграция откатилась атомарно → re-apply безопасный, `_schema_migrations` запись не появилась. - Migration order по правилу sql.md соблюдён (миграция первая, новые таблицы только потом читаются кодом из PR #222). PR уже merged автором (commit `ea7a8f4`). После авто-деплоя верифицировать: - `SELECT 1 FROM _schema_migrations WHERE filename = '99_nspd_entities_denorm.sql';` - `\d nspd_parcels` / `\d nspd_buildings`
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#224
No description provided.