mirror of
https://github.com/postgres/postgres.git
synced 2025-07-31 22:04:40 +03:00
Repair some problems in GIST-index contrib modules. Patch from
Teodor Sigaev <teodor@stack.net>.
This commit is contained in:
@ -10,6 +10,7 @@
|
||||
#include "utils/array.h"
|
||||
#include "utils/builtins.h"
|
||||
#include "storage/bufpage.h"
|
||||
#include "access/tuptoaster.h"
|
||||
|
||||
#include "txtidx.h"
|
||||
#include "query.h"
|
||||
@ -86,6 +87,15 @@ uniqueint( int4* a, int4 l ) {
|
||||
return res + 1 - a;
|
||||
}
|
||||
|
||||
static void
|
||||
makesign( BITVECP sign, GISTTYPE *a) {
|
||||
int4 k,len = ARRNELEM( a );
|
||||
int4 *ptr = GETARR( a );
|
||||
MemSet( (void*)sign, 0, sizeof(BITVEC) );
|
||||
for(k=0;k<len;k++)
|
||||
HASH( sign, ptr[k] );
|
||||
}
|
||||
|
||||
Datum
|
||||
gtxtidx_compress(PG_FUNCTION_ARGS) {
|
||||
GISTENTRY *entry = (GISTENTRY *)PG_GETARG_POINTER(0);
|
||||
@ -110,8 +120,6 @@ gtxtidx_compress(PG_FUNCTION_ARGS) {
|
||||
*arr = crc32_sz( (uint8*)&words[ ptr->pos ], ptr->len );
|
||||
arr++; ptr++;
|
||||
}
|
||||
if ( val != toastedval )
|
||||
pfree(val);
|
||||
|
||||
len = uniqueint( GETARR(res), val->size );
|
||||
if ( len != val->size ) {
|
||||
@ -120,7 +128,22 @@ gtxtidx_compress(PG_FUNCTION_ARGS) {
|
||||
len = CALCGTSIZE( ARRKEY, len );
|
||||
res = (GISTTYPE*)repalloc( (void*)res, len );
|
||||
res->len = len;
|
||||
}
|
||||
}
|
||||
if ( val != toastedval )
|
||||
pfree(val);
|
||||
|
||||
/* make signature, if array is too long */
|
||||
if ( res->len > TOAST_INDEX_TARGET ) {
|
||||
GISTTYPE *ressign;
|
||||
|
||||
len = CALCGTSIZE( SIGNKEY, 0 );
|
||||
ressign = (GISTTYPE*)palloc( len );
|
||||
ressign->len = len;
|
||||
ressign->flag = SIGNKEY;
|
||||
makesign( GETSIGN(ressign), res );
|
||||
pfree(res);
|
||||
res = ressign;
|
||||
}
|
||||
|
||||
retval = (GISTENTRY*)palloc(sizeof(GISTENTRY));
|
||||
gistentryinit(*retval, PointerGetDatum(res),
|
||||
@ -379,15 +402,6 @@ gtxtidx_penalty(PG_FUNCTION_ARGS) {
|
||||
PG_RETURN_POINTER( penalty );
|
||||
}
|
||||
|
||||
static void
|
||||
makesign( BITVECP sign, GISTTYPE *a) {
|
||||
int4 k,len = ARRNELEM( a );
|
||||
int4 *ptr = GETARR( a );
|
||||
MemSet( (void*)sign, 0, sizeof(BITVEC) );
|
||||
for(k=0;k<len;k++)
|
||||
HASH( sign, ptr[k] );
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
bool allistrue;
|
||||
BITVEC sign;
|
||||
@ -503,6 +517,11 @@ gtxtidx_picksplit(PG_FUNCTION_ARGS) {
|
||||
right = v->spl_right;
|
||||
v->spl_nright = 0;
|
||||
|
||||
if ( seed_1 == 0 || seed_2 == 0 ) {
|
||||
seed_1 = 1;
|
||||
seed_2 = 2;
|
||||
}
|
||||
|
||||
/* form initial .. */
|
||||
if ( cache[seed_1].allistrue ) {
|
||||
datum_l = (GISTTYPE*)palloc( CALCGTSIZE( SIGNKEY|ALLISTRUE, 0 ) );
|
||||
|
Reference in New Issue
Block a user