Konstanta 1/0 jako „líná" tvrdá chyba vybuchne už při plánování dotazu
import { Aside } from ‘@astrojs/starlight/components’;
Symptom
Sekce “Symptom”Kanonizace rolí měla „fail-closed” větev: neznámé OID → COALESCE(pr.rolname, (1/0)::text) →
tvrdá chyba místo tichého zahození. Dotaz ale padal na division by zero vždy, i když žádný
neznámý OID neexistoval.
Root cause
Sekce “Root cause”(1/0) je konstantní výraz — plánovač provádí constant folding při plánování, před vyhodnocením
jediného řádku a bez ohledu na líné vyhodnocování COALESCE/CASE. Lazy sémantika platí až za běhu;
plánování jí předchází.
Fix
Sekce “Fix”-- PŘED (padá při plánování):COALESCE(pr.rolname, (1/0)::text)
-- PO (vyhodnotí se jen pro řádek s NULL jménem):CASE WHEN pr.rolname IS NULL THEN (1/(rr::bigint - rr::bigint))::text -- per-row dělitel, nesloží se ELSE pr.rolname ENDJak se tomu vyvarovat v jiných systémech
Sekce “Jak se tomu vyvarovat v jiných systémech”- Detection: hledat
1/0,0/0v SQL; test „dotaz na prázdné množině projde”. - Anti-pattern: spoléhání na líné COALESCE/CASE s konstantní chybovou větví.
- Lepší přístup: dělitel odvozený ze sloupce, nebo vyhrazená IMMUTABLE funkce s RAISE.