summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2020-03-08 22:35:06 +0000
committerTom Lane2020-03-08 22:35:06 +0000
commit806eb92c018102da9514443ad19160c7b1841062 (patch)
treebded7786458e7be317cdf68bfd33142a72f7349b
parent38ce06c37e9cc8fec9125262b129602c2274f344 (diff)
Add an "absval" parameter to allow contrib/dict_int to ignore signs.
Jeff Janes Discussion: https://postgr.es/m/CAMkU=1xRcs_BUPzR0+V3WndaCAv0E_m3h6aUEJ8NF-sY1nnHsw@mail.gmail.com
-rw-r--r--contrib/dict_int/dict_int.c20
-rw-r--r--contrib/dict_int/expected/dict_int.out25
-rw-r--r--contrib/dict_int/sql/dict_int.sql6
-rw-r--r--doc/src/sgml/dict-int.sgml11
4 files changed, 59 insertions, 3 deletions
diff --git a/contrib/dict_int/dict_int.c b/contrib/dict_int/dict_int.c
index 56cb28312cf..a7e9890fcc4 100644
--- a/contrib/dict_int/dict_int.c
+++ b/contrib/dict_int/dict_int.c
@@ -21,6 +21,7 @@ typedef struct
{
int maxlen;
bool rejectlong;
+ bool absval;
} DictInt;
@@ -37,6 +38,7 @@ dintdict_init(PG_FUNCTION_ARGS)
d = (DictInt *) palloc0(sizeof(DictInt));
d->maxlen = 6;
d->rejectlong = false;
+ d->absval = false;
foreach(l, dictoptions)
{
@@ -55,6 +57,10 @@ dintdict_init(PG_FUNCTION_ARGS)
{
d->rejectlong = defGetBoolean(defel);
}
+ else if (strcmp(defel->defname, "absval") == 0)
+ {
+ d->absval = defGetBoolean(defel);
+ }
else
{
ereport(ERROR,
@@ -72,11 +78,21 @@ dintdict_lexize(PG_FUNCTION_ARGS)
{
DictInt *d = (DictInt *) PG_GETARG_POINTER(0);
char *in = (char *) PG_GETARG_POINTER(1);
- char *txt = pnstrdup(in, PG_GETARG_INT32(2));
+ int len = PG_GETARG_INT32(2);
+ char *txt;
TSLexeme *res = palloc0(sizeof(TSLexeme) * 2);
res[1].lexeme = NULL;
- if (PG_GETARG_INT32(2) > d->maxlen)
+
+ if (d->absval && (in[0] == '+' || in[0] == '-'))
+ {
+ len--;
+ txt = pnstrdup(in + 1, len);
+ }
+ else
+ txt = pnstrdup(in, len);
+
+ if (len > d->maxlen)
{
if (d->rejectlong)
{
diff --git a/contrib/dict_int/expected/dict_int.out b/contrib/dict_int/expected/dict_int.out
index 483e700d231..702f7afbca1 100644
--- a/contrib/dict_int/expected/dict_int.out
+++ b/contrib/dict_int/expected/dict_int.out
@@ -302,3 +302,28 @@ select ts_lexize('intdict', '314532610153');
ALTER TEXT SEARCH DICTIONARY intdict (MAXLEN = -214783648);
ERROR: maxlen value has to be >= 1
+select ts_lexize('intdict', '-40865854');
+ ts_lexize
+-----------
+ {-40865}
+(1 row)
+
+select ts_lexize('intdict', '+40865854');
+ ts_lexize
+-----------
+ {+40865}
+(1 row)
+
+ALTER TEXT SEARCH DICTIONARY intdict (ABSVAL = true);
+select ts_lexize('intdict', '-40865854');
+ ts_lexize
+-----------
+ {408658}
+(1 row)
+
+select ts_lexize('intdict', '+40865854');
+ ts_lexize
+-----------
+ {408658}
+(1 row)
+
diff --git a/contrib/dict_int/sql/dict_int.sql b/contrib/dict_int/sql/dict_int.sql
index 5c27accff4a..8f702aa10b0 100644
--- a/contrib/dict_int/sql/dict_int.sql
+++ b/contrib/dict_int/sql/dict_int.sql
@@ -53,3 +53,9 @@ select ts_lexize('intdict', '641439323669');
select ts_lexize('intdict', '314532610153');
ALTER TEXT SEARCH DICTIONARY intdict (MAXLEN = -214783648);
+
+select ts_lexize('intdict', '-40865854');
+select ts_lexize('intdict', '+40865854');
+ALTER TEXT SEARCH DICTIONARY intdict (ABSVAL = true);
+select ts_lexize('intdict', '-40865854');
+select ts_lexize('intdict', '+40865854');
diff --git a/doc/src/sgml/dict-int.sgml b/doc/src/sgml/dict-int.sgml
index b556f1b4daf..8babfdd5c24 100644
--- a/doc/src/sgml/dict-int.sgml
+++ b/doc/src/sgml/dict-int.sgml
@@ -25,7 +25,7 @@
<title>Configuration</title>
<para>
- The dictionary accepts two options:
+ The dictionary accepts three options:
</para>
<itemizedlist>
@@ -46,6 +46,15 @@
such an integer cannot be searched for.
</para>
</listitem>
+ <listitem>
+ <para>
+ The <literal>absval</literal> parameter specifies whether leading
+ <quote><literal>+</literal></quote> or <quote><literal>-</literal></quote>
+ signs should be removed from integer words. The default
+ is <literal>false</literal>. When <literal>true</literal>, the sign is
+ removed before <literal>maxlen</literal> is applied.
+ </para>
+ </listitem>
</itemizedlist>
</sect2>