From: Teodor Sigaev Date: Thu, 24 Aug 2006 17:37:34 +0000 (+0000) Subject: Fix compare bug for tsvector: problem was in aligment. Per Stefan Kaltenbrunner ... X-Git-Tag: REL8_2_BETA1~253 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8f91e2b6071aaeae333f668d0f5d9189c5710a7a;p=postgresql Fix compare bug for tsvector: problem was in aligment. Per Stefan Kaltenbrunner and Phil Frost --- diff --git a/contrib/tsearch2/tsvector.c b/contrib/tsearch2/tsvector.c index 4999b30d78..a52da49f0c 100644 --- a/contrib/tsearch2/tsvector.c +++ b/contrib/tsearch2/tsvector.c @@ -966,17 +966,43 @@ silly_cmp_tsvector(const tsvector * a, const tsvector * b) return 1; else { - unsigned char *aptr = (unsigned char *) (a->data) + DATAHDRSIZE; - unsigned char *bptr = (unsigned char *) (b->data) + DATAHDRSIZE; + WordEntry *aptr = ARRPTR(a); + WordEntry *bptr = ARRPTR(b); + int i = 0; + int res; + + + for(i=0;isize;i++) { + if ( aptr->haspos != bptr->haspos ) { + return ( aptr->haspos > bptr->haspos ) ? -1 : 1; + } else if ( aptr->pos != bptr->pos ) { + return ( aptr->pos > bptr->pos ) ? -1 : 1; + } else if ( aptr->len != bptr->len ) { + return ( aptr->len > bptr->len ) ? -1 : 1; + } else if ( (res=strncmp(STRPTR(a) + aptr->pos, STRPTR(b) + bptr->pos, b->len))!= 0 ) { + return res; + } else if ( aptr->haspos ) { + WordEntryPos *ap = POSDATAPTR(a, aptr); + WordEntryPos *bp = POSDATAPTR(b, bptr); + int j; + + if ( POSDATALEN(a, aptr) != POSDATALEN(b, bptr) ) + return ( POSDATALEN(a, aptr) > POSDATALEN(b, bptr) ) ? -1 : 1; + + for(j=0;j WEP_GETPOS(*bp) ) ? -1 : 1; + } else if ( WEP_GETWEIGHT(*ap) != WEP_GETWEIGHT(*bp) ) { + return ( WEP_GETWEIGHT(*ap) > WEP_GETWEIGHT(*bp) ) ? -1 : 1; + } + ap++, bp++; + } + } - while (aptr - ((unsigned char *) (a->data)) < a->len) - { - if (*aptr != *bptr) - return (*aptr < *bptr) ? -1 : 1; - aptr++; - bptr++; + aptr++; bptr++; } } + return 0; }