📄 heapam.h
字号:
/*------------------------------------------------------------------------- * * heapam.h * POSTGRES heap access method definitions. * * * Copyright (c) 1994, Regents of the University of California * * $Id: heapam.h,v 1.43.2.1 1999/07/30 18:26:58 scrappy Exp $ * *------------------------------------------------------------------------- */#ifndef HEAPAM_H#define HEAPAM_H#include <time.h>#include "access/htup.h"#include "access/relscan.h"#include "access/tupmacs.h"#include "storage/block.h"#include "utils/rel.h"#include "utils/tqual.h"/* ---------------------------------------------------------------- * heap access method statistics * ---------------------------------------------------------------- */typedef struct HeapAccessStatisticsData{ time_t init_global_timestamp; /* time global statistics started */ time_t local_reset_timestamp; /* last time local reset was done */ time_t last_request_timestamp; /* last time stats were requested */ int global_open; int global_openr; int global_close; int global_beginscan; int global_rescan; int global_endscan; int global_getnext; int global_fetch; int global_insert; int global_delete; int global_replace; int global_mark4update; int global_markpos; int global_restrpos; int global_BufferGetRelation; int global_RelationIdGetRelation; int global_RelationIdGetRelation_Buf; int global_RelationNameGetRelation; int global_getreldesc; int global_heapgettup; int global_RelationPutHeapTuple; int global_RelationPutLongHeapTuple; int local_open; int local_openr; int local_close; int local_beginscan; int local_rescan; int local_endscan; int local_getnext; int local_fetch; int local_insert; int local_delete; int local_replace; int local_mark4update; int local_markpos; int local_restrpos; int local_BufferGetRelation; int local_RelationIdGetRelation; int local_RelationIdGetRelation_Buf; int local_RelationNameGetRelation; int local_getreldesc; int local_heapgettup; int local_RelationPutHeapTuple; int local_RelationPutLongHeapTuple;} HeapAccessStatisticsData;typedef HeapAccessStatisticsData *HeapAccessStatistics;#define IncrHeapAccessStat(x) \ (heap_access_stats == NULL ? 0 : (heap_access_stats->x)++)/* ---------------- * fastgetattr * * This gets called many times, so we macro the cacheable and NULL * lookups, and call noncachegetattr() for the rest. * * ---------------- */extern Datum nocachegetattr(HeapTuple tup, int attnum, TupleDesc att, bool *isnull);#if !defined(DISABLE_COMPLEX_MACRO)#define fastgetattr(tup, attnum, tupleDesc, isnull) \( \ AssertMacro((attnum) > 0), \ ((isnull) ? (*(isnull) = false) : (dummyret)NULL), \ HeapTupleNoNulls(tup) ? \ ( \ ((tupleDesc)->attrs[(attnum)-1]->attcacheoff != -1 || \ (attnum) == 1) ? \ ( \ (Datum)fetchatt(&((tupleDesc)->attrs[(attnum)-1]), \ (char *) (tup)->t_data + (tup)->t_data->t_hoff + \ ( \ ((attnum) != 1) ? \ (tupleDesc)->attrs[(attnum)-1]->attcacheoff \ : \ 0 \ ) \ ) \ ) \ : \ nocachegetattr((tup), (attnum), (tupleDesc), (isnull)) \ ) \ : \ ( \ att_isnull((attnum)-1, (tup)->t_data->t_bits) ? \ ( \ ((isnull) ? (*(isnull) = true) : (dummyret)NULL), \ (Datum)NULL \ ) \ : \ ( \ nocachegetattr((tup), (attnum), (tupleDesc), (isnull)) \ ) \ ) \)#else /* !defined(DISABLE_COMPLEX_MACRO) */static Datumfastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull){ return ( (attnum) > 0 ? ( ((isnull) ? (*(isnull) = false) : (dummyret) NULL), HeapTupleNoNulls(tup) ? ( ((tupleDesc)->attrs[(attnum) - 1]->attcacheoff != -1 || (attnum) == 1) ? ( (Datum) fetchatt(&((tupleDesc)->attrs[(attnum) - 1]), (char *) (tup)->t_data + (tup)->t_data->t_hoff + ( ((attnum) != 1) ? (tupleDesc)->attrs[(attnum) - 1]->attcacheoff : 0 ) ) ) : nocachegetattr((tup), (attnum), (tupleDesc), (isnull)) ) : ( att_isnull((attnum) - 1, (tup)->t_data->t_bits) ? ( ((isnull) ? (*(isnull) = true) : (dummyret) NULL), (Datum) NULL ) : ( nocachegetattr((tup), (attnum), (tupleDesc), (isnull)) ) ) ) : ( (Datum) NULL ) );}#endif/* ---------------- * heap_getattr * * Find a particular field in a row represented as a heap tuple. * We return a pointer into that heap tuple, which points to the * first byte of the value of the field in question. * * If the field in question has a NULL value, we return a null * pointer and return <*isnull> == true. Otherwise, we return * <*isnull> == false. * * <tup> is the pointer to the heap tuple. <attnum> is the attribute * number of the column (field) caller wants. <tupleDesc> is a * pointer to the structure describing the row and all its fields. * * Because this macro is often called with constants, it generates * compiler warnings about 'left-hand comma expression has no effect. * * ---------------- */#define heap_getattr(tup, attnum, tupleDesc, isnull) \( \ AssertMacro((tup) != NULL && \ (attnum) > FirstLowInvalidHeapAttributeNumber && \ (attnum) != 0), \ ((attnum) > (int) (tup)->t_data->t_natts) ? \ ( \ ((isnull) ? (*(isnull) = true) : (dummyret)NULL), \ (Datum)NULL \ ) \ : \ ( \ ((attnum) > 0) ? \ ( \ fastgetattr((tup), (attnum), (tupleDesc), (isnull)) \ ) \ : \ ( \ ((isnull) ? (*(isnull) = false) : (dummyret)NULL), \ ((attnum) == SelfItemPointerAttributeNumber) ? \ ( \ (Datum)((char *)&((tup)->t_self)) \ ) \ : \ ( \ (Datum)*(unsigned int *) \ ((char *)(tup)->t_data + heap_sysoffset[-(attnum)-1]) \ ) \ ) \ ) \)extern HeapAccessStatistics heap_access_stats; /* in stats.c *//* ---------------- * function prototypes for heap access method * ---------------- *//* heap_create, heap_creatr, and heap_destroy are declared in catalog/heap.h *//* heapam.c */extern Relation heap_open(Oid relationId);extern Relation heap_openr(char *relationName);extern void heap_close(Relation relation);extern HeapScanDesc heap_beginscan(Relation relation, int atend, Snapshot snapshot, unsigned nkeys, ScanKey key);extern void heap_rescan(HeapScanDesc scan, bool scanFromEnd, ScanKey key);extern void heap_endscan(HeapScanDesc scan);extern HeapTuple heap_getnext(HeapScanDesc scandesc, int backw);extern void heap_fetch(Relation relation, Snapshot snapshot, HeapTuple tup, Buffer *userbuf);extern Oid heap_insert(Relation relation, HeapTuple tup);extern int heap_delete(Relation relation, ItemPointer tid, ItemPointer ctid);extern int heap_replace(Relation relation, ItemPointer otid, HeapTuple tup, ItemPointer ctid);extern int heap_mark4update(Relation relation, HeapTuple tup, Buffer *userbuf);extern void heap_markpos(HeapScanDesc scan);extern void heap_restrpos(HeapScanDesc scan);/* in common/heaptuple.c */extern Size ComputeDataSize(TupleDesc tupleDesc, Datum *value, char *nulls);extern void DataFill(char *data, TupleDesc tupleDesc, Datum *value, char *nulls, uint16 *infomask, bits8 *bit);extern int heap_attisnull(HeapTuple tup, int attnum);extern int heap_sysattrlen(AttrNumber attno);extern bool heap_sysattrbyval(AttrNumber attno);extern Datum nocachegetattr(HeapTuple tup, int attnum, TupleDesc att, bool *isnull);extern HeapTuple heap_copytuple(HeapTuple tuple);extern void heap_copytuple_with_tuple(HeapTuple src, HeapTuple dest);extern HeapTuple heap_formtuple(TupleDesc tupleDescriptor, Datum *value, char *nulls);extern HeapTuple heap_modifytuple(HeapTuple tuple, Relation relation, Datum *replValue, char *replNull, char *repl);HeapTuple heap_addheader(uint32 natts, int structlen, char *structure);/* in common/heap/stats.c */extern void PrintHeapAccessStatistics(HeapAccessStatistics stats);extern void initam(void);#endif /* HEAPAM_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -