Age Owner Branch data TLA Line data Source code
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 : :
23 : : typedef struct
24 : : {
25 : : StopList stoplist;
26 : : bool accept;
27 : : } DictSimple;
28 : :
29 : :
30 : : Datum
6591 tgl@sss.pgh.pa.us 31 :CBC 35 : dsimple_init(PG_FUNCTION_ARGS)
32 : : {
6590 33 : 35 : List *dictoptions = (List *) PG_GETARG_POINTER(0);
6587 34 : 35 : DictSimple *d = (DictSimple *) palloc0(sizeof(DictSimple));
6506 35 : 35 : bool stoploaded = false,
36 : 35 : acceptloaded = false;
37 : : ListCell *l;
38 : :
39 : 35 : d->accept = true; /* default */
40 : :
6590 41 [ - + - - : 35 : foreach(l, dictoptions)
- + ]
42 : : {
6590 tgl@sss.pgh.pa.us 43 :UBC 0 : DefElem *defel = (DefElem *) lfirst(l);
44 : :
2780 45 [ # # ]: 0 : if (strcmp(defel->defname, "stopwords") == 0)
46 : : {
6590 47 [ # # ]: 0 : if (stoploaded)
48 [ # # ]: 0 : ereport(ERROR,
49 : : (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
50 : : errmsg("multiple StopWords parameters")));
263 peter@eisentraut.org 51 : 0 : readstoplist(defGetString(defel), &d->stoplist, str_tolower);
6590 tgl@sss.pgh.pa.us 52 : 0 : stoploaded = true;
53 : : }
2780 54 [ # # ]: 0 : else if (strcmp(defel->defname, "accept") == 0)
55 : : {
6506 56 [ # # ]: 0 : if (acceptloaded)
57 [ # # ]: 0 : ereport(ERROR,
58 : : (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
59 : : errmsg("multiple Accept parameters")));
60 : 0 : d->accept = defGetBoolean(defel);
61 : 0 : acceptloaded = true;
62 : : }
63 : : else
64 : : {
6590 65 [ # # ]: 0 : ereport(ERROR,
66 : : (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
67 : : errmsg("unrecognized simple dictionary parameter: \"%s\"",
68 : : defel->defname)));
69 : : }
70 : : }
71 : :
6591 tgl@sss.pgh.pa.us 72 :CBC 35 : PG_RETURN_POINTER(d);
73 : : }
74 : :
75 : : Datum
76 : 1849 : dsimple_lexize(PG_FUNCTION_ARGS)
77 : : {
6587 78 : 1849 : DictSimple *d = (DictSimple *) PG_GETARG_POINTER(0);
6591 79 : 1849 : char *in = (char *) PG_GETARG_POINTER(1);
6505 bruce@momjian.us 80 : 1849 : int32 len = PG_GETARG_INT32(2);
81 : : char *txt;
82 : : TSLexeme *res;
83 : :
263 peter@eisentraut.org 84 : 1849 : txt = str_tolower(in, len, DEFAULT_COLLATION_OID);
85 : :
6591 tgl@sss.pgh.pa.us 86 [ + - - + ]: 1849 : if (*txt == '\0' || searchstoplist(&(d->stoplist), txt))
87 : : {
88 : : /* reject as stopword */
6591 tgl@sss.pgh.pa.us 89 :UBC 0 : pfree(txt);
6506 90 : 0 : res = palloc0(sizeof(TSLexeme) * 2);
91 : 0 : PG_RETURN_POINTER(res);
92 : : }
6506 tgl@sss.pgh.pa.us 93 [ + - ]:CBC 1849 : else if (d->accept)
94 : : {
95 : : /* accept */
96 : 1849 : res = palloc0(sizeof(TSLexeme) * 2);
6591 97 : 1849 : res[0].lexeme = txt;
6506 98 : 1849 : PG_RETURN_POINTER(res);
99 : : }
100 : : else
101 : : {
102 : : /* report as unrecognized */
6506 tgl@sss.pgh.pa.us 103 :UBC 0 : pfree(txt);
104 : 0 : PG_RETURN_POINTER(NULL);
105 : : }
106 : : }
|