Fix adjust_semi_join to be more cautious about clauseless joins.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 2 Nov 2010 22:45:50 +0000 (18:45 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
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;