• Tom Lane's avatar
    Reduce "X = X" to "X IS NOT NULL", if it's easy to do so. · 8ec5429e
    Tom Lane authored
    If the operator is a strict btree equality operator, and X isn't volatile,
    then the clause must yield true for any non-null value of X, or null if X
    is null.  At top level of a WHERE clause, we can ignore the distinction
    between false and null results, so it's valid to simplify the clause to
    "X IS NOT NULL".  This is a useful improvement mainly because we'll get
    a far better selectivity estimate in most cases.
    
    Because such cases seldom arise in well-written queries, it is unappetizing
    to expend a lot of planner cycles looking for them ... but it turns out
    that there's a place we can shoehorn this in practically for free, because
    equivclass.c already has to detect and reject candidate equivalences of the
    form X = X.  That doesn't catch every place that it would be valid to
    simplify to X IS NOT NULL, but it catches the typical case.  Working harder
    doesn't seem justified.
    
    Patch by me, reviewed by Petr Jelinek
    
    Discussion: https://postgr.es/m/CAMjNa7cC4X9YR-vAJS-jSYCajhRDvJQnN7m2sLH1wLh-_Z2bsw@mail.gmail.com
    8ec5429e
equivclass.c 80.6 KB