Re: cache lookup failed for function ...

From: "Albe Laurenz" <all(at)adv(dot)magwien(dot)gv(dot)at>
To: "Rolf Schaufelberger *EXTERN*" <rs(at)plusw(dot)de>, <pgsql-de-allgemein(at)postgresql(dot)org>
Subject: Re: cache lookup failed for function ...
Date: 2007-08-30 12:26:42
Message-ID: D960CB61B694CF459DCFB4B0128514C222123E@exadv11.host.magwien.gv.at
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

Rolf Schaufelberger schrieb:
> ich arbeite in meinem Projekt viel mit Trigger und Functions.
> Dabei werden z.T. Funktionen durch die Trigger
> aufgerufen (perform ...)
> Dabei stelle ich manchmal Probleme fest derart, dass
> falsche Berechnungen durchgeführt werden, da ein Trigger
> eine Funktion verwendet, die im Cache liegt! Wenn ich
> die Funktion nur neu lade (create or replace.. ) wird
> trotzdem die alte verwendet, wenn ich sie droppe und
> neu lade bekomme ich die Fehlermeldung aus dem Betreff.
> Meine Grundsätzliche Frage: Wo ist dieses verhalten
> (caching von Funktionen) dokumentiert und kann man das
> beeinflussen ? Wann / Wie wird der cache gelöscht ?

Wahrscheinlich verstehe ich das falsch, aber sowas kann's
eigentlich nicht geben. Siehe folgendes Beispiel:

CREATE TABLE test(id integer PRIMARY KEY);

CREATE OR REPLACE FUNCTION tr() RETURNS trigger
LANGUAGE plpgsql VOLATILE AS
$$BEGIN
RAISE NOTICE 'Erste Version, aufgerufen mit %', NEW.id;
RETURN NULL;
END;$$;

CREATE TRIGGER test_i AFTER INSERT ON test FOR EACH ROW
EXECUTE PROCEDURE tr();

INSERT INTO test(id) VALUES (42);
NOTICE: Erste Version, aufgerufen mit 42

SELECT oid FROM pg_proc WHERE proname='tr';
oid
-------
45834
(1 row)

CREATE OR REPLACE FUNCTION tr() RETURNS trigger
LANGUAGE plpgsql VOLATILE AS
$$BEGIN
RAISE NOTICE 'Zweite Version, aufgerufen mit %', NEW.id;
RETURN NULL;
END;$$;

INSERT INTO test(id) VALUES (-1);
NOTICE: Zweite Version, aufgerufen mit -1

SELECT oid FROM pg_proc WHERE proname='tr';
oid
-------
45834
(1 row)

Funktionen werden einfach ersetzt, und die OID ändert
sich nicht. Das heißt, auch ein Statement, das bereits
vor dem Ersetzen der Funktion ausgeführt wurde und nachher
wiederverwendet wird (in einer PL/pgSQL-Funktion z.B.),
wird die geänderte Funktion verwenden.
Im Ausführungsplan werden Objekte über OID referenziert.

Liebe Grüße,
Laurenz Albe

In response to

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Albe Laurenz 2007-08-30 15:27:51 Re: cache lookup failed for function ...
Previous Message Stefan Kaltenbrunner 2007-08-30 12:16:42 Re: cache lookup failed for function ...