|
3 | 3 | * procedural language
|
4 | 4 | *
|
5 | 5 | * IDENTIFICATION
|
6 |
| - * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.151 2005/07/28 07:51:13 neilc Exp $ |
| 6 | + * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.152 2005/09/13 16:16:17 tgl Exp $ |
7 | 7 | *
|
8 | 8 | * This software is copyrighted by Jan Wieck - Hamburg.
|
9 | 9 | *
|
@@ -3388,11 +3388,12 @@ exec_assign_value(PLpgSQL_execstate *estate,
|
3388 | 3388 | *
|
3389 | 3389 | * If expectedtypeid isn't InvalidOid, it is checked against the actual type.
|
3390 | 3390 | *
|
3391 |
| - * This obviously only handles scalar datums (not whole records or rows); |
3392 |
| - * at present it doesn't need to handle PLpgSQL_expr datums, either. |
| 3391 | + * At present this doesn't handle PLpgSQL_expr or PLpgSQL_arrayelem datums. |
3393 | 3392 | *
|
3394 | 3393 | * NOTE: caller must not modify the returned value, since it points right
|
3395 |
| - * at the stored value in the case of pass-by-reference datatypes. |
| 3394 | + * at the stored value in the case of pass-by-reference datatypes. In some |
| 3395 | + * cases we have to palloc a return value, and in such cases we put it into |
| 3396 | + * the estate's short-term memory context. |
3396 | 3397 | */
|
3397 | 3398 | static void
|
3398 | 3399 | exec_eval_datum(PLpgSQL_execstate *estate,
|
@@ -3997,34 +3998,34 @@ make_tuple_from_row(PLpgSQL_execstate *estate,
|
3997 | 3998 | int natts = tupdesc->natts;
|
3998 | 3999 | HeapTuple tuple;
|
3999 | 4000 | Datum *dvalues;
|
4000 |
| - char *nulls; |
| 4001 | + bool *nulls; |
4001 | 4002 | int i;
|
4002 | 4003 |
|
4003 | 4004 | if (natts != row->nfields)
|
4004 | 4005 | return NULL;
|
4005 | 4006 |
|
4006 | 4007 | dvalues = (Datum *) palloc0(natts * sizeof(Datum));
|
4007 |
| - nulls = (char *) palloc(natts * sizeof(char)); |
4008 |
| - MemSet(nulls, 'n', natts); |
| 4008 | + nulls = (bool *) palloc(natts * sizeof(bool)); |
4009 | 4009 |
|
4010 | 4010 | for (i = 0; i < natts; i++)
|
4011 | 4011 | {
|
4012 |
| - PLpgSQL_var *var; |
| 4012 | + Oid fieldtypeid; |
4013 | 4013 |
|
4014 | 4014 | if (tupdesc->attrs[i]->attisdropped)
|
4015 |
| - continue; /* leave the column as null */ |
| 4015 | + { |
| 4016 | + nulls[i] = true; /* leave the column as null */ |
| 4017 | + continue; |
| 4018 | + } |
4016 | 4019 | if (row->varnos[i] < 0) /* should not happen */
|
4017 | 4020 | elog(ERROR, "dropped rowtype entry for non-dropped column");
|
4018 | 4021 |
|
4019 |
| - var = (PLpgSQL_var *) (estate->datums[row->varnos[i]]); |
4020 |
| - if (var->datatype->typoid != tupdesc->attrs[i]->atttypid) |
| 4022 | + exec_eval_datum(estate, estate->datums[row->varnos[i]], |
| 4023 | + InvalidOid, &fieldtypeid, &dvalues[i], &nulls[i]); |
| 4024 | + if (fieldtypeid != tupdesc->attrs[i]->atttypid) |
4021 | 4025 | return NULL;
|
4022 |
| - dvalues[i] = var->value; |
4023 |
| - if (!var->isnull) |
4024 |
| - nulls[i] = ' '; |
4025 | 4026 | }
|
4026 | 4027 |
|
4027 |
| - tuple = heap_formtuple(tupdesc, dvalues, nulls); |
| 4028 | + tuple = heap_form_tuple(tupdesc, dvalues, nulls); |
4028 | 4029 |
|
4029 | 4030 | pfree(dvalues);
|
4030 | 4031 | pfree(nulls);
|
|
0 commit comments