make_outerjoininfo() decides whether outer join identity 3 applies between an outer join and a lower one in its LHS by checking that the join clause is strict for the lower join's RHS. It relied on the clause then necessarily referencing that RHS. That is not so when the strictness comes through a PlaceHolderVar: find_nonnullable_rels() looks inside the PHV's expression and reports rels it references laterally, while pull_varnos() reports only where the PHV is evaluated. In that case we marked the two joins as commutable although the clause does not use the lower join's RHS at all. Joinrels for the same set of base rels could then be built both with and without the upper join's relid, leading to an assertion failure in standard_join_search(). The bogus commutation also caused an extra clone of the upper join's clause to be generated, which could be applied at a higher join in addition to the clone already applied below it. In non-assert builds, this could lead to planner errors such as "variable not found in subplan target lists". To fix, ignore rels that the clause is strict for but does not reference, consistent with clause_relids treating a PHV as computed at its ph_eval_at. Back-patch to v16, where this commutation logic was introduced. Author: Richard Guo <guofenglinux@gmail.com> Reviewed-by: Tender Wang <tndrwang@gmail.com> Discussion: https://postgr.es/m/CAMbWs49xvh4-uPv3rxWkk_rtMT1ic+psHvEAxaFEXu2Rf-32Tw@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.
Copyright and license information can be found in the file COPYRIGHT.
General documentation about this version of PostgreSQL can be found at https://www.postgresql.org/docs/devel/. In particular, information about building PostgreSQL from the source code can be found at https://www.postgresql.org/docs/devel/installation.html.
The latest version of this software, and related software, may be obtained at https://www.postgresql.org/download/. For more information look at our web site located at https://www.postgresql.org/.