Re: cache lookup failed for function ...

From: Rolf Schaufelberger <rs(at)plusw(dot)de>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: cache lookup failed for function ...
Date: 2007-08-30 16:12:59
Message-ID: 200708301812.59690.rs@plusw.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

On Donnerstag 30 August 2007, Albe Laurenz wrote:
> Rolf Schaufelberger schrieb:
> > Der Ablauf ist etwa so:
> >
> > Trigger T
> > ruft Funktion A ( param)
> > ruft Funktion B ( param)
> > ruft Funktion C ( param)
> >
> > (C ist die F. welche das falsche Ergenis liefert.
> > Wenn ich Funktion A ( param) direkt aufrufe, ist das
> > Ergebnis falsch,
> > Rufe ich B oder C direkt auf, ist es richtig.
> > Function C ist eine einfache SQL-Funktion (langauge SQL), A
> > und B sind in
> > plsql geschrieben.
> > Ich habe auch alle drei Funktionen gedroppt, neu geladen,
> > Ergebnis immer noch
> > falsch. Bin ratlos.
>
> Ich glaub's noch immer nicht.
>
> Super wäre ein (vereinfachtes) Code-Beispiel, mit dem
> man das Problem nachvollziehen kann.
>
> Laurenz Albe
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: explain analyze is your friend
Ja, ja, hatte doch geschrieben, dass der Fehler in der ersten Funktion lag.

Da ich aber schon mal das Problem hatte, dass eine falsche Funktion aufgerufen
wurde und wegen der Fehlermeldung mit dem cache hatte ich in der falschen
Richtung gesucht.
Das erwähnte Problem mit der falschen Funktion funktionjiert folgendermaßen;

Ich habe die Schema: special1, special2, common,
und die Funktionen: special1.ftest, special2.ftest, common.master
common.master ruft dann : perform ftest();
und soll je nach search_path mal die eine mal die andere aufrufen.
Wenn ich nun folgendes mache:
set search_path to special1, common;
select common.master();
set search_path to special2, common;
select common.master();

wird beides mal special1.ftest aufgerufen!
==================================
CREATE schema special1;
CREATE schema special2;
CREATE schema common;

CREATE OR REPLACE FUNCTION special1.ftest() RETURNS void
LANGUAGE plpgsql VOLATILE AS
$$BEGIN
raise notice 'Special 1';
return;
END;$$;

CREATE OR REPLACE FUNCTION special2.ftest() RETURNS void
LANGUAGE plpgsql VOLATILE AS
$$BEGIN
raise notice 'Special 2';
return;
END;$$;

CREATE OR REPLACE FUNCTION common.master() RETURNS void
LANGUAGE plpgsql VOLATILE AS
$$BEGIN
RAISE NOTICE 'Common Master';
perform ftest();
RETURN;
END;$$;

SET search_path to special1, common;
SELECT common.master();

SET search_path to special2, common;
SELECT common.master();
======================
liefert bei mir:
SET
psql:workspace/trunk/sql/xx.sql:29: NOTICE: Common Master
psql:workspace/trunk/sql/xx.sql:29: NOTICE: Special 1
KONTEXT: SQL statement "SELECT ftest()"
PL/pgSQL function "master" line 3 at perform
master
--------

(1 Zeile)

SET
psql:workspace/trunk/sql/xx.sql:32: NOTICE: Common Master
psql:workspace/trunk/sql/xx.sql:32: NOTICE: Special 1
KONTEXT: SQL statement "SELECT ftest()"
PL/pgSQL function "master" line 3 at perform

Uups !!!


Rolf Schaufelberger

In response to

Responses

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Albe Laurenz 2007-08-31 08:27:21 Re: cache lookup failed for function ...
Previous Message Albe Laurenz 2007-08-30 15:27:51 Re: cache lookup failed for function ...