aboutsummaryrefslogtreecommitdiff
path: root/contrib/tsearch2/query_cleanup.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tsearch2/query_cleanup.c')
-rw-r--r--contrib/tsearch2/query_cleanup.c258
1 files changed, 0 insertions, 258 deletions
diff --git a/contrib/tsearch2/query_cleanup.c b/contrib/tsearch2/query_cleanup.c
deleted file mode 100644
index 0d3427ff9b8..00000000000
--- a/contrib/tsearch2/query_cleanup.c
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * Rewrite routines of query tree
- * Teodor Sigaev <teodor@sigaev.ru>
- */
-
-#include "postgres.h"
-
-#include <float.h>
-
-#include "utils/builtins.h"
-
-#include "query.h"
-#include "query_cleanup.h"
-
-typedef struct NODE
-{
- struct NODE *left;
- struct NODE *right;
- ITEM *valnode;
-} NODE;
-
-/*
- * make query tree from plain view of query
- */
-static NODE *
-maketree(ITEM * in)
-{
- NODE *node = (NODE *) palloc(sizeof(NODE));
-
- node->valnode = in;
- node->right = node->left = NULL;
- if (in->type == OPR)
- {
- node->right = maketree(in + 1);
- if (in->val != (int4) '!')
- node->left = maketree(in + in->left);
- }
- return node;
-}
-
-typedef struct
-{
- ITEM *ptr;
- int4 len;
- int4 cur;
-} PLAINTREE;
-
-static void
-plainnode(PLAINTREE * state, NODE * node)
-{
- if (state->cur == state->len)
- {
- state->len *= 2;
- state->ptr = (ITEM *) repalloc((void *) state->ptr, state->len * sizeof(ITEM));
- }
- memcpy((void *) &(state->ptr[state->cur]), (void *) node->valnode, sizeof(ITEM));
- if (node->valnode->type == VAL)
- state->cur++;
- else if (node->valnode->val == (int4) '!')
- {
- state->ptr[state->cur].left = 1;
- state->cur++;
- plainnode(state, node->right);
- }
- else
- {
- int4 cur = state->cur;
-
- state->cur++;
- plainnode(state, node->right);
- state->ptr[cur].left = state->cur - cur;
- plainnode(state, node->left);
- }
- pfree(node);
-}
-
-/*
- * make plain view of tree from 'normal' view of tree
- */
-static ITEM *
-plaintree(NODE * root, int4 *len)
-{
- PLAINTREE pl;
-
- pl.cur = 0;
- pl.len = 16;
- if (root && (root->valnode->type == VAL || root->valnode->type == OPR))
- {
- pl.ptr = (ITEM *) palloc(pl.len * sizeof(ITEM));
- plainnode(&pl, root);
- }
- else
- pl.ptr = NULL;
- *len = pl.cur;
- return pl.ptr;
-}
-
-static void
-freetree(NODE * node)
-{
- if (!node)
- return;
- if (node->left)
- freetree(node->left);
- if (node->right)
- freetree(node->right);
- pfree(node);
-}
-
-/*
- * clean tree for ! operator.
- * It's usefull for debug, but in
- * other case, such view is used with search in index.
- * Operator ! always return TRUE
- */
-static NODE *
-clean_NOT_intree(NODE * node)
-{
- if (node->valnode->type == VAL)
- return node;
-
- if (node->valnode->val == (int4) '!')
- {
- freetree(node);
- return NULL;
- }
-
- /* operator & or | */
- if (node->valnode->val == (int4) '|')
- {
- if ((node->left = clean_NOT_intree(node->left)) == NULL ||
- (node->right = clean_NOT_intree(node->right)) == NULL)
- {
- freetree(node);
- return NULL;
- }
- }
- else
- {
- NODE *res = node;
-
- node->left = clean_NOT_intree(node->left);
- node->right = clean_NOT_intree(node->right);
- if (node->left == NULL && node->right == NULL)
- {
- pfree(node);
- res = NULL;
- }
- else if (node->left == NULL)
- {
- res = node->right;
- pfree(node);
- }
- else if (node->right == NULL)
- {
- res = node->left;
- pfree(node);
- }
- return res;
- }
- return node;
-}
-
-ITEM *
-clean_NOT_v2(ITEM * ptr, int4 *len)
-{
- NODE *root = maketree(ptr);
-
- return plaintree(clean_NOT_intree(root), len);
-}
-
-
-#ifdef V_UNKNOWN /* exists in Windows headers */
-#undef V_UNKNOWN
-#endif
-#ifdef V_FALSE /* exists in Solaris headers */
-#undef V_FALSE
-#endif
-
-#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
- * text (stopword)
- */
-static NODE *
-clean_fakeval_intree(NODE * node, char *result)
-{
- char lresult = V_UNKNOWN,
- rresult = V_UNKNOWN;
-
- if (node->valnode->type == VAL)
- return node;
- else if (node->valnode->type == VALSTOP)
- {
- pfree(node);
- *result = V_STOP;
- return NULL;
- }
-
-
- if (node->valnode->val == (int4) '!')
- {
- node->right = clean_fakeval_intree(node->right, &rresult);
- if (!node->right)
- {
- *result = V_STOP;
- freetree(node);
- return NULL;
- }
- }
- else
- {
- NODE *res = node;
-
- 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);
- *result = V_STOP;
- return NULL;
- }
- else if (lresult == V_STOP)
- {
- res = node->right;
- pfree(node);
- }
- else if (rresult == V_STOP)
- {
- res = node->left;
- pfree(node);
- }
- return res;
- }
- return node;
-}
-
-ITEM *
-clean_fakeval_v2(ITEM * ptr, int4 *len)
-{
- NODE *root = maketree(ptr);
- char result = V_UNKNOWN;
- NODE *resroot;
-
- resroot = clean_fakeval_intree(root, &result);
- if (result != V_UNKNOWN)
- {
- elog(NOTICE, "query contains only stopword(s) or doesn't contain lexeme(s), ignored");
- *len = 0;
- return NULL;
- }
-
- return plaintree(resroot, len);
-}