Skip to content

Commit 5b0fa0c

Browse files
committed
Fix make_tuple_from_row to support nested rowtypes, per gripe from
Roman Neuhauser. Update some obsolete comments for exec_eval_datum, too.
1 parent d6bc885 commit 5b0fa0c

File tree

1 file changed

+16
-15
lines changed

1 file changed

+16
-15
lines changed

src/pl/plpgsql/src/pl_exec.c

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* procedural language
44
*
55
* 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 $
77
*
88
* This software is copyrighted by Jan Wieck - Hamburg.
99
*
@@ -3388,11 +3388,12 @@ exec_assign_value(PLpgSQL_execstate *estate,
33883388
*
33893389
* If expectedtypeid isn't InvalidOid, it is checked against the actual type.
33903390
*
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.
33933392
*
33943393
* 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.
33963397
*/
33973398
static void
33983399
exec_eval_datum(PLpgSQL_execstate *estate,
@@ -3997,34 +3998,34 @@ make_tuple_from_row(PLpgSQL_execstate *estate,
39973998
int natts = tupdesc->natts;
39983999
HeapTuple tuple;
39994000
Datum *dvalues;
4000-
char *nulls;
4001+
bool *nulls;
40014002
int i;
40024003

40034004
if (natts != row->nfields)
40044005
return NULL;
40054006

40064007
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));
40094009

40104010
for (i = 0; i < natts; i++)
40114011
{
4012-
PLpgSQL_var *var;
4012+
Oid fieldtypeid;
40134013

40144014
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+
}
40164019
if (row->varnos[i] < 0) /* should not happen */
40174020
elog(ERROR, "dropped rowtype entry for non-dropped column");
40184021

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)
40214025
return NULL;
4022-
dvalues[i] = var->value;
4023-
if (!var->isnull)
4024-
nulls[i] = ' ';
40254026
}
40264027

4027-
tuple = heap_formtuple(tupdesc, dvalues, nulls);
4028+
tuple = heap_form_tuple(tupdesc, dvalues, nulls);
40284029

40294030
pfree(dvalues);
40304031
pfree(nulls);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy