提交 6f2182fe 编写于 作者: T Tom Lane

contrib/intarray updates from Oleg Bartunov:

it's reimplemented to use function interface version 1 and special
treating of degenerated signatures.
上级 88ba4018
...@@ -41,13 +41,13 @@ ...@@ -41,13 +41,13 @@
#define SORT(x) \ #define SORT(x) \
do { \ do { \
if ( ARRNELEMS( x ) > 1 ) \ if ( ARRNELEMS( x ) > 1 ) \
isort( (void*)ARRPTR( x ), ARRNELEMS( x ) ); \ isort( ARRPTR( x ), ARRNELEMS( x ) ); \
} while(0) } while(0)
#define PREPAREARR(x) \ #define PREPAREARR(x) \
do { \ do { \
if ( ARRNELEMS( x ) > 1 ) \ if ( ARRNELEMS( x ) > 1 ) \
if ( isort( (void*)ARRPTR( x ), ARRNELEMS( x ) ) ) \ if ( isort( ARRPTR( x ), ARRNELEMS( x ) ) ) \
x = _int_unique( x ); \ x = _int_unique( x ); \
} while(0) } while(0)
...@@ -126,7 +126,7 @@ typedef void (*formfloat) (ArrayType *, float *); ...@@ -126,7 +126,7 @@ typedef void (*formfloat) (ArrayType *, float *);
/* /*
** usefull function ** usefull function
*/ */
static bool isort(int *a, const int len); static bool isort(int4 *a, const int len);
static ArrayType *new_intArrayType(int num); static ArrayType *new_intArrayType(int num);
static ArrayType *copy_intArrayType(ArrayType *a); static ArrayType *copy_intArrayType(ArrayType *a);
static ArrayType *resize_intArrayType(ArrayType *a, int num); static ArrayType *resize_intArrayType(ArrayType *a, int num);
...@@ -152,48 +152,72 @@ static ArrayType *_int_common_union(bytea *entryvec, ...@@ -152,48 +152,72 @@ static ArrayType *_int_common_union(bytea *entryvec,
/* /*
** GiST support methods ** GiST support methods
*/ */
bool g_int_consistent(GISTENTRY *entry, ArrayType *query, StrategyNumber strategy); PG_FUNCTION_INFO_V1( g_int_consistent );
GISTENTRY *g_int_compress(GISTENTRY *entry); PG_FUNCTION_INFO_V1( g_int_compress );
GISTENTRY *g_int_decompress(GISTENTRY *entry); PG_FUNCTION_INFO_V1( g_int_decompress );
float *g_int_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result); PG_FUNCTION_INFO_V1( g_int_penalty );
GIST_SPLITVEC *g_int_picksplit(bytea *entryvec, GIST_SPLITVEC *v); PG_FUNCTION_INFO_V1( g_int_picksplit );
ArrayType *g_int_union(bytea *entryvec, int *sizep); PG_FUNCTION_INFO_V1( g_int_union );
bool *g_int_same(ArrayType *b1, ArrayType *b2, bool *result); PG_FUNCTION_INFO_V1( g_int_same );
Datum g_int_consistent(PG_FUNCTION_ARGS);
Datum g_int_compress(PG_FUNCTION_ARGS);
Datum g_int_decompress(PG_FUNCTION_ARGS);
Datum g_int_penalty(PG_FUNCTION_ARGS);
Datum g_int_picksplit(PG_FUNCTION_ARGS);
Datum g_int_union(PG_FUNCTION_ARGS);
Datum g_int_same(PG_FUNCTION_ARGS);
/* /*
** R-tree support functions ** R-tree support functions
*/ */
bool inner_int_contains(ArrayType *a, ArrayType *b); static bool inner_int_contains(ArrayType *a, ArrayType *b);
bool inner_int_overlap(ArrayType *a, ArrayType *b); static bool inner_int_overlap(ArrayType *a, ArrayType *b);
ArrayType *inner_int_union(ArrayType *a, ArrayType *b); static ArrayType *inner_int_union(ArrayType *a, ArrayType *b);
ArrayType *inner_int_inter(ArrayType *a, ArrayType *b); static ArrayType *inner_int_inter(ArrayType *a, ArrayType *b);
static void rt__int_size(ArrayType *a, float *sz);
bool _int_different(ArrayType *a, ArrayType *b);
bool _int_same(ArrayType *a, ArrayType *b); PG_FUNCTION_INFO_V1( _int_different );
bool _int_contains(ArrayType *a, ArrayType *b); PG_FUNCTION_INFO_V1( _int_same );
bool _int_contained(ArrayType *a, ArrayType *b); PG_FUNCTION_INFO_V1( _int_contains );
bool _int_overlap(ArrayType *a, ArrayType *b); PG_FUNCTION_INFO_V1( _int_contained );
ArrayType *_int_union(ArrayType *a, ArrayType *b); PG_FUNCTION_INFO_V1( _int_overlap );
ArrayType *_int_inter(ArrayType *a, ArrayType *b); PG_FUNCTION_INFO_V1( _int_union );
void rt__int_size(ArrayType *a, float *sz); PG_FUNCTION_INFO_V1( _int_inter );
Datum _int_different(PG_FUNCTION_ARGS);
Datum _int_same(PG_FUNCTION_ARGS);
Datum _int_contains(PG_FUNCTION_ARGS);
Datum _int_contained(PG_FUNCTION_ARGS);
Datum _int_overlap(PG_FUNCTION_ARGS);
Datum _int_union(PG_FUNCTION_ARGS);
Datum _int_inter(PG_FUNCTION_ARGS);
/* /*
** _intbig methods ** _intbig methods
*/ */
bool g_intbig_consistent(GISTENTRY *entry, ArrayType *query, StrategyNumber strategy); PG_FUNCTION_INFO_V1( g_intbig_consistent );
GISTENTRY *g_intbig_compress(GISTENTRY *entry); PG_FUNCTION_INFO_V1( g_intbig_compress );
GISTENTRY *g_intbig_decompress(GISTENTRY *entry); PG_FUNCTION_INFO_V1( g_intbig_decompress );
float *g_intbig_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result); PG_FUNCTION_INFO_V1( g_intbig_penalty );
GIST_SPLITVEC *g_intbig_picksplit(bytea *entryvec, GIST_SPLITVEC *v); PG_FUNCTION_INFO_V1( g_intbig_picksplit );
ArrayType *g_intbig_union(bytea *entryvec, int *sizep); PG_FUNCTION_INFO_V1( g_intbig_union );
bool *g_intbig_same(ArrayType *a, ArrayType *b, bool *result); PG_FUNCTION_INFO_V1( g_intbig_same );
Datum g_intbig_consistent(PG_FUNCTION_ARGS);
Datum g_intbig_compress(PG_FUNCTION_ARGS);
Datum g_intbig_decompress(PG_FUNCTION_ARGS);
Datum g_intbig_penalty(PG_FUNCTION_ARGS);
Datum g_intbig_picksplit(PG_FUNCTION_ARGS);
Datum g_intbig_union(PG_FUNCTION_ARGS);
Datum g_intbig_same(PG_FUNCTION_ARGS);
static bool _intbig_contains(ArrayType *a, ArrayType *b); static bool _intbig_contains(ArrayType *a, ArrayType *b);
static bool _intbig_overlap(ArrayType *a, ArrayType *b); static bool _intbig_overlap(ArrayType *a, ArrayType *b);
static ArrayType *_intbig_union(ArrayType *a, ArrayType *b); static ArrayType *_intbig_union(ArrayType *a, ArrayType *b);
/*static ArrayType * _intbig_inter(ArrayType *a, ArrayType *b);*/ static ArrayType * _intbig_inter(ArrayType *a, ArrayType *b);
static void rt__intbig_size(ArrayType *a, float *sz); static void rt__intbig_size(ArrayType *a, float *sz);
static void gensign(BITVEC sign, int *a, int len); static void gensign(BITVEC sign, int *a, int len);
...@@ -207,11 +231,11 @@ static void gensign(BITVEC sign, int *a, int len); ...@@ -207,11 +231,11 @@ static void gensign(BITVEC sign, int *a, int len);
** the predicate x op query == FALSE, where op is the oper ** the predicate x op query == FALSE, where op is the oper
** corresponding to strategy in the pg_amop table. ** corresponding to strategy in the pg_amop table.
*/ */
bool Datum
g_int_consistent(GISTENTRY *entry, g_int_consistent(PG_FUNCTION_ARGS) {
ArrayType *query, GISTENTRY *entry = (GISTENTRY *)PG_GETARG_POINTER(0);
StrategyNumber strategy) ArrayType *query = ( ArrayType * )PG_GETARG_POINTER(1);
{ StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
bool retval; bool retval;
/* sort query for fast search, key is already sorted */ /* sort query for fast search, key is already sorted */
...@@ -239,21 +263,26 @@ g_int_consistent(GISTENTRY *entry, ...@@ -239,21 +263,26 @@ g_int_consistent(GISTENTRY *entry,
default: default:
retval = FALSE; retval = FALSE;
} }
return (retval); PG_RETURN_BOOL(retval);
} }
ArrayType * Datum
g_int_union(bytea *entryvec, int *sizep) g_int_union(PG_FUNCTION_ARGS)
{ {
return _int_common_union(entryvec, sizep, inner_int_union); PG_RETURN_POINTER( _int_common_union(
(bytea *) PG_GETARG_POINTER(0),
(int *) PG_GETARG_POINTER(1),
inner_int_union
) );
} }
/* /*
** GiST Compress and Decompress methods ** GiST Compress and Decompress methods
*/ */
GISTENTRY * Datum
g_int_compress(GISTENTRY *entry) g_int_compress(PG_FUNCTION_ARGS)
{ {
GISTENTRY *entry = (GISTENTRY *)PG_GETARG_POINTER(0);
GISTENTRY *retval; GISTENTRY *retval;
ArrayType *r; ArrayType *r;
int len; int len;
...@@ -280,7 +309,7 @@ g_int_compress(GISTENTRY *entry) ...@@ -280,7 +309,7 @@ g_int_compress(GISTENTRY *entry)
gistentryinit(*retval, (Datum) 0, entry->rel, entry->page, entry->offset, gistentryinit(*retval, (Datum) 0, entry->rel, entry->page, entry->offset,
0, FALSE); 0, FALSE);
return (retval); PG_RETURN_POINTER(retval);
} }
if (entry->leafkey) if (entry->leafkey)
...@@ -320,12 +349,13 @@ g_int_compress(GISTENTRY *entry) ...@@ -320,12 +349,13 @@ g_int_compress(GISTENTRY *entry)
gistentryinit(*retval, PointerGetDatum(r), gistentryinit(*retval, PointerGetDatum(r),
entry->rel, entry->page, entry->offset, VARSIZE(r), FALSE); entry->rel, entry->page, entry->offset, VARSIZE(r), FALSE);
return (retval); PG_RETURN_POINTER(retval);
} }
GISTENTRY * Datum
g_int_decompress(GISTENTRY *entry) g_int_decompress(PG_FUNCTION_ARGS)
{ {
GISTENTRY *entry = (GISTENTRY *)PG_GETARG_POINTER(0);
GISTENTRY *retval; GISTENTRY *retval;
ArrayType *r; ArrayType *r;
int *dr, int *dr,
...@@ -352,7 +382,7 @@ g_int_decompress(GISTENTRY *entry) ...@@ -352,7 +382,7 @@ g_int_decompress(GISTENTRY *entry)
#ifdef GIST_DEBUG #ifdef GIST_DEBUG
elog(NOTICE, "DECOMP IN: NULL"); elog(NOTICE, "DECOMP IN: NULL");
#endif #endif
return (retval); PG_RETURN_POINTER(retval);
} }
...@@ -363,7 +393,7 @@ g_int_decompress(GISTENTRY *entry) ...@@ -363,7 +393,7 @@ g_int_decompress(GISTENTRY *entry)
{ /* not comressed value */ { /* not comressed value */
/* sometimes strange bytesize */ /* sometimes strange bytesize */
gistentryinit(*entry, PointerGetDatum(in), entry->rel, entry->page, entry->offset, VARSIZE(in), FALSE); gistentryinit(*entry, PointerGetDatum(in), entry->rel, entry->page, entry->offset, VARSIZE(in), FALSE);
return (entry); PG_RETURN_POINTER(entry);
} }
#ifdef GIST_DEBUG #ifdef GIST_DEBUG
...@@ -386,28 +416,35 @@ g_int_decompress(GISTENTRY *entry) ...@@ -386,28 +416,35 @@ g_int_decompress(GISTENTRY *entry)
gistentryinit(*retval, PointerGetDatum(r), entry->rel, entry->page, entry->offset, VARSIZE(r), FALSE); gistentryinit(*retval, PointerGetDatum(r), entry->rel, entry->page, entry->offset, VARSIZE(r), FALSE);
return (retval); PG_RETURN_POINTER(retval);
} }
/* /*
** The GiST Penalty method for _intments ** The GiST Penalty method for _intments
*/ */
float * Datum
g_int_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result) g_int_penalty(PG_FUNCTION_ARGS)
{ {
return _int_common_penalty(origentry, newentry, result, inner_int_union, rt__int_size); PG_RETURN_POINTER( _int_common_penalty(
(GISTENTRY *)PG_GETARG_POINTER(0),
(GISTENTRY *)PG_GETARG_POINTER(1),
(float *) PG_GETARG_POINTER(2),
inner_int_union, rt__int_size
) );
} }
GIST_SPLITVEC * Datum
g_int_picksplit(bytea *entryvec, g_int_picksplit(PG_FUNCTION_ARGS)
GIST_SPLITVEC *v)
{ {
return _int_common_picksplit(entryvec, v, PG_RETURN_POINTER( _int_common_picksplit(
inner_int_union, (bytea *)PG_GETARG_POINTER(0),
inner_int_inter, (GIST_SPLITVEC *)PG_GETARG_POINTER(1),
rt__int_size, inner_int_union,
1e-8); inner_int_inter,
rt__int_size,
1e-8
) );
} }
/* /*
...@@ -415,26 +452,38 @@ g_int_picksplit(bytea *entryvec, ...@@ -415,26 +452,38 @@ g_int_picksplit(bytea *entryvec,
*/ */
bool * Datum
g_int_same(ArrayType *b1, ArrayType *b2, bool *result) g_int_same(PG_FUNCTION_ARGS)
{ {
if (_int_same(b1, b2)) bool *result = (bool *)PG_GETARG_POINTER(2);
*result = TRUE; *result = DatumGetBool(
else DirectFunctionCall2(
*result = FALSE; _int_same,
PointerGetDatum(PG_GETARG_POINTER(0)),
PointerGetDatum(PG_GETARG_POINTER(1))
)
);
return (result); PG_RETURN_POINTER(result);
} }
bool Datum
_int_contained(ArrayType *a, ArrayType *b) _int_contained(PG_FUNCTION_ARGS)
{ {
return (_int_contains(b, a)); PG_RETURN_BOOL( DatumGetBool(
DirectFunctionCall2(
_int_contains,
PointerGetDatum(PG_GETARG_POINTER(1)),
PointerGetDatum(PG_GETARG_POINTER(0))
)
));
} }
bool Datum
_int_contains(ArrayType *a, ArrayType *b) _int_contains(PG_FUNCTION_ARGS)
{ {
ArrayType *a = (ArrayType *)PG_GETARG_POINTER(0);
ArrayType *b = (ArrayType *)PG_GETARG_POINTER(1);
bool res; bool res;
ArrayType *an, ArrayType *an,
*bn; *bn;
...@@ -451,10 +500,10 @@ _int_contains(ArrayType *a, ArrayType *b) ...@@ -451,10 +500,10 @@ _int_contains(ArrayType *a, ArrayType *b)
res = inner_int_contains(an, bn); res = inner_int_contains(an, bn);
pfree(an); pfree(an);
pfree(bn); pfree(bn);
return res; PG_RETURN_BOOL( res );
} }
bool static bool
inner_int_contains(ArrayType *a, ArrayType *b) inner_int_contains(ArrayType *a, ArrayType *b)
{ {
int na, int na,
...@@ -497,15 +546,23 @@ inner_int_contains(ArrayType *a, ArrayType *b) ...@@ -497,15 +546,23 @@ inner_int_contains(ArrayType *a, ArrayType *b)
* Operator class for R-tree indexing * Operator class for R-tree indexing
*****************************************************************************/ *****************************************************************************/
bool Datum
_int_different(ArrayType *a, ArrayType *b) _int_different(PG_FUNCTION_ARGS)
{ {
return (!_int_same(a, b)); PG_RETURN_BOOL( ! DatumGetBool(
DirectFunctionCall2(
_int_same,
PointerGetDatum(PG_GETARG_POINTER(0)),
PointerGetDatum(PG_GETARG_POINTER(1))
)
));
} }
bool Datum
_int_same(ArrayType *a, ArrayType *b) _int_same(PG_FUNCTION_ARGS)
{ {
ArrayType *a = (ArrayType *)PG_GETARG_POINTER(0);
ArrayType *b = (ArrayType *)PG_GETARG_POINTER(1);
int na, int na,
nb; nb;
int n; int n;
...@@ -546,14 +603,16 @@ _int_same(ArrayType *a, ArrayType *b) ...@@ -546,14 +603,16 @@ _int_same(ArrayType *a, ArrayType *b)
pfree(an); pfree(an);
pfree(bn); pfree(bn);
return result; PG_RETURN_BOOL(result);
} }
/* _int_overlap -- does a overlap b? /* _int_overlap -- does a overlap b?
*/ */
bool Datum
_int_overlap(ArrayType *a, ArrayType *b) _int_overlap(PG_FUNCTION_ARGS)
{ {
ArrayType *a = (ArrayType *)PG_GETARG_POINTER(0);
ArrayType *b = (ArrayType *)PG_GETARG_POINTER(1);
bool result; bool result;
ArrayType *an, ArrayType *an,
*bn; *bn;
...@@ -572,10 +631,10 @@ _int_overlap(ArrayType *a, ArrayType *b) ...@@ -572,10 +631,10 @@ _int_overlap(ArrayType *a, ArrayType *b)
pfree(an); pfree(an);
pfree(bn); pfree(bn);
return result; PG_RETURN_BOOL( result );
} }
bool static bool
inner_int_overlap(ArrayType *a, ArrayType *b) inner_int_overlap(ArrayType *a, ArrayType *b)
{ {
int na, int na,
...@@ -609,9 +668,11 @@ inner_int_overlap(ArrayType *a, ArrayType *b) ...@@ -609,9 +668,11 @@ inner_int_overlap(ArrayType *a, ArrayType *b)
return FALSE; return FALSE;
} }
ArrayType * Datum
_int_union(ArrayType *a, ArrayType *b) _int_union(PG_FUNCTION_ARGS)
{ {
ArrayType *a = (ArrayType *)PG_GETARG_POINTER(0);
ArrayType *b = (ArrayType *)PG_GETARG_POINTER(1);
ArrayType *result; ArrayType *result;
ArrayType *an, ArrayType *an,
*bn; *bn;
...@@ -631,10 +692,10 @@ _int_union(ArrayType *a, ArrayType *b) ...@@ -631,10 +692,10 @@ _int_union(ArrayType *a, ArrayType *b)
if (bn) if (bn)
pfree(bn); pfree(bn);
return result; PG_RETURN_POINTER( result );
} }
ArrayType * static ArrayType *
inner_int_union(ArrayType *a, ArrayType *b) inner_int_union(ArrayType *a, ArrayType *b)
{ {
ArrayType *r = NULL; ArrayType *r = NULL;
...@@ -691,15 +752,17 @@ inner_int_union(ArrayType *a, ArrayType *b) ...@@ -691,15 +752,17 @@ inner_int_union(ArrayType *a, ArrayType *b)
} }
ArrayType * Datum
_int_inter(ArrayType *a, ArrayType *b) _int_inter(PG_FUNCTION_ARGS)
{ {
ArrayType *a = (ArrayType *)PG_GETARG_POINTER(0);
ArrayType *b = (ArrayType *)PG_GETARG_POINTER(1);
ArrayType *result; ArrayType *result;
ArrayType *an, ArrayType *an,
*bn; *bn;
if (ARRISNULL(a) || ARRISNULL(b)) if (ARRISNULL(a) || ARRISNULL(b))
return new_intArrayType(0); PG_RETURN_POINTER(new_intArrayType(0));
an = copy_intArrayType(a); an = copy_intArrayType(a);
bn = copy_intArrayType(b); bn = copy_intArrayType(b);
...@@ -712,10 +775,10 @@ _int_inter(ArrayType *a, ArrayType *b) ...@@ -712,10 +775,10 @@ _int_inter(ArrayType *a, ArrayType *b)
pfree(an); pfree(an);
pfree(bn); pfree(bn);
return result; PG_RETURN_POINTER( result );
} }
ArrayType * static ArrayType *
inner_int_inter(ArrayType *a, ArrayType *b) inner_int_inter(ArrayType *a, ArrayType *b)
{ {
ArrayType *r; ArrayType *r;
...@@ -764,7 +827,7 @@ inner_int_inter(ArrayType *a, ArrayType *b) ...@@ -764,7 +827,7 @@ inner_int_inter(ArrayType *a, ArrayType *b)
return resize_intArrayType(r, dr - ARRPTR(r)); return resize_intArrayType(r, dr - ARRPTR(r));
} }
void static void
rt__int_size(ArrayType *a, float *size) rt__int_size(ArrayType *a, float *size)
{ {
if (ARRISNULL(a)) if (ARRISNULL(a))
...@@ -782,11 +845,11 @@ rt__int_size(ArrayType *a, float *size) ...@@ -782,11 +845,11 @@ rt__int_size(ArrayType *a, float *size)
/* len >= 2 */ /* len >= 2 */
static bool static bool
isort(int *a, int len) isort(int4 *a, int len)
{ {
int tmp, int4 tmp,
index; index;
int *cur, int4 *cur,
*end; *end;
bool r = FALSE; bool r = FALSE;
...@@ -1006,9 +1069,12 @@ _intbig_inter(ArrayType *a, ArrayType *b) ...@@ -1006,9 +1069,12 @@ _intbig_inter(ArrayType *a, ArrayType *b)
return r; return r;
} }
bool * Datum
g_intbig_same(ArrayType *a, ArrayType *b, bool *result) g_intbig_same(PG_FUNCTION_ARGS)
{ {
ArrayType *a = (ArrayType *)PG_GETARG_POINTER(0);
ArrayType *b = (ArrayType *)PG_GETARG_POINTER(1);
bool *result = (bool *)PG_GETARG_POINTER(2);
BITVECP da, BITVECP da,
db; db;
int i; int i;
...@@ -1016,7 +1082,7 @@ g_intbig_same(ArrayType *a, ArrayType *b, bool *result) ...@@ -1016,7 +1082,7 @@ g_intbig_same(ArrayType *a, ArrayType *b, bool *result)
if (ARRISNULL(a) || ARRISNULL(b)) if (ARRISNULL(a) || ARRISNULL(b))
{ {
*result = (ARRISNULL(a) && ARRISNULL(b)) ? TRUE : FALSE; *result = (ARRISNULL(a) && ARRISNULL(b)) ? TRUE : FALSE;
return result; PG_RETURN_POINTER( result );
} }
da = SIGPTR(a); da = SIGPTR(a);
...@@ -1026,28 +1092,46 @@ g_intbig_same(ArrayType *a, ArrayType *b, bool *result) ...@@ -1026,28 +1092,46 @@ g_intbig_same(ArrayType *a, ArrayType *b, bool *result)
if (da[i] != db[i]) if (da[i] != db[i])
{ {
*result = FALSE; *result = FALSE;
return result; PG_RETURN_POINTER( result );
} }
); );
*result = TRUE; *result = TRUE;
return result; PG_RETURN_POINTER( result );
} }
GISTENTRY * Datum
g_intbig_compress(GISTENTRY *entry) g_intbig_compress(PG_FUNCTION_ARGS)
{ {
GISTENTRY *entry = (GISTENTRY *)PG_GETARG_POINTER(0);
GISTENTRY *retval; GISTENTRY *retval;
ArrayType *r, ArrayType *r,
*in; *in;
bool maycompress = true;
int i;
if (DatumGetPointer(entry->key) != NULL) if (DatumGetPointer(entry->key) != NULL)
in = (ArrayType *) PG_DETOAST_DATUM(entry->key); in = (ArrayType *) PG_DETOAST_DATUM(entry->key);
else else
in = NULL; in = NULL;
if (!entry->leafkey) if (!entry->leafkey) {
return entry; if ( ! ARRISNULL(in) ) {
LOOPBYTE(
if ( ( ((char*)ARRPTR(in))[i] & 0xff ) != 0xff ) {
maycompress = false;
break;
}
);
if ( maycompress ) {
retval = palloc(sizeof(GISTENTRY));
r = new_intArrayType(1);
gistentryinit(*retval, PointerGetDatum(r), entry->rel, entry->page, entry->offset, VARSIZE(r), FALSE);
PG_RETURN_POINTER( retval );
}
}
PG_RETURN_POINTER( entry );
}
retval = palloc(sizeof(GISTENTRY)); retval = palloc(sizeof(GISTENTRY));
...@@ -1057,7 +1141,7 @@ g_intbig_compress(GISTENTRY *entry) ...@@ -1057,7 +1141,7 @@ g_intbig_compress(GISTENTRY *entry)
if (in != (ArrayType *) DatumGetPointer(entry->key)) if (in != (ArrayType *) DatumGetPointer(entry->key))
pfree(in); pfree(in);
gistentryinit(*retval, (Datum) 0, entry->rel, entry->page, entry->offset, 0, FALSE); gistentryinit(*retval, (Datum) 0, entry->rel, entry->page, entry->offset, 0, FALSE);
return (retval); PG_RETURN_POINTER (retval);
} }
r = new_intArrayType(SIGLENINT); r = new_intArrayType(SIGLENINT);
...@@ -1065,60 +1149,101 @@ g_intbig_compress(GISTENTRY *entry) ...@@ -1065,60 +1149,101 @@ g_intbig_compress(GISTENTRY *entry)
ARRPTR(in), ARRPTR(in),
ARRNELEMS(in)); ARRNELEMS(in));
LOOPBYTE(
if( ( ((char*)ARRPTR(in))[i] & 0xff ) != 0xff ) {
maycompress = false;
break;
}
);
if ( maycompress ) {
pfree(r);
r = new_intArrayType(1);
}
gistentryinit(*retval, PointerGetDatum(r), entry->rel, entry->page, entry->offset, VARSIZE(r), FALSE); gistentryinit(*retval, PointerGetDatum(r), entry->rel, entry->page, entry->offset, VARSIZE(r), FALSE);
if (in) if (in)
if (in != (ArrayType *) DatumGetPointer(entry->key)) if ( in != (ArrayType *) DatumGetPointer(entry->key))
pfree(in); pfree(in);
return (retval); PG_RETURN_POINTER (retval);
} }
GISTENTRY * Datum
g_intbig_decompress(GISTENTRY *entry) g_intbig_decompress(PG_FUNCTION_ARGS)
{ {
GISTENTRY *entry = (GISTENTRY *)PG_GETARG_POINTER(0);
ArrayType *key; ArrayType *key;
key = (ArrayType *) PG_DETOAST_DATUM(entry->key); if ( DatumGetPointer(entry->key) != NULL )
if (key != (ArrayType *) DatumGetPointer(entry->key)) key = (ArrayType *) PG_DETOAST_DATUM(entry->key);
else
key = NULL;
if ( key != (ArrayType *) DatumGetPointer(entry->key))
{ {
GISTENTRY *retval; GISTENTRY *retval;
retval = palloc(sizeof(GISTENTRY)); retval = palloc(sizeof(GISTENTRY));
gistentryinit(*retval, PointerGetDatum(key), entry->rel, entry->page, entry->offset, VARSIZE(key), FALSE); gistentryinit(*retval, PointerGetDatum(key), entry->rel, entry->page, entry->offset, (key) ? VARSIZE(key) : 0, FALSE);
return retval; PG_RETURN_POINTER( retval );
} }
return entry; if ( ! ARRISNULL(key) )
} if ( ARRNELEMS(key) == 1 ) {
GISTENTRY *retval;
ArrayType *newkey;
GIST_SPLITVEC * retval = palloc(sizeof(GISTENTRY));
g_intbig_picksplit(bytea *entryvec, GIST_SPLITVEC *v) newkey = new_intArrayType(SIGLENINT);
{ MemSet( (void*)ARRPTR(newkey), 0xff, SIGLEN );
return _int_common_picksplit(entryvec, v,
_intbig_union,
_intbig_inter,
rt__intbig_size,
1.0);
gistentryinit(*retval, PointerGetDatum(newkey), entry->rel, entry->page, entry->offset, VARSIZE(newkey), FALSE);
PG_RETURN_POINTER( retval );
}
PG_RETURN_POINTER( entry );
} }
ArrayType * Datum
g_intbig_union(bytea *entryvec, int *sizep) g_intbig_picksplit(PG_FUNCTION_ARGS)
{ {
return _int_common_union(entryvec, sizep, _intbig_union); PG_RETURN_POINTER( _int_common_picksplit(
(bytea *)PG_GETARG_POINTER(0),
(GIST_SPLITVEC *)PG_GETARG_POINTER(1),
_intbig_union,
_intbig_inter,
rt__intbig_size,
1.0
) );
} }
float * Datum
g_intbig_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result) g_intbig_union(PG_FUNCTION_ARGS)
{ {
_int_common_penalty(origentry, newentry, result, _intbig_union, rt__intbig_size); PG_RETURN_POINTER( _int_common_union(
return result; (bytea *) PG_GETARG_POINTER(0),
(int *) PG_GETARG_POINTER(1),
_intbig_union
) );
} }
bool Datum
g_intbig_consistent(GISTENTRY *entry, ArrayType *query, StrategyNumber strategy) g_intbig_penalty(PG_FUNCTION_ARGS)
{ {
PG_RETURN_POINTER( _int_common_penalty(
(GISTENTRY *)PG_GETARG_POINTER(0),
(GISTENTRY *)PG_GETARG_POINTER(1),
(float *) PG_GETARG_POINTER(2),
_intbig_union, rt__intbig_size
) );
}
Datum
g_intbig_consistent(PG_FUNCTION_ARGS) {
GISTENTRY *entry = (GISTENTRY *)PG_GETARG_POINTER(0);
ArrayType *query = ( ArrayType * )PG_GETARG_POINTER(1);
StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
bool retval; bool retval;
ArrayType *q; ArrayType *q;
...@@ -1147,7 +1272,7 @@ g_intbig_consistent(GISTENTRY *entry, ArrayType *query, StrategyNumber strategy) ...@@ -1147,7 +1272,7 @@ g_intbig_consistent(GISTENTRY *entry, ArrayType *query, StrategyNumber strategy)
retval = FALSE; retval = FALSE;
} }
pfree(q); pfree(q);
return (retval); PG_RETURN_BOOL(retval);
} }
/***************************************************************** /*****************************************************************
...@@ -1158,7 +1283,7 @@ g_intbig_consistent(GISTENTRY *entry, ArrayType *query, StrategyNumber strategy) ...@@ -1158,7 +1283,7 @@ g_intbig_consistent(GISTENTRY *entry, ArrayType *query, StrategyNumber strategy)
** The GiST Union method for _intments ** The GiST Union method for _intments
** returns the minimal set that encloses all the entries in entryvec ** returns the minimal set that encloses all the entries in entryvec
*/ */
ArrayType * static ArrayType *
_int_common_union(bytea *entryvec, int *sizep, formarray unionf) _int_common_union(bytea *entryvec, int *sizep, formarray unionf)
{ {
int numranges, int numranges,
...@@ -1202,7 +1327,7 @@ _int_common_union(bytea *entryvec, int *sizep, formarray unionf) ...@@ -1202,7 +1327,7 @@ _int_common_union(bytea *entryvec, int *sizep, formarray unionf)
* The GiST Penalty method for _intments * * The GiST Penalty method for _intments *
*****************************************/ *****************************************/
float * static float *
_int_common_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result, _int_common_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result,
formarray unionf, formarray unionf,
formfloat sizef) formfloat sizef)
...@@ -1232,7 +1357,7 @@ _int_common_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result, ...@@ -1232,7 +1357,7 @@ _int_common_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result,
** The GiST PickSplit method for _intments ** The GiST PickSplit method for _intments
** We use Guttman's poly time split algorithm ** We use Guttman's poly time split algorithm
*/ */
GIST_SPLITVEC * static GIST_SPLITVEC *
_int_common_picksplit(bytea *entryvec, _int_common_picksplit(bytea *entryvec,
GIST_SPLITVEC *v, GIST_SPLITVEC *v,
formarray unionf, formarray unionf,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册