8000 Fix ExecMakeTableFunctionResult to verify that all rows returned by a… · danielcode/postgres@c2c90a5 · GitHub
[go: up one dir, main page]

Skip to content

Commit c2c90a5

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 703cd9c commit c2c90a5

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.183.2.7 2009/12/29 17:41:35 heikki Exp $
11+
* $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.183.2.8 2010/08/26 18:55:12 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -1509,6 +1509,16 @@ ExecMakeTableFunctionResult(ExprState *funcexpr,
15091509

15101510
td = DatumGetHeapTupleHeader(result);
15111511

1512+
/*
1513+
* Verify all returned rows have same subtype; necessary in
1514+
* case the type is RECORD.
1515+
*/
1516+
if (HeapTupleHeaderGetTypeId(td) != tupdesc->tdtypeid ||
1517+
HeapTupleHeaderGetTypMod(td) != tupdesc->tdtypmod)
1518+
ereport(ERROR,
1519+
(errcode(ERRCODE_DATATYPE_MISMATCH),
1520+
errmsg("rows returned by function are not all of the same row type")));
1521+
15121522
/*
15131523
* tuplestore_puttuple needs a HeapTuple not a bare
15141524
* HeapTupleHeader, but it doesn't need all the fields.

0 commit comments

Comments< 3175 /div> (0)
0