@@ -34,6 +34,7 @@ static bool has_join_restriction(PlannerInfo *root, RelOptInfo *rel);
3434static bool has_legal_joinclause (PlannerInfo * root , RelOptInfo * rel );
3535static bool restriction_is_constant_false (List * restrictlist ,
3636 RelOptInfo * joinrel ,
37+ Relids ojrelids ,
3738 bool only_pushed_down );
3839static void populate_joinrel_with_paths (PlannerInfo * root , RelOptInfo * rel1 ,
3940 RelOptInfo * rel2 , RelOptInfo * joinrel ,
@@ -894,6 +895,10 @@ populate_joinrel_with_paths(PlannerInfo *root, RelOptInfo *rel1,
894895 RelOptInfo * rel2 , RelOptInfo * joinrel ,
895896 SpecialJoinInfo * sjinfo , List * restrictlist )
896897{
898+ Relids ojrelids = CALC_OUTER_JOIN_RELIDS (joinrel -> relids ,
899+ rel1 -> relids ,
900+ rel2 -> relids );
901+
897902 /*
898903 * Consider paths using each rel as both outer and inner. Depending on
899904 * the join type, a provably empty outer or inner rel might mean the join
@@ -916,7 +921,7 @@ populate_joinrel_with_paths(PlannerInfo *root, RelOptInfo *rel1,
916921 {
917922 case JOIN_INNER :
918923 if (is_dummy_rel (rel1 ) || is_dummy_rel (rel2 ) ||
919- restriction_is_constant_false (restrictlist , joinrel , false))
924+ restriction_is_constant_false (restrictlist , joinrel , ojrelids , false))
920925 {
921926 mark_dummy_rel (joinrel );
922927 break ;
@@ -930,12 +935,12 @@ populate_joinrel_with_paths(PlannerInfo *root, RelOptInfo *rel1,
930935 break ;
931936 case JOIN_LEFT :
932937 if (is_dummy_rel (rel1 ) ||
933- restriction_is_constant_false (restrictlist , joinrel , true))
938+ restriction_is_constant_false (restrictlist , joinrel , ojrelids , true))
934939 {
935940 mark_dummy_rel (joinrel );
936941 break ;
937942 }
938- if (restriction_is_constant_false (restrictlist , joinrel , false) &&
943+ if (restriction_is_constant_false (restrictlist , joinrel , ojrelids , false) &&
939944 bms_is_subset (rel2 -> relids , sjinfo -> syn_righthand ))
940945 mark_dummy_rel (rel2 );
941946 add_paths_to_joinrel (root , joinrel , rel1 , rel2 ,
@@ -947,7 +952,7 @@ populate_joinrel_with_paths(PlannerInfo *root, RelOptInfo *rel1,
947952 break ;
948953 case JOIN_FULL :
949954 if ((is_dummy_rel (rel1 ) && is_dummy_rel (rel2 )) ||
950- restriction_is_constant_false (restrictlist , joinrel , true))
955+ restriction_is_constant_false (restrictlist , joinrel , ojrelids , true))
951956 {
952957 mark_dummy_rel (joinrel );
953958 break ;
@@ -983,7 +988,7 @@ populate_joinrel_with_paths(PlannerInfo *root, RelOptInfo *rel1,
983988 bms_is_subset (sjinfo -> min_righthand , rel2 -> relids ))
984989 {
985990 if (is_dummy_rel (rel1 ) || is_dummy_rel (rel2 ) ||
986- restriction_is_constant_false (restrictlist , joinrel , false))
991+ restriction_is_constant_false (restrictlist , joinrel , ojrelids , false))
987992 {
988993 mark_dummy_rel (joinrel );
989994 break ;
@@ -1009,7 +1014,7 @@ populate_joinrel_with_paths(PlannerInfo *root, RelOptInfo *rel1,
10091014 sjinfo ) != NULL )
10101015 {
10111016 if (is_dummy_rel (rel1 ) || is_dummy_rel (rel2 ) ||
1012- restriction_is_constant_false (restrictlist , joinrel , false))
1017+ restriction_is_constant_false (restrictlist , joinrel , ojrelids , false))
10131018 {
10141019 mark_dummy_rel (joinrel );
10151020 break ;
@@ -1024,12 +1029,12 @@ populate_joinrel_with_paths(PlannerInfo *root, RelOptInfo *rel1,
10241029 break ;
10251030 case JOIN_ANTI :
10261031 if (is_dummy_rel (rel1 ) ||
1027- restriction_is_constant_false (restrictlist , joinrel , true))
1032+ restriction_is_constant_false (restrictlist , joinrel , ojrelids , true))
10281033 {
10291034 mark_dummy_rel (joinrel );
10301035 break ;
10311036 }
1032- if (restriction_is_constant_false (restrictlist , joinrel , false) &&
1037+ if (restriction_is_constant_false (restrictlist , joinrel , ojrelids , false) &&
10331038 bms_is_subset (rel2 -> relids , sjinfo -> syn_righthand ))
10341039 mark_dummy_rel (rel2 );
10351040 add_paths_to_joinrel (root , joinrel , rel1 , rel2 ,
@@ -1426,6 +1431,7 @@ mark_dummy_rel(RelOptInfo *rel)
14261431static bool
14271432restriction_is_constant_false (List * restrictlist ,
14281433 RelOptInfo * joinrel ,
1434+ Relids ojrelids ,
14291435 bool only_pushed_down )
14301436{
14311437 ListCell * lc ;
@@ -1440,7 +1446,8 @@ restriction_is_constant_false(List *restrictlist,
14401446 {
14411447 RestrictInfo * rinfo = lfirst_node (RestrictInfo , lc );
14421448
1443- if (only_pushed_down && !RINFO_IS_PUSHED_DOWN (rinfo , joinrel -> relids ))
1449+ if (only_pushed_down &&
1450+ !RINFO_IS_PUSHED_DOWN (rinfo , ojrelids , joinrel -> relids ))
14441451 continue ;
14451452
14461453 if (rinfo -> clause && IsA (rinfo -> clause , Const ))
0 commit comments