diff options
Diffstat (limited to 'src/backend/tsearch/dict.c')
-rw-r--r-- | src/backend/tsearch/dict.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/backend/tsearch/dict.c b/src/backend/tsearch/dict.c new file mode 100644 index 0000000..1e1ccda --- /dev/null +++ b/src/backend/tsearch/dict.c @@ -0,0 +1,89 @@ +/*------------------------------------------------------------------------- + * + * dict.c + * Standard interface to dictionary + * + * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * + * + * IDENTIFICATION + * src/backend/tsearch/dict.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "catalog/pg_type.h" +#include "tsearch/ts_cache.h" +#include "tsearch/ts_utils.h" +#include "utils/builtins.h" + + +/* + * Lexize one word by dictionary, mostly debug function + */ +Datum +ts_lexize(PG_FUNCTION_ARGS) +{ + Oid dictId = PG_GETARG_OID(0); + text *in = PG_GETARG_TEXT_PP(1); + ArrayType *a; + TSDictionaryCacheEntry *dict; + TSLexeme *res, + *ptr; + Datum *da; + DictSubState dstate = {false, false, NULL}; + + dict = lookup_ts_dictionary_cache(dictId); + + res = (TSLexeme *) DatumGetPointer(FunctionCall4(&dict->lexize, + PointerGetDatum(dict->dictData), + PointerGetDatum(VARDATA_ANY(in)), + Int32GetDatum(VARSIZE_ANY_EXHDR(in)), + PointerGetDatum(&dstate))); + + if (dstate.getnext) + { + dstate.isend = true; + ptr = (TSLexeme *) DatumGetPointer(FunctionCall4(&dict->lexize, + PointerGetDatum(dict->dictData), + PointerGetDatum(VARDATA_ANY(in)), + Int32GetDatum(VARSIZE_ANY_EXHDR(in)), + PointerGetDatum(&dstate))); + if (ptr != NULL) + res = ptr; + } + + if (!res) + PG_RETURN_NULL(); + + ptr = res; + while (ptr->lexeme) + ptr++; + da = (Datum *) palloc(sizeof(Datum) * (ptr - res)); + ptr = res; + while (ptr->lexeme) + { + da[ptr - res] = CStringGetTextDatum(ptr->lexeme); + ptr++; + } + + a = construct_array(da, + ptr - res, + TEXTOID, + -1, + false, + TYPALIGN_INT); + + ptr = res; + while (ptr->lexeme) + { + pfree(DatumGetPointer(da[ptr - res])); + pfree(ptr->lexeme); + ptr++; + } + pfree(res); + pfree(da); + + PG_RETURN_POINTER(a); +} |