From 806eb92c018102da9514443ad19160c7b1841062 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 8 Mar 2020 18:35:06 -0400 Subject: [PATCH] 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 --- contrib/dict_int/dict_int.c | 20 ++++++++++++++++++-- contrib/dict_int/expected/dict_int.out | 25 +++++++++++++++++++++++++ contrib/dict_int/sql/dict_int.sql | 6 ++++++ doc/src/sgml/dict-int.sgml | 11 ++++++++++- 4 files changed, 59 insertions(+), 3 deletions(-) diff --git a/contrib/dict_int/dict_int.c b/contrib/dict_int/dict_int.c index 56cb28312c..a7e9890fcc 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 483e700d23..702f7afbca 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 5c27accff4..8f702aa10b 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 b556f1b4da..8babfdd5c2 100644 --- a/doc/src/sgml/dict-int.sgml +++ b/doc/src/sgml/dict-int.sgml @@ -25,7 +25,7 @@ Configuration - The dictionary accepts two options: + The dictionary accepts three options: @@ -46,6 +46,15 @@ such an integer cannot be searched for. + + + The absval parameter specifies whether leading + + or - + signs should be removed from integer words. The default + is false. When true, the sign is + removed before maxlen is applied. + +