Line data Source code
1 : /*------------------------------------------------------------------------- 2 : * 3 : * dict.c 4 : * Standard interface to dictionary 5 : * 6 : * Portions Copyright (c) 1996-2024, 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_public.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 936 : ts_lexize(PG_FUNCTION_ARGS) 28 : { 29 936 : Oid dictId = PG_GETARG_OID(0); 30 936 : text *in = PG_GETARG_TEXT_PP(1); 31 : ArrayType *a; 32 : TSDictionaryCacheEntry *dict; 33 : TSLexeme *res, 34 : *ptr; 35 : Datum *da; 36 936 : DictSubState dstate = {false, false, NULL}; 37 : 38 936 : dict = lookup_ts_dictionary_cache(dictId); 39 : 40 936 : 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 936 : 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 936 : if (!res) 59 56 : PG_RETURN_NULL(); 60 : 61 880 : ptr = res; 62 2088 : while (ptr->lexeme) 63 1208 : ptr++; 64 880 : da = (Datum *) palloc(sizeof(Datum) * (ptr - res)); 65 880 : ptr = res; 66 2088 : while (ptr->lexeme) 67 : { 68 1208 : da[ptr - res] = CStringGetTextDatum(ptr->lexeme); 69 1208 : ptr++; 70 : } 71 : 72 880 : a = construct_array_builtin(da, ptr - res, TEXTOID); 73 : 74 880 : ptr = res; 75 2088 : while (ptr->lexeme) 76 : { 77 1208 : pfree(DatumGetPointer(da[ptr - res])); 78 1208 : pfree(ptr->lexeme); 79 1208 : ptr++; 80 : } 81 880 : pfree(res); 82 880 : pfree(da); 83 : 84 880 : PG_RETURN_POINTER(a); 85 : }