Re: pl/pgsql problem with search_path

From: Eugene Chow <gene(at)paragonam(dot)com>
To: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
Cc: pgsql-bugs(at)postgresql(dot)org
Subject: Re: pl/pgsql problem with search_path
Date: 2003-09-06 23:29:45
Message-ID: FFA9B0D3-E0C1-11D7-9F19-000393B8CD52@paragonam.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

Thanks. If I had only read the manual before posting. I solved it by
using 'execute' instead of 'select into' since the search_path is not
static in my system.

Gene

On Saturday, September 6, 2003, at 04:21 PM, Bruce Momjian wrote:

>
> I think the problem is that the first time the function is called, it
> is
> compiled and cached for later use. At that time the function is bound
> to the table oid, so even though you change the search path, the cached
> copy still calls the old table.
>
> If you exit psql and re-enter, or change the schema _before_ you call
> the function for the first time, it should be fine.
>
> This highlights another problem with our plpgsql function caching.
>
> -----------------------------------------------------------------------
> ----
>
> Eugene Chow wrote:
>> My plpgsql function seems to be ignoring search_path when looking for
>> the right table to select from. I'm running 7.3.4. Below is my test
>> code. Am I doing something wrong?
>>
>> TIA, Gene Chow
>>
>> test=> create or replace function getval() returns varchar as '
>> test'> declare val varchar;
>> test'> begin
>> test'> select into val value from bar limit 1;
>> test'> return val;
>> test'> end;' language 'plpgsql';
>> CREATE FUNCTION
>>
>> test=> create table public.bar ( value varchar );
>> CREATE TABLE
>>
>> test=> insert into public.bar values ('public value');
>> INSERT 4012748 1
>>
>> test=> create schema foo;
>> CREATE SCHEMA
>>
>> test=> create table foo.bar ( value varchar );
>> CREATE TABLE
>>
>> test=> insert into foo.bar values ('foo value');
>> INSERT 4012754 1
>>
>> test=> set search_path to foo, public;
>> SET
>>
>> test=> select *, getval() from bar;
>> value | getval
>> -----------+-----------
>> foo value | foo value
>> (1 row)
>>
>> test=> set search_path to public;
>> SET
>>
>> test=> select *, getval() from bar;
>> value | getval
>> --------------+-----------
>> public value | foo value
>> (1 row)
>>
>>
>> ---------------------------(end of
>> broadcast)---------------------------
>> TIP 7: don't forget to increase your free space map settings
>>
>
> --
> Bruce Momjian | http://candle.pha.pa.us
> pgman(at)candle(dot)pha(dot)pa(dot)us | (610) 359-1001
> + If your life is a hard drive, | 13 Roberts Road
> + Christ can be your backup. | Newtown Square, Pennsylvania
> 19073
>

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Tom Lane 2003-09-07 01:26:24 Re: pl/pgsql problem with search_path
Previous Message Bruce Momjian 2003-09-06 23:21:11 Re: pl/pgsql problem with search_path