diff options
author | Teodor Sigaev <teodor@sigaev.ru> | 2005-06-01 11:45:42 +0000 |
---|---|---|
committer | Teodor Sigaev <teodor@sigaev.ru> | 2005-06-01 11:45:42 +0000 |
commit | babd4714f66d8b90c4c7a7d8c33c21d2001685c9 (patch) | |
tree | cabc0c25bfbd3caf71ad7fe780090b1515a2cab7 | |
parent | 3b3600148d615982f98c254a2623089f26d56f3d (diff) | |
download | postgresql-babd4714f66d8b90c4c7a7d8c33c21d2001685c9.tar.gz postgresql-babd4714f66d8b90c4c7a7d8c33c21d2001685c9.zip |
Prevent to divide by zero and range out of 0..1
-rw-r--r-- | contrib/tsearch2/rank.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/contrib/tsearch2/rank.c b/contrib/tsearch2/rank.c index 8dc10e2a426..53cf1bef15e 100644 --- a/contrib/tsearch2/rank.c +++ b/contrib/tsearch2/rank.c @@ -288,6 +288,7 @@ calc_rank(float *w, tsvector * t, QUERYTYPE * q, int4 method) { ITEM *item = GETQUERY(q); float res = 0.0; + int len; if (!t->size || !q->size) return 0.0; @@ -303,10 +304,11 @@ calc_rank(float *w, tsvector * t, QUERYTYPE * q, int4 method) case 0: break; case 1: - res /= log((float) cnt_length(t)); + res /= log( (float)(cnt_length(t)+1) ) / log(2.0); break; case 2: - res /= (float) cnt_length(t); + len = cnt_length(t); + if ( len > 0 ) res /= (float)len; break; default: /* internal error */ @@ -609,10 +611,11 @@ rank_cd(PG_FUNCTION_ARGS) case 0: break; case 1: - res /= log((float) cnt_length(txt)); + res /= log( (float)(cnt_length(txt)+1) ); break; case 2: - res /= (float) cnt_length(txt); + len = cnt_length(txt); + if ( len > 0 ) res /= (float)len; break; default: /* internal error */ |