diff options
author | Tom Lane | 2020-03-08 22:35:06 +0000 |
---|---|---|
committer | Tom Lane | 2020-03-08 22:35:06 +0000 |
commit | 806eb92c018102da9514443ad19160c7b1841062 (patch) | |
tree | bded7786458e7be317cdf68bfd33142a72f7349b | |
parent | 38ce06c37e9cc8fec9125262b129602c2274f344 (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.c | 20 | ||||
-rw-r--r-- | contrib/dict_int/expected/dict_int.out | 25 | ||||
-rw-r--r-- | contrib/dict_int/sql/dict_int.sql | 6 | ||||
-rw-r--r-- | 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 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> |