Skip to content

Commit f822be3

Browse files
committed
Refactor getWeights to write to caller-supplied buffer
This gets rid of the static result buffer. Reviewed-by: Robert Haas Discussion: https://www.postgresql.org/message-id/7f86e06a-98c5-4ce3-8ec9-3885c8de0358@iki.fi
1 parent 01e51ed commit f822be3

File tree

1 file changed

+31
-22
lines changed

1 file changed

+31
-22
lines changed

src/backend/utils/adt/tsrank.c

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
#include "utils/array.h"
2222
#include "utils/fmgrprotos.h"
2323

24-
static const float weights[] = {0.1f, 0.2f, 0.4f, 1.0f};
24+
#define NUM_WEIGHTS 4
25+
static const float default_weights[NUM_WEIGHTS] = {0.1f, 0.2f, 0.4f, 1.0f};
2526

2627
#define wpos(wep) ( w[ WEP_GETWEIGHT(wep) ] )
2728

@@ -396,22 +397,24 @@ calc_rank(const float *w, TSVector t, TSQuery q, int32 method)
396397
return res;
397398
}
398399

399-
static const float *
400-
getWeights(ArrayType *win)
400+
/*
401+
* Extract weights from an array. The weights are stored in *ws, which must
402+
* have space for NUM_WEIGHTS elements.
403+
*/
404+
static void
405+
getWeights(ArrayType *win, float *ws)
401406
{
402-
static float ws[lengthof(weights)];
403407
int i;
404408
float4 *arrdata;
405409

406-
if (win == NULL)
407-
return weights;
410+
Assert(win != NULL);
408411

409412
if (ARR_NDIM(win) != 1)
410413
ereport(ERROR,
411414
(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
412415
errmsg("array of weight must be one-dimensional")));
413416

414-
if (ArrayGetNItems(ARR_NDIM(win), ARR_DIMS(win)) < lengthof(weights))
417+
if (ArrayGetNItems(ARR_NDIM(win), ARR_DIMS(win)) < NUM_WEIGHTS)
415418
ereport(ERROR,
416419
(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
417420
errmsg("array of weight is too short")));
@@ -422,16 +425,14 @@ getWeights(ArrayType *win)
422425
errmsg("array of weight must not contain nulls")));
423426

424427
arrdata = (float4 *) ARR_DATA_PTR(win);
425-
for (i = 0; i < lengthof(weights); i++)
428+
for (i = 0; i < NUM_WEIGHTS; i++)
426429
{
427-
ws[i] = (arrdata[i] >= 0) ? arrdata[i] : weights[i];
430+
ws[i] = (arrdata[i] >= 0) ? arrdata[i] : default_weights[i];
428431
if (ws[i] > 1.0)
429432
ereport(ERROR,
430433
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
431434
errmsg("weight out of range")));
432435
}
433-
434-
return ws;
435436
}
436437

437438
Datum
@@ -441,9 +442,11 @@ ts_rank_wttf(PG_FUNCTION_ARGS)
441442
TSVector txt = PG_GETARG_TSVECTOR(1);
442443
TSQuery query = PG_GETARG_TSQUERY(2);
443444
int method = PG_GETARG_INT32(3);
445+
float weights[NUM_WEIGHTS];
444446
float res;
445447

446-
res = calc_rank(getWeights(win), txt, query, method);
448+
getWeights(win, weights);
449+
res = calc_rank(weights, txt, query, method);
447450

