PostgreSQL Source Code git master
dict_simple.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * dict_simple.c
4 * Simple dictionary: just lowercase and check for stopword
5 *
6 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
7 *
8 *
9 * IDENTIFICATION
10 * src/backend/tsearch/dict_simple.c
11 *
12 *-------------------------------------------------------------------------
13 */
14#include "postgres.h"
15
16#include "catalog/pg_collation_d.h"
17#include "commands/defrem.h"
18#include "tsearch/ts_public.h"
19#include "utils/fmgrprotos.h"
20#include "utils/formatting.h"
21
22
23typedef struct
24{
26 bool accept;
28
29
32{
33 List *dictoptions = (List *) PG_GETARG_POINTER(0);
34 DictSimple *d = (DictSimple *) palloc0(sizeof(DictSimple));
35 bool stoploaded = false,
36 acceptloaded = false;
37 ListCell *l;
38
39 d->accept = true; /* default */
40
41 foreach(l, dictoptions)
42 {
43 DefElem *defel = (DefElem *) lfirst(l);
44
45 if (strcmp(defel->defname, "stopwords") == 0)
46 {
47 if (stoploaded)
49 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
50 errmsg("multiple StopWords parameters")));
52 stoploaded = true;
53 }
54 else if (strcmp(defel->defname, "accept") == 0)
55 {
56 if (acceptloaded)
58 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
59 errmsg("multiple Accept parameters")));
60 d->accept = defGetBoolean(defel);
61 acceptloaded = true;
62 }
63 else
64 {
66 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
67 errmsg("unrecognized simple dictionary parameter: \"%s\"",
68 defel->defname)));
69 }
70 }
71
73}
74
77{
79 char *in = (char *) PG_GETARG_POINTER(1);
81 char *txt;
83
84 txt = str_tolower(in, len, DEFAULT_COLLATION_OID);
85
86 if (*txt == '\0' || searchstoplist(&(d->stoplist), txt))
87 {
88 /* reject as stopword */
89 pfree(txt);
90 res = palloc0(sizeof(TSLexeme) * 2);
92 }
93 else if (d->accept)
94 {
95 /* accept */
96 res = palloc0(sizeof(TSLexeme) * 2);
97 res[0].lexeme = txt;
99 }
100 else
101 {
102 /* report as unrecognized */
103 pfree(txt);
104 PG_RETURN_POINTER(NULL);
105 }
106}
int32_t int32
Definition: c.h:484
char * defGetString(DefElem *def)
Definition: define.c:35
bool defGetBoolean(DefElem *def)
Definition: define.c:94
Datum dsimple_lexize(PG_FUNCTION_ARGS)
Definition: dict_simple.c:76
Datum dsimple_init(PG_FUNCTION_ARGS)
Definition: dict_simple.c:31
int errcode(int sqlerrcode)
Definition: elog.c:853
int errmsg(const char *fmt,...)
Definition: elog.c:1070
#define ERROR
Definition: elog.h:39
#define ereport(elevel,...)
Definition: elog.h:149
#define PG_GETARG_POINTER(n)
Definition: fmgr.h:276
#define PG_GETARG_INT32(n)
Definition: fmgr.h:269
#define PG_RETURN_POINTER(x)
Definition: fmgr.h:361
#define PG_FUNCTION_ARGS
Definition: fmgr.h:193
char * str_tolower(const char *buff, size_t nbytes, Oid collid)
Definition: formatting.c:1637
void pfree(void *pointer)
Definition: mcxt.c:1521
void * palloc0(Size size)
Definition: mcxt.c:1347
const void size_t len
#define lfirst(lc)
Definition: pg_list.h:172
uintptr_t Datum
Definition: postgres.h:69
char * defname
Definition: parsenodes.h:826
StopList stoplist
Definition: dict_simple.c:25
bool accept
Definition: dict_simple.c:26
Definition: pg_list.h:54
void readstoplist(const char *fname, StopList *s, char *(*wordop)(const char *, size_t, Oid))
Definition: ts_utils.c:69
bool searchstoplist(StopList *s, char *key)
Definition: ts_utils.c:141