Re: BUG #17477: A crash bug in transformValuesClause() - Mailing list pgsql-bugs

From Tom Lane
Subject Re: BUG #17477: A crash bug in transformValuesClause()
Date
Msg-id 3809468.1652109938@sss.pgh.pa.us
Whole thread Raw
In response to Re: BUG #17477: A crash bug in transformValuesClause()  (Masahiko Sawada <sawada.mshk@gmail.com>)
Responses Re: BUG #17477: A crash bug in transformValuesClause()
Re: BUG #17477: A crash bug in transformValuesClause()
List 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 by date:

Previous
From: Masahiko Sawada
Date:
Subject: Re: BUG #17477: A crash bug in transformValuesClause()
Next
From: PG Bug reporting form
Date:
Subject: BUG #17478: Missing documents in the index after CREATE INDEX CONCURRENTLY (but existing in the table)