Commit 85b587c2 authored by Tom Lane's avatar Tom Lane

Fix thinko in my recent change to put an explicit argisrow field in NullTest:

when the planner splits apart a ROW(...) IS NULL test, the argisrow values
of the component tests have to be determined from the component field types,
not copied from the original NullTest (in which argisrow is surely true).
parent 7e40cdc0
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.283 2010/01/02 16:57:48 momjian Exp $ * $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.284 2010/01/19 16:33:33 tgl Exp $
* *
* HISTORY * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
...@@ -2826,15 +2826,17 @@ eval_const_expressions_mutator(Node *node, ...@@ -2826,15 +2826,17 @@ eval_const_expressions_mutator(Node *node,
context); context);
if (arg && IsA(arg, RowExpr)) if (arg && IsA(arg, RowExpr))
{ {
RowExpr *rarg = (RowExpr *) arg;
List *newargs = NIL;
ListCell *l;
/* /*
* We break ROW(...) IS [NOT] NULL into separate tests on its * We break ROW(...) IS [NOT] NULL into separate tests on its
* component fields. This form is usually more efficient to * component fields. This form is usually more efficient to
* evaluate, as well as being more amenable to optimization. * evaluate, as well as being more amenable to optimization.
*/ */
RowExpr *rarg = (RowExpr *) arg;
List *newargs = NIL;
ListCell *l;
Assert(ntest->argisrow);
foreach(l, rarg->args) foreach(l, rarg->args)
{ {
Node *relem = (Node *) lfirst(l); Node *relem = (Node *) lfirst(l);
...@@ -2856,7 +2858,7 @@ eval_const_expressions_mutator(Node *node, ...@@ -2856,7 +2858,7 @@ eval_const_expressions_mutator(Node *node,
newntest = makeNode(NullTest); newntest = makeNode(NullTest);
newntest->arg = (Expr *) relem; newntest->arg = (Expr *) relem;
newntest->nulltesttype = ntest->nulltesttype; newntest->nulltesttype = ntest->nulltesttype;
newntest->argisrow = ntest->argisrow; newntest->argisrow = type_is_rowtype(exprType(relem));
newargs = lappend(newargs, newntest); newargs = lappend(newargs, newntest);
} }
/* If all the inputs were constants, result is TRUE */ /* If all the inputs were constants, result is TRUE */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment