-- Klammern in hire_employee. -- -- Der Protokolleintrag baute den Namen so: -- -- payload->>'first_name' || ' ' || payload->>'last_name' -- -- In PostgreSQL bindet `||` **stärker** als `->>`. Gelesen wird also -- -- payload ->> ('first_name' || ' ' || payload) ->> 'last_name' -- -- und das endet in „operator does not exist: text ->> unknown". Jede -- Neueinstellung scheiterte daran. -- -- Warum es niemandem auffiel: davor stand in derselben Anweisung ein Aufruf -- von auth.uid(). Die Rechteprüfung auf das Schema `auth` schlug schon -- während der Analyse fehl, und der Parser kam nie bis zu diesem Ausdruck. -- Ein Fehler hat den anderen verdeckt — beide mussten weg, damit eine -- Einstellung durchläuft. do $$ declare v_def text; v_alt constant text := 'payload->>''first_name'' || '' '' || payload->>''last_name'''; v_neu constant text := '(payload->>''first_name'') || '' '' || (payload->>''last_name'')'; 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; if v_def is null then raise exception 'hire_employee() nicht gefunden.'; end if; if position(v_alt in v_def) = 0 then raise notice 'hire_employee(): bereits geklammert.'; else execute replace(v_def, v_alt, v_neu); raise notice 'hire_employee(): geklammert.'; end if; end; $$; -- ═══ Gegenprobe ══════════════════════════════════════════════════ -- Der Ausdruck selbst, in beiden Lesarten. Ohne Klammern wirft er; mit -- Klammern kommt der Name heraus. Das hält die Regel fest, damit sie beim -- nächsten Mal nicht neu entdeckt werden muss. do $$ declare v_payload jsonb := '{"first_name": "Anna", "last_name": "Berger"}'::jsonb; v_name text; begin v_name := (v_payload->>'first_name') || ' ' || (v_payload->>'last_name'); if v_name <> 'Anna Berger' then raise exception 'Geklammert ergibt „%" statt „Anna Berger".', v_name; end if; begin execute $probe$ select ('{"a":"x"}'::jsonb)->>'a' || ' ' || ('{"a":"x"}'::jsonb)->>'a' $probe$; raise exception 'Ungeklammert wirft nicht mehr — die Vorrangregel hat sich geändert, die Prüfung ist wertlos geworden.'; exception when undefined_function then null; -- erwartet: text ->> unknown end; end; $$;