|
8 | 8 | * |
9 | 9 | * |
10 | 10 | * IDENTIFICATION |
11 | | - * $Header: /cvsroot/pgsql/src/backend/executor/spi.c,v 1.63 2001/11/21 18:30:58 tgl Exp $ |
| 11 | + * $Header: /cvsroot/pgsql/src/backend/executor/spi.c,v 1.64 2002/01/03 20:30:47 tgl Exp $ |
12 | 12 | * |
13 | 13 | *------------------------------------------------------------------------- |
14 | 14 | */ |
|
19 | 19 | #include"commands/command.h" |
20 | 20 | #include"executor/spi_priv.h" |
21 | 21 | #include"tcop/tcopprot.h" |
| 22 | +#include"utils/lsyscache.h" |
22 | 23 |
|
23 | 24 |
|
24 | 25 | uint32SPI_processed=0; |
@@ -782,16 +783,34 @@ SPI_cursor_open(char *name, void *plan, Datum *Values, char *Nulls) |
782 | 783 | /* If the plan has parameters, put them into the executor state */ |
783 | 784 | if (spiplan->nargs>0) |
784 | 785 | { |
785 | | -ParamListInfoparamLI= (ParamListInfo)palloc((spiplan->nargs+1)* |
786 | | -sizeof(ParamListInfoData)); |
| 786 | +ParamListInfoparamLI; |
| 787 | + |
| 788 | +paramLI= (ParamListInfo)palloc((spiplan->nargs+1)* |
| 789 | +sizeof(ParamListInfoData)); |
| 790 | +MemSet(paramLI,0, (spiplan->nargs+1)*sizeof(ParamListInfoData)); |
787 | 791 |
|
788 | 792 | eState->es_param_list_info=paramLI; |
789 | 793 | for (k=0;k<spiplan->nargs;paramLI++,k++) |
790 | 794 | { |
791 | 795 | paramLI->kind=PARAM_NUM; |
792 | 796 | paramLI->id=k+1; |
793 | 797 | paramLI->isnull= (Nulls&&Nulls[k]=='n'); |
794 | | -paramLI->value=Values[k]; |
| 798 | +if (paramLI->isnull) |
| 799 | +{ |
| 800 | +/* nulls just copy */ |
| 801 | +paramLI->value=Values[k]; |
| 802 | +} |
| 803 | +else |
| 804 | +{ |
| 805 | +/* pass-by-ref values must be copied into portal context */ |
| 806 | +int16paramTypLen; |
| 807 | +boolparamTypByVal; |
| 808 | + |
| 809 | +get_typlenbyval(spiplan->argtypes[k], |
| 810 | +¶mTypLen,¶mTypByVal); |
| 811 | +paramLI->value=datumCopy(Values[k], |
| 812 | +paramTypByVal,paramTypLen); |
| 813 | +} |
795 | 814 | } |
796 | 815 | paramLI->kind=PARAM_INVALID; |
797 | 816 | } |
@@ -1077,8 +1096,11 @@ _SPI_execute_plan(_SPI_plan *plan, Datum *Values, char *Nulls, int tcount) |
1077 | 1096 | state=CreateExecutorState(); |
1078 | 1097 | if (nargs>0) |
1079 | 1098 | { |
1080 | | -ParamListInfoparamLI= (ParamListInfo)palloc((nargs+1)* |
1081 | | -sizeof(ParamListInfoData)); |
| 1099 | +ParamListInfoparamLI; |
| 1100 | + |
| 1101 | +paramLI= (ParamListInfo)palloc((nargs+1)* |
| 1102 | +sizeof(ParamListInfoData)); |
| 1103 | +MemSet(paramLI,0, (nargs+1)*sizeof(ParamListInfoData)); |
1082 | 1104 |
|
1083 | 1105 | state->es_param_list_info=paramLI; |
1084 | 1106 | for (k=0;k<plan->nargs;paramLI++,k++) |
|