diff options
Diffstat (limited to 'contrib/dict_int')
-rw-r--r-- | contrib/dict_int/.gitignore | 4 | ||||
-rw-r--r-- | contrib/dict_int/Makefile | 23 | ||||
-rw-r--r-- | contrib/dict_int/dict_int--1.0.sql | 25 | ||||
-rw-r--r-- | contrib/dict_int/dict_int.c | 116 | ||||
-rw-r--r-- | contrib/dict_int/dict_int.control | 6 | ||||
-rw-r--r-- | contrib/dict_int/expected/dict_int.out | 356 | ||||
-rw-r--r-- | contrib/dict_int/sql/dict_int.sql | 69 |
7 files changed, 599 insertions, 0 deletions
diff --git a/contrib/dict_int/.gitignore b/contrib/dict_int/.gitignore new file mode 100644 index 0000000..5dcb3ff --- /dev/null +++ b/contrib/dict_int/.gitignore @@ -0,0 +1,4 @@ +# Generated subdirectories +/log/ +/results/ +/tmp_check/ diff --git a/contrib/dict_int/Makefile b/contrib/dict_int/Makefile new file mode 100644 index 0000000..2ff1bdb --- /dev/null +++ b/contrib/dict_int/Makefile @@ -0,0 +1,23 @@ +# contrib/dict_int/Makefile + +MODULE_big = dict_int +OBJS = \ + $(WIN32RES) \ + dict_int.o + +EXTENSION = dict_int +DATA = dict_int--1.0.sql +PGFILEDESC = "dict_int - add-on dictionary template for full-text search" + +REGRESS = dict_int + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = contrib/dict_int +top_builddir = ../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif diff --git a/contrib/dict_int/dict_int--1.0.sql b/contrib/dict_int/dict_int--1.0.sql new file mode 100644 index 0000000..acb1461 --- /dev/null +++ b/contrib/dict_int/dict_int--1.0.sql @@ -0,0 +1,25 @@ +/* contrib/dict_int/dict_int--1.0.sql */ + +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION dict_int" to load this file. \quit + +CREATE FUNCTION dintdict_init(internal) + RETURNS internal + AS 'MODULE_PATHNAME' + LANGUAGE C STRICT; + +CREATE FUNCTION dintdict_lexize(internal, internal, internal, internal) + RETURNS internal + AS 'MODULE_PATHNAME' + LANGUAGE C STRICT; + +CREATE TEXT SEARCH TEMPLATE intdict_template ( + LEXIZE = dintdict_lexize, + INIT = dintdict_init +); + +CREATE TEXT SEARCH DICTIONARY intdict ( + TEMPLATE = intdict_template +); + +COMMENT ON TEXT SEARCH DICTIONARY intdict IS 'dictionary for integers'; diff --git a/contrib/dict_int/dict_int.c b/contrib/dict_int/dict_int.c new file mode 100644 index 0000000..3c84208 --- /dev/null +++ b/contrib/dict_int/dict_int.c @@ -0,0 +1,116 @@ +/*------------------------------------------------------------------------- + * + * dict_int.c + * Text search dictionary for integers + * + * Copyright (c) 2007-2021, PostgreSQL Global Development Group + * + * IDENTIFICATION + * contrib/dict_int/dict_int.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "commands/defrem.h" +#include "tsearch/ts_public.h" + +PG_MODULE_MAGIC; + +typedef struct +{ + int maxlen; + bool rejectlong; + bool absval; +} DictInt; + + +PG_FUNCTION_INFO_V1(dintdict_init); +PG_FUNCTION_INFO_V1(dintdict_lexize); + +Datum +dintdict_init(PG_FUNCTION_ARGS) +{ + List *dictoptions = (List *) PG_GETARG_POINTER(0); + DictInt *d; + ListCell *l; + + d = (DictInt *) palloc0(sizeof(DictInt)); + d->maxlen = 6; + d->rejectlong = false; + d->absval = false; + + foreach(l, dictoptions) + { + DefElem *defel = (DefElem *) lfirst(l); + + if (strcmp(defel->defname, "maxlen") == 0) + { + d->maxlen = atoi(defGetString(defel)); + + if (d->maxlen < 1) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("maxlen value has to be >= 1"))); + } + else if (strcmp(defel->defname, "rejectlong") == 0) + { + d->rejectlong = defGetBoolean(defel); + } + else if (strcmp(defel->defname, "absval") == 0) + { + d->absval = defGetBoolean(defel); + } + else + { + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unrecognized intdict parameter: \"%s\"", + defel->defname))); + } + } + + PG_RETURN_POINTER(d); +} + +Datum +dintdict_lexize(PG_FUNCTION_ARGS) +{ + DictInt *d = (DictInt *) PG_GETARG_POINTER(0); + char *in = (char *) PG_GETARG_POINTER(1); + int len = PG_GETARG_INT32(2); + char *txt; + TSLexeme *res = palloc0(sizeof(TSLexeme) * 2); + + res[1].lexeme = NULL; + + 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) + { + /* reject by returning void array */ + pfree(txt); + res[0].lexeme = NULL; + } + else + { + /* trim integer */ + txt[d->maxlen] = '\0'; + res[0].lexeme = txt; + } + } + else + { + res[0].lexeme = txt; + } + + PG_RETURN_POINTER(res); +} diff --git a/contrib/dict_int/dict_int.control b/contrib/dict_int/dict_int.control new file mode 100644 index 0000000..ec04cce --- /dev/null +++ b/contrib/dict_int/dict_int.control @@ -0,0 +1,6 @@ +# dict_int extension +comment = 'text search dictionary template for integers' +default_version = '1.0' +module_pathname = '$libdir/dict_int' +relocatable = true +trusted = true diff --git a/contrib/dict_int/expected/dict_int.out b/contrib/dict_int/expected/dict_int.out new file mode 100644 index 0000000..39906fc --- /dev/null +++ b/contrib/dict_int/expected/dict_int.out @@ -0,0 +1,356 @@ +CREATE EXTENSION dict_int; +--lexize +select ts_lexize('intdict', '511673'); + ts_lexize +----------- + {511673} +(1 row) + +select ts_lexize('intdict', '129'); + ts_lexize +----------- + {129} +(1 row) + +select ts_lexize('intdict', '40865854'); + ts_lexize +----------- + {408658} +(1 row) + +select ts_lexize('intdict', '952'); + ts_lexize +----------- + {952} +(1 row) + +select ts_lexize('intdict', '654980341'); + ts_lexize +----------- + {654980} +(1 row) + +select ts_lexize('intdict', '09810106'); + ts_lexize +----------- + {098101} +(1 row) + +select ts_lexize('intdict', '14262713'); + ts_lexize +----------- + {142627} +(1 row) + +select ts_lexize('intdict', '6532082986'); + ts_lexize +----------- + {653208} +(1 row) + +select ts_lexize('intdict', '0150061'); + ts_lexize +----------- + {015006} +(1 row) + +select ts_lexize('intdict', '7778'); + ts_lexize +----------- + {7778} +(1 row) + +select ts_lexize('intdict', '9547'); + ts_lexize +----------- + {9547} +(1 row) + +select ts_lexize('intdict', '753395478'); + ts_lexize +----------- + {753395} +(1 row) + +select ts_lexize('intdict', '647652'); + ts_lexize +----------- + {647652} +(1 row) + +select ts_lexize('intdict', '6988655574'); + ts_lexize +----------- + {698865} +(1 row) + +select ts_lexize('intdict', '1279'); + ts_lexize +----------- + {1279} +(1 row) + +select ts_lexize('intdict', '1266645909'); + ts_lexize +----------- + {126664} +(1 row) + +select ts_lexize('intdict', '7594193969'); + ts_lexize +----------- + {759419} +(1 row) + +select ts_lexize('intdict', '16928207'); + ts_lexize +----------- + {169282} +(1 row) + +select ts_lexize('intdict', '196850350328'); + ts_lexize +----------- + {196850} +(1 row) + +select ts_lexize('intdict', '22026985592'); + ts_lexize +----------- + {220269} +(1 row) + +select ts_lexize('intdict', '2063765'); + ts_lexize +----------- + {206376} +(1 row) + +select ts_lexize('intdict', '242387310'); + ts_lexize +----------- + {242387} +(1 row) + +select ts_lexize('intdict', '93595'); + ts_lexize +----------- + {93595} +(1 row) + +select ts_lexize('intdict', '9374'); + ts_lexize +----------- + {9374} +(1 row) + +select ts_lexize('intdict', '996969'); + ts_lexize +----------- + {996969} +(1 row) + +select ts_lexize('intdict', '353595982'); + ts_lexize +----------- + {353595} +(1 row) + +select ts_lexize('intdict', '925860'); + ts_lexize +----------- + {925860} +(1 row) + +select ts_lexize('intdict', '11848378337'); + ts_lexize +----------- + {118483} +(1 row) + +select ts_lexize('intdict', '333'); + ts_lexize +----------- + {333} +(1 row) + +select ts_lexize('intdict', '799287416765'); + ts_lexize +----------- + {799287} +(1 row) + +select ts_lexize('intdict', '745939'); + ts_lexize +----------- + {745939} +(1 row) + +select ts_lexize('intdict', '67601305734'); + ts_lexize +----------- + {676013} +(1 row) + +select ts_lexize('intdict', '3361113'); + ts_lexize +----------- + {336111} +(1 row) + +select ts_lexize('intdict', '9033778607'); + ts_lexize +----------- + {903377} +(1 row) + +select ts_lexize('intdict', '7507648'); + ts_lexize +----------- + {750764} +(1 row) + +select ts_lexize('intdict', '1166'); + ts_lexize +----------- + {1166} +(1 row) + +select ts_lexize('intdict', '9360498'); + ts_lexize +----------- + {936049} +(1 row) + +select ts_lexize('intdict', '917795'); + ts_lexize +----------- + {917795} +(1 row) + +select ts_lexize('intdict', '9387894'); + ts_lexize +----------- + {938789} +(1 row) + +select ts_lexize('intdict', '42764329'); + ts_lexize +----------- + {427643} +(1 row) + +select ts_lexize('intdict', '564062'); + ts_lexize +----------- + {564062} +(1 row) + +select ts_lexize('intdict', '5413377'); + ts_lexize +----------- + {541337} +(1 row) + +select ts_lexize('intdict', '060965'); + ts_lexize +----------- + {060965} +(1 row) + +select ts_lexize('intdict', '08273593'); + ts_lexize +----------- + {082735} +(1 row) + +select ts_lexize('intdict', '593556010144'); + ts_lexize +----------- + {593556} +(1 row) + +select ts_lexize('intdict', '17988843352'); + ts_lexize +----------- + {179888} +(1 row) + +select ts_lexize('intdict', '252281774'); + ts_lexize +----------- + {252281} +(1 row) + +select ts_lexize('intdict', '313425'); + ts_lexize +----------- + {313425} +(1 row) + +select ts_lexize('intdict', '641439323669'); + ts_lexize +----------- + {641439} +(1 row) + +select ts_lexize('intdict', '314532610153'); + ts_lexize +----------- + {314532} +(1 row) + +ALTER TEXT SEARCH DICTIONARY intdict (MAXLEN = -214783648); -- fail +ERROR: maxlen value has to be >= 1 +-- This ought to fail, perhaps, but historically it has not: +ALTER TEXT SEARCH DICTIONARY intdict (MAXLEN = 6.7); +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) + +ALTER TEXT SEARCH DICTIONARY intdict (REJECTLONG = 1); +select ts_lexize('intdict', '-40865854'); + ts_lexize +----------- + {} +(1 row) + +select ts_lexize('intdict', '-4086585'); + ts_lexize +----------- + {} +(1 row) + +select ts_lexize('intdict', '-408658'); + ts_lexize +----------- + {408658} +(1 row) + +SELECT dictinitoption FROM pg_ts_dict WHERE dictname = 'intdict'; + dictinitoption +----------------------------------------------- + maxlen = 6.7, absval = 'true', rejectlong = 1 +(1 row) + diff --git a/contrib/dict_int/sql/dict_int.sql b/contrib/dict_int/sql/dict_int.sql new file mode 100644 index 0000000..4e2543d --- /dev/null +++ b/contrib/dict_int/sql/dict_int.sql @@ -0,0 +1,69 @@ +CREATE EXTENSION dict_int; + +--lexize +select ts_lexize('intdict', '511673'); +select ts_lexize('intdict', '129'); +select ts_lexize('intdict', '40865854'); +select ts_lexize('intdict', '952'); +select ts_lexize('intdict', '654980341'); +select ts_lexize('intdict', '09810106'); +select ts_lexize('intdict', '14262713'); +select ts_lexize('intdict', '6532082986'); +select ts_lexize('intdict', '0150061'); +select ts_lexize('intdict', '7778'); +select ts_lexize('intdict', '9547'); +select ts_lexize('intdict', '753395478'); +select ts_lexize('intdict', '647652'); +select ts_lexize('intdict', '6988655574'); +select ts_lexize('intdict', '1279'); +select ts_lexize('intdict', '1266645909'); +select ts_lexize('intdict', '7594193969'); +select ts_lexize('intdict', '16928207'); +select ts_lexize('intdict', '196850350328'); +select ts_lexize('intdict', '22026985592'); +select ts_lexize('intdict', '2063765'); +select ts_lexize('intdict', '242387310'); +select ts_lexize('intdict', '93595'); +select ts_lexize('intdict', '9374'); +select ts_lexize('intdict', '996969'); +select ts_lexize('intdict', '353595982'); +select ts_lexize('intdict', '925860'); +select ts_lexize('intdict', '11848378337'); +select ts_lexize('intdict', '333'); +select ts_lexize('intdict', '799287416765'); +select ts_lexize('intdict', '745939'); +select ts_lexize('intdict', '67601305734'); +select ts_lexize('intdict', '3361113'); +select ts_lexize('intdict', '9033778607'); +select ts_lexize('intdict', '7507648'); +select ts_lexize('intdict', '1166'); +select ts_lexize('intdict', '9360498'); +select ts_lexize('intdict', '917795'); +select ts_lexize('intdict', '9387894'); +select ts_lexize('intdict', '42764329'); +select ts_lexize('intdict', '564062'); +select ts_lexize('intdict', '5413377'); +select ts_lexize('intdict', '060965'); +select ts_lexize('intdict', '08273593'); +select ts_lexize('intdict', '593556010144'); +select ts_lexize('intdict', '17988843352'); +select ts_lexize('intdict', '252281774'); +select ts_lexize('intdict', '313425'); +select ts_lexize('intdict', '641439323669'); +select ts_lexize('intdict', '314532610153'); + +ALTER TEXT SEARCH DICTIONARY intdict (MAXLEN = -214783648); -- fail +-- This ought to fail, perhaps, but historically it has not: +ALTER TEXT SEARCH DICTIONARY intdict (MAXLEN = 6.7); + +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'); +ALTER TEXT SEARCH DICTIONARY intdict (REJECTLONG = 1); +select ts_lexize('intdict', '-40865854'); +select ts_lexize('intdict', '-4086585'); +select ts_lexize('intdict', '-408658'); + +SELECT dictinitoption FROM pg_ts_dict WHERE dictname = 'intdict'; |