88 *
99 *
1010 * IDENTIFICATION
11- * $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.281 2009/12/15 17:57:47 tgl Exp $
11+ * $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.282 2010/01/01 23:03:10 tgl Exp $
1212 *
1313 * HISTORY
1414 * AUTHORDATEMAJOR EVENT
@@ -1295,7 +1295,7 @@ find_nonnullable_rels_walker(Node *node, bool top_level)
12951295/* IS NOT NULL can be considered strict, but only at top level */
12961296NullTest * expr = (NullTest * )node ;
12971297
1298- if (top_level && expr -> nulltesttype == IS_NOT_NULL )
1298+ if (top_level && expr -> nulltesttype == IS_NOT_NULL && ! expr -> argisrow )
12991299result = find_nonnullable_rels_walker ((Node * )expr -> arg , false);
13001300}
13011301else if (IsA (node ,BooleanTest ))
@@ -1497,7 +1497,7 @@ find_nonnullable_vars_walker(Node *node, bool top_level)
14971497/* IS NOT NULL can be considered strict, but only at top level */
14981498NullTest * expr = (NullTest * )node ;
14991499
1500- if (top_level && expr -> nulltesttype == IS_NOT_NULL )
1500+ if (top_level && expr -> nulltesttype == IS_NOT_NULL && ! expr -> argisrow )
15011501result = find_nonnullable_vars_walker ((Node * )expr -> arg , false);
15021502}
15031503else if (IsA (node ,BooleanTest ))
@@ -1601,7 +1601,7 @@ find_forced_null_var(Node *node)
16011601/* check for var IS NULL */
16021602NullTest * expr = (NullTest * )node ;
16031603
1604- if (expr -> nulltesttype == IS_NULL )
1604+ if (expr -> nulltesttype == IS_NULL && ! expr -> argisrow )
16051605{
16061606Var * var = (Var * )expr -> arg ;
16071607
@@ -2856,6 +2856,7 @@ eval_const_expressions_mutator(Node *node,
28562856newntest = makeNode (NullTest );
28572857newntest -> arg = (Expr * )relem ;
28582858newntest -> nulltesttype = ntest -> nulltesttype ;
2859+ newntest -> argisrow = ntest -> argisrow ;
28592860newargs = lappend (newargs ,newntest );
28602861}
28612862/* If all the inputs were constants, result is TRUE */
@@ -2867,7 +2868,7 @@ eval_const_expressions_mutator(Node *node,
28672868/* Else we need an AND node */
28682869return (Node * )make_andclause (newargs );
28692870}
2870- if (arg && IsA (arg ,Const ))
2871+ if (! ntest -> argisrow && arg && IsA (arg ,Const ))
28712872{
28722873Const * carg = (Const * )arg ;
28732874bool result ;
@@ -2893,6 +2894,7 @@ eval_const_expressions_mutator(Node *node,
28932894newntest = makeNode (NullTest );
28942895newntest -> arg = (Expr * )arg ;
28952896newntest -> nulltesttype = ntest -> nulltesttype ;
2897+ newntest -> argisrow = ntest -> argisrow ;
28962898return (Node * )newntest ;
28972899}
28982900if (IsA (node ,BooleanTest ))