*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/executor/nodeBitmapAnd.c,v 1.2 2005/04/20 15:48:36 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/executor/nodeBitmapAnd.c,v 1.3 2005/08/28 22:47:20 tgl Exp $
*
*-------------------------------------------------------------------------
*/
tbm_intersect(result, subresult);
tbm_free(subresult);
}
+
+ /*
+ * If at any stage we have a completely empty bitmap, we can fall
+ * out without evaluating the remaining subplans, since ANDing them
+ * can no longer change the result. (Note: the fact that indxpath.c
+ * orders the subplans by selectivity should make this case more
+ * likely to occur.)
+ */
+ if (tbm_is_empty(result))
+ break;
}
if (result == NULL)
* Copyright (c) 2003-2005, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/nodes/tidbitmap.c,v 1.5 2005/07/24 02:25:26 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/nodes/tidbitmap.c,v 1.6 2005/08/28 22:47:20 tgl Exp $
*
*-------------------------------------------------------------------------
*/
}
}
+/*
+ * tbm_is_empty - is a TIDBitmap completely empty?
+ */
+bool
+tbm_is_empty(const TIDBitmap *tbm)
+{
+ return (tbm->nentries == 0);
+}
+
/*
* tbm_begin_iterate - prepare to iterate through a TIDBitmap
*
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.187 2005/07/28 20:26:20 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.188 2005/08/28 22:47:20 tgl Exp $
*
*-------------------------------------------------------------------------
*/
* cases, the partial index will sort before competing non-partial
* indexes and so it makes the right choice, but perhaps we need to
* work harder.
+ *
+ * Note: outputting the selected sub-paths in selectivity order is a good
+ * thing even if we weren't using that as part of the selection method,
+ * because it makes the short-circuit case in MultiExecBitmapAnd() more
+ * likely to apply.
*/
/* Convert list to array so we can apply qsort */
*
* Copyright (c) 2003-2005, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/include/nodes/tidbitmap.h,v 1.1 2005/04/17 22:24:02 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/nodes/tidbitmap.h,v 1.2 2005/08/28 22:47:20 tgl Exp $
*
*-------------------------------------------------------------------------
*/
extern void tbm_union(TIDBitmap *a, const TIDBitmap *b);
extern void tbm_intersect(TIDBitmap *a, const TIDBitmap *b);
+extern bool tbm_is_empty(const TIDBitmap *tbm);
+
extern void tbm_begin_iterate(TIDBitmap *tbm);
extern TBMIterateResult *tbm_iterate(TIDBitmap *tbm);