| /*------------------------------------------------------------------------- |
| * |
| * genam.h |
| * POSTGRES generalized index access method definitions. |
| * |
| * |
| * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group |
| * Portions Copyright (c) 1994, Regents of the University of California |
| * |
| * $PostgreSQL: pgsql/src/include/access/genam.h,v 1.65 2006/07/31 20:09:05 tgl Exp $ |
| * |
| *------------------------------------------------------------------------- |
| */ |
| #ifndef GENAM_H |
| #define GENAM_H |
| |
| #include "access/relscan.h" |
| #include "access/sdir.h" |
| #include "nodes/primnodes.h" |
| #include "storage/lock.h" |
| #include "utils/relcache.h" |
| |
| #include "cdb/cdbinmemheapam.h" |
| |
| /* |
| * Struct for statistics returned by ambuild |
| */ |
| typedef struct IndexBuildResult |
| { |
| double heap_tuples; /* # of tuples seen in parent table */ |
| double index_tuples; /* # of tuples inserted into index */ |
| } IndexBuildResult; |
| |
| /* |
| * Struct for input arguments passed to ambulkdelete and amvacuumcleanup |
| * |
| * Note that num_heap_tuples will not be valid during ambulkdelete, |
| * only amvacuumcleanup. |
| */ |
| typedef struct IndexVacuumInfo |
| { |
| Relation index; /* the index being vacuumed */ |
| bool vacuum_full; /* VACUUM FULL (we have exclusive lock) */ |
| int message_level; /* ereport level for progress messages */ |
| double num_heap_tuples; /* tuples remaining in heap */ |
| List *extra_oids; /* For bitmap indexes: store three relfilenode oids |
| * for reindexing a bitmap index. |
| */ |
| } IndexVacuumInfo; |
| |
| /* |
| * Struct for statistics returned by ambulkdelete and amvacuumcleanup |
| * |
| * This struct is normally allocated by the first ambulkdelete call and then |
| * passed along through subsequent ones until amvacuumcleanup; however, |
| * amvacuumcleanup must be prepared to allocate it in the case where no |
| * ambulkdelete calls were made (because no tuples needed deletion). |
| * Note that an index AM could choose to return a larger struct |
| * of which this is just the first field; this provides a way for ambulkdelete |
| * to communicate additional private data to amvacuumcleanup. |
| * |
| * Note: pages_removed is the amount by which the index physically shrank, |
| * if any (ie the change in its total size on disk). pages_deleted and |
| * pages_free refer to free space within the index file. |
| */ |
| typedef struct IndexBulkDeleteResult |
| { |
| BlockNumber num_pages; /* pages remaining in index */ |
| BlockNumber pages_removed; /* # removed during vacuum operation */ |
| double num_index_tuples; /* tuples remaining */ |
| double tuples_removed; /* # removed during vacuum operation */ |
| BlockNumber pages_deleted; /* # unused pages in index */ |
| BlockNumber pages_free; /* # pages available for reuse */ |
| } IndexBulkDeleteResult; |
| |
| /* Typedef for callback function to determine if a tuple is bulk-deletable */ |
| typedef bool (*IndexBulkDeleteCallback) (ItemPointer itemptr, void *state); |
| |
| /* Struct for heap-or-index scans of system tables */ |
| typedef struct SysScanDescData |
| { |
| Relation heap_rel; /* catalog being scanned */ |
| Relation irel; /* NULL if doing heap scan */ |
| HeapScanDesc scan; /* only valid in heap-scan case */ |
| IndexScanDesc iscan; /* only valid in index-scan case */ |
| InMemHeapScanDesc inmemscan; /* only valid in in-memory heap scan*/ |
| InMemHeapScanDesc inmemonlyscan; /* scan of in-memory entries that are not saved to disk */ |
| bool inmem_started; /* heap/index scan finished, start inmemonlyscan */ |
| } SysScanDescData; |
| |
| typedef SysScanDescData *SysScanDesc; |
| |
| |
| /* |
| * generalized index_ interface routines (in indexam.c) |
| */ |
| extern Relation index_open(Oid relationId, LOCKMODE lockmode); |
| extern void index_close(Relation relation, LOCKMODE lockmode); |
| |
| extern bool index_insert(Relation indexRelation, |
| Datum *values, bool *isnull, |
| ItemPointer heap_t_ctid, |
| Relation heapRelation, |
| bool check_uniqueness); |
| |
| extern IndexScanDesc index_beginscan(Relation heapRelation, |
| Relation indexRelation, |
| Snapshot snapshot, |
| int nkeys, ScanKey key); |
| extern IndexScanDesc index_beginscan_generic(Relation heapRelation, |
| Relation indexRelation, |
| Snapshot snapshot, |
| int nkeys, ScanKey key, bool isMultiscan); |
| |
| extern void index_rescan(IndexScanDesc scan, ScanKey key); |
| extern void index_endscan(IndexScanDesc scan); |
| extern void index_markpos(IndexScanDesc scan); |
| extern void index_restrpos(IndexScanDesc scan); |
| extern HeapTuple index_getnext(IndexScanDesc scan, ScanDirection direction); |
| extern bool index_getnext_indexitem(IndexScanDesc scan, |
| ScanDirection direction); |
| |
| extern Node *index_getmulti(IndexScanDesc scan, Node *bitmap); |
| |
| extern IndexBulkDeleteResult *index_bulk_delete(IndexVacuumInfo *info, |
| IndexBulkDeleteResult *stats, |
| IndexBulkDeleteCallback callback, |
| void *callback_state); |
| extern IndexBulkDeleteResult *index_vacuum_cleanup(IndexVacuumInfo *info, |
| IndexBulkDeleteResult *stats); |
| extern RegProcedure index_getprocid(Relation irel, AttrNumber attnum, |
| uint16 procnum); |
| extern FmgrInfo *index_getprocinfo(Relation irel, AttrNumber attnum, |
| uint16 procnum); |
| |
| /* |
| * index access method support routines (in genam.c) |
| */ |
| extern IndexScanDesc RelationGetIndexScan(Relation indexRelation, |
| int nkeys, ScanKey key); |
| extern void IndexScanEnd(IndexScanDesc scan); |
| |
| /* |
| * heap-or-index access to system catalogs (in genam.c) |
| */ |
| extern SysScanDesc systable_beginscan(Relation heapRelation, |
| Oid indexId, |
| bool indexOK, |
| Snapshot snapshot, |
| int nkeys, ScanKey key); |
| extern HeapTuple systable_getnext(SysScanDesc sysscan); |
| extern HeapTuple systable_getprev(SysScanDesc sysscan); |
| extern void systable_endscan(SysScanDesc sysscan); |
| extern SysScanDesc systable_beginscan_ordered(Relation heapRelation, |
| Relation indexRelation, |
| Snapshot snapshot, |
| int nkeys, ScanKey key); |
| extern HeapTuple systable_getnext_ordered(SysScanDesc sysscan, |
| ScanDirection direction); |
| extern void systable_endscan_ordered(SysScanDesc sysscan); |
| |
| #endif /* GENAM_H */ |