If we don't have to return any columns from heap tuples, and there's no need to recheck qual conditions, and the heap page is all-visible, then we can skip fetching the heap page altogether.
Skip prefetching pages too, when possible, on the assumption that the recheck flag will remain the same from one page to the next. While that assumption is hardly bulletproof, it seems like a good bet most of the time, and better than prefetching pages we don't need.
This commit installs the executor infrastructure, but doesn't change any planner cost estimates, thus possibly causing bitmap scans to not be chosen in cases where this change renders them the best choice. I (tgl) am not entirely convinced that we need to account for this behavior in the planner, because I think typically the bitmap scan would get chosen anyway if it's the best bet. In any case the submitted patch took way too many shortcuts, resulting in too many clearly-bad choices, to be committable.
Alexander Kuzmenkov, reviewed by Alexey Chernyshov, and whacked around rather heavily by me.
7c70996ebf Allow bitmap scans to operate as index-only scans when possible.
src/backend/executor/nodeBitmapHeapscan.c | 165 +++++++++++++++++++++++-------
src/backend/optimizer/plan/createplan.c | 9 ++
src/include/nodes/execnodes.h | 10 +-
src/test/regress/expected/stats.out | 3 +
src/test/regress/sql/stats.sql | 3 +
5 files changed, 150 insertions(+), 40 deletions(-)