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: