Coverage Report

Created: 2025-09-27 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/postgres/src/backend/tsearch/dict_simple.c
Line
Count
Source
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
31
dsimple_init(PG_FUNCTION_ARGS)
32
0
{
33
0
  List     *dictoptions = (List *) PG_GETARG_POINTER(0);
34
0
  DictSimple *d = (DictSimple *) palloc0(sizeof(DictSimple));
35
0
  bool    stoploaded = false,
36
0
        acceptloaded = false;
37
0
  ListCell   *l;
38
39
0
  d->accept = true;     /* default */
40
41
0
  foreach(l, dictoptions)
42
0
  {
43
0
    DefElem    *defel = (DefElem *) lfirst(l);
44
45
0
    if (strcmp(defel->defname, "stopwords") == 0)
46
0
    {
47
0
      if (stoploaded)
48
0
        ereport(ERROR,
49
0
            (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
50
0
             errmsg("multiple StopWords parameters")));
51
0
      readstoplist(defGetString(defel), &d->stoplist, str_tolower);
52
0
      stoploaded = true;
53
0
    }
54
0
    else if (strcmp(defel->defname, "accept") == 0)
55
0
    {
56
0
      if (acceptloaded)
57
0
        ereport(ERROR,
58
0
            (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
59
0
             errmsg("multiple Accept parameters")));
60
0
      d->accept = defGetBoolean(defel);
61
0
      acceptloaded = true;
62
0
    }
63
0
    else
64
0
    {
65
0
      ereport(ERROR,
66
0
          (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
67
0
           errmsg("unrecognized simple dictionary parameter: \"%s\"",
68
0
              defel->defname)));
69
0
    }
70
0
  }
71
72
0
  PG_RETURN_POINTER(d);
73
0
}
74
75
Datum
76
dsimple_lexize(PG_FUNCTION_ARGS)
77
0
{
78
0
  DictSimple *d = (DictSimple *) PG_GETARG_POINTER(0);
79
0
  char     *in = (char *) PG_GETARG_POINTER(1);
80
0
  int32   len = PG_GETARG_INT32(2);
81
0
  char     *txt;
82
0
  TSLexeme   *res;
83
84
0
  txt = str_tolower(in, len, DEFAULT_COLLATION_OID);
85
86
0
  if (*txt == '\0' || searchstoplist(&(d->stoplist), txt))
87
0
  {
88
    /* reject as stopword */
89
0
    pfree(txt);
90
0
    res = palloc0(sizeof(TSLexeme) * 2);
91
0
    PG_RETURN_POINTER(res);
92
0
  }
93
0
  else if (d->accept)
94
0
  {
95
    /* accept */
96
0
    res = palloc0(sizeof(TSLexeme) * 2);
97
0
    res[0].lexeme = txt;
98
0
    PG_RETURN_POINTER(res);
99
0
  }
100
0
  else
101
0
  {
102
    /* report as unrecognized */
103
0
    pfree(txt);
104
0
    PG_RETURN_POINTER(NULL);
105
0
  }
106
0
}