aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/tsquery_cleanup.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/tsquery_cleanup.c')
-rw-r--r--src/backend/utils/adt/tsquery_cleanup.c63
1 files changed, 37 insertions, 26 deletions
diff --git a/src/backend/utils/adt/tsquery_cleanup.c b/src/backend/utils/adt/tsquery_cleanup.c
index 7991a4ad198..22e6f7c8198 100644
--- a/src/backend/utils/adt/tsquery_cleanup.c
+++ b/src/backend/utils/adt/tsquery_cleanup.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_cleanup.c,v 1.1 2007/08/21 01:11:19 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_cleanup.c,v 1.2 2007/09/07 15:09:56 teodor Exp $
*
*-------------------------------------------------------------------------
*/
@@ -35,20 +35,23 @@ maketree(QueryItem * in)
node->valnode = in;
node->right = node->left = NULL;
- if (in->type == OPR)
+ if (in->type == QI_OPR)
{
node->right = maketree(in + 1);
- if (in->val != (int4) '!')
- node->left = maketree(in + in->left);
+ if (in->operator.oper != OP_NOT)
+ node->left = maketree(in + in->operator.left);
}
return node;
}
+/*
+ * Internal state for plaintree and plainnode
+ */
typedef struct
{
QueryItem *ptr;
- int4 len;
- int4 cur;
+ int len; /* allocated size of ptr */
+ int cur; /* number of elements in ptr */
} PLAINTREE;
static void
@@ -60,37 +63,37 @@ plainnode(PLAINTREE * state, NODE * node)
state->ptr = (QueryItem *) repalloc((void *) state->ptr, state->len * sizeof(QueryItem));
}
memcpy((void *) &(state->ptr[state->cur]), (void *) node->valnode, sizeof(QueryItem));
- if (node->valnode->type == VAL)
+ if (node->valnode->type == QI_VAL)
state->cur++;
- else if (node->valnode->val == (int4) '!')
+ else if (node->valnode->operator.oper == OP_NOT)
{
- state->ptr[state->cur].left = 1;
+ state->ptr[state->cur].operator.left = 1;
state->cur++;
plainnode(state, node->right);
}
else
{
- int4 cur = state->cur;
+ int cur = state->cur;
state->cur++;
plainnode(state, node->right);
- state->ptr[cur].left = state->cur - cur;
+ state->ptr[cur].operator.left = state->cur - cur;
plainnode(state, node->left);
}
pfree(node);
}
/*
- * make plain view of tree from 'normal' view of tree
+ * make plain view of tree from a NODE-tree representation
*/
static QueryItem *
-plaintree(NODE * root, int4 *len)
+plaintree(NODE * root, int *len)
{
PLAINTREE pl;
pl.cur = 0;
pl.len = 16;
- if (root && (root->valnode->type == VAL || root->valnode->type == OPR))
+ if (root && (root->valnode->type == QI_VAL || root->valnode->type == QI_OPR))
{
pl.ptr = (QueryItem *) palloc(pl.len * sizeof(QueryItem));
plainnode(&pl, root);
@@ -122,17 +125,17 @@ freetree(NODE * node)
static NODE *
clean_NOT_intree(NODE * node)
{
- if (node->valnode->type == VAL)
+ if (node->valnode->type == QI_VAL)
return node;
- if (node->valnode->val == (int4) '!')
+ if (node->valnode->operator.oper == OP_NOT)
{
freetree(node);
return NULL;
}
/* operator & or | */
- if (node->valnode->val == (int4) '|')
+ if (node->valnode->operator.oper == OP_OR)
{
if ((node->left = clean_NOT_intree(node->left)) == NULL ||
(node->right = clean_NOT_intree(node->right)) == NULL)
@@ -144,6 +147,8 @@ clean_NOT_intree(NODE * node)
else
{
NODE *res = node;
+
+ Assert(node->valnode->operator.oper == OP_AND);
node->left = clean_NOT_intree(node->left);
node->right = clean_NOT_intree(node->right);
@@ -168,7 +173,7 @@ clean_NOT_intree(NODE * node)
}
QueryItem *
-clean_NOT(QueryItem * ptr, int4 *len)
+clean_NOT(QueryItem * ptr, int *len)
{
NODE *root = maketree(ptr);
@@ -180,10 +185,13 @@ clean_NOT(QueryItem * ptr, int4 *len)
#undef V_UNKNOWN
#endif
-#define V_UNKNOWN 0
-#define V_TRUE 1
-#define V_FALSE 2
-#define V_STOP 3
+/*
+ * output values for result output parameter of clean_fakeval_intree
+ */
+#define V_UNKNOWN 0 /* the expression can't be evaluated statically */
+#define V_TRUE 1 /* the expression is always true (not implemented) */
+#define V_FALSE 2 /* the expression is always false (not implemented) */
+#define V_STOP 3 /* the expression is a stop word */
/*
* Clean query tree from values which is always in
@@ -195,17 +203,19 @@ clean_fakeval_intree(NODE * node, char *result)
char lresult = V_UNKNOWN,
rresult = V_UNKNOWN;
- if (node->valnode->type == VAL)
+ if (node->valnode->type == QI_VAL)
return node;
- else if (node->valnode->type == VALSTOP)
+ else
+ if (node->valnode->type == QI_VALSTOP)
{
pfree(node);
*result = V_STOP;
return NULL;
}
+ Assert(node->valnode->type == QI_OPR);
- if (node->valnode->val == (int4) '!')
+ if (node->valnode->operator.oper == OP_NOT)
{
node->right = clean_fakeval_intree(node->right, &rresult);
if (!node->right)
@@ -221,6 +231,7 @@ clean_fakeval_intree(NODE * node, char *result)
node->left = clean_fakeval_intree(node->left, &lresult);
node->right = clean_fakeval_intree(node->right, &rresult);
+
if (lresult == V_STOP && rresult == V_STOP)
{
freetree(node);
@@ -243,7 +254,7 @@ clean_fakeval_intree(NODE * node, char *result)
}
QueryItem *
-clean_fakeval(QueryItem * ptr, int4 *len)
+clean_fakeval(QueryItem * ptr, int *len)
{
NODE *root = maketree(ptr);
char result = V_UNKNOWN;