|
8 | 8 | * |
9 | 9 | * |
10 | 10 | * IDENTIFICATION |
11 | | - * $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.150 2006/04/04 19:35:34 tgl Exp $ |
| 11 | + * $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.151 2006/04/22 01:25:58 tgl Exp $ |
12 | 12 | * |
13 | 13 | *------------------------------------------------------------------------- |
14 | 14 | */ |
@@ -885,33 +885,33 @@ SPI_cursor_open(const char *name, void *plan, |
885 | 885 | /* If the plan has parameters, set them up */ |
886 | 886 | if (spiplan->nargs > 0) |
887 | 887 | { |
888 | | - paramLI = (ParamListInfo) palloc0((spiplan->nargs + 1) * |
889 | | - sizeof(ParamListInfoData)); |
| 888 | + /* sizeof(ParamListInfoData) includes the first array element */ |
| 889 | + paramLI = (ParamListInfo) palloc(sizeof(ParamListInfoData) + |
| 890 | + (spiplan->nargs - 1) * sizeof(ParamExternData)); |
| 891 | + paramLI->numParams = spiplan->nargs; |
890 | 892 |
|
891 | 893 | for (k = 0; k < spiplan->nargs; k++) |
892 | 894 | { |
893 | | - paramLI[k].kind = PARAM_NUM; |
894 | | - paramLI[k].id = k + 1; |
895 | | - paramLI[k].ptype = spiplan->argtypes[k]; |
896 | | - paramLI[k].isnull = (Nulls && Nulls[k] == 'n'); |
897 | | - if (paramLI[k].isnull) |
| 895 | + ParamExternData *prm = ¶mLI->params[k]; |
| 896 | + |
| 897 | + prm->ptype = spiplan->argtypes[k]; |
| 898 | + prm->isnull = (Nulls && Nulls[k] == 'n'); |
| 899 | + if (prm->isnull) |
898 | 900 | { |
899 | 901 | /* nulls just copy */ |
900 | | - paramLI[k].value = Values[k]; |
| 902 | + prm->value = Values[k]; |
901 | 903 | } |
902 | 904 | else |
903 | 905 | { |
904 | 906 | /* pass-by-ref values must be copied into portal context */ |
905 | 907 | int16 paramTypLen; |
906 | 908 | bool paramTypByVal; |
907 | 909 |
|
908 | | - get_typlenbyval(spiplan->argtypes[k], |
909 | | - ¶mTypLen, ¶mTypByVal); |
910 | | - paramLI[k].value = datumCopy(Values[k], |
911 | | - paramTypByVal, paramTypLen); |
| 910 | + get_typlenbyval(prm->ptype, ¶mTypLen, ¶mTypByVal); |
| 911 | + prm->value = datumCopy(Values[k], |
| 912 | + paramTypByVal, paramTypLen); |
912 | 913 | } |
913 | 914 | } |
914 | | - paramLI[k].kind = PARAM_INVALID; |
915 | 915 | } |
916 | 916 | else |
917 | 917 | paramLI = NULL; |
@@ -1334,18 +1334,19 @@ _SPI_execute_plan(_SPI_plan *plan, Datum *Values, const char *Nulls, |
1334 | 1334 | { |
1335 | 1335 | int k; |
1336 | 1336 |
|
1337 | | - paramLI = (ParamListInfo) |
1338 | | - palloc0((nargs + 1) * sizeof(ParamListInfoData)); |
| 1337 | + /* sizeof(ParamListInfoData) includes the first array element */ |
| 1338 | + paramLI = (ParamListInfo) palloc(sizeof(ParamListInfoData) + |
| 1339 | + (nargs - 1) * sizeof(ParamExternData)); |
| 1340 | + paramLI->numParams = nargs; |
1339 | 1341 |
|
1340 | 1342 | for (k = 0; k < nargs; k++) |
1341 | 1343 | { |
1342 | | - paramLI[k].kind = PARAM_NUM; |
1343 | | - paramLI[k].id = k + 1; |
1344 | | - paramLI[k].ptype = plan->argtypes[k]; |
1345 | | - paramLI[k].isnull = (Nulls && Nulls[k] == 'n'); |
1346 | | - paramLI[k].value = Values[k]; |
| 1344 | + ParamExternData *prm = ¶mLI->params[k]; |
| 1345 | + |
| 1346 | + prm->value = Values[k]; |
| 1347 | + prm->isnull = (Nulls && Nulls[k] == 'n'); |
| 1348 | + prm->ptype = plan->argtypes[k]; |
1347 | 1349 | } |
1348 | | - paramLI[k].kind = PARAM_INVALID; |
1349 | 1350 | } |
1350 | 1351 | else |
1351 | 1352 | paramLI = NULL; |
|
0 commit comments