Обсуждение: Refcursor problem
Hi,
I am running 7.2b3 and trying to make something like this work (new
refcursor stuff):
CREATE TABLE t (c text);
CREATE FUNCTION errtest(refcursor, text) RETURNS refcursor AS '
BEGIN
OPEN $1 FOR SELECT c FROM t WHERE c=$2;
RETURN $1;
END;
' LANGUAGE 'plpgsql';
INSERT INTO t VALUES ('123');
BEGIN;
SELECT errtest('rs', '123');
FETCH ALL IN rs;
COMMIT;
I am getting this error after FETCH ALL....
psql:errtest.sql:15: ERROR: MemoryContextAlloc: invalid request size
2139062147
If I tweak the function, the size in the error message (2139062147) stays
the same.
However, if I change the function to
CREATE FUNCTION errtest(refcursor, integer) RETURNS refcursor AS '
BEGIN
OPEN $1 FOR SELECT c FROM t WHERE c=text($2);
RETURN $1;
END;
' LANGUAGE 'plpgsql';
BEGIN;
SELECT errtest('rs', 123);
FETCH ALL IN rs;
COMMIT;
everything works fine. Am I missing something here? Workaround?
The OS is Linux Red Hat 7.1, kernel 2.4.5, glibc 2.2.4
Thanks for your help!
Dmitry Fomichev
Dmitry Fomichev <dfomichev@reldata.com> writes:
> I am running 7.2b3 and trying to make something like this work (new
> refcursor stuff):
> CREATE TABLE t (c text);
> CREATE FUNCTION errtest(refcursor, text) RETURNS refcursor AS '
> BEGIN
> OPEN $1 FOR SELECT c FROM t WHERE c=$2;
> RETURN $1;
> END;
> ' LANGUAGE 'plpgsql';
> INSERT INTO t VALUES ('123');
> BEGIN;
> SELECT errtest('rs', '123');
> FETCH ALL IN rs;
> COMMIT;
> I am getting this error after FETCH ALL....
> psql:errtest.sql:15: ERROR: MemoryContextAlloc: invalid request size
> 2139062147
Nasty. It looks like SPI_cursor_open needs to be careful to copy
by-reference parameter values into the memory context created for
the cursor portal. Will fix.
regards, tom lane
Tom Lane wrote:
> Dmitry Fomichev <dfomichev@reldata.com> writes:
> > I am running 7.2b3 and trying to make something like this work (new
> > refcursor stuff):
>
> > CREATE TABLE t (c text);
>
> > CREATE FUNCTION errtest(refcursor, text) RETURNS refcursor AS '
> > BEGIN
> > OPEN $1 FOR SELECT c FROM t WHERE c=$2;
> > RETURN $1;
> > END;
> > ' LANGUAGE 'plpgsql';
>
> > INSERT INTO t VALUES ('123');
>
> > BEGIN;
> > SELECT errtest('rs', '123');
> > FETCH ALL IN rs;
> > COMMIT;
>
> > I am getting this error after FETCH ALL....
>
> > psql:errtest.sql:15: ERROR: MemoryContextAlloc: invalid request size
> > 2139062147
>
> Nasty. It looks like SPI_cursor_open needs to be careful to copy
> by-reference parameter values into the memory context created for
> the cursor portal. Will fix.
It doesn't do? Blame it on me. Thanks.
Jan
--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#================================================== JanWieck@Yahoo.com #
_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com