@ -8,7 +8,7 @@
* Portions Copyright ( c ) 1994 , Regents of the University of California
*
* IDENTIFICATION
* $ PostgreSQL : pgsql / src / backend / access / gin / ginentrypage . c , v 1.19 2009 / 01 / 01 17 : 23 : 34 momjian Exp $
* $ PostgreSQL : pgsql / src / backend / access / gin / ginentrypage . c , v 1.20 2009 / 06 / 06 02 : 39 : 40 tgl Exp $
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
@ -20,28 +20,33 @@
# include "utils/rel.h"
/*
* forms tuple for entry tree . On leaf page , Index tuple has
* non - traditional layout . Tuple may contain posting list or
* root blocknumber of posting tree . Macros GinIsPostingTre : ( itup ) / GinSetPostingTree ( itup , blkno )
* Form a tuple for entry tree .
*
* On leaf pages , Index tuple has non - traditional layout . Tuple may contain
* posting list or root blocknumber of posting tree .
* Macros : GinIsPostingTree ( itup ) / GinSetPostingTree ( itup , blkno )
* 1 ) Posting list
* - itup - > t_info & INDEX_SIZE_MASK contains size of tuple as usual
* - itup - > t_info & INDEX_SIZE_MASK contains total size of tuple as usual
* - ItemPointerGetBlockNumber ( & itup - > t_tid ) contains original
* size of tuple ( without posting list ) .
* Macroses : GinGetOrigSizePosting ( itup ) / GinSetOrigSizePosting ( itup , n )
* Macros : GinGetOrigSizePosting ( itup ) / GinSetOrigSizePosting ( itup , n )
* - ItemPointerGetOffsetNumber ( & itup - > t_tid ) contains number
* of elements in posting list ( number of heap itempointer )
* Macroses : GinGetNPosting ( itup ) / GinSetNPosting ( itup , n )
* - After usual part of tuple there is a posting list
* of elements in posting list ( number of heap itempointers )
* Macros : GinGetNPosting ( itup ) / GinSetNPosting ( itup , n )
* - After standard part of tuple there is a posting list , ie , array
* of heap itempointers
* Macros : GinGetPosting ( itup )
* 2 ) Posting tree
* - itup - > t_info & INDEX_SIZE_MASK contains size of tuple as usual
* - ItemPointerGetBlockNumber ( & itup - > t_tid ) contains block number of
* root of posting tree
* - ItemPointerGetOffsetNumber ( & itup - > t_tid ) contains magic number GIN_TREE_POSTING
* - ItemPointerGetOffsetNumber ( & itup - > t_tid ) contains magic number
* GIN_TREE_POSTING , which distinguishes this from posting - list case
*
* Storage of attributes of tuple are different for single and multicolumn index .
* For single - column index tuple stores only value to be indexed and for
* multicolumn variant it stores two attributes : column number of value and value .
* Attributes of an index tuple are different for single and multicolumn index .
* For single - column case , index tuple stores only value to be indexed .
* For multicolumn case , it stores two attributes : column number of value
* and value .
*/
IndexTuple
GinFormTuple ( GinState * ginstate , OffsetNumber attnum , Datum key , ItemPointerData * ipd , uint32 nipd )
@ -89,6 +94,28 @@ GinFormTuple(GinState *ginstate, OffsetNumber attnum, Datum key, ItemPointerData
return itup ;
}
/*
* Sometimes we reduce the number of posting list items in a tuple after
* having built it with GinFormTuple . This function adjusts the size
* fields to match .
*/
void
GinShortenTuple ( IndexTuple itup , uint32 nipd )
{
uint32 newsize ;
Assert ( nipd < = GinGetNPosting ( itup ) ) ;
newsize = MAXALIGN ( SHORTALIGN ( GinGetOrigSizePosting ( itup ) ) + sizeof ( ItemPointerData ) * nipd ) ;
Assert ( newsize < = ( itup - > t_info & INDEX_SIZE_MASK ) ) ;
itup - > t_info & = ~ INDEX_SIZE_MASK ;
itup - > t_info | = newsize ;
GinSetNPosting ( itup , nipd ) ;
}
/*
* Entry tree is a " static " , ie tuple never deletes from it ,
* so we don ' t use right bound , we use rightest key instead .