mirror of
https://github.com/postgres/postgres.git
synced 2025-06-29 10:41:53 +03:00
Changes
* new split algorithm (as proposed in http://archives.postgresql.org/pgsql-hackers/2006-06/msg00254.php) * possible call pickSplit() for second and below columns * add spl_(l|r)datum_exists to GIST_SPLITVEC - pickSplit should check its values to use already defined spl_(l|r)datum for splitting. pickSplit should set spl_(l|r)datum_exists to 'false' (if they was 'true') to signal to caller about using spl_(l|r)datum. * support for old pickSplit(): not very optimal but correct split * remove 'bytes' field from GISTENTRY: in any case size of value is defined by it's type. * split GIST_SPLITVEC to two structures: one for using in picksplit and second - for internal use. * some code refactoring * support of subsplit to rtree opclasses TODO: add support of subsplit to contrib modules
This commit is contained in:
@ -9,7 +9,7 @@
|
||||
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/access/gist.h,v 1.53 2006/06/25 01:02:12 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/include/access/gist.h,v 1.54 2006/06/28 12:00:14 teodor Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -75,37 +75,29 @@ typedef GISTPageOpaqueData *GISTPageOpaque;
|
||||
|
||||
/*
|
||||
* This is the Split Vector to be returned by the PickSplit method.
|
||||
* 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...
|
||||
*/
|
||||
typedef struct GIST_SPLITVEC
|
||||
{
|
||||
OffsetNumber *spl_left; /* array of entries that go left */
|
||||
int spl_nleft; /* size of this array */
|
||||
Datum spl_ldatum; /* Union of keys in spl_left */
|
||||
Datum spl_lattr[INDEX_MAX_KEYS]; /* Union of subkeys in
|
||||
* spl_left */
|
||||
int spl_lattrsize[INDEX_MAX_KEYS];
|
||||
bool spl_lisnull[INDEX_MAX_KEYS];
|
||||
bool spl_leftvalid;
|
||||
bool spl_ldatum_exists; /* true, if spl_ldatum already exists. */
|
||||
|
||||
OffsetNumber *spl_right; /* array of entries that go right */
|
||||
int spl_nright; /* size of the array */
|
||||
Datum spl_rdatum; /* Union of keys in spl_right */
|
||||
Datum spl_rattr[INDEX_MAX_KEYS]; /* Union of subkeys in
|
||||
* 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 */
|
||||
char *spl_grpflag; /* flags of each group */
|
||||
bool spl_rdatum_exists; /* true, if spl_rdatum already exists. */
|
||||
} GIST_SPLITVEC;
|
||||
|
||||
/*
|
||||
* 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.
|
||||
* leafkey is a flag to tell us if the entry is in a leaf node.
|
||||
*/
|
||||
typedef struct GISTENTRY
|
||||
{
|
||||
@ -113,7 +105,6 @@ typedef struct GISTENTRY
|
||||
Relation rel;
|
||||
Page page;
|
||||
OffsetNumber offset;
|
||||
int bytes;
|
||||
bool leafkey;
|
||||
} GISTENTRY;
|
||||
|
||||
@ -147,8 +138,8 @@ typedef struct
|
||||
/*
|
||||
* macro to initialize a GISTENTRY
|
||||
*/
|
||||
#define gistentryinit(e, k, r, pg, o, b, l) \
|
||||
#define gistentryinit(e, k, r, pg, o, l) \
|
||||
do { (e).key = (k); (e).rel = (r); (e).page = (pg); \
|
||||
(e).offset = (o); (e).bytes = (b); (e).leafkey = (l); } while (0)
|
||||
(e).offset = (o); (e).leafkey = (l); } while (0)
|
||||
|
||||
#endif /* GIST_H */
|
||||
|
Reference in New Issue
Block a user