fix(parcels): rename CTE overlaps → overlap_rows (#1196 hotfix) #1197

Merged
bot-backend merged 1 commit from fix/neighbors-cte-overlaps-keyword into main 2026-06-13 04:09:16 +00:00
Collaborator

Summary

Hotfix регрессии от PR #1195: CTE overlaps AS (...) падает на PG (OVERLAPS — keyword для time-period operator). С момента мерджа PR #1195 каждый POST /analyze возвращал neighbors_summary.data_available: False, neighbors: [] (фронт получал пустой блок соседей), плюс ронял всю остальную часть analyze в aborted-transaction (ird блок, persist analysis_run).

Воспроизведение

Прямой psql на проде:

WITH neighbors AS (...), overlaps AS (...) SELECT ...
-- ERROR: syntax error at or near "overlaps"

WITH neighbors AS (...), overlap_rows AS (...) SELECT ...
-- OK

И через TestClient POST /analyze на 66:41:0304011:1124 — captured WARNING:

neighbors query failed: (psycopg.errors.SyntaxError) syntax error at or near "overlaps"
LINE 24:                 overlaps AS (
                         ^

Что в PR

  • backend/app/api/v1/parcels.py:623,648,650,658 — CTE alias overlapsoverlap_rows, SELECT column alias тоже + Python row["overlap_rows"].
  • Семантика SQL идентична PR #1195. Никаких других изменений.

Почему регрессия прошла CI

tests/api/v1/ патчат БД через MagicMock, SQL не выполняется на реальной PG. Mock не ловит keyword-конфликт. Future-proofing: добавить минимальный integration-тест с настоящей PG для analyze hot-path — отдельный issue, не блокер этого hotfix.

Test plan

  • psql прямой smoke — переименованный CTE работает, отдаёт 6 соседей и 1 overlap для 66:41:0304011:1124.
  • pytest tests/api/v1/ -k analyze → 26 passed (тесты на mock БД продолжают зеленеть — не были задеты).
  • ruff check → All checks passed.
  • Post-deploy: prod replay × 1 на 66:41:0304011:1124 — confirm neighbors_summary.data_available=True + len > 0 + ird.ird_overlaps непустой.

Refs #1196
Regression of: #1195

## Summary Hotfix регрессии от PR #1195: CTE `overlaps AS (...)` падает на PG (`OVERLAPS` — keyword для time-period operator). С момента мерджа PR #1195 **каждый** `POST /analyze` возвращал `neighbors_summary.data_available: False, neighbors: []` (фронт получал пустой блок соседей), плюс ронял всю остальную часть analyze в aborted-transaction (`ird` блок, persist analysis_run). ## Воспроизведение Прямой psql на проде: ```sql WITH neighbors AS (...), overlaps AS (...) SELECT ... -- ERROR: syntax error at or near "overlaps" WITH neighbors AS (...), overlap_rows AS (...) SELECT ... -- OK ``` И через TestClient `POST /analyze` на 66:41:0304011:1124 — captured WARNING: ``` neighbors query failed: (psycopg.errors.SyntaxError) syntax error at or near "overlaps" LINE 24: overlaps AS ( ^ ``` ## Что в PR - `backend/app/api/v1/parcels.py:623,648,650,658` — CTE alias `overlaps` → `overlap_rows`, SELECT column alias тоже + Python `row["overlap_rows"]`. - Семантика SQL идентична PR #1195. Никаких других изменений. ## Почему регрессия прошла CI `tests/api/v1/` патчат БД через `MagicMock`, SQL не выполняется на реальной PG. Mock не ловит keyword-конфликт. **Future-proofing**: добавить минимальный integration-тест с настоящей PG для analyze hot-path — отдельный issue, не блокер этого hotfix. ## Test plan - [x] `psql` прямой smoke — переименованный CTE работает, отдаёт 6 соседей и 1 overlap для `66:41:0304011:1124`. - [x] `pytest tests/api/v1/ -k analyze` → 26 passed (тесты на mock БД продолжают зеленеть — не были задеты). - [x] `ruff check` → All checks passed. - [ ] Post-deploy: prod replay × 1 на 66:41:0304011:1124 — confirm `neighbors_summary.data_available=True` + len > 0 + `ird.ird_overlaps` непустой. Refs #1196 Regression of: #1195
bot-backend added 1 commit 2026-06-13 04:00:11 +00:00
fix(parcels): rename CTE overlaps → overlap_rows (#1196 regression of #1195)
All checks were successful
CI / changes (push) Successful in 7s
CI / changes (pull_request) Successful in 6s
Deploy / changes (push) Successful in 6s
Deploy / build-frontend (push) Has been skipped
Deploy / build-worker (push) Successful in 2m47s
Deploy / deploy (push) Successful in 1m12s
CI / frontend-tests (push) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / backend-tests (push) Successful in 6m28s
CI / backend-tests (pull_request) Successful in 6m25s
Deploy / build-backend (push) Successful in 1m45s
2b23a4b24b
`OVERLAPS` — это PostgreSQL keyword (binary operator для time-periods —
`(start1,end1) OVERLAPS (start2,end2)`). Парсер ругается на `overlaps AS (...)`
в WITH-блоке с

  ERROR: syntax error at or near "overlaps"

→ exception → транзакция в aborted state → весь analyze пайплайн ниже
получает InFailedSqlTransaction (ird_overlays, persist, ird block) → фронт
видит data_available=False, neighbors=[]. Воспроизводится на КАЖДОМ
/analyze с момента мерджа PR #1195.

Mock-БД в pytest tests/api/v1/ синтаксис не проверяет — отсюда регрессия
прошла CI. Прямой psql-replay на проде:
  WITH neighbors AS (...), overlaps AS (...) → syntax error
  WITH neighbors AS (...), overlap_rows AS (...) → ok

Минимальная переименование CTE alias (4 строки: 2 в SQL + 1 в SELECT
column alias + 1 в Python `row["overlap_rows"]`). Семантика идентична PR #1195.

Memory: future-proofing — добавить интеграционный тест с реальной PG для
analyze hot-path (отдельный issue, не блокер этого hotfix).

Refs #1196
bot-backend merged commit 2b23a4b24b into main 2026-06-13 04:09:16 +00:00
bot-backend deleted branch fix/neighbors-cte-overlaps-keyword 2026-06-13 04:09:16 +00:00
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#1197
No description provided.