]> granicus.if.org Git - postgresql/commitdiff
Don't choke when exec_move_row assigns a synthesized null to a column
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 12 Feb 2010 19:37:36 +0000 (19:37 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 12 Feb 2010 19:37:36 +0000 (19:37 +0000)
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.

src/pl/plpgsql/src/pl_exec.c

index e15076a5a8388a48bbe6f4fb78443d57741e8839..a271f57151c9d769feefd7147fe4302a3e69e1f7 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.254 2010/01/19 01:35:31 tgl Exp $
+ *       $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.255 2010/02/12 19:37:36 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -3520,11 +3520,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 */
@@ -3538,7 +3533,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);
@@ -3562,11 +3562,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 */
@@ -3580,7 +3575,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);
@@ -4759,6 +4760,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;
                        }