gbt_text_xfrm ( bytea * leaf )
{
bytea * out = leaf;
-
int32 ilen = VARSIZE (leaf) - VARHDRSZ;
int32 olen ;
- char sin[ilen+1];
- char * sou = NULL;
- memcpy ( (void*)&sin[0], (void*) VARDATA(leaf) ,ilen );
+ char * sin;
+ char * sou;
+
+ sin = palloc(ilen + 1);
+ memcpy (sin, (void*) VARDATA(leaf) ,ilen );
sin[ilen] = '\0';
+
olen = strxfrm ( NULL, &sin[0], 0 ) + 1;
sou = palloc ( olen );
olen = strxfrm ( sou , &sin[0] , olen );
out->vl_len = olen+1;
memcpy( (void*) VARDATA(out), sou, olen-VARHDRSZ );
((char*)out)[olen] = '\0';
+
pfree(sou);
+ pfree(sin);
return out;
}
}
-
-
GIST_SPLITVEC *
-gbt_num_picksplit( const GistEntryVector *entryvec, GIST_SPLITVEC *v, const gbtree_ninfo * tinfo )
+gbt_num_picksplit( const GistEntryVector *entryvec, GIST_SPLITVEC *v,
+ const gbtree_ninfo * tinfo )
{
+ OffsetNumber i,
+ maxoff = entryvec->n - 1;
+ Nsrt *arr;
+ int nbytes;
- OffsetNumber i ,
-
- maxoff = entryvec->n - 1;
-
- Nsrt arr[maxoff+1] ;
- int nbytes ;
-
+ arr = (Nsrt *) palloc((maxoff+1) * sizeof(Nsrt));
nbytes = (maxoff + 2) * sizeof(OffsetNumber);
v->spl_left = (OffsetNumber *) palloc(nbytes);
v->spl_right = (OffsetNumber *) palloc(nbytes);
}
}
- return v;
+ pfree(arr);
+ return v;
}
-
}
-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);
}
/* 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 */
}
- return v;
+ pfree(arr);
+ return v;
}
-
-
-
/*
-** The GiST consistent method
-*/
-
+ * The GiST consistent method
+ */
extern bool
gbt_var_consistent(
GBT_VARKEY_R * key,