Re: BUG #17561: Server crashes on executing row() with very long argument list
От | Tom Lane |
---|---|
Тема | Re: BUG #17561: Server crashes on executing row() with very long argument list |
Дата | |
Msg-id | 3768321.1659105655@sss.pgh.pa.us обсуждение исходный текст |
Ответ на | Re: BUG #17561: Server crashes on executing row() with very long argument list (Tom Lane <tgl@sss.pgh.pa.us>) |
Ответы |
Re: BUG #17561: Server crashes on executing row() with very long argument list
|
Список | pgsql-bugs |
I wrote: > I think the parser should've prevented this. It's in charge of > rejecting overlength SELECT lists, for example. Also, the limit > probably needs to be just MaxTupleAttributeNumber. Concretely, about as attached. In the existing code, if you just supply 10000 or so columns you reach this error in heaptuple.c: if (numberOfAttributes > MaxTupleAttributeNumber) ereport(ERROR, (errcode(ERRCODE_TOO_MANY_COLUMNS), errmsg("number of columns (%d) exceeds limit (%d)", numberOfAttributes, MaxTupleAttributeNumber))); I borrowed the errcode from that, but the wording from parse_node.c: if (pstate->p_next_resno - 1 > MaxTupleAttributeNumber) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("target lists can have at most %d entries", MaxTupleAttributeNumber))); I'm a bit inclined to adjust parse_node.c to also use TOO_MANY_COLUMNS (54011) instead of the generic PROGRAM_LIMIT_EXCEEDED (54000). regards, tom lane diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 9f567f4bf4..059cb7097c 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -2140,6 +2140,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;
В списке pgsql-bugs по дате отправления: