From fb13881f423193a8342e0fe098f581e511b09d67 Mon Sep 17 00:00:00 2001 From: Teodor Sigaev Date: Thu, 31 Mar 2005 15:08:08 +0000 Subject: [PATCH] 1 fix various comparing functions 2 implement gtsvector_out for use with gevel module (debug GiST indexes, http://www.sai.msu.su/~megera/postgres/gist/gevel/) --- contrib/tsearch2/dict.c | 4 +++- contrib/tsearch2/gistidx.c | 27 +++++++++++++++++++++++---- contrib/tsearch2/rank.c | 4 ++-- contrib/tsearch2/ts_cfg.c | 4 +++- contrib/tsearch2/tsvector.c | 2 +- contrib/tsearch2/wparser.c | 4 +++- 6 files changed, 35 insertions(+), 10 deletions(-) diff --git a/contrib/tsearch2/dict.c b/contrib/tsearch2/dict.c index 7a3626b3bc..0b7fb7288c 100644 --- a/contrib/tsearch2/dict.c +++ b/contrib/tsearch2/dict.c @@ -92,7 +92,9 @@ reset_dict(void) static int comparedict(const void *a, const void *b) { - return ((DictInfo *) a)->dict_id - ((DictInfo *) b)->dict_id; + if ( ((DictInfo *) a)->dict_id == ((DictInfo *) b)->dict_id ) + return 0; + return ( ((DictInfo *) a)->dict_id < ((DictInfo *) b)->dict_id ) ? -1 : 1; } DictInfo * diff --git a/contrib/tsearch2/gistidx.c b/contrib/tsearch2/gistidx.c index bf1705036e..58fbb97451 100644 --- a/contrib/tsearch2/gistidx.c +++ b/contrib/tsearch2/gistidx.c @@ -54,6 +54,7 @@ Datum gtsvector_picksplit(PG_FUNCTION_ARGS); GETBITBYTE(val,7) \ ) +static int4 sizebitvec(BITVECP sign); Datum gtsvector_in(PG_FUNCTION_ARGS) @@ -64,13 +65,31 @@ gtsvector_in(PG_FUNCTION_ARGS) PG_RETURN_DATUM(0); } +#define SINGOUTSTR "%d true bits, %d false bits" +#define ARROUTSTR "%d unique words" +#define EXTRALEN ( 2*13 ) + +static int outbuf_maxlen = 0; + Datum gtsvector_out(PG_FUNCTION_ARGS) { - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("gtsvector_out not implemented"))); - PG_RETURN_DATUM(0); + GISTTYPE *key = (GISTTYPE *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_POINTER(0))); + char *outbuf; + + if ( outbuf_maxlen==0 ) + outbuf_maxlen = 2*EXTRALEN + Max( strlen(SINGOUTSTR), strlen(ARROUTSTR) ) + 1; + outbuf = palloc( outbuf_maxlen ); + + if ( ISARRKEY(key) ) + sprintf( outbuf, ARROUTSTR, ARRNELEM(key) ); + else { + int cnttrue = ( ISALLTRUE(key) ) ? SIGLENBIT : sizebitvec(GETSIGN(key)); + sprintf( outbuf, SINGOUTSTR, cnttrue, SIGLENBIT - cnttrue ); + } + + PG_FREE_IF_COPY(key,0); + PG_RETURN_POINTER(outbuf); } static int diff --git a/contrib/tsearch2/rank.c b/contrib/tsearch2/rank.c index a06bb96795..a58986e474 100644 --- a/contrib/tsearch2/rank.c +++ b/contrib/tsearch2/rank.c @@ -386,7 +386,7 @@ static int compareDocR(const void *a, const void *b) { if (((DocRepresentation *) a)->pos == ((DocRepresentation *) b)->pos) - return 1; + return 0; return (((DocRepresentation *) a)->pos > ((DocRepresentation *) b)->pos) ? 1 : -1; } @@ -654,7 +654,7 @@ static int compareDocWord(const void *a, const void *b) { if (((DocWord *) a)->pos == ((DocWord *) b)->pos) - return 1; + return 0; return (((DocWord *) a)->pos > ((DocWord *) b)->pos) ? 1 : -1; } diff --git a/contrib/tsearch2/ts_cfg.c b/contrib/tsearch2/ts_cfg.c index 79f25c43d9..735d406109 100644 --- a/contrib/tsearch2/ts_cfg.c +++ b/contrib/tsearch2/ts_cfg.c @@ -186,7 +186,9 @@ reset_cfg(void) static int comparecfg(const void *a, const void *b) { - return ((TSCfgInfo *) a)->id - ((TSCfgInfo *) b)->id; + if ( ((TSCfgInfo *) a)->id == ((TSCfgInfo *) b)->id ) + return 0; + return ( ((TSCfgInfo *) a)->id < ((TSCfgInfo *) b)->id ) ? -1 : 1; } TSCfgInfo * diff --git a/contrib/tsearch2/tsvector.c b/contrib/tsearch2/tsvector.c index 2856a16aba..2630694e4e 100644 --- a/contrib/tsearch2/tsvector.c +++ b/contrib/tsearch2/tsvector.c @@ -51,7 +51,7 @@ static int comparePos(const void *a, const void *b) { if (WEP_GETPOS(*(WordEntryPos *) a) == WEP_GETPOS(*(WordEntryPos *) b)) - return 1; + return 0; return (WEP_GETPOS(*(WordEntryPos *) a)> WEP_GETPOS(*(WordEntryPos *) b)) ? 1 : -1; } diff --git a/contrib/tsearch2/wparser.c b/contrib/tsearch2/wparser.c index 554c2684b9..33bfd4d87e 100644 --- a/contrib/tsearch2/wparser.c +++ b/contrib/tsearch2/wparser.c @@ -93,7 +93,9 @@ reset_prs(void) static int compareprs(const void *a, const void *b) { - return ((WParserInfo *) a)->prs_id - ((WParserInfo *) b)->prs_id; + if ( ((WParserInfo *) a)->prs_id == ((WParserInfo *) b)->prs_id ) + return 0; + return ( ((WParserInfo *) a)->prs_id < ((WParserInfo *) b)->prs_id ) ? -1 : 1; } WParserInfo * -- 2.40.0