diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index f500774c3c..2a63de8b4d 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -1830,8 +1830,16 @@ addRangeTableEntryForFunction(ParseState *pstate, /* * 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) @@ -1911,6 +1919,15 @@ addRangeTableEntryForFunction(ParseState *pstate, 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; @@ -1993,11 +2010,23 @@ addRangeTableEntryForTableFunc(ParseState *pstate, 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;