Skip to content

Commit 62275d5

Browse files
committed
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.
1 parent b98317c commit 62275d5

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

src/backend/executor/execQual.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.263 2010/02/26 02:00:41 momjian Exp $
11+
* $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.263.4.1 2010/08/26 18:54:44 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -2134,6 +2134,16 @@ ExecMakeTableFunctionResult(ExprState *funcexpr,
21342134

21352135
td = DatumGetHeapTupleHeader(result);
21362136

2137+
/*
2138+
* Verify all returned rows have same subtype; necessary in
2139+
* case the type is RECORD.
2140+
*/
2141+
if (HeapTupleHeaderGetTypeId(td) != tupdesc->tdtypeid ||
2142+
HeapTupleHeaderGetTypMod(td) != tupdesc->tdtypmod)
2143+
ereport(ERROR,
2144+
(errcode(ERRCODE_DATATYPE_MISMATCH),
2145+
errmsg("rows returned by function are not all of the same row type")));
2146+
21372147
/*
21382148
* tuplestore_puttuple needs a HeapTuple not a bare
21392149
* HeapTupleHeader, but it doesn't need all the fields.

0 commit comments

Comments
 (0)