mirror of
https://github.com/postgres/postgres.git
synced 2026-10-23 13:29:09 +03:00
38fe5a93665a064bb93a83915098df557be52a8c
Commit2ebf25e7dleft query_planner's qp_callback call where it had been historically, but that turns out to be a bad idea. It means that the code reached via qp_callback is subject to the must-be-able-to-restart rule created by looping back after join removal. We found one place that fails that requirement: adjust_group_pathkeys_for_groupagg sets Aggref.aggpresorted flags, and there's nothing that will reset those in case of a query_planner restart, yet the selected set of Aggrefs can change. There might be other places with similar issues. Fortunately, qp_callback's main charter is to compute/update pathkey values, and that is not something that join removal depends on or should depend on. (Whether join removal is valid is surely not dependent on what order the rel might get scanned in.) Nothing else within the restart loop depends on it either --- in other words, the existing placement was a bit random to begin with. So we can fix this problem just by moving that call to below the restart loop. That costs nothing, indeed it saves some cycles by not having to do that processing more than once. And removing an unstated requirement from code that's not directly called by query_planner should help forestall future bugs. While the known bug only exists in v18 and up (older branches lack the aggpresorted optimization), I've chosen to back-patch the code change to v16 like2ebf25e7dwas. This is the sort of API requirement that we don't really want to be different across branches. Reported-by: shihao zhong <zhong950419@gmail.com> Author: Tom Lane <tgl@sss.pgh.pa.us> Reviewed-by: shihao zhong <zhong950419@gmail.com> Discussion: https://postgr.es/m/CAGRkXqSOAT1yop44B8jwacL_91rxK=QuoU8Of3NLMb9NgAO2NA@mail.gmail.com Backpatch-through: 16
PostgreSQL Database Management System ===================================== This directory contains the source code distribution of the PostgreSQL database management system. PostgreSQL is an advanced object-relational database management system that supports an extended subset of the SQL standard, including transactions, foreign keys, subqueries, triggers, user-defined types and functions. This distribution also contains C language bindings. PostgreSQL has many language interfaces, many of which are listed here: https://www.postgresql.org/download/ See the file INSTALL for instructions on how to build and install PostgreSQL. That file also lists supported operating systems and hardware platforms and contains information regarding any other software packages that are required to build or run the PostgreSQL system. Copyright and license information can be found in the file COPYRIGHT. A comprehensive documentation set is included in this distribution; it can be read as described in the installation instructions. The latest version of this software may be obtained at https://www.postgresql.org/download/. For more information look at our web site located at https://www.postgresql.org/.
Languages
C
83.9%
PLpgSQL
6.2%
Perl
5.4%
Yacc
1.2%
Meson
0.7%
Other
2.4%