PostgreSQL Source Code  git master
ltxtquery_op.c File Reference
#include "postgres.h"
#include <ctype.h>
#include "ltree.h"
#include "miscadmin.h"
Include dependency graph for ltxtquery_op.c:

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)
 

Function Documentation

◆ checkcondition_str()

static bool checkcondition_str ( void *  checkval,
ITEM val 
)
static

Definition at line 56 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_INCASE, LVAR_SUBLEXEME, and ltree_level::name.

Referenced by ltxtq_exec().

57 {
58  ltree_level *level = LTREE_FIRST(((CHKVAL *) checkval)->node);
59  int tlen = ((CHKVAL *) checkval)->node->numlevel;
60  char *op = ((CHKVAL *) checkval)->operand + val->distance;
61  int (*cmpptr) (const char *, const char *, size_t);
62 
63  cmpptr = (val->flag & LVAR_INCASE) ? ltree_strncasecmp : strncmp;
64  while (tlen > 0)
65  {
66  if (val->flag & LVAR_SUBLEXEME)
67  {
68  if (compare_subnode(level, op, val->length, cmpptr, (val->flag & LVAR_ANYEND)))
69  return true;
70  }
71  else if ((val->length == level->len ||
72  (level->len > val->length && (val->flag & LVAR_ANYEND))) &&
73  (*cmpptr) (op, level->name, val->length) == 0)
74  return true;
75 
76  tlen--;
77  level = LEVEL_NEXT(level);
78  }
79 
80  return false;
81 }
int ltree_strncasecmp(const char *a, const char *b, size_t s)
Definition: lquery_op.c:78
bool compare_subnode(ltree_level *t, char *qn, int len, int(*cmpptr)(const char *, const char *, size_t), bool anyend)
Definition: lquery_op.c:44
char name[FLEXIBLE_ARRAY_MEMBER]
Definition: ltree.h:23
#define LVAR_INCASE
Definition: ltree.h:62
uint16 len
Definition: ltree.h:22
#define LVAR_ANYEND
Definition: ltree.h:61
uint8 length
Definition: ltree.h:131
uint8 flag
Definition: ltree.h:129
#define LEVEL_NEXT(x)
Definition: ltree.h:27
#define LVAR_SUBLEXEME
Definition: ltree.h:63
#define LTREE_FIRST(x)
Definition: ltree.h:38
uint16 distance
Definition: ltree.h:132

◆ ltree_execute()

bool ltree_execute ( ITEM curitem,
void *  checkval,
bool  calcnot,
bool(*)(void *checkval, ITEM *val chkcond 
)

Definition at line 20 of file ltxtquery_op.c.

References check_stack_depth(), ITEM::left, ITEM::type, ITEM::val, and VAL.

Referenced by gist_qtxt(), and ltxtq_exec().

21 {
22  /* since this function recurses, it could be driven to stack overflow */
24 
25  if (curitem->type == VAL)
26  return (*chkcond) (checkval, curitem);
27  else if (curitem->val == (int32) '!')
28  {
29  return calcnot ?
30  ((ltree_execute(curitem + 1, checkval, calcnot, chkcond)) ? false : true)
31  : true;
32  }
33  else if (curitem->val == (int32) '&')
34  {
35  if (ltree_execute(curitem + curitem->left, checkval, calcnot, chkcond))
36  return ltree_execute(curitem + 1, checkval, calcnot, chkcond);
37  else
38  return false;
39  }
40  else
41  { /* |-operator */
42  if (ltree_execute(curitem + curitem->left, checkval, calcnot, chkcond))
43  return true;
44  else
45  return ltree_execute(curitem + 1, checkval, calcnot, chkcond);
46  }
47 }
signed int int32
Definition: c.h:355
int16 type
Definition: _int.h:142
#define true
Definition: c.h:321
void check_stack_depth(void)
Definition: postgres.c:3295
int32 val
Definition: _int.h:144
int16 left
Definition: _int.h:143
#define VAL
Definition: _int.h:162
bool ltree_execute(ITEM *curitem, void *checkval, bool calcnot, bool(*chkcond)(void *checkval, ITEM *val))
Definition: ltxtquery_op.c:20

◆ ltxtq_exec()

Datum ltxtq_exec ( PG_FUNCTION_ARGS  )

Definition at line 84 of file ltxtquery_op.c.

References checkcondition_str(), GETOPERAND, GETQUERY, ltree_execute(), CHKVAL::node, CHKVAL::operand, PG_FREE_IF_COPY, PG_GETARG_LTREE_P, PG_GETARG_LTXTQUERY_P, PG_RETURN_BOOL, and val.

Referenced by _ltxtq_exec(), _ltxtq_extract_exec(), ltree_consistent(), and ltxtq_rexec().

85 {
87  ltxtquery *query = PG_GETARG_LTXTQUERY_P(1);
88  CHKVAL chkval;
89  bool result;
90 
91  chkval.node = val;
92  chkval.operand = GETOPERAND(query);
93 
94  result = ltree_execute(GETQUERY(query),
95  &chkval,
96  true,
98 
99  PG_FREE_IF_COPY(val, 0);
100  PG_FREE_IF_COPY(query, 1);
101  PG_RETURN_BOOL(result);
102 }
#define PG_GETARG_LTREE_P(n)
Definition: ltree.h:204
#define GETQUERY(x)
Definition: _int.h:157
#define GETOPERAND(x)
Definition: ltree.h:151
static bool checkcondition_str(void *checkval, ITEM *val)
Definition: ltxtquery_op.c:56
char * operand
Definition: ltxtquery_op.c:52
Definition: ltree.h:29
#define PG_RETURN_BOOL(x)
Definition: fmgr.h:353
#define PG_FREE_IF_COPY(ptr, n)
Definition: fmgr.h:255
#define PG_GETARG_LTXTQUERY_P(n)
Definition: ltree.h:214
ltree * node
Definition: ltxtquery_op.c:51
long val
Definition: informix.c:664
bool ltree_execute(ITEM *curitem, void *checkval, bool calcnot, bool(*chkcond)(void *checkval, ITEM *val))
Definition: ltxtquery_op.c:20

◆ ltxtq_rexec()

Datum ltxtq_rexec ( PG_FUNCTION_ARGS  )

Definition at line 105 of file ltxtquery_op.c.

References DirectFunctionCall2, ltxtq_exec(), PG_GETARG_DATUM, and PG_RETURN_DATUM.

106 {
108  PG_GETARG_DATUM(1),
109  PG_GETARG_DATUM(0)
110  ));
111 }
#define PG_GETARG_DATUM(n)
Definition: fmgr.h:263
Datum ltxtq_exec(PG_FUNCTION_ARGS)
Definition: ltxtquery_op.c:84
#define PG_RETURN_DATUM(x)
Definition: fmgr.h:347
#define DirectFunctionCall2(func, arg1, arg2)
Definition: fmgr.h:621

◆ PG_FUNCTION_INFO_V1() [1/2]

PG_FUNCTION_INFO_V1 ( ltxtq_exec  )

◆ PG_FUNCTION_INFO_V1() [2/2]

PG_FUNCTION_INFO_V1 ( ltxtq_rexec  )