Fix thinko in my recent change to put an explicit argisrow field in NullTest:
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 19 Jan 2010 16:33:33 +0000 (16:33 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 19 Jan 2010 16:33:33 +0000 (16:33 +0000)
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).

src/backend/optimizer/util/clauses.c

index a66d8391c5711ba998048269002ff99103feca6e..5910246dc9a8a7905c4bdbc1959f174a51716235 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * 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
  *   AUTHOR            DATE            MAJOR EVENT
@@ -2826,15 +2826,17 @@ eval_const_expressions_mutator(Node *node,
                                             context);
        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
             * component fields.  This form is usually more efficient to
             * 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)
            {
                Node       *relem = (Node *) lfirst(l);
@@ -2856,7 +2858,7 @@ eval_const_expressions_mutator(Node *node,
                newntest = makeNode(NullTest);
                newntest->arg = (Expr *) relem;
                newntest->nulltesttype = ntest->nulltesttype;
-               newntest->argisrow = ntest->argisrow;
+               newntest->argisrow = type_is_rowtype(exprType(relem));
                newargs = lappend(newargs, newntest);
            }
            /* If all the inputs were constants, result is TRUE */