=== Applying patches on top of PostgreSQL commit ID 290bb8afe6b47adb8b080688bd97a710af351cb1 === /etc/rc.d/jail: WARNING: Per-jail configuration via jail_* variables is obsolete. Please consider migrating to /etc/jail.conf. Thu Aug 6 08:45:39 UTC 2026 On branch cf/6720 nothing to commit, working tree clean === using 'git am' to apply patch ./v6-0001-Remove-inner-joins-based-on-foreign-keys.patch === Applying: Remove inner joins based on foreign keys Using index info to reconstruct a base tree... M src/backend/optimizer/plan/analyzejoins.c M src/backend/utils/cache/relcache.c M src/backend/utils/misc/guc_parameters.dat M src/backend/utils/misc/postgresql.conf.sample M src/include/utils/rel.h M src/test/regress/expected/join.out M src/test/regress/expected/sysviews.out M src/test/regress/sql/join.sql Falling back to patching base and 3-way merge... Auto-merging src/test/regress/sql/join.sql Auto-merging src/test/regress/expected/sysviews.out Auto-merging src/test/regress/expected/join.out Auto-merging src/include/utils/rel.h Auto-merging src/backend/utils/misc/postgresql.conf.sample Auto-merging src/backend/utils/misc/guc_parameters.dat Auto-merging src/backend/utils/cache/relcache.c Auto-merging src/backend/optimizer/plan/analyzejoins.c CONFLICT (content): Merge conflict in src/backend/optimizer/plan/analyzejoins.c error: Failed to merge in the changes. hint: Use 'git am --show-current-patch=diff' to see the failed patch Patch failed at 0001 Remove inner joins based on foreign keys When you have resolved this problem, run "git am --continue". If you prefer to skip this patch, run "git am --skip" instead. To restore the original branch and stop patching, run "git am --abort". === using patch(1) to apply patch ./v6-0001-Remove-inner-joins-based-on-foreign-keys.patch === patching file src/backend/optimizer/path/equivclass.c patching file src/backend/optimizer/plan/analyzejoins.c Hunk #3 succeeded at 86 (offset 2 lines). Hunk #4 succeeded at 445 (offset 2 lines). Hunk #5 FAILED at 466. Hunk #6 succeeded at 529 (offset 3 lines). Hunk #7 succeeded at 538 (offset 3 lines). Hunk #8 succeeded at 564 (offset 3 lines). Hunk #9 succeeded at 606 (offset 3 lines). Hunk #10 succeeded at 636 (offset 3 lines). Hunk #11 FAILED at 662. Hunk #12 succeeded at 695 with fuzz 1 (offset 3 lines). Hunk #13 succeeded at 727 (offset 21 lines). Hunk #14 succeeded at 747 (offset 21 lines). Hunk #15 succeeded at 809 (offset 21 lines). Hunk #16 succeeded at 842 (offset 21 lines). Hunk #17 succeeded at 867 (offset 21 lines). Hunk #18 succeeded at 2236 (offset 68 lines). Hunk #19 succeeded at 2764 (offset 68 lines). 2 out of 19 hunks FAILED -- saving rejects to file src/backend/optimizer/plan/analyzejoins.c.rej patching file src/backend/optimizer/plan/initsplan.c patching file src/backend/optimizer/plan/planmain.c patching file src/backend/optimizer/util/plancat.c patching file src/backend/utils/cache/relcache.c Hunk #1 succeeded at 4785 (offset 11 lines). patching file src/backend/utils/misc/guc_parameters.dat Hunk #1 succeeded at 891 (offset -1 lines). patching file src/backend/utils/misc/postgresql.conf.sample Hunk #1 succeeded at 450 (offset 3 lines). patching file src/include/nodes/pathnodes.h patching file src/include/optimizer/paths.h patching file src/include/optimizer/planmain.h patching file src/include/utils/rel.h patching file src/test/regress/expected/join.out Hunk #1 succeeded at 10215 (offset 50 lines). patching file src/test/regress/expected/sysviews.out Hunk #1 succeeded at 159 with fuzz 1. Hunk #2 FAILED at 181. 1 out of 2 hunks FAILED -- saving rejects to file src/test/regress/expected/sysviews.out.rej patching file src/test/regress/sql/join.sql Hunk #1 succeeded at 3928 (offset 25 lines). Unstaged changes after reset: M src/backend/optimizer/path/equivclass.c M src/backend/optimizer/plan/analyzejoins.c M src/backend/optimizer/plan/initsplan.c M src/backend/optimizer/plan/planmain.c M src/backend/optimizer/util/plancat.c M src/backend/utils/cache/relcache.c M src/backend/utils/misc/guc_parameters.dat M src/backend/utils/misc/postgresql.conf.sample M src/include/nodes/pathnodes.h M src/include/optimizer/paths.h M src/include/optimizer/planmain.h M src/include/utils/rel.h M src/test/regress/expected/join.out M src/test/regress/expected/sysviews.out M src/test/regress/sql/join.sql Removing src/backend/optimizer/plan/analyzejoins.c.rej Removing src/test/regress/expected/sysviews.out.rej === using 'git apply' to apply patch ./v6-0001-Remove-inner-joins-based-on-foreign-keys.patch === Applied patch to 'src/backend/optimizer/path/equivclass.c' cleanly. Applied patch to 'src/backend/optimizer/plan/analyzejoins.c' with conflicts. Applied patch to 'src/backend/optimizer/plan/initsplan.c' cleanly. Applied patch to 'src/backend/optimizer/plan/planmain.c' cleanly. Applied patch to 'src/backend/optimizer/util/plancat.c' cleanly. Applied patch to 'src/backend/utils/cache/relcache.c' cleanly. Applied patch to 'src/backend/utils/misc/guc_parameters.dat' cleanly. Applied patch to 'src/backend/utils/misc/postgresql.conf.sample' cleanly. Applied patch to 'src/include/nodes/pathnodes.h' cleanly. Applied patch to 'src/include/optimizer/paths.h' cleanly. Applied patch to 'src/include/optimizer/planmain.h' cleanly. Applied patch to 'src/include/utils/rel.h' cleanly. Applied patch to 'src/test/regress/expected/join.out' cleanly. Applied patch to 'src/test/regress/expected/sysviews.out' cleanly. Applied patch to 'src/test/regress/sql/join.sql' cleanly. U src/backend/optimizer/plan/analyzejoins.c diff --cc src/backend/optimizer/plan/analyzejoins.c index 881950e5264,7085bde6b2a..00000000000 --- a/src/backend/optimizer/plan/analyzejoins.c +++ b/src/backend/optimizer/plan/analyzejoins.c @@@ -459,11 -466,11 +468,15 @@@ remove_rel_from_query(PlannerInfo *root ListCell *l; bool is_outer_join = (sjinfo != NULL); bool is_self_join = (!is_outer_join && subst > 0); ++<<<<<<< ours + Bitmapset *seen_serials = NULL; ++======= + bool is_inner_join = (!is_outer_join && subst < 0); ++>>>>>>> theirs - Assert(is_outer_join || is_self_join); + Assert(is_outer_join || is_self_join || is_inner_join); Assert(!is_outer_join || ojrelid > 0); - Assert(!is_outer_join || joinrelids != NULL); + Assert(is_self_join || joinrelids != NULL); /* * Update all_baserels and related relid sets. @@@ -646,10 -663,10 +669,17 @@@ * replace references to the removed relid with subst within the * lateral_vars lists. * ++<<<<<<< ours + * Also, for left-join removal, we strip the removed rel and join from any + * PlaceHolderVar embedded in the surviving rels' restriction clauses and + * join clauses; we needn't bother with the rel being removed, nor when + * the query has no PlaceHolderVars. ++======= + * Also, for left-join and inner-join removal, we strip the removed rel + * and join from any PlaceHolderVar embedded in the surviving rels' + * restriction clauses (see remove_rel_from_phvs); we needn't bother with + * the rel being removed, nor when the query has no PlaceHolderVars. ++>>>>>>> theirs */ for (rti = 1; rti < root->simple_rel_array_size; rti++) { @@@ -676,30 -693,14 +706,32 @@@ ChangeVarNodesExtended((Node *) otherrel->lateral_vars, relid, subst, 0, replace_relid_callback); - if (is_outer_join && rti != relid && root->glob->lastPHId != 0) + if ((is_outer_join || is_inner_join) && + rti != relid && + root->glob->lastPHId != 0) { foreach_node(RestrictInfo, rinfo, otherrel->baserestrictinfo) + remove_rel_from_restrictinfo_phvs(rinfo, relid, ojrelid); + + /* + * Join clauses need the same treatment, but there's no value in + * processing any join clause more than once. So it's slightly + * annoying that we have to find them via the per-base-relation + * joininfo lists. Avoid duplicate processing by tracking the + * rinfo_serial numbers of join clauses we've already seen. (This + * doesn't work for is_clone clauses, so we must waste effort on + * them.) + */ + foreach_node(RestrictInfo, rinfo, otherrel->joininfo) { - rinfo->clause = (Expr *) - remove_rel_from_phvs((Node *) rinfo->clause, relid, ojrelid); + if (!rinfo->is_clone) /* else serial number is not unique */ + { + if (bms_is_member(rinfo->rinfo_serial, seen_serials)) + continue; /* saw it already */ + seen_serials = bms_add_member(seen_serials, + rinfo->rinfo_serial); + } + remove_rel_from_restrictinfo_phvs(rinfo, relid, ojrelid); } } }