diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2010-02-12 19:37:43 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2010-02-12 19:37:43 +0000 |
commit | 45c17a7ad52fdb1b281954c475b294281bd2612e (patch) | |
tree | 5f55e533d7544efceaa85d9dfce4da4f03501aab /src | |
parent | f7231399a4d9fb19a12060f74bc8b2990c50e5af (diff) |
Don't choke when exec_move_row assigns a synthesized null to a column
that happens to be composite itself. Per bug #5314 from Oleg Serov.
Backpatch to 8.0 --- 7.4 has got too many other shortcomings in
composite-type support to make this worth worrying about in that branch.
Diffstat (limited to 'src')
-rw-r--r-- | src/pl/plpgsql/src/pl_exec.c | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index e73539d6719..899860a62f7 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.244.2.2 2009/12/29 17:41:09 heikki Exp $ + * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.244.2.3 2010/02/12 19:37:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -3510,11 +3510,6 @@ exec_assign_value(PLpgSQL_execstate *estate, */ PLpgSQL_row *row = (PLpgSQL_row *) target; - /* Source must be of RECORD or composite type */ - if (!type_is_rowtype(valtype)) - ereport(ERROR, - (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("cannot assign non-composite value to a row variable"))); if (*isNull) { /* If source is null, just assign nulls to the row */ @@ -3528,7 +3523,12 @@ exec_assign_value(PLpgSQL_execstate *estate, TupleDesc tupdesc; HeapTupleData tmptup; - /* Else source is a tuple Datum, safe to do this: */ + /* Source must be of RECORD or composite type */ + if (!type_is_rowtype(valtype)) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("cannot assign non-composite value to a row variable"))); + /* Source is a tuple Datum, so safe to do this: */ td = DatumGetHeapTupleHeader(value); /* Extract rowtype info and find a tupdesc */ tupType = HeapTupleHeaderGetTypeId(td); @@ -3552,11 +3552,6 @@ exec_assign_value(PLpgSQL_execstate *estate, */ PLpgSQL_rec *rec = (PLpgSQL_rec *) target; - /* Source must be of RECORD or composite type */ - if (!type_is_rowtype(valtype)) - ereport(ERROR, - (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("cannot assign non-composite value to a record variable"))); if (*isNull) { /* If source is null, just assign nulls to the record */ @@ -3570,7 +3565,13 @@ exec_assign_value(PLpgSQL_execstate *estate, TupleDesc tupdesc; HeapTupleData tmptup; - /* Else source is a tuple Datum, safe to do this: */ + /* Source must be of RECORD or composite type */ + if (!type_is_rowtype(valtype)) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("cannot assign non-composite value to a record variable"))); + + /* Source is a tuple Datum, so safe to do this: */ td = DatumGetHeapTupleHeader(value); /* Extract rowtype info and find a tupdesc */ tupType = HeapTupleHeaderGetTypeId(td); @@ -4639,6 +4640,10 @@ exec_move_row(PLpgSQL_execstate *estate, { value = (Datum) 0; isnull = true; + /* + * InvalidOid is OK because exec_assign_value doesn't care + * about the type of a source NULL + */ valtype = InvalidOid; } |