mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-21 08:29:39 +08:00
100 lines
1.9 KiB
C
100 lines
1.9 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* dict_int.c
|
|
* Text search dictionary for integers
|
|
*
|
|
* Copyright (c) 2007-2011, 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;
|
|
} DictInt;
|
|
|
|
|
|
PG_FUNCTION_INFO_V1(dintdict_init);
|
|
Datum dintdict_init(PG_FUNCTION_ARGS);
|
|
|
|
PG_FUNCTION_INFO_V1(dintdict_lexize);
|
|
Datum dintdict_lexize(PG_FUNCTION_ARGS);
|
|
|
|
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;
|
|
|
|
foreach(l, dictoptions)
|
|
{
|
|
DefElem *defel = (DefElem *) lfirst(l);
|
|
|
|
if (pg_strcasecmp(defel->defname, "MAXLEN") == 0)
|
|
{
|
|
d->maxlen = atoi(defGetString(defel));
|
|
}
|
|
else if (pg_strcasecmp(defel->defname, "REJECTLONG") == 0)
|
|
{
|
|
d->rejectlong = 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);
|
|
char *txt = pnstrdup(in, PG_GETARG_INT32(2));
|
|
TSLexeme *res = palloc(sizeof(TSLexeme) * 2);
|
|
|
|
res[1].lexeme = NULL;
|
|
if (PG_GETARG_INT32(2) > 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);
|
|
}
|