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
|
|
|
*
|
2004-12-31 23:04:05 +01:00
|
|
|
* Portions Copyright (c) 1996-2005, 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
|
|
|
*
|
2005-06-30 19:52:14 +02:00
|
|
|
* $PostgreSQL: pgsql/src/include/access/gist.h,v 1.49 2005/06/30 17:52:14 teodor Exp $
|
1996-08-27 23:50:29 +02:00
|
|
|
*
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
#ifndef GIST_H
|
|
|
|
#define GIST_H
|
|
|
|
|
2005-05-17 05:34:18 +02:00
|
|
|
#include "storage/bufpage.h"
|
|
|
|
#include "storage/off.h"
|
|
|
|
#include "utils/rel.h"
|
2005-06-27 14:45:23 +02:00
|
|
|
#include "access/xlog.h"
|
|
|
|
#include "access/xlogdefs.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
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 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-06-30 19:52:14 +02:00
|
|
|
uint32 flags; /* 29 bits are unused for now */
|
2005-06-27 14:45:23 +02:00
|
|
|
BlockNumber rightlink;
|
|
|
|
|
|
|
|
/* the only meaning - change this value if
|
|
|
|
page split. */
|
|
|
|
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.
|
|
|
|
*/
|
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 */
|
2001-10-25 07:50:21 +02:00
|
|
|
Datum spl_lattr[INDEX_MAX_KEYS]; /* Union of subkeys in
|
|
|
|
* spl_left */
|
|
|
|
int spl_lattrsize[INDEX_MAX_KEYS];
|
|
|
|
bool spl_lisnull[INDEX_MAX_KEYS];
|
2005-06-20 12:29:37 +02:00
|
|
|
bool spl_leftvalid;
|
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 */
|
2001-10-25 07:50:21 +02:00
|
|
|
Datum spl_rattr[INDEX_MAX_KEYS]; /* Union of subkeys in
|
|
|
|
* spl_right */
|
|
|
|
int spl_rattrsize[INDEX_MAX_KEYS];
|
|
|
|
bool spl_risnull[INDEX_MAX_KEYS];
|
2005-06-20 12:29:37 +02:00
|
|
|
bool spl_rightvalid;
|
2001-10-25 07:50:21 +02:00
|
|
|
|
|
|
|
int *spl_idgrp;
|
|
|
|
int *spl_ngrp; /* number in each group */
|
|
|
|
char *spl_grpflag; /* flags of each group */
|
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.
|
|
|
|
* The size of the key is in bytes, and 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;
|
|
|
|
int bytes;
|
|
|
|
bool leafkey;
|
1997-09-08 23:56:23 +02:00
|
|
|
} GISTENTRY;
|
1996-08-27 23:50:29 +02:00
|
|
|
|
2005-06-27 14:45:23 +02:00
|
|
|
#define GistPageGetOpaque(page) ( (GISTPageOpaque) PageGetSpecialPointer(page) )
|
|
|
|
|
|
|
|
#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)
|
|
|
|
#define GistPageSetNonLeaf(page) ( GistPageGetOpaque(page)->flags &= ~F_LEAF)
|
2005-06-20 12:29:37 +02:00
|
|
|
|
2005-06-27 14:45:23 +02:00
|
|
|
#define GistPageIsDeleted(page) ( GistPageGetOpaque(page)->flags & F_DELETED)
|
|
|
|
#define GistPageSetDeleted(page) ( GistPageGetOpaque(page)->flags |= F_DELETED)
|
|
|
|
#define GistPageSetNonDeleted(page) ( GistPageGetOpaque(page)->flags &= ~F_DELETED)
|
2005-06-20 12:29:37 +02:00
|
|
|
|
2005-06-27 14:45:23 +02:00
|
|
|
#define GistTuplesDeleted(page) ( GistPageGetOpaque(page)->flags & F_TUPLES_DELETED)
|
|
|
|
#define GistMarkTuplesDeleted(page) ( GistPageGetOpaque(page)->flags |= F_TUPLES_DELETED)
|
|
|
|
#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;
|
|
|
|
|
2005-05-17 05:34:18 +02:00
|
|
|
#define GEVHDRSZ (offsetof(GistEntryVector, vector[0]))
|
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
|
|
|
|
*/
|
2001-05-31 20:16:55 +02:00
|
|
|
#define gistentryinit(e, k, r, pg, o, b, l) \
|
|
|
|
do { (e).key = (k); (e).rel = (r); (e).page = (pg); \
|
|
|
|
(e).offset = (o); (e).bytes = (b); (e).leafkey = (l); } while (0)
|
1997-09-07 07:04:48 +02:00
|
|
|
|
2001-11-05 18:46:40 +01:00
|
|
|
#endif /* GIST_H */
|