Line data Source code
1 : /*------------------------------------------------------------------------- 2 : * 3 : * dict.c 4 : * Standard interface to dictionary 5 : * 6 : * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group 7 : * 8 : * 9 : * IDENTIFICATION 10 : * src/backend/tsearch/dict.c 11 : * 12 : *------------------------------------------------------------------------- 13 : */ 14 : #include "postgres.h" 15 : 16 : #include "catalog/pg_type.h" 17 : #include "tsearch/ts_cache.h" 18 : #include "tsearch/ts_utils.h" 19 : #include "utils/array.h" 20 : #include "utils/builtins.h" 21 : 22 : 23 : /* 24 : * Lexize one word by dictionary, mostly debug function 25 : */ 26 : Datum 27 918 : ts_lexize(PG_FUNCTION_ARGS) 28 : { 29 918 : Oid dictId = PG_GETARG_OID(0); 30 918 : text *in = PG_GETARG_TEXT_PP(1); 31 : ArrayType *a; 32 : TSDictionaryCacheEntry *dict; 33 : TSLexeme *res, 34 : *ptr; 35 : Datum *da; 36 918 : DictSubState dstate = {false, false, NULL}; 37 : 38 918 : dict = lookup_ts_dictionary_cache(dictId); 39 : 40 918 : res = (TSLexeme *) DatumGetPointer(FunctionCall4(&dict->lexize, 41 : PointerGetDatum(dict->dictData), 42 : PointerGetDatum(VARDATA_ANY(in)), 43 : Int32GetDatum(VARSIZE_ANY_EXHDR(in)), 44 : PointerGetDatum(&dstate))); 45 : 46 918 : if (dstate.getnext) 47 : { 48 6 : dstate.isend = true; 49 6 : ptr = (TSLexeme *) DatumGetPointer(FunctionCall4(&dict->lexize, 50 : PointerGetDatum(dict->dictData), 51 : PointerGetDatum(VARDATA_ANY(in)), 52 : Int32GetDatum(VARSIZE_ANY_EXHDR(in)), 53 : PointerGetDatum(&dstate))); 54 6 : if (ptr != NULL) 55 0 : res = ptr; 56 : } 57 : 58 918 : if (!res) 59 54 : PG_RETURN_NULL(); 60 : 61 864 : ptr = res; 62 2056 : while (ptr->lexeme) 63 1192 : ptr++; 64 864 : da = (Datum *) palloc(sizeof(Datum) * (ptr - res)); 65 864 : ptr = res; 66 2056 : while (ptr->lexeme) 67 : { 68 1192 : da[ptr - res] = CStringGetTextDatum(ptr->lexeme); 69 1192 : ptr++; 70 : } 71 : 72 864 : a = construct_array_builtin(da, ptr - res, TEXTOID); 73 : 74 864 : ptr = res; 75 2056 : while (ptr->lexeme) 76 : { 77 1192 : pfree(DatumGetPointer(da[ptr - res])); 78 1192 : pfree(ptr->lexeme); 79 1192 : ptr++; 80 : } 81 864 : pfree(res); 82 864 : pfree(da); 83 : 84 864 : PG_RETURN_POINTER(a); 85 : }