diff options
Diffstat (limited to 'src/include/access/gist_private.h')
-rw-r--r-- | src/include/access/gist_private.h | 154 |
1 files changed, 150 insertions, 4 deletions
diff --git a/src/include/access/gist_private.h b/src/include/access/gist_private.h index db255a7b6f5..479f221176b 100644 --- a/src/include/access/gist_private.h +++ b/src/include/access/gist_private.h @@ -7,15 +7,17 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/gist_private.h,v 1.2 2005/06/06 17:01:24 tgl Exp $ + * $PostgreSQL: pgsql/src/include/access/gist_private.h,v 1.3 2005/06/14 11:45:14 teodor Exp $ * *------------------------------------------------------------------------- */ #ifndef GIST_PRIVATE_H #define GIST_PRIVATE_H +#include "access/itup.h" #include "access/gist.h" #include "access/xlog.h" +#include "access/xlogdefs.h" #include "fmgr.h" /* @@ -67,6 +69,42 @@ typedef struct GISTScanOpaqueData typedef GISTScanOpaqueData *GISTScanOpaque; /* + * GISTInsertStack used for locking buffers and transfer arguments during + * insertion + */ + +typedef struct GISTInsertStack { + /* current page */ + BlockNumber blkno; + Buffer buffer; + Page page; + + /* child's offset */ + OffsetNumber childoffnum; + + /* pointer to parent */ + struct GISTInsertStack *parent; + + bool todelete; +} GISTInsertStack; + +typedef struct { + Relation r; + IndexTuple *itup; /* in/out, points to compressed entry */ + int ituplen; /* length of itup */ + GISTInsertStack *stack; + bool needInsertComplete; + bool xlog_mode; + + /* pointer to heap tuple */ + ItemPointerData key; + + /* path to stroe in XLog */ + BlockNumber *path; + int pathlen; +} GISTInsertState; + +/* * When we're doing a scan and updating a tree at the same time, the * updates may affect the scan. We use the flags entry of the scan's * opaque space to record our actual position in response to updates @@ -89,6 +127,72 @@ typedef GISTScanOpaqueData *GISTScanOpaque; #define GISTOP_DEL 0 #define GISTOP_SPLIT 1 +#define ATTSIZE(datum, tupdesc, i, isnull) \ + ( \ + (isnull) ? 0 : \ + att_addlength(0, (tupdesc)->attrs[(i)-1]->attlen, (datum)) \ + ) + +/* XLog stuff */ +#define XLOG_GIST_ENTRY_UPDATE 0x00 +#define XLOG_GIST_ENTRY_DELETE 0x10 +#define XLOG_GIST_NEW_ROOT 0x20 + +typedef struct gistxlogEntryUpdate { + RelFileNode node; + BlockNumber blkno; + + /* if todeleteoffnum!=InvalidOffsetNumber then delete it. */ + OffsetNumber todeleteoffnum; + uint16 pathlen; + + /* + * It used to identify compliteness of insert. + * Sets to leaf itup + */ + ItemPointerData key; + + /* follow: + * 1. path to root (BlockNumber) + * 2. tuples to insert + */ +} gistxlogEntryUpdate; + +#define XLOG_GIST_PAGE_SPLIT 0x30 + +typedef struct gistxlogPageSplit { + RelFileNode node; + BlockNumber origblkno; /*splitted page*/ + OffsetNumber todeleteoffnum; + uint16 pathlen; + int npage; + int nitup; + + /* see comments on gistxlogEntryUpdate */ + ItemPointerData key; + + /* follow: + * 1. path to root (BlockNumber) + * 2. tuples to insert + * 3. gistxlogPage and array of OffsetNumber per page + */ +} gistxlogPageSplit; + +typedef struct gistxlogPage { + BlockNumber blkno; + int num; +} gistxlogPage; + + +#define XLOG_GIST_INSERT_COMPLETE 0x40 + +typedef struct gistxlogInsertComplete { + RelFileNode node; + ItemPointerData key; +} gistxlogInsertComplete; + +#define XLOG_GIST_CREATE_INDEX 0x50 + /* gist.c */ extern Datum gistbuild(PG_FUNCTION_ARGS); extern Datum gistinsert(PG_FUNCTION_ARGS); @@ -96,15 +200,57 @@ extern Datum gistbulkdelete(PG_FUNCTION_ARGS); extern MemoryContext createTempGistContext(void); extern void initGISTstate(GISTSTATE *giststate, Relation index); extern void freeGISTstate(GISTSTATE *giststate); -extern void gistdentryinit(GISTSTATE *giststate, int nkey, GISTENTRY *e, - Datum k, Relation r, Page pg, OffsetNumber o, - int b, bool l, bool isNull); +extern void gistnewroot(Relation r, IndexTuple *itup, int len, ItemPointer key, bool xlog_mode); +extern void gistmakedeal(GISTInsertState *state, GISTSTATE *giststate); +/* gistxlog.c */ extern void gist_redo(XLogRecPtr lsn, XLogRecord *record); extern void gist_desc(char *buf, uint8 xl_info, char *rec); +extern void gist_xlog_startup(void); +extern void gist_xlog_cleanup(void); /* gistget.c */ extern Datum gistgettuple(PG_FUNCTION_ARGS); extern Datum gistgetmulti(PG_FUNCTION_ARGS); +/* gistutil.c */ +extern OffsetNumber gistfillbuffer(Relation r, Page page, IndexTuple *itup, + int len, OffsetNumber off); +extern bool gistnospace(Page page, IndexTuple *itvec, int len); +extern IndexTuple * gistextractbuffer(Buffer buffer, int *len /* out */ ); +extern IndexTuple * gistjoinvector( + IndexTuple *itvec, int *len, + IndexTuple *additvec, int addlen); +extern IndexTuple gistunion(Relation r, IndexTuple *itvec, + int len, GISTSTATE *giststate); +extern IndexTuple gistgetadjusted(Relation r, + IndexTuple oldtup, + IndexTuple addtup, + GISTSTATE *giststate); +extern int gistfindgroup(GISTSTATE *giststate, + GISTENTRY *valvec, GIST_SPLITVEC *spl); +extern void gistadjsubkey(Relation r, + IndexTuple *itup, int *len, + GIST_SPLITVEC *v, + GISTSTATE *giststate); +extern IndexTuple gistFormTuple(GISTSTATE *giststate, + Relation r, Datum *attdata, int *datumsize, bool *isnull); + +extern OffsetNumber gistchoose(Relation r, Page p, + IndexTuple it, + GISTSTATE *giststate); +extern void gistcentryinit(GISTSTATE *giststate, int nkey, + GISTENTRY *e, Datum k, + Relation r, Page pg, + OffsetNumber o, int b, bool l, bool isNull); +extern void gistDeCompressAtt(GISTSTATE *giststate, Relation r, + IndexTuple tuple, Page p, OffsetNumber o, + GISTENTRY *attdata, bool *isnull); +extern void gistunionsubkey(Relation r, GISTSTATE *giststate, + IndexTuple *itvec, GIST_SPLITVEC *spl); +extern void GISTInitBuffer(Buffer b, uint32 f); +extern void gistdentryinit(GISTSTATE *giststate, int nkey, GISTENTRY *e, + Datum k, Relation r, Page pg, OffsetNumber o, + int b, bool l, bool isNull); + #endif /* GIST_PRIVATE_H */ |