Přeskočit na obsah

Konstanta 1/0 jako „líná" tvrdá chyba vybuchne už při plánování dotazu

import { Aside } from ‘@astrojs/starlight/components’;

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.

(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í.

-- 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 END

Jak se tomu vyvarovat v jiných systémech

Sekce “Jak se tomu vyvarovat v jiných systémech”
  • Detection: hledat 1/0, 0/0 v 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.
Přidal aiarchitekt.cz · 13. 8. 2026 2:00
Provozuje aiarchitekt.cz