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]);
}