pgsql: Revise the planner's handling of "pseudoconstant" WHERE clauses, - Mailing list pgsql-committers

From tgl@postgresql.org (Tom Lane)
Subject pgsql: Revise the planner's handling of "pseudoconstant" WHERE clauses,
Date
Msg-id 20060701183833.D8F4F9FA5CD@postgresql.org
Whole thread Raw
List pgsql-committers
Log Message:
-----------
Revise the planner's handling of "pseudoconstant" WHERE clauses, that is
clauses containing no variables and no volatile functions.  Such a clause
can be used as a one-time qual in a gating Result plan node, to suppress
plan execution entirely when it is false.  Even when the clause is true,
putting it in a gating node wins by avoiding repeated evaluation of the
clause.  In previous PG releases, query_planner() would do this for
pseudoconstant clauses appearing at the top level of the jointree, but
there was no ability to generate a gating Result deeper in the plan tree.
To fix it, get rid of the special case in query_planner(), and instead
process pseudoconstant clauses through the normal RestrictInfo qual
distribution mechanism.  When a pseudoconstant clause is found attached to
a path node in create_plan(), pull it out and generate a gating Result at
that point.  This requires special-casing pseudoconstants in selectivity
estimation and cost_qual_eval, but on the whole it's pretty clean.
It probably even makes the planner a bit faster than before for the normal
case of no pseudoconstants, since removing pull_constant_clauses saves one
useless traversal of the qual tree.  Per gripe from Phil Frost.

Modified Files:
--------------
    pgsql/src/backend/nodes:
        copyfuncs.c (r1.337 -> r1.338)
        (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/nodes/copyfuncs.c.diff?r1=1.337&r2=1.338)
        outfuncs.c (r1.274 -> r1.275)
        (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/nodes/outfuncs.c.diff?r1=1.274&r2=1.275)
    pgsql/src/backend/optimizer:
        README (r1.34 -> r1.35)
        (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/optimizer/README.diff?r1=1.34&r2=1.35)
    pgsql/src/backend/optimizer/path:
        allpaths.c (r1.146 -> r1.147)
        (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/optimizer/path/allpaths.c.diff?r1=1.146&r2=1.147)
        clausesel.c (r1.79 -> r1.80)
        (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/optimizer/path/clausesel.c.diff?r1=1.79&r2=1.80)
        costsize.c (r1.158 -> r1.159)
        (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/optimizer/path/costsize.c.diff?r1=1.158&r2=1.159)
        indxpath.c (r1.208 -> r1.209)
        (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/optimizer/path/indxpath.c.diff?r1=1.208&r2=1.209)
    pgsql/src/backend/optimizer/plan:
        createplan.c (r1.211 -> r1.212)

(http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/optimizer/plan/createplan.c.diff?r1=1.211&r2=1.212)
        initsplan.c (r1.117 -> r1.118)

(http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/optimizer/plan/initsplan.c.diff?r1=1.117&r2=1.118)
        planagg.c (r1.15 -> r1.16)
        (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/optimizer/plan/planagg.c.diff?r1=1.15&r2=1.16)
        planmain.c (r1.93 -> r1.94)
        (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/optimizer/plan/planmain.c.diff?r1=1.93&r2=1.94)
        planner.c (r1.200 -> r1.201)
        (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/optimizer/plan/planner.c.diff?r1=1.200&r2=1.201)
    pgsql/src/backend/optimizer/util:
        clauses.c (r1.212 -> r1.213)
        (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/optimizer/util/clauses.c.diff?r1=1.212&r2=1.213)
        pathnode.c (r1.128 -> r1.129)
        (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/optimizer/util/pathnode.c.diff?r1=1.128&r2=1.129)
        restrictinfo.c (r1.47 -> r1.48)

(http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/optimizer/util/restrictinfo.c.diff?r1=1.47&r2=1.48)
    pgsql/src/include/nodes:
        relation.h (r1.125 -> r1.126)
        (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/include/nodes/relation.h.diff?r1=1.125&r2=1.126)
    pgsql/src/include/optimizer:
        clauses.h (r1.83 -> r1.84)
        (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/include/optimizer/clauses.h.diff?r1=1.83&r2=1.84)
        pathnode.h (r1.68 -> r1.69)
        (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/include/optimizer/pathnode.h.diff?r1=1.68&r2=1.69)
        planmain.h (r1.92 -> r1.93)
        (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/include/optimizer/planmain.h.diff?r1=1.92&r2=1.93)
        restrictinfo.h (r1.36 -> r1.37)
        (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/include/optimizer/restrictinfo.h.diff?r1=1.36&r2=1.37)

pgsql-committers by date:

Previous
From: gsmet@pgfoundry.org (User Gsmet)
Date:
Subject: pgfouine - pgfouine: preparing 0.6.1 release
Next
From: tgl@postgresql.org (Tom Lane)
Date:
Subject: pgsql: Fix oversight in planning for multiple indexscans driven by