mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-23 06:47:14 +08:00
4297a35196de281e551d500fc71c7033f253cb98
ed1a88dda made it so WindowClauses can be merged when all window functions belonging to the WindowClause can equally well use some other WindowClause without any behavioral changes. When that optimization applies, the WindowFunc's "winref" gets adjusted to reference the new WindowClause. That commit does not work well with the deduplication logic in find_window_functions(), which only added the WindowFunc to the list when there wasn't already an identical WindowFunc in the list. That deduplication logic meant that the duplicate WindowFunc wouldn't get the "winref" changed when optimize_window_clauses() was able to swap the WindowFunc to another WindowClause. This could lead to the following error in the unlikely event that the deduplication code did something and the duplicate WindowFunc happened to be moved into another WindowClause. ERROR: WindowFunc with winref 2 assigned to WindowAgg with winref 1 As it turns out, the deduplication logic in find_window_functions() is pretty bogus. It might have done something when added, as that code predates b8d7f053c, which changed how projections work. As it turns out, at least now we *will* evaluate the duplicate WindowFuncs. All that the deduplication code seems to do today is assist in underestimating the WindowAggPath costs due to not counting the evaluation costs of duplicate WindowFuncs. Ideally the fix would be to remove the deduplication code, but that could result in changes to the plan costs, as duplicate WindowFuncs would then be costed. Instead, let's play it safe and shift the deduplication code so it runs after the other processing in optimize_window_clauses(). Backpatch only as far as v16 as there doesn't seem to be any other harm done by the WindowFunc deduplication code before then. This issue was fixed in master by 7027dd499. Reported-by: Meng Zhang <mza117jc@gmail.com> Author: Meng Zhang <mza117jc@gmail.com> Author: David Rowley <dgrowleyml@gmail.com> Discussion: https://postgr.es/m/CAErYLFAuxmW0UVdgrz7iiuNrxGQnFK_OP9hBD5CUzRgjrVrz=Q@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/.
Description
Languages
C
84.8%
PLpgSQL
6.1%
Perl
4.7%
Yacc
1.2%
Meson
0.7%
Other
2.4%