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()  ("Jonathan S. Katz" <jkatz@postgresql.org>)
Re: BUG #17477: A crash bug in transformValuesClause()  (Alvaro Herrera <alvherre@alvh.no-ip.org>)
Список 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 по дате отправления:

Предыдущее
От: Masahiko Sawada
Дата:
Сообщение: Re: BUG #17477: A crash bug in transformValuesClause()
Следующее
От: PG Bug reporting form
Дата:
Сообщение: BUG #17478: Missing documents in the index after CREATE INDEX CONCURRENTLY (but existing in the table)