#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 | ) |