#include "postgres.h"#include <ctype.h>#include "ltree.h"
Go to the source code of this file.
Data Structures | |
| struct | CHKVAL |
Functions | |
| PG_FUNCTION_INFO_V1 (ltxtq_exec) | |
| PG_FUNCTION_INFO_V1 (ltxtq_rexec) | |
| bool | ltree_execute (ITEM *curitem, void *checkval, bool calcnot, bool(*chkcond)(void *checkval, ITEM *val)) |
| static bool | checkcondition_str (void *checkval, ITEM *val) |
| Datum | ltxtq_exec (PG_FUNCTION_ARGS) |
| Datum | ltxtq_rexec (PG_FUNCTION_ARGS) |
Definition at line 52 of file ltxtquery_op.c.
References compare_subnode(), ITEM::distance, ITEM::flag, ltree_level::len, ITEM::length, LEVEL_NEXT, LTREE_FIRST, ltree_strncasecmp(), LVAR_ANYEND, LVAR_SUBLEXEME, and ltree_level::name.
Referenced by ltxtq_exec().
{
ltree_level *level = LTREE_FIRST(((CHKVAL *) checkval)->node);
int tlen = ((CHKVAL *) checkval)->node->numlevel;
char *op = ((CHKVAL *) checkval)->operand + val->distance;
int (*cmpptr) (const char *, const char *, size_t);
cmpptr = (val->flag & LVAR_INCASE) ? ltree_strncasecmp : strncmp;
while (tlen > 0)
{
if (val->flag & LVAR_SUBLEXEME)
{
if (compare_subnode(level, op, val->length, cmpptr, (val->flag & LVAR_ANYEND)))
return true;
}
else if (
(
val->length == level->len ||
(level->len > val->length && (val->flag & LVAR_ANYEND))
) &&
(*cmpptr) (op, level->name, val->length) == 0)
return true;
tlen--;
level = LEVEL_NEXT(level);
}
return false;
}
| bool ltree_execute | ( | ITEM * | curitem, | |
| void * | checkval, | |||
| bool | calcnot, | |||
| bool(*)(void *checkval, ITEM *val) | chkcond | |||
| ) |
Definition at line 19 of file ltxtquery_op.c.
References ITEM::left, ltree_execute(), ITEM::type, ITEM::val, and VAL.
Referenced by gist_qtxt(), ltree_execute(), and ltxtq_exec().
{
if (curitem->type == VAL)
return (*chkcond) (checkval, curitem);
else if (curitem->val == (int32) '!')
{
return (calcnot) ?
((ltree_execute(curitem + 1, checkval, calcnot, chkcond)) ? false : true)
: true;
}
else if (curitem->val == (int32) '&')
{
if (ltree_execute(curitem + curitem->left, checkval, calcnot, chkcond))
return ltree_execute(curitem + 1, checkval, calcnot, chkcond);
else
return false;
}
else
{ /* |-operator */
if (ltree_execute(curitem + curitem->left, checkval, calcnot, chkcond))
return true;
else
return ltree_execute(curitem + 1, checkval, calcnot, chkcond);
}
}
| Datum ltxtq_exec | ( | PG_FUNCTION_ARGS | ) |
Definition at line 83 of file ltxtquery_op.c.
References checkcondition_str(), GETOPERAND, GETQUERY, ltree_execute(), CHKVAL::node, CHKVAL::operand, PG_FREE_IF_COPY, PG_GETARG_LTREE, PG_GETARG_LTXTQUERY, PG_RETURN_BOOL, and val.
Referenced by _ltxtq_exec(), _ltxtq_extract_exec(), ltree_consistent(), and ltxtq_rexec().
{
ltree *val = PG_GETARG_LTREE(0);
ltxtquery *query = PG_GETARG_LTXTQUERY(1);
CHKVAL chkval;
bool result;
chkval.node = val;
chkval.operand = GETOPERAND(query);
result = ltree_execute(
GETQUERY(query),
&chkval,
true,
checkcondition_str
);
PG_FREE_IF_COPY(val, 0);
PG_FREE_IF_COPY(query, 1);
PG_RETURN_BOOL(result);
}
| Datum ltxtq_rexec | ( | PG_FUNCTION_ARGS | ) |
Definition at line 106 of file ltxtquery_op.c.
References DirectFunctionCall2, ltxtq_exec(), PG_GETARG_DATUM, and PG_RETURN_DATUM.
{
PG_RETURN_DATUM(DirectFunctionCall2(ltxtq_exec,
PG_GETARG_DATUM(1),
PG_GETARG_DATUM(0)
));
}
| PG_FUNCTION_INFO_V1 | ( | ltxtq_rexec | ) |
| PG_FUNCTION_INFO_V1 | ( | ltxtq_exec | ) |
1.7.1