fix(shared): missing Platform parameter leaves @Platform in SQL and breaks session creation with PostgreSQL 42883 #133

Closed
opened 2026-06-09 14:19:27 +03:00 by Toutsu · 1 comment
Owner

Симптом

После деплоя v3.9.7 пользователь нажал ✅ Создать в wizard'е — бот ответил:

💥 Ошибка: 42883: operator does not exist: @ character varying
Попытка 1/3.

Подтверждённый root cause

Через SSH на 192.168.50.220 прочитаны PostgreSQL logs контейнера gmrelaybot-db-1. PostgreSQL получил statement с незаменённым @Platform:

INSERT INTO group_managers (group_id, player_id, role)
SELECT $1, p.id, $2
FROM players p
WHERE p.platform = @Platform
  AND p.external_user_id = $3
ON CONFLICT (group_id, player_id) DO NOTHING

В src/GmRelay.Shared/Features/Sessions/CreateSession/CreateSessionHandler.cs SQL использовал @Platform, но anonymous object для group_managers insert передавал только GroupId, ExternalGmId, OwnerRole. Dapper.AOT заменил остальные параметры на $1/$2/$3, а @Platform оставил literal. PostgreSQL распарсил @ как operator и вернул 42883.

Почему баг проявился только сейчас

Баг был скрыт предыдущими блокерами:

  • v3.9.6 восстановил Telegram polling после missing libgssapi_krb5.so.2.
  • v3.9.7 позволил no-limit sessions пройти validation.
  • После этого wizard впервые дошёл до group_managers insert.

Решение (3.9.8)

  1. Добавить Platform = platform в parameter object для group_managers insert.
  2. Добавить Testcontainers/PostgreSQL regression test: new platform group creation must add Owner and persist session.
  3. Синхронизировать версию 3.9.8.
## Симптом После деплоя `v3.9.7` пользователь нажал `✅ Создать` в wizard'е — бот ответил: ``` 💥 Ошибка: 42883: operator does not exist: @ character varying Попытка 1/3. ``` ## Подтверждённый root cause Через SSH на `192.168.50.220` прочитаны PostgreSQL logs контейнера `gmrelaybot-db-1`. PostgreSQL получил statement с незаменённым `@Platform`: ```sql INSERT INTO group_managers (group_id, player_id, role) SELECT $1, p.id, $2 FROM players p WHERE p.platform = @Platform AND p.external_user_id = $3 ON CONFLICT (group_id, player_id) DO NOTHING ``` В `src/GmRelay.Shared/Features/Sessions/CreateSession/CreateSessionHandler.cs` SQL использовал `@Platform`, но anonymous object для `group_managers` insert передавал только `GroupId`, `ExternalGmId`, `OwnerRole`. Dapper.AOT заменил остальные параметры на `$1/$2/$3`, а `@Platform` оставил literal. PostgreSQL распарсил `@` как operator и вернул `42883`. ## Почему баг проявился только сейчас Баг был скрыт предыдущими блокерами: - `v3.9.6` восстановил Telegram polling после missing `libgssapi_krb5.so.2`. - `v3.9.7` позволил no-limit sessions пройти validation. - После этого wizard впервые дошёл до `group_managers` insert. ## Решение (3.9.8) 1. Добавить `Platform = platform` в parameter object для `group_managers` insert. 2. Добавить Testcontainers/PostgreSQL regression test: new platform group creation must add Owner and persist session. 3. Синхронизировать версию `3.9.8`.
Toutsu changed title from fix(shared): INSERT INTO players ON CONFLICT inference fails with 42883 in HandleAsync — wizard завершается с PG error to fix(shared): missing Platform parameter leaves @Platform in SQL and breaks session creation with PostgreSQL 42883 2026-06-09 15:19:04 +03:00
Toutsu added reference 2026-06-09 15:19:04 +03:00
Toutsu added reference 2026-06-09 15:19:31 +03:00
Author
Owner

Реализовано в PR #134 и выпущено в v3.9.8.

Root cause подтверждён production PostgreSQL logs: в group_managers insert оставался незаменённый @Platform, потому что параметр Platform отсутствовал в Dapper parameter object.

Реализовано в PR #134 и выпущено в v3.9.8. - PR: https://git.codeanddice.ru/Toutsu/GmRelayBot/pulls/134 - Release: https://git.codeanddice.ru/Toutsu/GmRelayBot/releases/tag/v3.9.8 - Merge commit: `5014ca5c58cb5c43cb0d64ce90077bce780dbdf3` - PR checks: run #313 — success - Deploy: run #314 — success Root cause подтверждён production PostgreSQL logs: в `group_managers` insert оставался незаменённый `@Platform`, потому что параметр `Platform` отсутствовал в Dapper parameter object.
Toutsu added reference 2026-06-09 15:57:13 +03:00
Toutsu added reference 2026-06-09 15:57:48 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Toutsu/GmRelayBot#133