@@ -59,7 +59,8 @@ static void remove_leftjoinrel_from_query(PlannerInfo *root, int relid,
59
59
static void remove_rel_from_restrictinfo (RestrictInfo * rinfo ,
60
60
int relid , int ojrelid );
61
61
static void remove_rel_from_eclass (EquivalenceClass * ec ,
62
- int relid , int ojrelid , int subst );
62
+ SpecialJoinInfo * sjinfo ,
63
+ int relid , int subst );
63
64
static List * remove_rel_from_joinlist (List * joinlist , int relid , int * nremoved );
64
65
static bool rel_supports_distinctness (PlannerInfo * root , RelOptInfo * rel );
65
66
static bool rel_is_distinct_for (PlannerInfo * root , RelOptInfo * rel ,
@@ -324,17 +325,22 @@ remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel,
324
325
Relids joinrelids )
325
326
{
326
327
int relid = rel -> relid ;
327
- int ojrelid = (sjinfo != NULL ) ? sjinfo -> ojrelid : -1 ;
328
328
Index rti ;
329
329
ListCell * l ;
330
330
331
331
/*
332
332
* Update all_baserels and related relid sets.
333
333
*/
334
334
root -> all_baserels = adjust_relid_set (root -> all_baserels , relid , subst );
335
- root -> outer_join_rels = adjust_relid_set (root -> outer_join_rels , ojrelid , subst );
336
335
root -> all_query_rels = adjust_relid_set (root -> all_query_rels , relid , subst );
337
- root -> all_query_rels = adjust_relid_set (root -> all_query_rels , ojrelid , subst );
336
+
337
+ if (sjinfo != NULL )
338
+ {
339
+ root -> outer_join_rels = bms_del_member (root -> outer_join_rels ,
340
+ sjinfo -> ojrelid );
341
+ root -> all_query_rels = bms_del_member (root -> all_query_rels ,
342
+ sjinfo -> ojrelid );
343
+ }
338
344
339
345
/*
340
346
* Likewise remove references from SpecialJoinInfo data structures.
@@ -366,22 +372,30 @@ remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel,
366
372
367
373
if (sjinfo != NULL )
368
374
{
369
- Assert (subst <= 0 && ojrelid > 0 );
370
-
371
- /* Remove ojrelid bits from the sets: */
372
- sjinf -> min_lefthand = bms_del_member (sjinf -> min_lefthand , ojrelid );
373
- sjinf -> min_righthand = bms_del_member (sjinf -> min_righthand , ojrelid );
374
- sjinf -> syn_lefthand = bms_del_member (sjinf -> syn_lefthand , ojrelid );
375
- sjinf -> syn_righthand = bms_del_member (sjinf -> syn_righthand , ojrelid );
375
+ Assert (subst <= 0 );
376
+
377
+ /* Remove sjinfo->ojrelid bits from the sets: */
378
+ sjinf -> min_lefthand = bms_del_member (sjinf -> min_lefthand ,
379
+ sjinfo -> ojrelid );
380
+ sjinf -> min_righthand = bms_del_member (sjinf -> min_righthand ,
381
+ sjinfo -> ojrelid );
382
+ sjinf -> syn_lefthand = bms_del_member (sjinf -> syn_lefthand ,
383
+ sjinfo -> ojrelid );
384
+ sjinf -> syn_righthand = bms_del_member (sjinf -> syn_righthand ,
385
+ sjinfo -> ojrelid );
376
386
/* relid cannot appear in these fields, but ojrelid can: */
377
- sjinf -> commute_above_l = bms_del_member (sjinf -> commute_above_l , ojrelid );
378
- sjinf -> commute_above_r = bms_del_member (sjinf -> commute_above_r , ojrelid );
379
- sjinf -> commute_below_l = bms_del_member (sjinf -> commute_below_l , ojrelid );
380
- sjinf -> commute_below_r = bms_del_member (sjinf -> commute_below_r , ojrelid );
387
+ sjinf -> commute_above_l = bms_del_member (sjinf -> commute_above_l ,
388
+ sjinfo -> ojrelid );
389
+ sjinf -> commute_above_r = bms_del_member (sjinf -> commute_above_r ,
390
+ sjinfo -> ojrelid );
391
+ sjinf -> commute_below_l = bms_del_member (sjinf -> commute_below_l ,
392
+ sjinfo -> ojrelid );
393
+ sjinf -> commute_below_r = bms_del_member (sjinf -> commute_below_r ,
394
+ sjinfo -> ojrelid );
381
395
}
382
396
else
383
397
{
384
- Assert (subst > 0 && ojrelid == -1 );
398
+ Assert (subst > 0 );
385
399
386
400
ChangeVarNodes ((Node * ) sjinf -> semi_rhs_exprs , relid , subst , 0 );
387
401
}
@@ -408,7 +422,7 @@ remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel,
408
422
Assert (sjinfo == NULL || !bms_is_member (relid , phinfo -> ph_lateral ));
409
423
if (bms_is_subset (phinfo -> ph_needed , joinrelids ) &&
410
424
bms_is_member (relid , phinfo -> ph_eval_at ) &&
411
- (sjinfo == NULL || !bms_is_member (ojrelid , phinfo -> ph_eval_at )))
425
+ (sjinfo == NULL || !bms_is_member (sjinfo -> ojrelid , phinfo -> ph_eval_at )))
412
426
{
413
427
root -> placeholder_list = foreach_delete_current (root -> placeholder_list ,
414
428
l );
@@ -419,7 +433,9 @@ remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel,
419
433
PlaceHolderVar * phv = phinfo -> ph_var ;
420
434
421
435
phinfo -> ph_eval_at = adjust_relid_set (phinfo -> ph_eval_at , relid , subst );
422
- phinfo -> ph_eval_at = adjust_relid_set (phinfo -> ph_eval_at , ojrelid , subst );
436
+ if (sjinfo != NULL )
437
+ phinfo -> ph_eval_at = adjust_relid_set (phinfo -> ph_eval_at ,
438
+ sjinfo -> ojrelid , subst );
423
439
Assert (!bms_is_empty (phinfo -> ph_eval_at )); /* checked previously */
424
440
/* Reduce ph_needed to contain only "relation 0"; see below */
425
441
if (bms_is_member (0 , phinfo -> ph_needed ))
@@ -437,7 +453,9 @@ remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel,
437
453
/* ph_lateral might or might not be empty */
438
454
439
455
phv -> phrels = adjust_relid_set (phv -> phrels , relid , subst );
440
- phv -> phrels = adjust_relid_set (phv -> phrels , ojrelid , subst );
456
+ if (sjinfo != NULL )
457
+ phv -> phrels = adjust_relid_set (phv -> phrels ,
458
+ sjinfo -> ojrelid , subst );
441
459
Assert (!bms_is_empty (phv -> phrels ));
442
460
443
461
ChangeVarNodes ((Node * ) phv -> phexpr , relid , subst , 0 );
@@ -454,8 +472,8 @@ remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel,
454
472
EquivalenceClass * ec = (EquivalenceClass * ) lfirst (l );
455
473
456
474
if (bms_is_member (relid , ec -> ec_relids ) ||
457
- (sjinfo == NULL || bms_is_member (ojrelid , ec -> ec_relids )))
458
- remove_rel_from_eclass (ec , relid , ojrelid , subst );
475
+ (sjinfo == NULL || bms_is_member (sjinfo -> ojrelid , ec -> ec_relids )))
476
+ remove_rel_from_eclass (ec , sjinfo , relid , subst );
459
477
}
460
478
461
479
/*
@@ -671,7 +689,8 @@ remove_rel_from_restrictinfo(RestrictInfo *rinfo, int relid, int ojrelid)
671
689
}
672
690
673
691
/*
674
- * Remove any references to relid or ojrelid from the EquivalenceClass.
692
+ * Remove any references to relid or sjinfo->ojrelid (if sjinfo != NULL)
693
+ * from the EquivalenceClass.
675
694
*
676
695
* Like remove_rel_from_restrictinfo, we don't worry about cleaning out
677
696
* any nullingrel bits in contained Vars and PHVs. (This might have to be
@@ -680,13 +699,16 @@ remove_rel_from_restrictinfo(RestrictInfo *rinfo, int relid, int ojrelid)
680
699
* level(s).
681
700
*/
682
701
static void
683
- remove_rel_from_eclass (EquivalenceClass * ec , int relid , int ojrelid , int subst )
702
+ remove_rel_from_eclass (EquivalenceClass * ec , SpecialJoinInfo * sjinfo ,
703
+ int relid , int subst )
684
704
{
685
705
ListCell * lc ;
686
706
687
707
/* Fix up the EC's overall relids */
688
708
ec -> ec_relids = adjust_relid_set (ec -> ec_relids , relid , subst );
689
- ec -> ec_relids = adjust_relid_set (ec -> ec_relids , ojrelid , subst );
709
+ if (sjinfo != NULL )
710
+ ec -> ec_relids = adjust_relid_set (ec -> ec_relids ,
711
+ sjinfo -> ojrelid , subst );
690
712
691
713
/*
692
714
* Fix up the member expressions. Any non-const member that ends with
@@ -698,11 +720,14 @@ remove_rel_from_eclass(EquivalenceClass *ec, int relid, int ojrelid, int subst)
698
720
EquivalenceMember * cur_em = (EquivalenceMember * ) lfirst (lc );
699
721
700
722
if (bms_is_member (relid , cur_em -> em_relids ) ||
701
- (ojrelid != -1 && bms_is_member (ojrelid , cur_em -> em_relids )))
723
+ (sjinfo != NULL && bms_is_member (sjinfo -> ojrelid ,
724
+ cur_em -> em_relids )))
702
725
{
703
726
Assert (!cur_em -> em_is_const );
704
727
cur_em -> em_relids = adjust_relid_set (cur_em -> em_relids , relid , subst );
705
- cur_em -> em_relids = adjust_relid_set (cur_em -> em_relids , ojrelid , subst );
728
+ if (sjinfo != NULL )
729
+ cur_em -> em_relids = adjust_relid_set (cur_em -> em_relids ,
730
+ sjinfo -> ojrelid , subst );
706
731
if (bms_is_empty (cur_em -> em_relids ))
707
732
ec -> ec_members = foreach_delete_current (ec -> ec_members , lc );
708
733
}
@@ -713,10 +738,10 @@ remove_rel_from_eclass(EquivalenceClass *ec, int relid, int ojrelid, int subst)
713
738
{
714
739
RestrictInfo * rinfo = (RestrictInfo * ) lfirst (lc );
715
740
716
- if (ojrelid == -1 )
741
+ if (sjinfo == NULL )
717
742
ChangeVarNodes ((Node * ) rinfo , relid , subst , 0 );
718
743
else
719
- remove_rel_from_restrictinfo (rinfo , relid , ojrelid );
744
+ remove_rel_from_restrictinfo (rinfo , relid , sjinfo -> ojrelid );
720
745
}
721
746
722
747
/*
0 commit comments