Header And Logo

PostgreSQL
| The world's most advanced open source database.

Functions

dict.c File Reference

#include "postgres.h"
#include "catalog/pg_type.h"
#include "tsearch/ts_cache.h"
#include "tsearch/ts_utils.h"
#include "utils/builtins.h"
Include dependency graph for dict.c:

Go to the source code of this file.

Functions

Datum ts_lexize (PG_FUNCTION_ARGS)

Function Documentation

Datum ts_lexize ( PG_FUNCTION_ARGS   ) 

Definition at line 26 of file dict.c.

References construct_array(), CStringGetTextDatum, DatumGetPointer, TSDictionaryCacheEntry::dictData, FunctionCall4, DictSubState::getnext, Int32GetDatum, DictSubState::isend, TSLexeme::lexeme, TSDictionaryCacheEntry::lexize, lookup_ts_dictionary_cache(), NULL, palloc(), pfree(), PG_GETARG_OID, PG_GETARG_TEXT_P, PG_RETURN_NULL, PG_RETURN_POINTER, PointerGetDatum, TEXTOID, VARDATA, VARHDRSZ, and VARSIZE.

Referenced by tsa_lexize_bycurrent(), and tsa_lexize_byname().

{
    Oid         dictId = PG_GETARG_OID(0);
    text       *in = PG_GETARG_TEXT_P(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(in)),
                                       Int32GetDatum(VARSIZE(in) - VARHDRSZ),
                                                  PointerGetDatum(&dstate)));

    if (dstate.getnext)
    {
        dstate.isend = true;
        ptr = (TSLexeme *) DatumGetPointer(FunctionCall4(&dict->lexize,
                                             PointerGetDatum(dict->dictData),
                                                PointerGetDatum(VARDATA(in)),
                                       Int32GetDatum(VARSIZE(in) - VARHDRSZ),
                                                  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,
                        'i');

    ptr = res;
    while (ptr->lexeme)
    {
        pfree(DatumGetPointer(da[ptr - res]));
        pfree(ptr->lexeme);
        ptr++;
    }
    pfree(res);
    pfree(da);

    PG_RETURN_POINTER(a);
}