I developed this patch as part of the Datum-as-struct semi-proposal [0].
I think it can be useful independent of that.
Here, Datum was used to pass around an opaque pointer between a group of
functions. But one might as well use void * for that; the use of Datum
doesn't achieve anything here and is just distracting.
[0]:
https://www.postgresql.org/message-id/flat/8246d7ff-f4b7-4363-913e-827dadfeb145%40eisentraut.orgFrom ab1ac0e4b1f9948faf56dd09d570d17cc2fd8275 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Fri, 5 Sep 2025 23:21:53 +0200
Subject: [PATCH] Change some Datum to void * for opaque pass-through pointer
---
src/backend/tsearch/to_tsany.c | 12 ++++++------
src/backend/utils/adt/tsquery.c | 8 ++++----
src/include/tsearch/ts_utils.h | 4 ++--
3 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/src/backend/tsearch/to_tsany.c b/src/backend/tsearch/to_tsany.c
index 4dfcc2cd3bd..678095cb29f 100644
--- a/src/backend/tsearch/to_tsany.c
+++ b/src/backend/tsearch/to_tsany.c
@@ -489,7 +489,7 @@ add_to_tsvector(void *_state, char *elem_value, int
elem_len)
* and different variants are ORed together.
*/
static void
-pushval_morph(Datum opaque, TSQueryParserState state, char *strval, int
lenval, int16 weight, bool prefix)
+pushval_morph(void *opaque, TSQueryParserState state, char *strval, int
lenval, int16 weight, bool prefix)
{
int32 count = 0;
ParsedText prs;
@@ -498,7 +498,7 @@ pushval_morph(Datum opaque, TSQueryParserState state, char
*strval, int lenval,
cntvar = 0,
cntpos = 0,
cnt = 0;
- MorphOpaque *data = (MorphOpaque *) DatumGetPointer(opaque);
+ MorphOpaque *data = opaque;
prs.lenwords = 4;
prs.curwords = 0;
@@ -594,7 +594,7 @@ to_tsquery_byid(PG_FUNCTION_ARGS)
query = parse_tsquery(text_to_cstring(in),
pushval_morph,
- PointerGetDatum(&data),
+ &data,
0,
NULL);
@@ -631,7 +631,7 @@ plainto_tsquery_byid(PG_FUNCTION_ARGS)
query = parse_tsquery(text_to_cstring(in),
pushval_morph,
- PointerGetDatum(&data),
+ &data,
P_TSQ_PLAIN,
NULL);
@@ -669,7 +669,7 @@ phraseto_tsquery_byid(PG_FUNCTION_ARGS)
query = parse_tsquery(text_to_cstring(in),
pushval_morph,
- PointerGetDatum(&data),
+ &data,
P_TSQ_PLAIN,
NULL);
@@ -707,7 +707,7 @@ websearch_to_tsquery_byid(PG_FUNCTION_ARGS)
query = parse_tsquery(text_to_cstring(in),
pushval_morph,
- PointerGetDatum(&data),
+ &data,
P_TSQ_WEB,
NULL);
diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c
index 717de8073d5..6a021c61afb 100644
--- a/src/backend/utils/adt/tsquery.c
+++ b/src/backend/utils/adt/tsquery.c
@@ -671,7 +671,7 @@ cleanOpStack(TSQueryParserState state,
static void
makepol(TSQueryParserState state,
PushFunction pushval,
- Datum opaque)
+ void *opaque)
{
int8 operator = 0;
ts_tokentype type;
@@ -816,7 +816,7 @@ findoprnd(QueryItem *ptr, int size, bool *needcleanup)
TSQuery
parse_tsquery(char *buf,
PushFunction pushval,
- Datum opaque,
+ void *opaque,
int flags,
Node *escontext)
{
@@ -939,7 +939,7 @@ parse_tsquery(char *buf,
}
static void
-pushval_asis(Datum opaque, TSQueryParserState state, char *strval, int lenval,
+pushval_asis(void *opaque, TSQueryParserState state, char *strval, int lenval,
int16 weight, bool prefix)
{
pushValue(state, strval, lenval, weight, prefix);
@@ -956,7 +956,7 @@ tsqueryin(PG_FUNCTION_ARGS)
PG_RETURN_TSQUERY(parse_tsquery(in,
pushval_asis,
-
PointerGetDatum(NULL),
+ NULL,
0,
escontext));
}
diff --git a/src/include/tsearch/ts_utils.h b/src/include/tsearch/ts_utils.h
index 7debc85ed80..78175929088 100644
--- a/src/include/tsearch/ts_utils.h
+++ b/src/include/tsearch/ts_utils.h
@@ -54,7 +54,7 @@ extern void close_tsvector_parser(TSVectorParseState state);
struct TSQueryParserStateData; /* private in backend/utils/adt/tsquery.c */
typedef struct TSQueryParserStateData *TSQueryParserState;
-typedef void (*PushFunction) (Datum opaque, TSQueryParserState state,
+typedef void (*PushFunction) (void *opaque, TSQueryParserState state,
char *token, int
tokenlen,
int16 tokenweights,
/* bitmap as described in
* QueryOperand struct */
@@ -66,7 +66,7 @@ typedef void (*PushFunction) (Datum opaque,
TSQueryParserState state,
extern TSQuery parse_tsquery(char *buf,
PushFunction pushval,
- Datum opaque,
+ void *opaque,
int flags,
Node *escontext);
--
2.52.0