@@ -74,8 +74,6 @@ static bool is_innerrel_unique_for(PlannerInfo *root,
74
74
List * restrictlist ,
75
75
List * * extra_clauses );
76
76
static int self_join_candidates_cmp (const void * a , const void * b );
77
- static bool replace_relid_callback (Node * node ,
78
- ChangeVarNodes_context * context );
79
77
80
78
81
79
/*
@@ -399,8 +397,7 @@ remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel,
399
397
{
400
398
Assert (subst > 0 );
401
399
402
- ChangeVarNodesExtended ((Node * ) sjinf -> semi_rhs_exprs , relid , subst ,
403
- 0 , replace_relid_callback );
400
+ ChangeVarNodes ((Node * ) sjinf -> semi_rhs_exprs , relid , subst , 0 );
404
401
}
405
402
}
406
403
@@ -472,8 +469,7 @@ remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel,
472
469
sjinfo -> ojrelid , subst );
473
470
Assert (!bms_is_empty (phv -> phrels ));
474
471
475
- ChangeVarNodesExtended ((Node * ) phv -> phexpr , relid , subst , 0 ,
476
- replace_relid_callback );
472
+ ChangeVarNodes ((Node * ) phv -> phexpr , relid , subst , 0 );
477
473
478
474
Assert (phv -> phnullingrels == NULL ); /* no need to adjust */
479
475
}
@@ -527,8 +523,7 @@ remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel,
527
523
}
528
524
529
525
if (subst > 0 )
530
- ChangeVarNodesExtended ((Node * ) otherrel -> lateral_vars , relid ,
531
- subst , 0 , replace_relid_callback );
526
+ ChangeVarNodes ((Node * ) otherrel -> lateral_vars , relid , subst , 0 );
532
527
}
533
528
}
534
529
@@ -762,8 +757,7 @@ remove_rel_from_eclass(EquivalenceClass *ec, SpecialJoinInfo *sjinfo,
762
757
RestrictInfo * rinfo = (RestrictInfo * ) lfirst (lc );
763
758
764
759
if (sjinfo == NULL )
765
- ChangeVarNodesExtended ((Node * ) rinfo , relid , subst , 0 ,
766
- replace_relid_callback );
760
+ ChangeVarNodes ((Node * ) rinfo , relid , subst , 0 );
767
761
else
768
762
remove_rel_from_restrictinfo (rinfo , relid , sjinfo -> ojrelid );
769
763
}
@@ -1554,8 +1548,7 @@ update_eclasses(EquivalenceClass *ec, int from, int to)
1554
1548
em -> em_jdomain -> jd_relids = adjust_relid_set (em -> em_jdomain -> jd_relids , from , to );
1555
1549
1556
1550
/* We only process inner joins */
1557
- ChangeVarNodesExtended ((Node * ) em -> em_expr , from , to , 0 ,
1558
- replace_relid_callback );
1551
+ ChangeVarNodes ((Node * ) em -> em_expr , from , to , 0 );
1559
1552
1560
1553
foreach_node (EquivalenceMember , other , new_members )
1561
1554
{
@@ -1589,8 +1582,7 @@ update_eclasses(EquivalenceClass *ec, int from, int to)
1589
1582
continue ;
1590
1583
}
1591
1584
1592
- ChangeVarNodesExtended ((Node * ) rinfo , from , to , 0 ,
1593
- replace_relid_callback );
1585
+ ChangeVarNodes ((Node * ) rinfo , from , to , 0 );
1594
1586
1595
1587
/*
1596
1588
* After switching the clause to the remaining relation, check it for
@@ -1685,118 +1677,6 @@ add_non_redundant_clauses(PlannerInfo *root,
1685
1677
}
1686
1678
}
1687
1679
1688
- /*
1689
- * A custom callback for ChangeVarNodesExtended() providing
1690
- * Self-join elimination (SJE) related functionality
1691
- *
1692
- * SJE needs to skip the RangeTblRef node
1693
- * type. During SJE's last step, remove_rel_from_joinlist() removes
1694
- * remaining RangeTblRefs with target relid. If ChangeVarNodes() replaces
1695
- * the target relid before, remove_rel_from_joinlist() fails to identify
1696
- * the nodes to delete.
1697
- *
1698
- * SJE also needs to change the relids within RestrictInfo's.
1699
- */
1700
- static bool
1701
- replace_relid_callback (Node * node , ChangeVarNodes_context * context )
1702
- {
1703
- if (IsA (node , RangeTblRef ))
1704
- {
1705
- return true;
1706
- }
1707
- else if (IsA (node , RestrictInfo ))
1708
- {
1709
- RestrictInfo * rinfo = (RestrictInfo * ) node ;
1710
- int relid = -1 ;
1711
- bool is_req_equal =
1712
- (rinfo -> required_relids == rinfo -> clause_relids );
1713
- bool clause_relids_is_multiple =
1714
- (bms_membership (rinfo -> clause_relids ) == BMS_MULTIPLE );
1715
-
1716
- /*
1717
- * Recurse down into clauses if the target relation is present in
1718
- * clause_relids or required_relids. We must check required_relids
1719
- * because the relation not present in clause_relids might still be
1720
- * present somewhere in orclause.
1721
- */
1722
- if (bms_is_member (context -> rt_index , rinfo -> clause_relids ) ||
1723
- bms_is_member (context -> rt_index , rinfo -> required_relids ))
1724
- {
1725
- Relids new_clause_relids ;
1726
-
1727
- ChangeVarNodesWalkExpression ((Node * ) rinfo -> clause , context );
1728
- ChangeVarNodesWalkExpression ((Node * ) rinfo -> orclause , context );
1729
-
1730
- new_clause_relids = adjust_relid_set (rinfo -> clause_relids ,
1731
- context -> rt_index ,
1732
- context -> new_index );
1733
-
1734
- /*
1735
- * Incrementally adjust num_base_rels based on the change of
1736
- * clause_relids, which could contain both base relids and
1737
- * outer-join relids. This operation is legal until we remove
1738
- * only baserels.
1739
- */
1740
- rinfo -> num_base_rels -= bms_num_members (rinfo -> clause_relids ) -
1741
- bms_num_members (new_clause_relids );
1742
-
1743
- rinfo -> clause_relids = new_clause_relids ;
1744
- rinfo -> left_relids =
1745
- adjust_relid_set (rinfo -> left_relids , context -> rt_index , context -> new_index );
1746
- rinfo -> right_relids =
1747
- adjust_relid_set (rinfo -> right_relids , context -> rt_index , context -> new_index );
1748
- }
1749
-
1750
- if (is_req_equal )
1751
- rinfo -> required_relids = rinfo -> clause_relids ;
1752
- else
1753
- rinfo -> required_relids =
1754
- adjust_relid_set (rinfo -> required_relids , context -> rt_index , context -> new_index );
1755
-
1756
- rinfo -> outer_relids =
1757
- adjust_relid_set (rinfo -> outer_relids , context -> rt_index , context -> new_index );
1758
- rinfo -> incompatible_relids =
1759
- adjust_relid_set (rinfo -> incompatible_relids , context -> rt_index , context -> new_index );
1760
-
1761
- if (rinfo -> mergeopfamilies &&
1762
- bms_get_singleton_member (rinfo -> clause_relids , & relid ) &&
1763
- clause_relids_is_multiple &&
1764
- relid == context -> new_index && IsA (rinfo -> clause , OpExpr ))
1765
- {
1766
- Expr * leftOp ;
1767
- Expr * rightOp ;
1768
-
1769
- leftOp = (Expr * ) get_leftop (rinfo -> clause );
1770
- rightOp = (Expr * ) get_rightop (rinfo -> clause );
1771
-
1772
- /*
1773
- * For self-join elimination, changing varnos could transform
1774
- * "t1.a = t2.a" into "t1.a = t1.a". That is always true as long
1775
- * as "t1.a" is not null. We use qual() to check for such a case,
1776
- * and then we replace the qual for a check for not null
1777
- * (NullTest).
1778
- */
1779
- if (leftOp != NULL && equal (leftOp , rightOp ))
1780
- {
1781
- NullTest * ntest = makeNode (NullTest );
1782
-
1783
- ntest -> arg = leftOp ;
1784
- ntest -> nulltesttype = IS_NOT_NULL ;
1785
- ntest -> argisrow = false;
1786
- ntest -> location = -1 ;
1787
- rinfo -> clause = (Expr * ) ntest ;
1788
- rinfo -> mergeopfamilies = NIL ;
1789
- rinfo -> left_em = NULL ;
1790
- rinfo -> right_em = NULL ;
1791
- }
1792
- Assert (rinfo -> orclause == NULL );
1793
- }
1794
- return true;
1795
- }
1796
-
1797
- return false;
1798
- }
1799
-
1800
1680
/*
1801
1681
* Remove a relation after we have proven that it participates only in an
1802
1682
* unneeded unique self-join.
@@ -1845,8 +1725,7 @@ remove_self_join_rel(PlannerInfo *root, PlanRowMark *kmark, PlanRowMark *rmark,
1845
1725
foreach_node (RestrictInfo , rinfo , joininfos )
1846
1726
{
1847
1727
remove_join_clause_from_rels (root , rinfo , rinfo -> required_relids );
1848
- ChangeVarNodesExtended ((Node * ) rinfo , toRemove -> relid , toKeep -> relid ,
1849
- 0 , replace_relid_callback );
1728
+ ChangeVarNodes ((Node * ) rinfo , toRemove -> relid , toKeep -> relid , 0 );
1850
1729
1851
1730
if (bms_membership (rinfo -> required_relids ) == BMS_MULTIPLE )
1852
1731
jinfo_candidates = lappend (jinfo_candidates , rinfo );
@@ -1864,8 +1743,7 @@ remove_self_join_rel(PlannerInfo *root, PlanRowMark *kmark, PlanRowMark *rmark,
1864
1743
restrictlist );
1865
1744
foreach_node (RestrictInfo , rinfo , toRemove -> baserestrictinfo )
1866
1745
{
1867
- ChangeVarNodesExtended ((Node * ) rinfo , toRemove -> relid , toKeep -> relid ,
1868
- 0 , replace_relid_callback );
1746
+ ChangeVarNodes ((Node * ) rinfo , toRemove -> relid , toKeep -> relid , 0 );
1869
1747
1870
1748
if (bms_membership (rinfo -> required_relids ) == BMS_MULTIPLE )
1871
1749
jinfo_candidates = lappend (jinfo_candidates , rinfo );
@@ -1907,8 +1785,7 @@ remove_self_join_rel(PlannerInfo *root, PlanRowMark *kmark, PlanRowMark *rmark,
1907
1785
{
1908
1786
Node * node = lfirst (lc );
1909
1787
1910
- ChangeVarNodesExtended (node , toRemove -> relid , toKeep -> relid , 0 ,
1911
- replace_relid_callback );
1788
+ ChangeVarNodes (node , toRemove -> relid , toKeep -> relid , 0 );
1912
1789
if (!list_member (toKeep -> reltarget -> exprs , node ))
1913
1790
toKeep -> reltarget -> exprs = lappend (toKeep -> reltarget -> exprs , node );
1914
1791
}
@@ -1952,18 +1829,14 @@ remove_self_join_rel(PlannerInfo *root, PlanRowMark *kmark, PlanRowMark *rmark,
1952
1829
* Replace varno in all the query structures, except nodes RangeTblRef
1953
1830
* otherwise later remove_rel_from_joinlist will yield errors.
1954
1831
*/
1955
- ChangeVarNodesExtended ((Node * ) root -> parse , toRemove -> relid , toKeep -> relid ,
1956
- 0 , replace_relid_callback );
1832
+ ChangeVarNodesExtended ((Node * ) root -> parse , toRemove -> relid , toKeep -> relid , 0 , false);
1957
1833
1958
1834
/* Replace links in the planner info */
1959
1835
remove_rel_from_query (root , toRemove , toKeep -> relid , NULL , NULL );
1960
1836
1961
1837
/* At last, replace varno in root targetlist and HAVING clause */
1962
- ChangeVarNodesExtended ((Node * ) root -> processed_tlist , toRemove -> relid ,
1963
- toKeep -> relid , 0 , replace_relid_callback );
1964
- ChangeVarNodesExtended ((Node * ) root -> processed_groupClause ,
1965
- toRemove -> relid , toKeep -> relid , 0 ,
1966
- replace_relid_callback );
1838
+ ChangeVarNodes ((Node * ) root -> processed_tlist , toRemove -> relid , toKeep -> relid , 0 );
1839
+ ChangeVarNodes ((Node * ) root -> processed_groupClause , toRemove -> relid , toKeep -> relid , 0 );
1967
1840
1968
1841
adjust_relid_set (root -> all_result_relids , toRemove -> relid , toKeep -> relid );
1969
1842
adjust_relid_set (root -> leaf_result_relids , toRemove -> relid , toKeep -> relid );
@@ -2046,10 +1919,8 @@ split_selfjoin_quals(PlannerInfo *root, List *joinquals, List **selfjoinquals,
2046
1919
* when we have cast of the same var to different (but compatible)
2047
1920
* types.
2048
1921
*/
2049
- ChangeVarNodesExtended (rightexpr ,
2050
- bms_singleton_member (rinfo -> right_relids ),
2051
- bms_singleton_member (rinfo -> left_relids ), 0 ,
2052
- replace_relid_callback );
1922
+ ChangeVarNodes (rightexpr , bms_singleton_member (rinfo -> right_relids ),
1923
+ bms_singleton_member (rinfo -> left_relids ), 0 );
2053
1924
2054
1925
if (equal (leftexpr , rightexpr ))
2055
1926
sjoinquals = lappend (sjoinquals , rinfo );
@@ -2085,8 +1956,7 @@ match_unique_clauses(PlannerInfo *root, RelOptInfo *outer, List *uclauses,
2085
1956
bms_is_empty (rinfo -> right_relids ));
2086
1957
2087
1958
clause = (Expr * ) copyObject (rinfo -> clause );
2088
- ChangeVarNodesExtended ((Node * ) clause , relid , outer -> relid , 0 ,
2089
- replace_relid_callback );
1959
+ ChangeVarNodes ((Node * ) clause , relid , outer -> relid , 0 );
2090
1960
2091
1961
iclause = bms_is_empty (rinfo -> left_relids ) ? get_rightop (clause ) :
2092
1962
get_leftop (clause );
0 commit comments