aboutsummaryrefslogtreecommitdiff
path: root/src/include/access/gist_private.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/access/gist_private.h')
-rw-r--r--src/include/access/gist_private.h154
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 */