Skip site navigation (1) Skip section navigation (2)

Peripheral Links

Header And Logo

PostgreSQL
| The world's most advanced open source database.

Site Navigation

Search for
  Advanced Search

Re: cache lookup failed for function ...



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



Home | Main Index | Thread Index

Privacy Policy | PostgreSQL Archives hosted by Command Prompt, Inc. | Designed by tinysofa
Copyright © 1996 – 2008 PostgreSQL Global Development Group