pgsql: Postpone extParam/allParam calculations until the very end of pl - Mailing list pgsql-committers

From Tom Lane
Subject pgsql: Postpone extParam/allParam calculations until the very end of pl
Date
Msg-id E1ZPN23-00064Q-RV@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Postpone extParam/allParam calculations until the very end of planning.

Until now we computed these Param ID sets at the end of subquery_planner,
but that approach depends on subquery_planner returning a concrete Plan
tree.  We would like to switch over to returning one or more Paths for a
subquery, and in that representation the necessary details aren't fully
fleshed out (not to mention that we don't really want to do this work for
Paths that end up getting discarded).  Hence, refactor so that we can
compute the param ID sets at the end of planning, just before
set_plan_references is run.

The main change necessary to make this work is that we need to capture
the set of outer-level Param IDs available to the current query level
before exiting subquery_planner, since the outer levels' plan_params lists
are transient.  (That's not going to pose a problem for returning Paths,
since all the work involved in producing that data is part of expression
preprocessing, which will continue to happen before Paths are produced.)
On the plus side, this change gets rid of several existing kluges.

Eventually I'd like to get rid of SS_finalize_plan altogether in favor of
doing this work during set_plan_references, but that will require some
complex rejiggering because SS_finalize_plan needs to visit subplans and
initplans before the main plan.  So leave that idea for another day.

Branch
------
master

Details
-------
http://git.postgresql.org/pg/commitdiff/68fa28f77146653f1fcaa530d2f2f161bf5de479

Modified Files
--------------
src/backend/nodes/outfuncs.c              |    1 +
src/backend/optimizer/plan/createplan.c   |   10 +-
src/backend/optimizer/plan/planagg.c      |   43 +++--
src/backend/optimizer/plan/planner.c      |   37 +++-
src/backend/optimizer/plan/subselect.c    |  266 +++++++++++++++--------------
src/backend/optimizer/prep/prepjointree.c |    1 +
src/include/nodes/relation.h              |    7 +
src/include/optimizer/subselect.h         |    8 +-
src/test/regress/expected/join.out        |   57 +++++++
src/test/regress/sql/join.sql             |   21 +++
10 files changed, 293 insertions(+), 158 deletions(-)


pgsql-committers by date:

Previous
From: Alvaro Herrera
Date:
Subject: pgsql: Don't include rel.h when relcache.h is sufficient
Next
From: Tom Lane
Date:
Subject: pgsql: Fix some possible low-memory failures in regexp compilation.