/*
* Use the column definition list to construct a tupdesc and fill
- * in the RangeTblFunction's lists.
+ * in the RangeTblFunction's lists. Limit number of columns to
+ * MaxHeapAttributeNumber, because CheckAttributeNamesTypes will.
*/
+ if (list_length(coldeflist) > MaxHeapAttributeNumber)
+ ereport(ERROR,
+ (errcode(ERRCODE_TOO_MANY_COLUMNS),
+ errmsg("column definition lists can have at most %d entries",
+ MaxHeapAttributeNumber),
+ parser_errposition(pstate,
+ exprLocation((Node *) coldeflist))));
tupdesc = CreateTemplateTupleDesc(list_length(coldeflist));
i = 1;
foreach(col, coldeflist)
if (rangefunc->ordinality)
totalatts++;
+ /* Disallow more columns than will fit in a tuple */
+ if (totalatts > MaxTupleAttributeNumber)
+ ereport(ERROR,
+ (errcode(ERRCODE_TOO_MANY_COLUMNS),
+ errmsg("functions in FROM can return at most %d columns",
+ MaxTupleAttributeNumber),
+ parser_errposition(pstate,
+ exprLocation((Node *) funcexprs))));
+
/* Merge the tuple descs of each function into a composite one */
tupdesc = CreateTemplateTupleDesc(totalatts);
natts = 0;
Alias *eref;
int numaliases;
+ Assert(pstate != NULL);
+
+ /* Disallow more columns than will fit in a tuple */
+ if (list_length(tf->colnames) > MaxTupleAttributeNumber)
+ ereport(ERROR,
+ (errcode(ERRCODE_TOO_MANY_COLUMNS),
+ errmsg("functions in FROM can return at most %d columns",
+ MaxTupleAttributeNumber),
+ parser_errposition(pstate,
+ exprLocation((Node *) tf))));
+ Assert(list_length(tf->coltypes) == list_length(tf->colnames));
+ Assert(list_length(tf->coltypmods) == list_length(tf->colnames));
+ Assert(list_length(tf->colcollations) == list_length(tf->colnames));
+
refname = alias ? alias->aliasname :
pstrdup(tf->functype == TFT_XMLTABLE ? "xmltable" : "json_table");
- Assert(pstate != NULL);
-
rte->rtekind = RTE_TABLEFUNC;
rte->relid = InvalidOid;
rte->subquery = NULL;