fix(sql): wrap 73_complexes_master.sql in BEGIN/COMMIT (atomic apply) (#125)

Per code review audit (May 14): файл без transaction wrapper — backfill CTE
INSERTs + view recreations executed как individual auto-commit statements.
Mid-file crash → orphan rows в complexes/complex_sources с no rollback path.

## Fix

`BEGIN;` после header comments (line 31, перед section 1).
`COMMIT;` в конце файла после последнего COMMENT ON VIEW.

Wraps все 6 секций atomically:
1-2: CREATE TABLE + CREATE INDEX для complexes + complex_sources
3-5: 3 backfill CTE INSERTs с ON CONFLICT DO NOTHING
6: DROP VIEW IF EXISTS + CREATE VIEW + COMMENT для v_complex_full

## No CONCURRENTLY split needed

Проверил — все 10 indexes используют plain `CREATE INDEX IF NOT EXISTS` без
CONCURRENTLY keyword. Безопасно обернуть в одну tx.

## Idempotency preserved

Все existing guards остаются:
- CREATE TABLE/INDEX IF NOT EXISTS
- ON CONFLICT (source, source_id) DO NOTHING
- DROP VIEW IF EXISTS

Re-running file двукратно — safe.

## Vault

`fixes/Migration_73_Complexes_Atomic_May14.md` — created (status: resolved).

Co-authored-by: lekss361 <claudestars@proton.me>
This commit is contained in:
lekss361 2026-05-14 23:29:28 +03:00 committed by GitHub
parent a3e7d21e3a
commit 8a266502a1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -27,6 +27,8 @@
--
-- Идемпотентно через ON CONFLICT.
BEGIN;
-- ── 1. complexes (canonical master) ─────────────────────────────────────────
CREATE TABLE IF NOT EXISTS complexes (
@ -316,3 +318,5 @@ SELECT
COMMENT ON VIEW v_complex_with_objective IS
'ЖК + агрегаты Objective per-flat: sold count/pct, средняя цена, '
'диапазон reg_date. NULL во всех колонках = ЖК без Objective-источника.';
COMMIT;