@ -30,6 +30,7 @@ typedef void (*storeRes_func) (SpGistScanOpaque so, ItemPointer heapPtr,
typedef struct ScanStackEntry
typedef struct ScanStackEntry
{
{
Datum reconstructedValue ; /* value reconstructed from parent */
Datum reconstructedValue ; /* value reconstructed from parent */
void * traversalValue ; /* opclass-specific traverse value */
int level ; /* level of items on this page */
int level ; /* level of items on this page */
ItemPointerData ptr ; /* block and offset to scan from */
ItemPointerData ptr ; /* block and offset to scan from */
} ScanStackEntry ;
} ScanStackEntry ;
@ -42,6 +43,9 @@ freeScanStackEntry(SpGistScanOpaque so, ScanStackEntry *stackEntry)
if ( ! so - > state . attType . attbyval & &
if ( ! so - > state . attType . attbyval & &
DatumGetPointer ( stackEntry - > reconstructedValue ) ! = NULL )
DatumGetPointer ( stackEntry - > reconstructedValue ) ! = NULL )
pfree ( DatumGetPointer ( stackEntry - > reconstructedValue ) ) ;
pfree ( DatumGetPointer ( stackEntry - > reconstructedValue ) ) ;
if ( stackEntry - > traversalValue )
pfree ( stackEntry - > traversalValue ) ;
pfree ( stackEntry ) ;
pfree ( stackEntry ) ;
}
}
@ -239,6 +243,7 @@ static bool
spgLeafTest ( Relation index , SpGistScanOpaque so ,
spgLeafTest ( Relation index , SpGistScanOpaque so ,
SpGistLeafTuple leafTuple , bool isnull ,
SpGistLeafTuple leafTuple , bool isnull ,
int level , Datum reconstructedValue ,
int level , Datum reconstructedValue ,
void * traversalValue ,
Datum * leafValue , bool * recheck )
Datum * leafValue , bool * recheck )
{
{
bool result ;
bool result ;
@ -265,6 +270,7 @@ spgLeafTest(Relation index, SpGistScanOpaque so,
in . scankeys = so - > keyData ;
in . scankeys = so - > keyData ;
in . nkeys = so - > numberOfKeys ;
in . nkeys = so - > numberOfKeys ;
in . reconstructedValue = reconstructedValue ;
in . reconstructedValue = reconstructedValue ;
in . traversalValue = traversalValue ;
in . level = level ;
in . level = level ;
in . returnData = so - > want_itup ;
in . returnData = so - > want_itup ;
in . leafDatum = leafDatum ;
in . leafDatum = leafDatum ;
@ -365,6 +371,7 @@ redirect:
leafTuple , isnull ,
leafTuple , isnull ,
stackEntry - > level ,
stackEntry - > level ,
stackEntry - > reconstructedValue ,
stackEntry - > reconstructedValue ,
stackEntry - > traversalValue ,
& leafValue ,
& leafValue ,
& recheck ) )
& recheck ) )
{
{
@ -411,6 +418,7 @@ redirect:
leafTuple , isnull ,
leafTuple , isnull ,
stackEntry - > level ,
stackEntry - > level ,
stackEntry - > reconstructedValue ,
stackEntry - > reconstructedValue ,
stackEntry - > traversalValue ,
& leafValue ,
& leafValue ,
& recheck ) )
& recheck ) )
{
{
@ -456,6 +464,8 @@ redirect:
in . scankeys = so - > keyData ;
in . scankeys = so - > keyData ;
in . nkeys = so - > numberOfKeys ;
in . nkeys = so - > numberOfKeys ;
in . reconstructedValue = stackEntry - > reconstructedValue ;
in . reconstructedValue = stackEntry - > reconstructedValue ;
in . traversalMemoryContext = oldCtx ;
in . traversalValue = stackEntry - > traversalValue ;
in . level = stackEntry - > level ;
in . level = stackEntry - > level ;
in . returnData = so - > want_itup ;
in . returnData = so - > want_itup ;
in . allTheSame = innerTuple - > allTheSame ;
in . allTheSame = innerTuple - > allTheSame ;
@ -523,6 +533,14 @@ redirect:
else
else
newEntry - > reconstructedValue = ( Datum ) 0 ;
newEntry - > reconstructedValue = ( Datum ) 0 ;
/*
* Elements of out . traversalValues should be allocated in
* in . traversalMemoryContext , which is actually a long
* lived context of index scan .
*/
newEntry - > traversalValue = ( out . traversalValues ) ?
out . traversalValues [ i ] : NULL ;
so - > scanStack = lcons ( newEntry , so - > scanStack ) ;
so - > scanStack = lcons ( newEntry , so - > scanStack ) ;
}
}
}
}