From 33b2a2c97f3dd4cf8bbc2c020e34129886367b72 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 20 Feb 2015 17:50:18 -0500 Subject: [PATCH] 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. --- src/backend/utils/adt/tsrank.c | 28 +++++++++++++++++----------- src/include/tsearch/ts_type.h | 7 +++++++ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/backend/utils/adt/tsrank.c b/src/backend/utils/adt/tsrank.c index 8952d7f0b6..733203ec7b 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; diff --git a/src/include/tsearch/ts_type.h b/src/include/tsearch/ts_type.h index ce919a2c66..281cdd6c26 100644 --- a/src/include/tsearch/ts_type.h +++ b/src/include/tsearch/ts_type.h @@ -66,6 +66,13 @@ typedef struct WordEntryPos pos[FLEXIBLE_ARRAY_MEMBER]; } WordEntryPosVector; +/* WordEntryPosVector with exactly 1 entry */ +typedef struct +{ + uint16 npos; + WordEntryPos pos[1]; +} WordEntryPosVector1; + #define WEP_GETWEIGHT(x) ( (x) >> 14 ) #define WEP_GETPOS(x) ( (x) & 0x3fff ) -- 2.39.5