]> granicus.if.org Git - postgresql/commitdiff
Fix adjust_semi_join to be more cautious about clauseless joins.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 2 Nov 2010 22:45:36 +0000 (18:45 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 2 Nov 2010 22:45:36 +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 067cbca1254d7b58114edf40e7c9ec967ce86f88..16a5d0a3ca277a8ad4d735eb43940bc6f46560f7 100644 (file)
@@ -2897,12 +2897,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;