summaryrefslogtreecommitdiff
path: root/src/backend/optimizer
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2023-02-04 17:40:35 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2023-02-04 17:40:35 -0500
commit9f452feeeb830534dc2ce743a2a14b109128326d (patch)
tree5df0088c54b7565fddabab435e8028b4228957fd /src/backend/optimizer
parent8538519db107777a6b06b7277185e6605caf8d4c (diff)
downloadpostgresql-9f452feeeb830534dc2ce743a2a14b109128326d.tar.gz
Fix thinko in qual distribution.
deconstruct_distribute tweaks the outer join scope (ojscope) it passes to distribute_qual_to_rels when considering an outer join qual that's above potentially-commutable outer joins. However, if the current join is *not* potentially commutable, we shouldn't do that. The argument that distribute_qual_to_rels will not do something wrong with the bogus ojscope falls flat if we don't pass it non-null postponed_oj_qual_list. Moreover, there's no need to play games in this case since we aren't going to commute anything. Per SQLSmith testing by Robins Tharakan. Discussion: https://postgr.es/m/CAEP4nAw74k4b-=93gmfCNX3MOY3y4uPxqbk_MnCVEpdsqHJVsg@mail.gmail.com
Diffstat (limited to 'src/backend/optimizer')
-rw-r--r--src/backend/optimizer/plan/initsplan.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/src/backend/optimizer/plan/initsplan.c b/src/backend/optimizer/plan/initsplan.c
index a19260f9bc..c301e6dffc 100644
--- a/src/backend/optimizer/plan/initsplan.c
+++ b/src/backend/optimizer/plan/initsplan.c
@@ -1189,23 +1189,8 @@ deconstruct_distribute(PlannerInfo *root, JoinTreeItem *jtitem)
if (j->jointype == JOIN_SEMI)
ojscope = NULL;
else
- {
ojscope = bms_union(sjinfo->min_lefthand,
sjinfo->min_righthand);
-
- /*
- * Add back any commutable lower OJ relids that were removed
- * from min_lefthand or min_righthand, else the ojscope
- * cross-check in distribute_qual_to_rels will complain. If
- * any such OJs were removed, we will postpone processing of
- * non-degenerate clauses, so this addition doesn't affect
- * anything except that cross-check and some Asserts. Real
- * clause positioning decisions will be made later, when we
- * revisit the postponed clauses.
- */
- if (sjinfo->commute_below)
- ojscope = bms_add_members(ojscope, sjinfo->commute_below);
- }
}
else
{
@@ -1221,7 +1206,21 @@ deconstruct_distribute(PlannerInfo *root, JoinTreeItem *jtitem)
* they will drop down below this join anyway.)
*/
if (j->jointype == JOIN_LEFT && sjinfo->lhs_strict)
+ {
postponed_oj_qual_list = &jtitem->oj_joinclauses;
+
+ /*
+ * Add back any commutable lower OJ relids that were removed from
+ * min_lefthand or min_righthand, else the ojscope cross-check in
+ * distribute_qual_to_rels will complain. Since we are postponing
+ * processing of non-degenerate clauses, this addition doesn't
+ * affect anything except that cross-check. Real clause
+ * positioning decisions will be made later, when we revisit the
+ * postponed clauses.
+ */
+ if (sjinfo->commute_below)
+ ojscope = bms_add_members(ojscope, sjinfo->commute_below);
+ }
else
postponed_oj_qual_list = NULL;