summaryrefslogtreecommitdiff
path: root/contrib/tsearch2/rewrite.c
diff options
context:
space:
mode:
authorTeodor Sigaev2003-08-28 12:23:24 +0000
committerTeodor Sigaev2003-08-28 12:23:24 +0000
commit61366a950374ccbbd972288282eb203229b474de (patch)
treebbabfc5479676b3ea42174fe1aea22018a09c3ce /contrib/tsearch2/rewrite.c
parentd1031cdef2c8f0d9c7b3a1423649d90b8498808a (diff)
More accuracy works with stopwords in queries
Diffstat (limited to 'contrib/tsearch2/rewrite.c')
-rw-r--r--contrib/tsearch2/rewrite.c51
1 files changed, 8 insertions, 43 deletions
diff --git a/contrib/tsearch2/rewrite.c b/contrib/tsearch2/rewrite.c
index ac42f2c9a94..4d7294cd74a 100644
--- a/contrib/tsearch2/rewrite.c
+++ b/contrib/tsearch2/rewrite.c
@@ -177,6 +177,7 @@ clean_NOT_v2(ITEM * ptr, int4 *len)
#define V_UNKNOWN 0
#define V_TRUE 1
#define V_FALSE 2
+#define V_STOP 3
/*
* Clean query tree from values which is always in
@@ -190,10 +191,10 @@ clean_fakeval_intree(NODE * node, char *result)
if (node->valnode->type == VAL)
return node;
- else if (node->valnode->type == VALTRUE)
+ else if (node->valnode->type == VALSTOP)
{
pfree(node);
- *result = V_TRUE;
+ *result = V_STOP;
return NULL;
}
@@ -203,65 +204,29 @@ clean_fakeval_intree(NODE * node, char *result)
node->right = clean_fakeval_intree(node->right, &rresult);
if (!node->right)
{
- *result = (rresult == V_TRUE) ? V_FALSE : V_TRUE;
+ *result = V_STOP;
freetree(node);
return NULL;
}
}
- else if (node->valnode->val == (int4) '|')
- {
- NODE *res = node;
-
- node->left = clean_fakeval_intree(node->left, &lresult);
- node->right = clean_fakeval_intree(node->right, &rresult);
- if (lresult == V_TRUE || rresult == V_TRUE)
- {
- freetree(node);
- *result = V_TRUE;
- return NULL;
- }
- else if (lresult == V_FALSE && rresult == V_FALSE)
- {
- freetree(node);
- *result = V_FALSE;
- return NULL;
- }
- else if (lresult == V_FALSE)
- {
- res = node->right;
- pfree(node);
- }
- else if (rresult == V_FALSE)
- {
- res = node->left;
- pfree(node);
- }
- return res;
- }
else
{
NODE *res = node;
node->left = clean_fakeval_intree(node->left, &lresult);
node->right = clean_fakeval_intree(node->right, &rresult);
- if (lresult == V_FALSE || rresult == V_FALSE)
- {
- freetree(node);
- *result = V_FALSE;
- return NULL;
- }
- else if (lresult == V_TRUE && rresult == V_TRUE)
+ if (lresult == V_STOP && rresult == V_STOP)
{
freetree(node);
- *result = V_TRUE;
+ *result = V_STOP;
return NULL;
}
- else if (lresult == V_TRUE)
+ else if (lresult == V_STOP)
{
res = node->right;
pfree(node);
}
- else if (rresult == V_TRUE)
+ else if (rresult == V_STOP)
{
res = node->left;
pfree(node);