diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 8fc3252d1b..36ffb8ed4c 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -2150,6 +2150,14 @@ transformRowExpr(ParseState *pstate, RowExpr *r, bool allowDefault) newr->args = transformExpressionList(pstate, r->args, pstate->p_expr_kind, allowDefault); + /* Disallow more columns than will fit in a tuple */ + if (list_length(newr->args) > MaxTupleAttributeNumber) + ereport(ERROR, + (errcode(ERRCODE_TOO_MANY_COLUMNS), + errmsg("ROW expressions can have at most %d entries", + MaxTupleAttributeNumber), + parser_errposition(pstate, r->location))); + /* Barring later casting, we consider the type RECORD */ newr->row_typeid = RECORDOID; newr->row_format = COERCE_IMPLICIT_CAST; diff --git a/src/backend/parser/parse_node.c b/src/backend/parser/parse_node.c index 4d39cf9594..4014db4b80 100644 --- a/src/backend/parser/parse_node.c +++ b/src/backend/parser/parse_node.c @@ -82,7 +82,7 @@ free_parsestate(ParseState *pstate) */ if (pstate->p_next_resno - 1 > MaxTupleAttributeNumber) ereport(ERROR, - (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + (errcode(ERRCODE_TOO_MANY_COLUMNS), errmsg("target lists can have at most %d entries", MaxTupleAttributeNumber)));