From a7d6f3fe0a5d42a96c711cc33e6962b9a2f6511f Mon Sep 17 00:00:00 2001 From: Petr Jelinek Date: Sat, 7 Oct 2017 15:10:54 +0200 Subject: [PATCH] Transform X=X expressions into X IS NOT NULL --- src/backend/optimizer/path/equivclass.c | 12 ------------ src/backend/optimizer/plan/initsplan.c | 11 +++++++++++ 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c index 7997f50c18..d4ffdf66f2 100644 --- a/src/backend/optimizer/path/equivclass.c +++ b/src/backend/optimizer/path/equivclass.c @@ -154,18 +154,6 @@ process_equivalence(PlannerInfo *root, RestrictInfo *restrictinfo, collation); /* - * Reject clauses of the form X=X. These are not as redundant as they - * might seem at first glance: assuming the operator is strict, this is - * really an expensive way to write X IS NOT NULL. So we must not risk - * just losing the clause, which would be possible if there is already a - * single-element EquivalenceClass containing X. The case is not common - * enough to be worth contorting the EC machinery for, so just reject the - * clause and let it be processed as a normal restriction clause. - */ - if (equal(item1, item2)) - return false; /* X=X is not a useful equivalence */ - - /* * If below outer join, check for strictness, else reject. */ if (below_outer_join) diff --git a/src/backend/optimizer/plan/initsplan.c b/src/backend/optimizer/plan/initsplan.c index 9931dddba4..1c3672a978 100644 --- a/src/backend/optimizer/plan/initsplan.c +++ b/src/backend/optimizer/plan/initsplan.c @@ -2347,6 +2347,17 @@ process_implied_equality(PlannerInfo *root, return; } } + else if (equal(item1, item2)) + { + NullTest *ntest; + ntest = makeNode(NullTest); + ntest->arg = item1; + ntest->nulltesttype = IS_NOT_NULL; + ntest->argisrow = false; + ntest->location = exprLocation((Node *) clause); + + clause = (Expr *) ntest; + } /* * Push the new clause into all the appropriate restrictinfo lists. -- 2.11.0