Re: BUG #17477: A crash bug in transformValuesClause()
От | Tom Lane |
---|---|
Тема | Re: BUG #17477: A crash bug in transformValuesClause() |
Дата | |
Msg-id | 3809468.1652109938@sss.pgh.pa.us обсуждение исходный текст |
Ответ на | Re: BUG #17477: A crash bug in transformValuesClause() (Masahiko Sawada <sawada.mshk@gmail.com>) |
Ответы |
Re: BUG #17477: A crash bug in transformValuesClause()
Re: BUG #17477: A crash bug in transformValuesClause() |
Список | pgsql-bugs |
Masahiko Sawada <sawada.mshk@gmail.com> writes: > It seems like transformValuesClause() cannot handle properly the value > clause having a relation that has an empty column. Should we raise an > error in this case? Given that we try to support zero-column relations, I'm not sure why we'd insist on disallowing zero-column VALUES. I think the problem is that the code in transformValuesClause needs to be tweaked to make that work. The attached quick hack seems to do the trick. regards, tom lane diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 0144284aa3..6b54e8e46d 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -1424,7 +1424,7 @@ static Query * transformValuesClause(ParseState *pstate, SelectStmt *stmt) { Query *qry = makeNode(Query); - List *exprsLists; + List *exprsLists = NIL; List *coltypes = NIL; List *coltypmods = NIL; List *colcollations = NIL; @@ -1508,6 +1508,9 @@ transformValuesClause(ParseState *pstate, SelectStmt *stmt) /* Release sub-list's cells to save memory */ list_free(sublist); + + /* Prepare an exprsLists element for this row */ + exprsLists = lappend(exprsLists, NIL); } /* @@ -1551,17 +1554,7 @@ transformValuesClause(ParseState *pstate, SelectStmt *stmt) /* * Finally, rearrange the coerced expressions into row-organized lists. */ - exprsLists = NIL; - foreach(lc, colexprs[0]) - { - Node *col = (Node *) lfirst(lc); - List *sublist; - - sublist = list_make1(col); - exprsLists = lappend(exprsLists, sublist); - } - list_free(colexprs[0]); - for (i = 1; i < sublist_length; i++) + for (i = 0; i < sublist_length; i++) { forboth(lc, colexprs[i], lc2, exprsLists) { @@ -1569,6 +1562,7 @@ transformValuesClause(ParseState *pstate, SelectStmt *stmt) List *sublist = lfirst(lc2); sublist = lappend(sublist, col); + lfirst(lc2) = sublist; } list_free(colexprs[i]); }
В списке pgsql-bugs по дате отправления: