After reading the logic of removing useless join, I think the comment of this might need to be changed: "Currently, join_is_removable only succeeds if sjinfo's right hand is a single baserel. " could be changed to "Currently, join_is_removable only succeeds if sjinfo's min_righthand is a single baserel. ". Because the useless join in the query "select t1.* from t1 left join (t2 left join t3 on t3.a=t2.b) on t2.a=t1.a;" would also be eliminated. That is, the query will be converted to "select t1.* from t1;"
diff --git a/src/backend/optimizer/plan/analyzejoins.c b/src/backend/optimizer/plan/analyzejoins.c index 6c02fe8908..70e0ae372f 100644 --- a/src/backend/optimizer/plan/analyzejoins.c +++ b/src/backend/optimizer/plan/analyzejoins.c @@ -112,7 +112,7 @@ restart: /* * Currently, join_is_removable can only succeed when the sjinfo's - * righthand is a single baserel. Remove that rel from the query and + * min_righthand is a single baserel. Remove that rel from the query and * joinlist. */ innerrelid = bms_singleton_member(sjinfo->min_righthand);