aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/parser/parse_relation.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c
index f500774c3cf..2a63de8b4d5 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;