@ -35,6 +35,7 @@ static bool has_join_restriction(PlannerInfo *root, RelOptInfo *rel);
static bool has_legal_joinclause ( PlannerInfo * root , RelOptInfo * rel ) ;
static bool is_dummy_rel ( RelOptInfo * rel ) ;
static bool restriction_is_constant_false ( List * restrictlist ,
RelOptInfo * joinrel ,
bool only_pushed_down ) ;
static void populate_joinrel_with_paths ( PlannerInfo * root , RelOptInfo * rel1 ,
RelOptInfo * rel2 , RelOptInfo * joinrel ,
@ -780,7 +781,7 @@ populate_joinrel_with_paths(PlannerInfo *root, RelOptInfo *rel1,
{
case JOIN_INNER :
if ( is_dummy_rel ( rel1 ) | | is_dummy_rel ( rel2 ) | |
restriction_is_constant_false ( restrictlist , false ) )
restriction_is_constant_false ( restrictlist , joinrel , false ) )
{
mark_dummy_rel ( joinrel ) ;
break ;
@ -794,12 +795,12 @@ populate_joinrel_with_paths(PlannerInfo *root, RelOptInfo *rel1,
break ;
case JOIN_LEFT :
if ( is_dummy_rel ( rel1 ) | |
restriction_is_constant_false ( restrictlist , true ) )
restriction_is_constant_false ( restrictlist , joinrel , true ) )
{
mark_dummy_rel ( joinrel ) ;
break ;
}
if ( restriction_is_constant_false ( restrictlist , false ) & &
if ( restriction_is_constant_false ( restrictlist , joinrel , false ) & &
bms_is_subset ( rel2 - > relids , sjinfo - > syn_righthand ) )
mark_dummy_rel ( rel2 ) ;
add_paths_to_joinrel ( root , joinrel , rel1 , rel2 ,
@ -811,7 +812,7 @@ populate_joinrel_with_paths(PlannerInfo *root, RelOptInfo *rel1,
break ;
case JOIN_FULL :
if ( ( is_dummy_rel ( rel1 ) & & is_dummy_rel ( rel2 ) ) | |
restriction_is_constant_false ( restrictlist , true ) )
restriction_is_constant_false ( restrictlist , joinrel , true ) )
{
mark_dummy_rel ( joinrel ) ;
break ;
@ -847,7 +848,7 @@ populate_joinrel_with_paths(PlannerInfo *root, RelOptInfo *rel1,
bms_is_subset ( sjinfo - > min_righthand , rel2 - > relids ) )
{
if ( is_dummy_rel ( rel1 ) | | is_dummy_rel ( rel2 ) | |
restriction_is_constant_false ( restrictlist , false ) )
restriction_is_constant_false ( restrictlist , joinrel , false ) )
{
mark_dummy_rel ( joinrel ) ;
break ;
@ -870,7 +871,7 @@ populate_joinrel_with_paths(PlannerInfo *root, RelOptInfo *rel1,
sjinfo ) ! = NULL )
{
if ( is_dummy_rel ( rel1 ) | | is_dummy_rel ( rel2 ) | |
restriction_is_constant_false ( restrictlist , false ) )
restriction_is_constant_false ( restrictlist , joinrel , false ) )
{
mark_dummy_rel ( joinrel ) ;
break ;
@ -885,12 +886,12 @@ populate_joinrel_with_paths(PlannerInfo *root, RelOptInfo *rel1,
break ;
case JOIN_ANTI :
if ( is_dummy_rel ( rel1 ) | |
restriction_is_constant_false ( restrictlist , true ) )
restriction_is_constant_false ( restrictlist , joinrel , true ) )
{
mark_dummy_rel ( joinrel ) ;
break ;
}
if ( restriction_is_constant_false ( restrictlist , false ) & &
if ( restriction_is_constant_false ( restrictlist , joinrel , false ) & &
bms_is_subset ( rel2 - > relids , sjinfo - > syn_righthand ) )
mark_dummy_rel ( rel2 ) ;
add_paths_to_joinrel ( root , joinrel , rel1 , rel2 ,
@ -1249,10 +1250,13 @@ mark_dummy_rel(RelOptInfo *rel)
* decide there ' s no match for an outer row , which is pretty stupid . So ,
* we need to detect the case .
*
* If only_pushed_down is true , then consider only pushed - down quals .
* If only_pushed_down is true , then consider only quals that are pushed - down
* from the point of view of the joinrel .
*/
static bool
restriction_is_constant_false ( List * restrictlist , bool only_pushed_down )
restriction_is_constant_false ( List * restrictlist ,
RelOptInfo * joinrel ,
bool only_pushed_down )
{
ListCell * lc ;
@ -1266,7 +1270,7 @@ restriction_is_constant_false(List *restrictlist, bool only_pushed_down)
{
RestrictInfo * rinfo = lfirst_node ( RestrictInfo , lc ) ;
if ( only_pushed_down & & ! rinfo - > is_pushed_down )
if ( only_pushed_down & & ! RINFO_IS_PUSHED_DOWN ( rinfo , joinrel - > relids ) )
continue ;
if ( rinfo - > clause & & IsA ( rinfo - > clause , Const ) )
@ -1411,8 +1415,9 @@ try_partitionwise_join(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2,
* partition keys from given relations being joined .
*/
bool
have_partkey_equi_join ( RelOptInfo * rel1 , RelOptInfo * rel2 , JoinType jointype ,
List * restrictlist )
have_partkey_equi_join ( RelOptInfo * joinrel ,
RelOptInfo * rel1 , RelOptInfo * rel2 ,
JoinType jointype , List * restrictlist )
{
PartitionScheme part_scheme = rel1 - > part_scheme ;
ListCell * lc ;
@ -1438,7 +1443,8 @@ have_partkey_equi_join(RelOptInfo *rel1, RelOptInfo *rel2, JoinType jointype,
int ipk2 ;
/* If processing an outer join, only use its own join clauses. */
if ( IS_OUTER_JOIN ( jointype ) & & rinfo - > is_pushed_down )
if ( IS_OUTER_JOIN ( jointype ) & &
RINFO_IS_PUSHED_DOWN ( rinfo , joinrel - > relids ) )
continue ;
/* Skip clauses which can not be used for a join. */