]> granicus.if.org Git - postgresql/commitdiff
Teach nulltestsel() that system columns are never NULL.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 25 Jan 2019 16:44:26 +0000 (11:44 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 25 Jan 2019 16:44:26 +0000 (11:44 -0500)
While it's perhaps unlikely that users would write an explicit test
like "ctid IS NULL", this function is also used in range estimation,
and an incorrect answer can throw off the results for tight ranges.
Anyway it's not much code so we might as well do it.

Edmund Horner

Discussion: https://postgr.es/m/CAMyN-kCa3BFUFrCTtQeprxTU1anCd3Pua7zXstGCKq4pXgjukw@mail.gmail.com

src/backend/utils/adt/selfuncs.c

index dcb35d897520d696c52c40d1c4e273f77d2fa379..4af8c80848d9d48865cba384dcf7f3d127593117 100644 (file)
@@ -1797,6 +1797,15 @@ nulltestsel(PlannerInfo *root, NullTestType nulltesttype, Node *arg,
                                return (Selectivity) 0; /* keep compiler quiet */
                }
        }
+       else if (vardata.var && IsA(vardata.var, Var) &&
+                        ((Var *) vardata.var)->varattno < 0)
+       {
+               /*
+                * There are no stats for system columns, but we know they are never
+                * NULL.
+                */
+               selec = (nulltesttype == IS_NULL) ? 0.0 : 1.0;
+       }
        else
        {
                /*