From d544ec8bbd70d50c1b50a00437b8061cabeeb5f2 Mon Sep 17 00:00:00 2001 From: Teodor Sigaev Date: Mon, 20 Jun 2005 10:29:37 +0000 Subject: 1. full functional WAL for GiST 2. improve vacuum for gist - use FSM - full vacuum: - reforms parent tuple if it's needed ( tuples was deleted on child page or parent tuple remains invalid after crash recovery ) - truncate index file if possible 3. fixes bugs and mistakes --- src/include/access/gist.h | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'src/include/access/gist.h') diff --git a/src/include/access/gist.h b/src/include/access/gist.h index 33110b71b6a..bf9c1c712bb 100644 --- a/src/include/access/gist.h +++ b/src/include/access/gist.h @@ -9,7 +9,7 @@ * 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.h,v 1.46 2005/05/17 03:34:18 neilc Exp $ + * $PostgreSQL: pgsql/src/include/access/gist.h,v 1.47 2005/06/20 10:29:36 teodor Exp $ * *------------------------------------------------------------------------- */ @@ -36,6 +36,8 @@ * Page opaque data in a GiST index page. */ #define F_LEAF (1 << 0) +#define F_DELETED (1 << 1) +#define F_TUPLES_DELETED (1 << 2) typedef struct GISTPageOpaqueData { @@ -56,6 +58,7 @@ typedef struct GIST_SPLITVEC * spl_left */ int spl_lattrsize[INDEX_MAX_KEYS]; bool spl_lisnull[INDEX_MAX_KEYS]; + bool spl_leftvalid; OffsetNumber *spl_right; /* array of entries that go right */ int spl_nright; /* size of the array */ @@ -64,6 +67,7 @@ typedef struct GIST_SPLITVEC * spl_right */ int spl_rattrsize[INDEX_MAX_KEYS]; bool spl_risnull[INDEX_MAX_KEYS]; + bool spl_rightvalid; int *spl_idgrp; int *spl_ngrp; /* number in each group */ @@ -86,7 +90,18 @@ typedef struct GISTENTRY bool leafkey; } GISTENTRY; -#define GIST_LEAF(entry) (((GISTPageOpaque) PageGetSpecialPointer((entry)->page))->flags & F_LEAF) +#define GistPageIsLeaf(page) (((GISTPageOpaque) PageGetSpecialPointer(page))->flags & F_LEAF) +#define GIST_LEAF(entry) (GistPageIsLeaf((entry)->page)) +#define GistPageSetLeaf(page) (((GISTPageOpaque) PageGetSpecialPointer(page))->flags |= F_LEAF) +#define GistPageSetNonLeaf(page) (((GISTPageOpaque) PageGetSpecialPointer(page))->flags &= ~F_LEAF) + +#define GistPageIsDeleted(page) (((GISTPageOpaque) PageGetSpecialPointer(page))->flags & F_DELETED) +#define GistPageSetDeleted(page) (((GISTPageOpaque) PageGetSpecialPointer(page))->flags |= F_DELETED) +#define GistPageSetNonDeleted(page) (((GISTPageOpaque) PageGetSpecialPointer(page))->flags &= ~F_DELETED) + +#define GistTuplesDeleted(page) (((GISTPageOpaque) PageGetSpecialPointer(page))->flags & F_TUPLES_DELETED) +#define GistMarkTuplesDeleted(page) (((GISTPageOpaque) PageGetSpecialPointer(page))->flags |= F_TUPLES_DELETED) +#define GistClearTuplesDeleted(page) (((GISTPageOpaque) PageGetSpecialPointer(page))->flags &= ~F_TUPLES_DELETED) /* * Vector of GISTENTRY structs; user-defined methods union and pick -- cgit v1.2.3