Fix adjust_semi_join to be more cautious about clauseless joins.
authorTom Lane <[email protected]>
Tue, 2 Nov 2010 22:45:50 +0000 (18:45 -0400)
committerTom Lane <[email protected]>
Tue, 2 Nov 2010 22:45:50 +0000 (18:45 -0400)
It was reporting that these were fully indexed (hence cheap), when of
course they're the exact opposite of that.  I'm not certain if the case
would arise in practice, since a clauseless semijoin is hard to produce
in SQL, but if it did happen we'd make some dumb decisions.

src/backend/optimizer/path/costsize.c

index 9b35253fe52d731d93700e9328b315592b441e72..46a4639eb50b4e5a0adee0bb45b0f616077e56f8 100644 (file)
@@ -2579,12 +2579,20 @@ adjust_semi_join(PlannerInfo *root, JoinPath *path, SpecialJoinInfo *sjinfo,
         */
        if (indexed_join_quals)
        {
-               List       *nrclauses;
+               if (path->joinrestrictinfo != NIL)
+               {
+                       List       *nrclauses;
 
-               nrclauses = select_nonredundant_join_clauses(root,
-                                                                                                        path->joinrestrictinfo,
-                                                                                                        path->innerjoinpath);
-               *indexed_join_quals = (nrclauses == NIL);
+                       nrclauses = select_nonredundant_join_clauses(root,
+                                                                                                                path->joinrestrictinfo,
+                                                                                                                path->innerjoinpath);
+                       *indexed_join_quals = (nrclauses == NIL);
+               }
+               else
+               {
+                       /* a clauseless join does NOT qualify */
+                       *indexed_join_quals = false;
+               }
        }
 
        return true;