diff options
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/btree_gist/btree_utils_var.c | 20 | ||||
-rw-r--r-- | contrib/tsearch2/rank.c | 22 | ||||
-rw-r--r-- | contrib/tsearch2/tsvector.c | 11 |
3 files changed, 25 insertions, 28 deletions
diff --git a/contrib/btree_gist/btree_utils_var.c b/contrib/btree_gist/btree_utils_var.c index 1f5ea126920..ae44e754913 100644 --- a/contrib/btree_gist/btree_utils_var.c +++ b/contrib/btree_gist/btree_utils_var.c @@ -439,18 +439,14 @@ gbt_var_penalty(float *res, const GISTENTRY *o, const GISTENTRY *n, const gbtree } -/* - * Fortunately, this sort comparison 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_vsrt_cmp(const void *a, const void *b, void *arg) { GBT_VARKEY_R ar = gbt_var_key_readable(((const Vsrt *) a)->t); GBT_VARKEY_R br = gbt_var_key_readable(((const Vsrt *) b)->t); + const gbtree_vinfo *tinfo = (const gbtree_vinfo *) arg; - return (*gbt_vsrt_cmp_tinfo->f_cmp) (ar.lower, br.lower); + return (*tinfo->f_cmp) (ar.lower, br.lower); } GIST_SPLITVEC * @@ -496,11 +492,11 @@ gbt_var_picksplit(const GistEntryVector *entryvec, GIST_SPLITVEC *v, const gbtre } /* sort */ - gbt_vsrt_cmp_tinfo = tinfo; - qsort((void *) &arr[FirstOffsetNumber], - maxoff - FirstOffsetNumber + 1, - sizeof(Vsrt), - gbt_vsrt_cmp); + qsort_arg((void *) &arr[FirstOffsetNumber], + maxoff - FirstOffsetNumber + 1, + sizeof(Vsrt), + gbt_vsrt_cmp, + (void *) tinfo); /* We do simply create two parts */ diff --git a/contrib/tsearch2/rank.c b/contrib/tsearch2/rank.c index 41e633580d5..f8a7d5f2f06 100644 --- a/contrib/tsearch2/rank.c +++ b/contrib/tsearch2/rank.c @@ -122,14 +122,14 @@ find_wordentry(tsvector * t, QUERYTYPE * q, ITEM * item) } -static char *SortAndUniqOperand = NULL; - static int -compareITEM(const void *a, const void *b) +compareITEM(const void *a, const void *b, void *arg) { + char *operand = (char *) arg; + if ((*(ITEM **) a)->length == (*(ITEM **) b)->length) - return strncmp(SortAndUniqOperand + (*(ITEM **) a)->distance, - SortAndUniqOperand + (*(ITEM **) b)->distance, + return strncmp(operand + (*(ITEM **) a)->distance, + operand + (*(ITEM **) b)->distance, (*(ITEM **) b)->length); return ((*(ITEM **) a)->length > (*(ITEM **) b)->length) ? 1 : -1; @@ -158,15 +158,14 @@ SortAndUniqItems(char *operand, ITEM * item, int *size) if (*size < 2) return res; - SortAndUniqOperand = operand; - qsort(res, *size, sizeof(ITEM **), compareITEM); + qsort_arg(res, *size, sizeof(ITEM **), compareITEM, (void *) operand); ptr = res + 1; prevptr = res; while (ptr - res < *size) { - if (compareITEM((void *) ptr, (void *) prevptr) != 0) + if (compareITEM((void *) ptr, (void *) prevptr, (void *) operand) != 0) { prevptr++; *prevptr = *ptr; @@ -551,10 +550,11 @@ get_docrep(tsvector * txt, QUERYTYPE * query, int *doclen) int len = query->size * 4, cur = 0; DocRepresentation *doc; + char *operand; *(uint16 *) POSNULL = lengthof(POSNULL) - 1; doc = (DocRepresentation *) palloc(sizeof(DocRepresentation) * len); - SortAndUniqOperand = GETOPERAND(query); + operand = GETOPERAND(query); reset_istrue_flag(query); for (i = 0; i < query->size; i++) @@ -598,7 +598,9 @@ get_docrep(tsvector * txt, QUERYTYPE * query, int *doclen) for (k = 0; k < query->size; k++) { kptr = item + k; - if (k == i || (item[k].type == VAL && compareITEM(&kptr, &iptr) == 0)) + if (k == i || + (item[k].type == VAL && + compareITEM(&kptr, &iptr, operand) == 0)) { doc[cur].item[doc[cur].nitem] = item + k; doc[cur].nitem++; diff --git a/contrib/tsearch2/tsvector.c b/contrib/tsearch2/tsvector.c index a4a9d57d645..1abf1914e33 100644 --- a/contrib/tsearch2/tsvector.c +++ b/contrib/tsearch2/tsvector.c @@ -85,14 +85,14 @@ uniquePos(WordEntryPos * a, int4 l) return res + 1 - a; } -static char *BufferStr; static int -compareentry(const void *a, const void *b) +compareentry(const void *a, const void *b, void *arg) { + char *BufferStr = (char *) arg; + if (((WordEntryIN *) a)->entry.len == ((WordEntryIN *) b)->entry.len) { - return strncmp( - &BufferStr[((WordEntryIN *) a)->entry.pos], + return strncmp(&BufferStr[((WordEntryIN *) a)->entry.pos], &BufferStr[((WordEntryIN *) b)->entry.pos], ((WordEntryIN *) a)->entry.len); } @@ -117,8 +117,7 @@ uniqueentry(WordEntryIN * a, int4 l, char *buf, int4 *outbuflen) } ptr = a + 1; - BufferStr = buf; - qsort((void *) a, l, sizeof(WordEntryIN), compareentry); + qsort_arg((void *) a, l, sizeof(WordEntryIN), compareentry, (void *) buf); while (ptr - a < l) { |