-- Der Vorgabewert für die Arbeitstage in hire_employee greift nie. -- -- coalesce(array(select jsonb_array_elements_text(payload->'work_days'))::text[], -- '{Mo,Di,Mi,Do,Fr}') -- -- Fehlt der Schlüssel, liefert die Unterabfrage keine Zeilen, und `array(…)` -- macht daraus ein **leeres** Array — nicht NULL. `coalesce` sieht also -- keinen fehlenden Wert und lässt `{}` stehen. Die Bedingung -- chk_work_days_valid verlangt aber mindestens einen Tag, und die -- Einstellung bricht ab. -- -- Sichtbar ist das bisher nicht, weil der Assistent die Arbeitstage immer -- mitschickt und ohne sie gar nicht weiterlässt. Es ist eine Falle für jeden -- anderen Aufrufer — und ein Vorgabewert, der nichts vorgibt, ist schlimmer -- als keiner: er sieht aus, als wäre der Fall bedacht. -- -- `nullif(…, '{}')` macht aus dem leeren Array wieder ein fehlendes. do $$ declare v_def text; v_neu text; begin select pg_get_functiondef(p.oid) into v_def from pg_proc p join pg_namespace n on n.oid = p.pronamespace where n.nspname = 'public' and p.proname = 'hire_employee' limit 1; v_neu := regexp_replace( v_def, 'coalesce\(\s*array\(\s*select\s+jsonb_array_elements_text\(payload->''work_days''\)\s*\)\s*::text\[\]\s*,', 'coalesce(nullif(array(select jsonb_array_elements_text(payload->''work_days''))::text[], ''{}''),', 'g' ); if v_neu = v_def then raise exception 'Das Muster für die Arbeitstage passte nicht — hire_employee blieb unverändert.'; end if; execute v_neu; end; $$; -- ═══ Gegenprobe ══════════════════════════════════════════════════ -- Der Ausdruck in beiden Formen, damit die Regel festgehalten ist und nicht -- beim nächsten Mal neu entdeckt werden muss. do $$ begin if array(select jsonb_array_elements_text('{}'::jsonb->'work_days')) is null then raise exception 'array() über einen fehlenden Schlüssel liefert null — die Annahme dieser Migration stimmt nicht mehr.'; end if; if coalesce(nullif(array(select jsonb_array_elements_text('{}'::jsonb->'work_days'))::text[], '{}'), '{Mo,Di,Mi,Do,Fr}') <> '{Mo,Di,Mi,Do,Fr}'::text[] then raise exception 'Der korrigierte Ausdruck liefert nicht die Vorgabe.'; end if; if coalesce(nullif(array(select jsonb_array_elements_text('{"work_days":["Mo","Di"]}'::jsonb->'work_days'))::text[], '{}'), '{Mo,Di,Mi,Do,Fr}') <> '{Mo,Di}'::text[] then raise exception 'Der korrigierte Ausdruck überschreibt einen mitgegebenen Wert.'; end if; end; $$;