diff options
author | Tom Lane | 2004-08-21 00:09:10 +0000 |
---|---|---|
committer | Tom Lane | 2004-08-21 00:09:10 +0000 |
commit | 86d78021a403738f9a6a647fa327d7e7871aa11c (patch) | |
tree | 1fb49806c7098da3619970446dac637ff45f2463 /contrib/btree_gist/btree_utils_var.c | |
parent | bf9d9bd2f3a00bc5f01e56e70f46bf21815411f8 (diff) |
Whack btree_gist code around until it has some small hope of building
on non-gcc compilers.
Diffstat (limited to 'contrib/btree_gist/btree_utils_var.c')
-rw-r--r-- | contrib/btree_gist/btree_utils_var.c | 49 |
1 files changed, 24 insertions, 25 deletions
diff --git a/contrib/btree_gist/btree_utils_var.c b/contrib/btree_gist/btree_utils_var.c index 95333d45286..f8ced122267 100644 --- a/contrib/btree_gist/btree_utils_var.c +++ b/contrib/btree_gist/btree_utils_var.c @@ -416,36 +416,35 @@ gbt_var_penalty ( float * res , const GISTENTRY * o , const GISTENTRY * n, const } -static int32 gbt_vsrt_cmp ( const Vsrt * a , const Vsrt * b , const gbtree_vinfo * tinfo ) -{ - GBT_VARKEY_R ar = gbt_var_key_readable ( a->t ); - GBT_VARKEY_R br = gbt_var_key_readable ( b->t ); - return (*tinfo->f_cmp) ( ar.lower, br.lower ); -} +/* + * Fortunately, this sort comparsion routine needn't be reentrant... + */ +static const gbtree_vinfo * gbt_vsrt_cmp_tinfo; +static int +gbt_vsrt_cmp(const void *a, const void *b) +{ + GBT_VARKEY_R ar = gbt_var_key_readable ( ((const Vsrt *) a)->t ); + GBT_VARKEY_R br = gbt_var_key_readable ( ((const Vsrt *) b)->t ); + return (*gbt_vsrt_cmp_tinfo->f_cmp) ( ar.lower, br.lower ); +} extern GIST_SPLITVEC * gbt_var_picksplit( const GistEntryVector *entryvec, GIST_SPLITVEC *v, const gbtree_vinfo * tinfo ) { - - OffsetNumber i , - maxoff = entryvec->n - 1; - - Vsrt arr[maxoff+1] ; + OffsetNumber i, + maxoff = entryvec->n - 1; + Vsrt *arr; int pfrcntr = 0 , svcntr = 0 , nbytes ; char * tst , * cur ; - char **pfr = NULL ; GBT_VARKEY **sv = NULL; - static int cmp (const void *a, const void *b ){ - return gbt_vsrt_cmp ((Vsrt *) a , (Vsrt *) b , tinfo ); - } - + arr = (Vsrt *) palloc((maxoff+1) * sizeof(Vsrt)); nbytes = (maxoff + 2) * sizeof(OffsetNumber); v->spl_left = (OffsetNumber *) palloc(nbytes); v->spl_right = (OffsetNumber *) palloc(nbytes); @@ -482,8 +481,11 @@ gbt_var_picksplit( const GistEntryVector *entryvec, GIST_SPLITVEC *v, const gbtr } /* sort */ - qsort ( (void*) &arr[FirstOffsetNumber], maxoff-FirstOffsetNumber+1,sizeof(Vsrt), cmp ); - + gbt_vsrt_cmp_tinfo = tinfo; + qsort((void*) &arr[FirstOffsetNumber], + maxoff-FirstOffsetNumber+1, + sizeof(Vsrt), + gbt_vsrt_cmp); /* We do simply create two parts */ @@ -545,18 +547,15 @@ gbt_var_picksplit( const GistEntryVector *entryvec, GIST_SPLITVEC *v, const gbtr } - return v; + pfree(arr); + return v; } - - - /* -** The GiST consistent method -*/ - + * The GiST consistent method + */ extern bool gbt_var_consistent( GBT_VARKEY_R * key, |