aboutsummaryrefslogtreecommitdiff
path: root/src/include/access/gist_private.h
diff options
context:
space:
mode:
authorTeodor Sigaev <teodor@sigaev.ru>2005-06-14 11:45:14 +0000
committerTeodor Sigaev <teodor@sigaev.ru>2005-06-14 11:45:14 +0000
commit37c839365c566c9e8d7e96cea79e535281144224 (patch)
tree33a5094b45c6a6b6549e05e4e2dcf1c63cc69d38 /src/include/access/gist_private.h
parentd6636543c4becc4ba9989af8e5b490e1ee2e7c0e (diff)
downloadpostgresql-37c839365c566c9e8d7e96cea79e535281144224.tar.gz
postgresql-37c839365c566c9e8d7e96cea79e535281144224.zip
WAL for GiST. It work for online backup and so on, but on
recovery after crash (power loss etc) it may say that it can't restore index and index should be reindexed. Some refactoring code.
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 */