*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/optimizer/path/clausesel.c,v 1.63 2004/01/04 03:51:52 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/path/clausesel.c,v 1.64 2004/01/05 16:44:40 tgl Exp $
*
*-------------------------------------------------------------------------
*/
* If possible, cache the result of the selectivity calculation for
* the clause. We can cache if varRelid is zero or the clause
* contains only vars of that relid --- otherwise varRelid will affect
- * the result, so mustn't cache. We ignore the possibility that
- * jointype will affect the result, which should be okay because outer
- * join clauses will always be examined with the same jointype value.
+ * the result, so mustn't cache. We also have to be careful about
+ * the jointype. It's OK to cache when jointype is JOIN_INNER or
+ * one of the outer join types (any given outer-join clause should
+ * always be examined with the same jointype, so result won't change).
+ * It's not OK to cache when jointype is one of the special types
+ * associated with IN processing, because the same clause may be
+ * examined with different jointypes and the result should vary.
*/
if (varRelid == 0 ||
bms_is_subset_singleton(rinfo->clause_relids, varRelid))
{
- /* Cacheable --- do we already have the result? */
- if (rinfo->this_selec >= 0)
- return rinfo->this_selec;
- cacheable = true;
+ switch (jointype)
+ {
+ case JOIN_INNER:
+ case JOIN_LEFT:
+ case JOIN_FULL:
+ case JOIN_RIGHT:
+ /* Cacheable --- do we already have the result? */
+ if (rinfo->this_selec >= 0)
+ return rinfo->this_selec;
+ cacheable = true;
+ break;
+
+ case JOIN_UNION:
+ /* unimplemented anyway... */
+ case JOIN_IN:
+ case JOIN_REVERSE_IN:
+ case JOIN_UNIQUE_OUTER:
+ case JOIN_UNIQUE_INNER:
+ /* unsafe to cache */
+ break;
+ }
}
/* Proceed with examination of contained clause */