mirror of
https://github.com/postgres/postgres.git
synced 2025-11-06 07:49:08 +03:00
Add an "argisrow" field to NullTest nodes, following a plan made way back in
8.2beta but never carried out. This avoids repetitive tests of whether the argument is of scalar or composite type. Also, be a bit more paranoid about composite arguments in some places where we previously weren't checking.
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.281 2009/12/15 17:57:47 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.282 2010/01/01 23:03:10 tgl Exp $
|
||||
*
|
||||
* HISTORY
|
||||
* AUTHOR DATE MAJOR EVENT
|
||||
@@ -1295,7 +1295,7 @@ find_nonnullable_rels_walker(Node *node, bool top_level)
|
||||
/* IS NOT NULL can be considered strict, but only at top level */
|
||||
NullTest *expr = (NullTest *) node;
|
||||
|
||||
if (top_level && expr->nulltesttype == IS_NOT_NULL)
|
||||
if (top_level && expr->nulltesttype == IS_NOT_NULL && !expr->argisrow)
|
||||
result = find_nonnullable_rels_walker((Node *) expr->arg, false);
|
||||
}
|
||||
else if (IsA(node, BooleanTest))
|
||||
@@ -1497,7 +1497,7 @@ find_nonnullable_vars_walker(Node *node, bool top_level)
|
||||
/* IS NOT NULL can be considered strict, but only at top level */
|
||||
NullTest *expr = (NullTest *) node;
|
||||
|
||||
if (top_level && expr->nulltesttype == IS_NOT_NULL)
|
||||
if (top_level && expr->nulltesttype == IS_NOT_NULL && !expr->argisrow)
|
||||
result = find_nonnullable_vars_walker((Node *) expr->arg, false);
|
||||
}
|
||||
else if (IsA(node, BooleanTest))
|
||||
@@ -1601,7 +1601,7 @@ find_forced_null_var(Node *node)
|
||||
/* check for var IS NULL */
|
||||
NullTest *expr = (NullTest *) node;
|
||||
|
||||
if (expr->nulltesttype == IS_NULL)
|
||||
if (expr->nulltesttype == IS_NULL && !expr->argisrow)
|
||||
{
|
||||
Var *var = (Var *) expr->arg;
|
||||
|
||||
@@ -2856,6 +2856,7 @@ eval_const_expressions_mutator(Node *node,
|
||||
newntest = makeNode(NullTest);
|
||||
newntest->arg = (Expr *) relem;
|
||||
newntest->nulltesttype = ntest->nulltesttype;
|
||||
newntest->argisrow = ntest->argisrow;
|
||||
newargs = lappend(newargs, newntest);
|
||||
}
|
||||
/* If all the inputs were constants, result is TRUE */
|
||||
@@ -2867,7 +2868,7 @@ eval_const_expressions_mutator(Node *node,
|
||||
/* Else we need an AND node */
|
||||
return (Node *) make_andclause(newargs);
|
||||
}
|
||||
if (arg && IsA(arg, Const))
|
||||
if (!ntest->argisrow && arg && IsA(arg, Const))
|
||||
{
|
||||
Const *carg = (Const *) arg;
|
||||
bool result;
|
||||
@@ -2893,6 +2894,7 @@ eval_const_expressions_mutator(Node *node,
|
||||
newntest = makeNode(NullTest);
|
||||
newntest->arg = (Expr *) arg;
|
||||
newntest->nulltesttype = ntest->nulltesttype;
|
||||
newntest->argisrow = ntest->argisrow;
|
||||
return (Node *) newntest;
|
||||
}
|
||||
if (IsA(node, BooleanTest))
|
||||
|
||||
Reference in New Issue
Block a user