/*-------------------------------------------------------------------------
*
* tidbitmap . h
* PostgreSQL tuple - id ( TID ) bitmap package
*
* This module provides bitmap data structures that are spiritually
* similar to Bitmapsets , but are specially adapted to store sets of
* tuple identifiers ( TIDs ) , or ItemPointers . In particular , the division
* of an ItemPointer into BlockNumber and OffsetNumber is catered for .
* Also , since we wish to be able to store very large tuple sets in
* memory with this data structure , we support " lossy " storage , in which
* we no longer remember individual tuple offsets on a page but only the
* fact that a particular page needs to be visited .
*
*
* Copyright ( c ) 2003 - 2025 , PostgreSQL Global Development Group
*
* src / include / nodes / tidbitmap . h
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
#ifndef TIDBITMAP_H
#define TIDBITMAP_H
#include "access/htup_details.h"
#include "storage/itemptr.h"
#include "utils/dsa.h"
/*
* The maximum number of tuples per page is not large ( typically 256 with
* 8 K pages , or 1024 with 32 K pages ) . So there ' s not much point in making
* the per - page bitmaps variable size . We just legislate that the size
* is this :
*/
#define TBM_MAX_TUPLES_PER_PAGE MaxHeapTuplesPerPage
/*
* Actual bitmap representation is private to tidbitmap . c . Callers can
* do IsA ( x , TIDBitmap ) on it , but nothing else .
*/
typedef struct TIDBitmap TIDBitmap;
/* Likewise, TBMPrivateIterator is private */
typedef struct TBMPrivateIterator TBMPrivateIterator;
typedef struct TBMSharedIterator TBMSharedIterator;
/*
* Callers with both private and shared implementations can use this unified
* API .
*/
typedef struct TBMIterator
{
bool shared;
union
{
TBMPrivateIterator *private_iterator;
TBMSharedIterator *shared_iterator;
} i;
} TBMIterator;
/* Result structure for tbm_iterate */
typedef struct TBMIterateResult
{
BlockNumber blockno; /* block number containing tuples */
bool lossy;
/*
* Whether or not the tuples should be rechecked . This is always true if
* the page is lossy but may also be true if the query requires recheck .
*/
bool recheck;
/*
* Pointer to the page containing the bitmap for this block . It is a void *
* to avoid exposing the details of the tidbitmap PagetableEntry to API
* users .
*/
void *internal_page;
} TBMIterateResult;
/* function prototypes in nodes/tidbitmap.c */
extern TIDBitmap *tbm_create(Size maxbytes, dsa_area *dsa);
extern void tbm_free(TIDBitmap *tbm);
extern void tbm_free_shared_area(dsa_area *dsa, dsa_pointer dp);
extern void tbm_add_tuples(TIDBitmap *tbm,
const ItemPointer tids, int ntids,
bool recheck);
extern void tbm_add_page(TIDBitmap *tbm, BlockNumber pageno);
extern void tbm_union(TIDBitmap *a, const TIDBitmap *b);
extern void tbm_intersect(TIDBitmap *a, const TIDBitmap *b);
extern int tbm_extract_page_tuple(TBMIterateResult *iteritem,
OffsetNumber *offsets,
uint32 max_offsets);
extern bool tbm_is_empty(const TIDBitmap *tbm);
extern TBMPrivateIterator *tbm_begin_private_iterate(TIDBitmap *tbm);
extern dsa_pointer tbm_prepare_shared_iterate(TIDBitmap *tbm);
extern bool tbm_private_iterate(TBMPrivateIterator *iterator, TBMIterateResult *tbmres);
extern bool tbm_shared_iterate(TBMSharedIterator *iterator, TBMIterateResult *tbmres);
extern void tbm_end_private_iterate(TBMPrivateIterator *iterator);
extern void tbm_end_shared_iterate(TBMSharedIterator *iterator);
extern TBMSharedIterator *tbm_attach_shared_iterate(dsa_area *dsa,
dsa_pointer dp);
extern int tbm_calculate_entries(Size maxbytes);
extern TBMIterator tbm_begin_iterate(TIDBitmap *tbm,
dsa_area *dsa, dsa_pointer dsp);
extern void tbm_end_iterate(TBMIterator *iterator);
extern bool tbm_iterate(TBMIterator *iterator, TBMIterateResult *tbmres);
static inline bool
tbm_exhausted(TBMIterator *iterator)
{
/*
* It doesn ' t matter if we check the private or shared iterator here . If
* tbm_end_iterate ( ) was called , they will be NULL
*/
return !iterator->i.private_iterator;
}
#endif /* TIDBITMAP_H */
Messung V0.5 in Prozent C=80 H=99 G=90
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-08-08)
¤
*© Formatika GbR, Deutschland