BUG #2945: possibly forgotten SPI_push()/SPI_pop()

Поиск
Список
Период
Сортировка
От Sergiy Vyshnevetskiy
Тема BUG #2945: possibly forgotten SPI_push()/SPI_pop()
Дата
Msg-id 200701301311.l0UDB96M007717@wwwmaster.postgresql.org
обсуждение исходный текст
Ответы Re: BUG #2945: possibly forgotten SPI_push()/SPI_pop()  (Sergiy Vyshnevetskiy <serg@vostok.net>)
Re: BUG #2945: possibly forgotten SPI_push()/SPI_pop()  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-bugs
The following bug has been logged online:

Bug reference:      2945
Logged by:          Sergiy Vyshnevetskiy
Email address:      serg@vostok.net
PostgreSQL version: 8.2.1
Operating system:   FreeBSD-6 stable
Description:        possibly forgotten SPI_push()/SPI_pop()
Details:

Preparation:

#psql  = serg@[local]:5432 test
create or replace function "ifLow"() returns int immutable strict language
plpgsql as $F$begin return 0; end$F$;
CREATE FUNCTION
#psql  = serg@[local]:5432 test
create or replace function "ifHigh"() returns int immutable strict language
plpgsql as $F$begin return 5; end$F$;
CREATE FUNCTION
#psql  = serg@[local]:5432 test
create domain "D5" as int not null check(value between "ifLow"() and
"ifHigh"());
CREATE DOMAIN
#psql  = serg@[local]:5432 test



This works:

#psql  = serg@[local]:5432 test
create or replace function "D5"(int) returns int immutable strict language
plpgsql as $F$begin if($1<"ifLow"())then return "ifLow"();
elsif($1>"ifHigh"())then return "ifHigh"(); end if; return $1; end$F$;
CREATE FUNCTION
#psql  = serg@[local]:5432 test D5
----
  3
(1 запись)
#psql  = serg@[local]:5432 test
drop function "D5"(int);
DROP FUNCTION
#psql  = serg@[local]:5432 test

This doesn't work:

#psql  = serg@[local]:5432 test
create or replace function "D5"(int) returns "D5" immutable strict language
plpgsql as $F$begin if($1<"ifLow"())then return "ifLow"();
elsif($1>"ifHigh"())then return "ifHigh"(); end if; return $1; end$F$;
CREATE FUNCTION
#psql  = serg@[local]:5432 test
select "D5"(3);
ERROR:  SPI_connect failed: SPI_ERROR_CONNECT
КОНТЕКСТ:  PL/pgSQL function "D5" while casting return value to
function's return type
#psql  = serg@[local]:5432 test


Analysis:

The only difference is return type of "D5" function: int works, "D5"
doesn't.

The error is reported during an attempt to call "ifLow"() at "D5" domain
check evaluation.

Casus belli is calling SPI_connect() when _SPI_curid==-1 and
_SPI_connected==0.

Possible reason is forgotten SPI_push()/SPI_pop() wrapper in domain check
evaluation algorithm.

В списке pgsql-bugs по дате отправления:

Предыдущее
От: "Michael Schmidt"
Дата:
Сообщение: Re: BUG #2931: Can't capture pg_dump Password prompt
Следующее
От: Sergiy Vyshnevetskiy
Дата:
Сообщение: Re: BUG #2945: possibly forgotten SPI_push()/SPI_pop()