diff --git a/contrib/tsearch2/query.c b/contrib/tsearch2/query.c
index c325e453d4fb6e818afda2ec0593cb7fcb70828a..b832deb22e841624b02aaad7893e10a621bbdcbd 100644
--- a/contrib/tsearch2/query.c
+++ b/contrib/tsearch2/query.c
@@ -82,7 +82,8 @@ typedef struct NODE
 
 typedef struct
 {
-	char	   *buf;
+	char	   *buffer;			/* entire string we are scanning */
+	char	   *buf;			/* current scan point */
 	int4		state;
 	int4		count;
 	/* reverse polish notation in list (for temprorary usage) */
@@ -170,7 +171,8 @@ gettoken_query(QPRS_STATE * state, int4 *val, int4 *lenval, char **strval, int2
 				{
 					ereport(ERROR,
 							(errcode(ERRCODE_SYNTAX_ERROR),
-							 errmsg("error at start of operand")));
+							 errmsg("error at start of operand in tsearch query: \"%s\"",
+									state->buffer)));
 				}
 				else if (!t_isspace(state->buf))
 				{
@@ -188,7 +190,8 @@ gettoken_query(QPRS_STATE * state, int4 *val, int4 *lenval, char **strval, int2
 					else
 						ereport(ERROR,
 								(errcode(ERRCODE_SYNTAX_ERROR),
-								 errmsg("no operand")));
+								 errmsg("no operand in tsearch query: \"%s\"",
+										state->buffer)));
 				}
 				break;
 			case WAITOPERATOR:
@@ -241,11 +244,13 @@ pushquery(QPRS_STATE * state, int4 type, int4 val, int4 distance, int4 lenval, i
 	if (distance >= MAXSTRPOS)
 		ereport(ERROR,
 				(errcode(ERRCODE_SYNTAX_ERROR),
-				 errmsg("value is too big")));
+				 errmsg("value is too big in tsearch query: \"%s\"",
+						state->buffer)));
 	if (lenval >= MAXSTRLEN)
 		ereport(ERROR,
 				(errcode(ERRCODE_SYNTAX_ERROR),
-				 errmsg("operand is too long")));
+				 errmsg("operand is too long in tsearch query: \"%s\"",
+						state->buffer)));
 	tmp->distance = distance;
 	tmp->length = lenval;
 	tmp->next = state->str;
@@ -262,7 +267,8 @@ pushval_asis(QPRS_STATE * state, int type, char *strval, int lenval, int2 weight
 	if (lenval >= MAXSTRLEN)
 		ereport(ERROR,
 				(errcode(ERRCODE_SYNTAX_ERROR),
-				 errmsg("word is too long")));
+				 errmsg("word is too long in tsearch query: \"%s\"",
+						state->buffer)));
 
 	pushquery(state, type, crc32_sz(strval, lenval),
 			  state->curop - state->op, lenval, weight);
@@ -407,7 +413,8 @@ makepol(QPRS_STATE * state, void (*pushval) (QPRS_STATE *, int, char *, int, int
 			default:
 				ereport(ERROR,
 						(errcode(ERRCODE_SYNTAX_ERROR),
-						 errmsg("syntax error")));
+						 errmsg("syntax error in tsearch query: \"%s\"",
+								state->buffer)));
 				return ERR;
 
 		}
@@ -621,6 +628,7 @@ static QUERYTYPE *
 #endif
 
 	/* init state */
+	state.buffer = buf;
 	state.buf = buf;
 	state.state = (isplain) ? WAITSINGLEOPERAND : WAITFIRSTOPERAND;
 	state.count = 0;
@@ -644,7 +652,9 @@ static QUERYTYPE *
 	pfree(state.valstate.word);
 	if (!state.num)
 	{
-		elog(NOTICE, "query doesn't contain lexeme(s)");
+		ereport(NOTICE,
+				(errmsg("tsearch query doesn't contain lexeme(s): \"%s\"",
+						state.buffer)));
 		query = (QUERYTYPE *) palloc(HDRSIZEQT);
 		query->len = HDRSIZEQT;
 		query->size = 0;