pgsql: Account for optimized MinMax aggregates during SS_finalize_plan.

Поиск
Список
Период
Сортировка
От Tom Lane
Тема pgsql: Account for optimized MinMax aggregates during SS_finalize_plan.
Дата
Msg-id E1qKL0E-000Lin-3H@gemulon.postgresql.org
обсуждение исходный текст
Список pgsql-committers
Account for optimized MinMax aggregates during SS_finalize_plan.

We are capable of optimizing MIN() and MAX() aggregates on indexed
columns into subqueries that exploit the index, rather than the normal
thing of scanning the whole table.  When we do this, we replace the
Aggref node(s) with Params referencing subquery outputs.  Such Params
really ought to be included in the per-plan-node extParam/allParam
sets computed by SS_finalize_plan.  However, we've never done so
up to now because of an ancient implementation choice to perform
that substitution during set_plan_references, which runs after
SS_finalize_plan, so that SS_finalize_plan never sees these Params.

This seems like clearly a bug, yet there have been no field reports
of problems that could trace to it.  This may be because the types
of Plan nodes that could contain Aggrefs do not have any of the
rescan optimizations that are controlled by extParam/allParam.
Nonetheless it seems certain to bite us someday, so let's fix it
in a self-contained patch that can be back-patched if we find a
case in which there's a live bug pre-v17.

The cleanest fix would be to perform a separate tree walk to do
these substitutions before SS_finalize_plan runs.  That seems
unattractive, first because a whole-tree mutation pass is expensive,
and second because we lack infrastructure for visiting expression
subtrees in a Plan tree, so that we'd need a new function knowing
as much as SS_finalize_plan knows about that.  I also considered
swapping the order of SS_finalize_plan and set_plan_references,
but that fell foul of various assumptions that seem tricky to fix.
So the approach adopted here is to teach SS_finalize_plan itself
to check for such Aggrefs.  I refactored things a bit in setrefs.c
to avoid having three copies of the code that does that.

Given the lack of any currently-known bug, no test case here.

Discussion: https://postgr.es/m/2391880.1689025003@sss.pgh.pa.us

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/d0d44049d1262aed2eee906d26af852948206db0

Modified Files
--------------
src/backend/optimizer/plan/setrefs.c   | 68 +++++++++++++++++++++-------------
src/backend/optimizer/plan/subselect.c | 25 +++++++++++--
src/include/optimizer/planmain.h       |  2 +
3 files changed, 66 insertions(+), 29 deletions(-)


В списке pgsql-committers по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: pgsql: Improve error message for MaxAllocSize overrun in accumArrayResu
Следующее
От: Nathan Bossart
Дата:
Сообщение: pgsql: Simplify option handling in pg_ctl.