diff options
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/parse_expr.c | 8 | ||||
-rw-r--r-- | src/backend/parser/parse_node.c | 2 |
2 files changed, 9 insertions, 1 deletions
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 97f535a2f00..a903f7ab16d 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -2267,6 +2267,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 1baf7ef31f1..d1e2a71f9e9 100644 --- a/src/backend/parser/parse_node.c +++ b/src/backend/parser/parse_node.c @@ -83,7 +83,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))); |