@ -669,6 +669,15 @@ postgresGetForeignRelSize(PlannerInfo *root,
* we have and want to test whether any of them are useful . For a foreign
* we have and want to test whether any of them are useful . For a foreign
* table , we don ' t know what indexes are present on the remote side but
* table , we don ' t know what indexes are present on the remote side but
* want to speculate about which ones we ' d like to use if they existed .
* want to speculate about which ones we ' d like to use if they existed .
*
* This function returns a list of potentially - useful equivalence classes ,
* but it does not guarantee that an EquivalenceMember exists which contains
* Vars only from the given relation . For example , given ft1 JOIN t1 ON
* ft1 . x + t1 . x = 0 , this function will say that the equivalence class
* containing ft1 . x + t1 . x is potentially useful . Supposing ft1 is remote and
* t1 is local ( or on a different server ) , it will turn out that no useful
* ORDER BY clause can be generated . It ' s not our job to figure that out
* here ; we ' re only interested in identifying relevant ECs .
*/
*/
static List *
static List *
get_useful_ecs_for_relation ( PlannerInfo * root , RelOptInfo * rel )
get_useful_ecs_for_relation ( PlannerInfo * root , RelOptInfo * rel )
@ -721,13 +730,32 @@ get_useful_ecs_for_relation(PlannerInfo *root, RelOptInfo *rel)
/*
/*
* restrictinfo - > mergeopfamilies ! = NIL is sufficient to guarantee
* restrictinfo - > mergeopfamilies ! = NIL is sufficient to guarantee
* that left_ec and right_ec will be initialized , per comments in
* that left_ec and right_ec will be initialized , per comments in
* distribute_qual_to_rels , and rel - > joininfo should only contain ECs
* distribute_qual_to_rels .
* where this relation appears on one side or the other .
*
* We want to identify which side of this merge - joinable clause
* contains columns from the relation produced by this RelOptInfo . We
* test for overlap , not containment , because there could be extra
* relations on either side . For example , suppose we ' ve got something
* like ( ( A JOIN B ON A . x = B . x ) JOIN C ON A . y = C . y ) LEFT JOIN D ON
* A . y = D . y . The input rel might be the joinrel between A and B , and
* we ' ll consider the join clause A . y = D . y . relids contains a
* relation not involved in the join class ( B ) and the equivalence
* class for the left - hand side of the clause contains a relation not
* involved in the input rel ( C ) . Despite the fact that we have only
* overlap and not containment in either direction , A . y is potentially
* useful as a sort column .
*
* Note that it ' s even possible that relids overlaps neither side of
* the join clause . For example , consider A LEFT JOIN B ON A . x = B . x
* AND A . x = 1. The clause A . x = 1 will appear in B ' s joininfo list ,
* but overlaps neither side of B . In that case , we just skip this
* join clause , since it doesn ' t suggest a useful sort order for this
* relation .
*/
*/
if ( bms_is_subset ( relids , restrictinfo - > right_ec - > ec_relids ) )
if ( bms_overlap ( relids , restrictinfo - > right_ec - > ec_relids ) )
useful_eclass_list = list_append_unique_ptr ( useful_eclass_list ,
useful_eclass_list = list_append_unique_ptr ( useful_eclass_list ,
restrictinfo - > right_ec ) ;
restrictinfo - > right_ec ) ;
else if ( bms_is_subset ( relids , restrictinfo - > left_ec - > ec_relids ) )
else if ( bms_overlap ( relids , restrictinfo - > left_ec - > ec_relids ) )
useful_eclass_list = list_append_unique_ptr ( useful_eclass_list ,
useful_eclass_list = list_append_unique_ptr ( useful_eclass_list ,
restrictinfo - > left_ec ) ;
restrictinfo - > left_ec ) ;
}
}