1996-08-27 23:50:29 +02:00
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
*
|
1999-02-14 00:22:53 +01:00
|
|
|
* gist.h
|
2005-05-17 05:34:18 +02:00
|
|
|
* The public API for GiST indexes. This API is exposed to
|
|
|
|
* individuals implementing GiST indexes, so backward-incompatible
|
|
|
|
* changes should be made with care.
|
1997-09-07 07:04:48 +02:00
|
|
|
*
|
1996-08-27 23:50:29 +02:00
|
|
|
*
|
2006-03-05 16:59:11 +01:00
|
|
|
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
|
2001-05-30 21:53:40 +02:00
|
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
1996-08-27 23:50:29 +02:00
|
|
|
*
|
2006-09-10 02:29:35 +02:00
|
|
|
* $PostgreSQL: pgsql/src/include/access/gist.h,v 1.55 2006/09/10 00:29:34 tgl Exp $
|
1996-08-27 23:50:29 +02:00
|
|
|
*
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
#ifndef GIST_H
|
|
|
|
#define GIST_H
|
|
|
|
|
2005-11-07 18:36:47 +01:00
|
|
|
#include "access/xlog.h"
|
|
|
|
#include "access/xlogdefs.h"
|
2005-05-17 05:34:18 +02:00
|
|
|
#include "storage/bufpage.h"
|
|
|
|
#include "storage/off.h"
|
|
|
|
#include "utils/rel.h"
|
1996-08-27 23:50:29 +02:00
|
|
|
|
|
|
|
/*
|
2001-05-30 21:53:40 +02:00
|
|
|
* amproc indexes for GiST indexes.
|
|
|
|
*/
|
1997-09-07 07:04:48 +02:00
|
|
|
#define GIST_CONSISTENT_PROC 1
|
|
|
|
#define GIST_UNION_PROC 2
|
|
|
|
#define GIST_COMPRESS_PROC 3
|
|
|
|
#define GIST_DECOMPRESS_PROC 4
|
|
|
|
#define GIST_PENALTY_PROC 5
|
|
|
|
#define GIST_PICKSPLIT_PROC 6
|
|
|
|
#define GIST_EQUAL_PROC 7
|
2001-05-30 21:53:40 +02:00
|
|
|
#define GISTNProcs 7
|
|
|
|
|
2005-11-07 18:36:47 +01:00
|
|
|
/*
|
|
|
|
* strategy numbers for GiST opclasses that want to implement the old
|
|
|
|
* RTREE behavior.
|
|
|
|
*/
|
|
|
|
#define RTLeftStrategyNumber 1
|
|
|
|
#define RTOverLeftStrategyNumber 2
|
|
|
|
#define RTOverlapStrategyNumber 3
|
|
|
|
#define RTOverRightStrategyNumber 4
|
|
|
|
#define RTRightStrategyNumber 5
|
|
|
|
#define RTSameStrategyNumber 6
|
2006-09-10 02:29:35 +02:00
|
|
|
#define RTContainsStrategyNumber 7 /* for @> */
|
|
|
|
#define RTContainedByStrategyNumber 8 /* for <@ */
|
2005-11-07 18:36:47 +01:00
|
|
|
#define RTOverBelowStrategyNumber 9
|
|
|
|
#define RTBelowStrategyNumber 10
|
|
|
|
#define RTAboveStrategyNumber 11
|
|
|
|
#define RTOverAboveStrategyNumber 12
|
2006-09-10 02:29:35 +02:00
|
|
|
#define RTOldContainsStrategyNumber 13 /* for old spelling of @> */
|
|
|
|
#define RTOldContainedByStrategyNumber 14 /* for old spelling of <@ */
|
2005-11-07 18:36:47 +01:00
|
|
|
|
2001-05-30 21:53:40 +02:00
|
|
|
/*
|
|
|
|
* Page opaque data in a GiST index page.
|
|
|
|
*/
|
1997-09-07 07:04:48 +02:00
|
|
|
#define F_LEAF (1 << 0)
|
2005-06-20 12:29:37 +02:00
|
|
|
#define F_DELETED (1 << 1)
|
|
|
|
#define F_TUPLES_DELETED (1 << 2)
|
1996-08-27 23:50:29 +02:00
|
|
|
|
2005-06-27 14:45:23 +02:00
|
|
|
typedef XLogRecPtr GistNSN;
|
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
typedef struct GISTPageOpaqueData
|
|
|
|
{
|
2005-10-15 04:49:52 +02:00
|
|
|
uint32 flags; /* 29 bits are unused for now */
|
|
|
|
BlockNumber rightlink;
|
2005-06-27 14:45:23 +02:00
|
|
|
|
2005-10-15 04:49:52 +02:00
|
|
|
/*
|
|
|
|
* the only meaning - change this value if page split.
|
|
|
|
*/
|
2005-06-27 14:45:23 +02:00
|
|
|
GistNSN nsn;
|
1997-09-08 23:56:23 +02:00
|
|
|
} GISTPageOpaqueData;
|
1996-08-27 23:50:29 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
typedef GISTPageOpaqueData *GISTPageOpaque;
|
1996-08-27 23:50:29 +02:00
|
|
|
|
|
|
|
/*
|
2001-05-30 21:53:40 +02:00
|
|
|
* This is the Split Vector to be returned by the PickSplit method.
|
2006-06-28 14:00:14 +02:00
|
|
|
* PickSplit should check spl_(r|l)datum_exists. If it is 'true',
|
|
|
|
* that corresponding spl_(r|l)datum already defined and
|
|
|
|
* PickSplit should use that value. PickSplit should always set
|
|
|
|
* spl_(r|l)datum_exists to false: GiST will check value to
|
|
|
|
* control supportng this feature by PickSplit...
|
2001-05-30 21:53:40 +02:00
|
|
|
*/
|
1997-09-07 07:04:48 +02:00
|
|
|
typedef struct GIST_SPLITVEC
|
|
|
|
{
|
1997-09-08 04:41:22 +02:00
|
|
|
OffsetNumber *spl_left; /* array of entries that go left */
|
|
|
|
int spl_nleft; /* size of this array */
|
2001-05-31 20:16:55 +02:00
|
|
|
Datum spl_ldatum; /* Union of keys in spl_left */
|
2006-06-28 14:00:14 +02:00
|
|
|
bool spl_ldatum_exists; /* true, if spl_ldatum already exists. */
|
2001-05-31 20:16:55 +02:00
|
|
|
|
1997-09-08 04:41:22 +02:00
|
|
|
OffsetNumber *spl_right; /* array of entries that go right */
|
|
|
|
int spl_nright; /* size of the array */
|
2001-05-31 20:16:55 +02:00
|
|
|
Datum spl_rdatum; /* Union of keys in spl_right */
|
2006-06-28 14:00:14 +02:00
|
|
|
bool spl_rdatum_exists; /* true, if spl_rdatum already exists. */
|
1997-09-08 23:56:23 +02:00
|
|
|
} GIST_SPLITVEC;
|
1996-08-27 23:50:29 +02:00
|
|
|
|
|
|
|
/*
|
2005-05-17 05:34:18 +02:00
|
|
|
* An entry on a GiST node. Contains the key, as well as its own
|
|
|
|
* location (rel,page,offset) which can supply the matching pointer.
|
2006-06-28 14:00:14 +02:00
|
|
|
* leafkey is a flag to tell us if the entry is in a leaf node.
|
2001-05-30 21:53:40 +02:00
|
|
|
*/
|
1997-09-07 07:04:48 +02:00
|
|
|
typedef struct GISTENTRY
|
|
|
|
{
|
2001-05-31 20:16:55 +02:00
|
|
|
Datum key;
|
1997-09-08 04:41:22 +02:00
|
|
|
Relation rel;
|
|
|
|
Page page;
|
|
|
|
OffsetNumber offset;
|
|
|
|
bool leafkey;
|
1997-09-08 23:56:23 +02:00
|
|
|
} GISTENTRY;
|
1996-08-27 23:50:29 +02:00
|
|
|
|
2005-10-15 04:49:52 +02:00
|
|
|
#define GistPageGetOpaque(page) ( (GISTPageOpaque) PageGetSpecialPointer(page) )
|
2005-06-27 14:45:23 +02:00
|
|
|
|
|
|
|
#define GistPageIsLeaf(page) ( GistPageGetOpaque(page)->flags & F_LEAF)
|
2005-06-20 12:29:37 +02:00
|
|
|
#define GIST_LEAF(entry) (GistPageIsLeaf((entry)->page))
|
2005-06-27 14:45:23 +02:00
|
|
|
#define GistPageSetLeaf(page) ( GistPageGetOpaque(page)->flags |= F_LEAF)
|
2005-10-15 04:49:52 +02:00
|
|
|
#define GistPageSetNonLeaf(page) ( GistPageGetOpaque(page)->flags &= ~F_LEAF)
|
2005-06-20 12:29:37 +02:00
|
|
|
|
2005-10-15 04:49:52 +02:00
|
|
|
#define GistPageIsDeleted(page) ( GistPageGetOpaque(page)->flags & F_DELETED)
|
2005-06-27 14:45:23 +02:00
|
|
|
#define GistPageSetDeleted(page) ( GistPageGetOpaque(page)->flags |= F_DELETED)
|
2005-10-15 04:49:52 +02:00
|
|
|
#define GistPageSetNonDeleted(page) ( GistPageGetOpaque(page)->flags &= ~F_DELETED)
|
2005-06-20 12:29:37 +02:00
|
|
|
|
2005-10-15 04:49:52 +02:00
|
|
|
#define GistTuplesDeleted(page) ( GistPageGetOpaque(page)->flags & F_TUPLES_DELETED)
|
|
|
|
#define GistMarkTuplesDeleted(page) ( GistPageGetOpaque(page)->flags |= F_TUPLES_DELETED)
|
2005-06-27 14:45:23 +02:00
|
|
|
#define GistClearTuplesDeleted(page) ( GistPageGetOpaque(page)->flags &= ~F_TUPLES_DELETED)
|
2004-03-30 17:45:33 +02:00
|
|
|
|
|
|
|
/*
|
2005-05-17 05:34:18 +02:00
|
|
|
* Vector of GISTENTRY structs; user-defined methods union and pick
|
|
|
|
* split takes it as one of their arguments
|
2004-03-30 17:45:33 +02:00
|
|
|
*/
|
2004-08-29 07:07:03 +02:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
int32 n; /* number of elements */
|
2004-03-30 17:45:33 +02:00
|
|
|
GISTENTRY vector[1];
|
|
|
|
} GistEntryVector;
|
|
|
|
|
2006-06-25 03:02:12 +02:00
|
|
|
#define GEVHDRSZ (offsetof(GistEntryVector, vector))
|
2004-03-30 17:45:33 +02:00
|
|
|
|
1996-08-27 23:50:29 +02:00
|
|
|
/*
|
2001-05-30 21:53:40 +02:00
|
|
|
* macro to initialize a GISTENTRY
|
|
|
|
*/
|
2006-06-28 14:00:14 +02:00
|
|
|
#define gistentryinit(e, k, r, pg, o, l) \
|
2001-05-31 20:16:55 +02:00
|
|
|
do { (e).key = (k); (e).rel = (r); (e).page = (pg); \
|
2006-06-28 14:00:14 +02:00
|
|
|
(e).offset = (o); (e).leafkey = (l); } while (0)
|
1997-09-07 07:04:48 +02:00
|
|
|
|
2001-11-05 18:46:40 +01:00
|
|
|
#endif /* GIST_H */
|