summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2025-04-02 20:17:43 +0000
committerTom Lane2025-04-02 20:18:08 +0000
commitbe625caf3dad63bae39296b553fc8f856d7fb9b7 (patch)
treeb5610b342253c1573a7e53e70e378534c14c067b
parent4934d38759cdb65965db4ccf10aa767d9bee5e00 (diff)
Remove unnecessary type violation in tsvectorrecv().
compareentry() is declared to work on WordEntryIN structs, but tsvectorrecv() is using it in two places to work on WordEntry structs. This is almost okay, since WordEntry is the first field of WordEntryIN. But on machines with 8-byte pointers, WordEntryIN will have a larger alignment spec than WordEntry, and it's at least theoretically possible that the compiler could generate code that depends on the larger alignment. Given the lack of field reports, this may be just a hypothetical bug that upsets nothing except sanitizer tools. Or it may be real on certain hardware but nobody's tried to use tsvectorrecv() on such hardware. In any case we should fix it, and the fix is trivial: just change compareentry() so that it works on WordEntry without any mention of WordEntryIN. We can also get rid of the quite-useless intermediate function WordEntryCMP. Bug: #18875 Reported-by: Alexander Lakhin <exclusion@gmail.com> Author: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/18875-07a29c49c825a608@postgresql.org Backpatch-through: 13
-rw-r--r--src/backend/utils/adt/tsvector.c23
1 files changed, 10 insertions, 13 deletions
diff --git a/src/backend/utils/adt/tsvector.c b/src/backend/utils/adt/tsvector.c
index 62f0926d864..3831dd3c806 100644
--- a/src/backend/utils/adt/tsvector.c
+++ b/src/backend/utils/adt/tsvector.c
@@ -22,7 +22,7 @@
typedef struct
{
- WordEntry entry; /* must be first! */
+ WordEntry entry; /* must be first, see compareentry */
WordEntryPos *pos;
int poslen; /* number of elements in pos */
} WordEntryIN;
@@ -78,16 +78,19 @@ uniquePos(WordEntryPos *a, int l)
return res + 1 - a;
}
-/* Compare two WordEntryIN values for qsort */
+/*
+ * Compare two WordEntry structs for qsort_arg. This can also be used on
+ * WordEntryIN structs, since those have WordEntry as their first field.
+ */
static int
compareentry(const void *va, const void *vb, void *arg)
{
- const WordEntryIN *a = (const WordEntryIN *) va;
- const WordEntryIN *b = (const WordEntryIN *) vb;
+ const WordEntry *a = (const WordEntry *) va;
+ const WordEntry *b = (const WordEntry *) vb;
char *BufferStr = (char *) arg;
- return tsCompareString(&BufferStr[a->entry.pos], a->entry.len,
- &BufferStr[b->entry.pos], b->entry.len,
+ return tsCompareString(&BufferStr[a->pos], a->len,
+ &BufferStr[b->pos], b->len,
false);
}
@@ -167,12 +170,6 @@ uniqueentry(WordEntryIN *a, int l, char *buf, int *outbuflen)
return res + 1 - a;
}
-static int
-WordEntryCMP(WordEntry *a, WordEntry *b, char *buf)
-{
- return compareentry(a, b, buf);
-}
-
Datum
tsvectorin(PG_FUNCTION_ARGS)
@@ -505,7 +502,7 @@ tsvectorrecv(PG_FUNCTION_ARGS)
datalen += lex_len;
- if (i > 0 && WordEntryCMP(&vec->entries[i],
+ if (i > 0 && compareentry(&vec->entries[i],
&vec->entries[i - 1],
STRPTR(vec)) <= 0)
needSort = true;