Re: explain doesn't work with execute using - Mailing list pgsql-hackers

From Tom Lane
Subject Re: explain doesn't work with execute using
Date
Msg-id 21479.1212334585@sss.pgh.pa.us
Whole thread Raw
In response to explain doesn't work with execute using  ("Pavel Stehule" <pavel.stehule@gmail.com>)
Responses Re: explain doesn't work with execute using  ("Pavel Stehule" <pavel.stehule@gmail.com>)
List pgsql-hackers
"Pavel Stehule" <pavel.stehule@gmail.com> writes:
> I found following bug - using explain in stored procedures like:
> ...
> produce wrong result. Real plan is correct, etc variables are
> substituted. Bud this explain show variables.

This seems to be correctable with a one-line patch: make SPI_cursor_open
set the CONST flag on parameters it puts into the portal (attached).
I'm not entirely sure if it's a good idea or not --- comments?
        regards, tom lane

Index: src/backend/executor/spi.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/executor/spi.c,v
retrieving revision 1.195
diff -c -r1.195 spi.c
*** src/backend/executor/spi.c    12 May 2008 20:02:00 -0000    1.195
--- src/backend/executor/spi.c    1 Jun 2008 15:33:13 -0000
***************
*** 997,1003 ****             ParamExternData *prm = ¶mLI->params[k];              prm->ptype = plan->argtypes[k];
!             prm->pflags = 0;             prm->isnull = (Nulls && Nulls[k] == 'n');             if (prm->isnull)
     {
 
--- 997,1010 ----             ParamExternData *prm = ¶mLI->params[k];              prm->ptype = plan->argtypes[k];
!             /*
!              * We mark the parameters as const.  This has no effect for simple
!              * execution of a plan, but if more planning happens within the
!              * portal (eg via EXPLAIN), the effect will be to treat the
!              * parameters as constants.  This is good and correct as long as
!              * no plan generated inside the portal is used outside it.
!              */
!             prm->pflags = PARAM_FLAG_CONST;             prm->isnull = (Nulls && Nulls[k] == 'n');             if
(prm->isnull)            {
 


pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: synchronized scans for VACUUM
Next
From: "Pavel Stehule"
Date:
Subject: Re: explain doesn't work with execute using