*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/spi.c,v 1.63 2001/11/21 18:30:58 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/executor/spi.c,v 1.64 2002/01/03 20:30:47 tgl Exp $
*
*-------------------------------------------------------------------------
*/
#include "commands/command.h"
#include "executor/spi_priv.h"
#include "tcop/tcopprot.h"
+#include "utils/lsyscache.h"
uint32 SPI_processed = 0;
/* If the plan has parameters, put them into the executor state */
if (spiplan->nargs > 0)
{
- ParamListInfo paramLI = (ParamListInfo) palloc((spiplan->nargs + 1) *
- sizeof(ParamListInfoData));
+ ParamListInfo paramLI;
+
+ paramLI = (ParamListInfo) palloc((spiplan->nargs + 1) *
+ sizeof(ParamListInfoData));
+ MemSet(paramLI, 0, (spiplan->nargs + 1) * sizeof(ParamListInfoData));
eState->es_param_list_info = paramLI;
for (k = 0; k < spiplan->nargs; paramLI++, k++)
paramLI->kind = PARAM_NUM;
paramLI->id = k + 1;
paramLI->isnull = (Nulls && Nulls[k] == 'n');
- paramLI->value = Values[k];
+ if (paramLI->isnull)
+ {
+ /* nulls just copy */
+ paramLI->value = Values[k];
+ }
+ else
+ {
+ /* pass-by-ref values must be copied into portal context */
+ int16 paramTypLen;
+ bool paramTypByVal;
+
+ get_typlenbyval(spiplan->argtypes[k],
+ ¶mTypLen, ¶mTypByVal);
+ paramLI->value = datumCopy(Values[k],
+ paramTypByVal, paramTypLen);
+ }
}
paramLI->kind = PARAM_INVALID;
}
state = CreateExecutorState();
if (nargs > 0)
{
- ParamListInfo paramLI = (ParamListInfo) palloc((nargs + 1) *
- sizeof(ParamListInfoData));
+ ParamListInfo paramLI;
+
+ paramLI = (ParamListInfo) palloc((nargs + 1) *
+ sizeof(ParamListInfoData));
+ MemSet(paramLI, 0, (nargs + 1) * sizeof(ParamListInfoData));
state->es_param_list_info = paramLI;
for (k = 0; k < plan->nargs; paramLI++, k++)