]> granicus.if.org Git - postgresql/blob - src/backend/tsearch/dict_simple.c
Increase the default value of default_statistics_target from 10 to 100,
[postgresql] / src / backend / tsearch / dict_simple.c
1 /*-------------------------------------------------------------------------
2  *
3  * dict_simple.c
4  *              Simple dictionary: just lowercase and check for stopword
5  *
6  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
7  *
8  *
9  * IDENTIFICATION
10  *        $PostgreSQL: pgsql/src/backend/tsearch/dict_simple.c,v 1.7 2008/01/01 19:45:52 momjian Exp $
11  *
12  *-------------------------------------------------------------------------
13  */
14 #include "postgres.h"
15
16 #include "commands/defrem.h"
17 #include "tsearch/ts_locale.h"
18 #include "tsearch/ts_public.h"
19 #include "tsearch/ts_utils.h"
20 #include "utils/builtins.h"
21
22
23 typedef struct
24 {
25         StopList        stoplist;
26         bool            accept;
27 } DictSimple;
28
29
30 Datum
31 dsimple_init(PG_FUNCTION_ARGS)
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 (pg_strcasecmp("StopWords", defel->defname) == 0)
46                 {
47                         if (stoploaded)
48                                 ereport(ERROR,
49                                                 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
50                                                  errmsg("multiple StopWords parameters")));
51                         readstoplist(defGetString(defel), &d->stoplist, lowerstr);
52                         stoploaded = true;
53                 }
54                 else if (pg_strcasecmp("Accept", defel->defname) == 0)
55                 {
56                         if (acceptloaded)
57                                 ereport(ERROR,
58                                                 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
59                                                  errmsg("multiple Accept parameters")));
60                         d->accept = defGetBoolean(defel);
61                         acceptloaded = true;
62                 }
63                 else
64                 {
65                         ereport(ERROR,
66                                         (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
67                                    errmsg("unrecognized simple dictionary parameter: \"%s\"",
68                                                   defel->defname)));
69                 }
70         }
71
72         PG_RETURN_POINTER(d);
73 }
74
75 Datum
76 dsimple_lexize(PG_FUNCTION_ARGS)
77 {
78         DictSimple *d = (DictSimple *) PG_GETARG_POINTER(0);
79         char       *in = (char *) PG_GETARG_POINTER(1);
80         int32           len = PG_GETARG_INT32(2);
81         char       *txt;
82         TSLexeme   *res;
83
84         txt = lowerstr_with_len(in, len);
85
86         if (*txt == '\0' || searchstoplist(&(d->stoplist), txt))
87         {
88                 /* reject as stopword */
89                 pfree(txt);
90                 res = palloc0(sizeof(TSLexeme) * 2);
91                 PG_RETURN_POINTER(res);
92         }
93         else if (d->accept)
94         {
95                 /* accept */
96                 res = palloc0(sizeof(TSLexeme) * 2);
97                 res[0].lexeme = txt;
98                 PG_RETURN_POINTER(res);
99         }
100         else
101         {
102                 /* report as unrecognized */
103                 pfree(txt);
104                 PG_RETURN_POINTER(NULL);
105         }
106 }