aboutsummaryrefslogtreecommitdiff
path: root/contrib/tsearch2/query.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tsearch2/query.c')
-rw-r--r--contrib/tsearch2/query.c82
1 files changed, 78 insertions, 4 deletions
diff --git a/contrib/tsearch2/query.c b/contrib/tsearch2/query.c
index e6f1ae3a898..e312cf6af71 100644
--- a/contrib/tsearch2/query.c
+++ b/contrib/tsearch2/query.c
@@ -51,10 +51,20 @@ Datum to_tsquery_name(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(to_tsquery_current);
Datum to_tsquery_current(PG_FUNCTION_ARGS);
+PG_FUNCTION_INFO_V1(plainto_tsquery);
+Datum plainto_tsquery(PG_FUNCTION_ARGS);
+
+PG_FUNCTION_INFO_V1(plainto_tsquery_name);
+Datum plainto_tsquery_name(PG_FUNCTION_ARGS);
+
+PG_FUNCTION_INFO_V1(plainto_tsquery_current);
+Datum plainto_tsquery_current(PG_FUNCTION_ARGS);
+
/* parser's states */
#define WAITOPERAND 1
#define WAITOPERATOR 2
#define WAITFIRSTOPERAND 3
+#define WAITSINGLEOPERAND 4
/*
* node of query tree, also used
@@ -195,6 +205,14 @@ gettoken_query(QPRS_STATE * state, int4 *val, int4 *lenval, char **strval, int2
else if (*(state->buf) != ' ')
return ERR;
break;
+ case WAITSINGLEOPERAND:
+ if ( *(state->buf) == '\0' )
+ return END;
+ *strval = state->buf;
+ *lenval = strlen( state->buf );
+ state->buf += strlen( state->buf );
+ state->count++;
+ return VAL;
default:
return ERR;
break;
@@ -582,7 +600,7 @@ findoprnd(ITEM * ptr, int4 *pos)
* input
*/
static QUERYTYPE *
- queryin(char *buf, void (*pushval) (QPRS_STATE *, int, char *, int, int2), int cfg_id)
+queryin(char *buf, void (*pushval) (QPRS_STATE *, int, char *, int, int2), int cfg_id, bool isplain)
{
QPRS_STATE state;
int4 i;
@@ -599,7 +617,7 @@ static QUERYTYPE *
/* init state */
state.buf = buf;
- state.state = WAITFIRSTOPERAND;
+ state.state = (isplain) ? WAITSINGLEOPERAND : WAITFIRSTOPERAND;
state.count = 0;
state.num = 0;
state.str = NULL;
@@ -679,7 +697,7 @@ Datum
tsquery_in(PG_FUNCTION_ARGS)
{
SET_FUNCOID();
- PG_RETURN_POINTER(queryin((char *) PG_GETARG_POINTER(0), pushval_asis, 0));
+ PG_RETURN_POINTER(queryin((char *) PG_GETARG_POINTER(0), pushval_asis, 0, false));
}
/*
@@ -910,7 +928,7 @@ to_tsquery(PG_FUNCTION_ARGS)
str = text2char(in);
PG_FREE_IF_COPY(in, 1);
- query = queryin(str, pushval_morph, PG_GETARG_INT32(0));
+ query = queryin(str, pushval_morph, PG_GETARG_INT32(0),false);
if ( query->size == 0 )
PG_RETURN_POINTER(query);
@@ -950,3 +968,59 @@ to_tsquery_current(PG_FUNCTION_ARGS)
Int32GetDatum(get_currcfg()),
PG_GETARG_DATUM(0)));
}
+
+Datum
+plainto_tsquery(PG_FUNCTION_ARGS)
+{
+ text *in = PG_GETARG_TEXT_P(1);
+ char *str;
+ QUERYTYPE *query;
+ ITEM *res;
+ int4 len;
+
+ SET_FUNCOID();
+
+ str = text2char(in);
+ PG_FREE_IF_COPY(in, 1);
+
+ query = queryin(str, pushval_morph, PG_GETARG_INT32(0), true);
+
+ if ( query->size == 0 )
+ PG_RETURN_POINTER(query);
+
+ res = clean_fakeval_v2(GETQUERY(query), &len);
+ if (!res)
+ {
+ query->len = HDRSIZEQT;
+ query->size = 0;
+ PG_RETURN_POINTER(query);
+ }
+ memcpy((void *) GETQUERY(query), (void *) res, len * sizeof(ITEM));
+ pfree(res);
+ PG_RETURN_POINTER(query);
+}
+
+Datum
+plainto_tsquery_name(PG_FUNCTION_ARGS)
+{
+ text *name = PG_GETARG_TEXT_P(0);
+ Datum res;
+
+ SET_FUNCOID();
+ res = DirectFunctionCall2(plainto_tsquery,
+ Int32GetDatum(name2id_cfg(name)),
+ PG_GETARG_DATUM(1));
+
+ PG_FREE_IF_COPY(name, 0);
+ PG_RETURN_DATUM(res);
+}
+
+Datum
+plainto_tsquery_current(PG_FUNCTION_ARGS)
+{
+ SET_FUNCOID();
+ PG_RETURN_DATUM(DirectFunctionCall2(plainto_tsquery,
+ Int32GetDatum(get_currcfg()),
+ PG_GETARG_DATUM(0)));
+}
+