aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/tsrank.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2015-02-20 17:50:18 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2015-02-20 17:50:18 -0500
commit33b2a2c97f3dd4cf8bbc2c020e34129886367b72 (patch)
tree56580daeff63dca5ea7979769c33d6e9994b59c5 /src/backend/utils/adt/tsrank.c
parent33a3b03d636b529b27f869e332b6344d52635331 (diff)
downloadpostgresql-33b2a2c97f3dd4cf8bbc2c020e34129886367b72.tar.gz
postgresql-33b2a2c97f3dd4cf8bbc2c020e34129886367b72.zip
Fix statically allocated struct with FLEXIBLE_ARRAY_MEMBER member.
clang complains about this, not unreasonably, so define another struct that's explicitly for a WordEntryPos with exactly one element. While at it, get rid of pretty dubious use of a static variable for more than one purpose --- if it were being treated as const maybe I'd be okay with this, but it isn't.
Diffstat (limited to 'src/backend/utils/adt/tsrank.c')
-rw-r--r--src/backend/utils/adt/tsrank.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/src/backend/utils/adt/tsrank.c b/src/backend/utils/adt/tsrank.c
index 8952d7f0b61..733203ec7b5 100644
--- a/src/backend/utils/adt/tsrank.c
+++ b/src/backend/utils/adt/tsrank.c
@@ -195,16 +195,12 @@ SortAndUniqItems(TSQuery q, int *size)
return res;
}
-/* A dummy WordEntryPos array to use when haspos is false */
-static WordEntryPosVector POSNULL = {
- 1, /* Number of elements that follow */
- {0}
-};
-
static float
calc_rank_and(const float *w, TSVector t, TSQuery q)
{
WordEntryPosVector **pos;
+ WordEntryPosVector1 posnull;
+ WordEntryPosVector *POSNULL;
int i,
k,
l,
@@ -228,7 +224,12 @@ calc_rank_and(const float *w, TSVector t, TSQuery q)
return calc_rank_or(w, t, q);
}
pos = (WordEntryPosVector **) palloc0(sizeof(WordEntryPosVector *) * q->size);
- WEP_SETPOS(POSNULL.pos[0], MAXENTRYPOS - 1);
+
+ /* A dummy WordEntryPos array to use when haspos is false */
+ posnull.npos = 1;
+ posnull.pos[0] = 0;
+ WEP_SETPOS(posnull.pos[0], MAXENTRYPOS - 1);
+ POSNULL = (WordEntryPosVector *) &posnull;
for (i = 0; i < size; i++)
{
@@ -241,7 +242,7 @@ calc_rank_and(const float *w, TSVector t, TSQuery q)
if (entry->haspos)
pos[i] = _POSVECPTR(t, entry);
else
- pos[i] = &POSNULL;
+ pos[i] = POSNULL;
dimt = pos[i]->npos;
post = pos[i]->pos;
@@ -256,7 +257,7 @@ calc_rank_and(const float *w, TSVector t, TSQuery q)
for (p = 0; p < lenct; p++)
{
dist = Abs((int) WEP_GETPOS(post[l]) - (int) WEP_GETPOS(ct[p]));
- if (dist || (dist == 0 && (pos[i] == &POSNULL || pos[k] == &POSNULL)))
+ if (dist || (dist == 0 && (pos[i] == POSNULL || pos[k] == POSNULL)))
{
float curw;
@@ -282,6 +283,7 @@ calc_rank_or(const float *w, TSVector t, TSQuery q)
{
WordEntry *entry,
*firstentry;
+ WordEntryPosVector1 posnull;
WordEntryPos *post;
int32 dimt,
j,
@@ -291,6 +293,10 @@ calc_rank_or(const float *w, TSVector t, TSQuery q)
QueryOperand **item;
int size = q->size;
+ /* A dummy WordEntryPos array to use when haspos is false */
+ posnull.npos = 1;
+ posnull.pos[0] = 0;
+
item = SortAndUniqItems(q, &size);
for (i = 0; i < size; i++)
@@ -312,8 +318,8 @@ calc_rank_or(const float *w, TSVector t, TSQuery q)
}
else
{
- dimt = POSNULL.npos;
- post = POSNULL.pos;
+ dimt = posnull.npos;
+ post = posnull.pos;
}
resj = 0.0;