448451
PG_FREE_IF_COPY(win, 0);
449452
PG_FREE_IF_COPY(txt, 1);
@@ -457,9 +460,11 @@ ts_rank_wtt(PG_FUNCTION_ARGS)
457460
ArrayType *win = (ArrayType *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
458461
TSVector txt = PG_GETARG_TSVECTOR(1);
459462
TSQuery query = PG_GETARG_TSQUERY(2);
463+
float weights[NUM_WEIGHTS];
460464
float res;
461465

462-
res = calc_rank(getWeights(win), txt, query, DEF_NORM_METHOD);
466+
getWeights(win, weights);
467+
res = calc_rank(weights, txt, query, DEF_NORM_METHOD);
463468

464469
PG_FREE_IF_COPY(win, 0);
465470
PG_FREE_IF_COPY(txt, 1);
@@ -475,7 +480,7 @@ ts_rank_ttf(PG_FUNCTION_ARGS)
475480
int method = PG_GETARG_INT32(2);
476481
float res;
477482

478-
res = calc_rank(getWeights(NULL), txt, query, method);
483+
res = calc_rank(default_weights, txt, query, method);
479484

480485
PG_FREE_IF_COPY(txt, 0);
481486
PG_FREE_IF_COPY(query, 1);
@@ -489,7 +494,7 @@ ts_rank_tt(PG_FUNCTION_ARGS)
489494
TSQuery query = PG_GETARG_TSQUERY(1);
490495
float res;
491496

492-
res = calc_rank(getWeights(NULL), txt, query, DEF_NORM_METHOD);
497+
res = calc_rank(default_weights, txt, query, DEF_NORM_METHOD);
493498

494499
PG_FREE_IF_COPY(txt, 0);
495500
PG_FREE_IF_COPY(query, 1);
@@ -855,16 +860,16 @@ calc_rank_cd(const float4 *arrdata, TSVector txt, TSQuery query, int method)
855860
doclen = 0;
856861
CoverExt ext;
857862
double Wdoc = 0.0;
858-
double invws[lengthof(weights)];
863+
double invws[NUM_WEIGHTS];
859864
double SumDist = 0.0,
860865
PrevExtPos = 0.0;
861866
int NExtent = 0;
862867
QueryRepresentation qr;
863868

864869

865-
for (i = 0; i < lengthof(weights); i++)
870+
for (i = 0; i < NUM_WEIGHTS; i++)
866871
{
867-
invws[i] = ((double) ((arrdata[i] >= 0) ? arrdata[i] : weights[i]));
872+
invws[i] = ((double) ((arrdata[i] >= 0) ? arrdata[i] : default_weights[i]));
868873
if (invws[i] > 1.0)
869874
ereport(ERROR,
870875
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
@@ -956,9 +961,11 @@ ts_rankcd_wttf(PG_FUNCTION_ARGS)
956961
TSVector txt = PG_GETARG_TSVECTOR(1);
957962
TSQuery query = PG_GETARG_TSQUERY(2);
958963
int method = PG_GETARG_INT32(3);
964+
float weights[NUM_WEIGHTS];
959965
float res;
960966

961-
res = calc_rank_cd(getWeights(win), txt, query, method);
967+
getWeights(win, weights);
968+
res = calc_rank_cd(weights, txt, query, method);
962969

963970
PG_FREE_IF_COPY(win, 0);
964971
PG_FREE_IF_COPY(txt, 1);
@@ -972,9 +979,11 @@ ts_rankcd_wtt(PG_FUNCTION_ARGS)
972979
ArrayType *win = (ArrayType *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
973980
TSVector txt = PG_GETARG_TSVECTOR(1);
974981
TSQuery query = PG_GETARG_TSQUERY(2);
982+
float weights[NUM_WEIGHTS];
975983
float res;
976984

977-
res = calc_rank_cd(getWeights(win), txt, query, DEF_NORM_METHOD);
985+
getWeights(win, weights);
986+
res = calc_rank_cd(weights, txt, query, DEF_NORM_METHOD);
978987

979988
PG_FREE_IF_COPY(win, 0);
980989
PG_FREE_IF_COPY(txt, 1);
@@ -990,7 +999,7 @@ ts_rankcd_ttf(PG_FUNCTION_ARGS)
990999
int method = PG_GETARG_INT32(2);
9911000
float res;
9921001

993-
res = calc_rank_cd(getWeights(NULL), txt, query, method);
1002+
res = calc_rank_cd(default_weights, txt, query, method);
9941003

9951004
PG_FREE_IF_COPY(txt, 0);
9961005
PG_FREE_IF_COPY(query, 1);
@@ -1004,7 +1013,7 @@ ts_rankcd_tt(PG_FUNCTION_ARGS)
10041013
TSQuery query = PG_GETARG_TSQUERY(1);
10051014
float res;
10061015

1007-
res = calc_rank_cd(getWeights(NULL), txt, query, DEF_NORM_METHOD);
1016+
res = calc_rank_cd(default_weights, txt, query, DEF_NORM_METHOD);
10081017

10091018
PG_FREE_IF_COPY(txt, 0);
10101019
PG_FREE_IF_COPY(query, 1);

0 commit comments

Comments
 (0)