Fix ExecMakeTableFunctionResult to verify that all rows returned by a SRF

returning "record" actually do have the same rowtype.  This is needed because
the parser can't realistically enforce that they will all have the same typmod,
as seen in a recent example from David Wheeler.

Back-patch to 8.0, which is as far back as we have the notion of RECORD
subtypes being distinguished by typmod.  Wheeler's example depends on
8.4-and-up features, but I suspect there may be ways to provoke similar
failures before 8.4.
This commit is contained in:
Tom Lane 2010-08-26 18:55:06 +00:00
parent b64f3bcf72
commit 89af2fe797

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.199.2.4 2009/12/29 17:41:25 heikki Exp $
* $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.199.2.5 2010/08/26 18:55:06 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@ -1632,6 +1632,16 @@ ExecMakeTableFunctionResult(ExprState *funcexpr,
td = DatumGetHeapTupleHeader(result);
/*
* Verify all returned rows have same subtype; necessary in
* case the type is RECORD.
*/
if (HeapTupleHeaderGetTypeId(td) != tupdesc->tdtypeid ||
HeapTupleHeaderGetTypMod(td) != tupdesc->tdtypmod)
ereport(ERROR,
(errcode(ERRCODE_DATATYPE_MISMATCH),
errmsg("rows returned by function are not all of the same row type")));
/*
* tuplestore_puttuple needs a HeapTuple not a bare
* HeapTupleHeader, but it doesn't need all the fields.