diff --git a/contrib/tsearch2/ts_locale.c b/contrib/tsearch2/ts_locale.c
index b84681f1b072fbdd6bbb22e4261252b14d53f398..8bb453276bd7c047ef17091d715957e53d0a76fa 100644
--- a/contrib/tsearch2/ts_locale.c
+++ b/contrib/tsearch2/ts_locale.c
@@ -8,23 +8,29 @@
 #if defined(TS_USE_WIDE) && defined(WIN32)
 
 size_t
-wchar2char( const char *to, const wchar_t *from, size_t len ) {
+wchar2char( char *to, const wchar_t *from, size_t len ) {
 	if (GetDatabaseEncoding() == PG_UTF8) {
-		int	r;
+		int	r, nbytes;
 
 		if (len==0)
 			return 0;
 
+		/* in any case, *to should be allocated with enough space */
+		nbytes = WideCharToMultiByte(CP_UTF8, 0, from, len, NULL, 0, NULL, NULL);
+		if ( nbytes==0 )
+			ereport(ERROR,
+				(errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
+				 	errmsg("UTF-16 to UTF-8 translation failed: %lu",
+						GetLastError())));
+
 		r = WideCharToMultiByte(CP_UTF8, 0, from, len, to, nbytes,
 				NULL, NULL);
 
-		
 		if ( r==0 )
 			ereport(ERROR,
 				(errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
 				 	errmsg("UTF-16 to UTF-8 translation failed: %lu",
 						GetLastError())));
-
 		return r;
 	}
 
@@ -32,15 +38,14 @@ wchar2char( const char *to, const wchar_t *from, size_t len ) {
 }
 
 size_t 
-char2wchar( const wchar_t *to, const char *from, size_t len ) {
+char2wchar( wchar_t *to, const char *from, size_t len ) {
 	if (GetDatabaseEncoding() == PG_UTF8) {
 		int	r;
 
 		if (len==0)
 			return 0;
 
-		r = MultiByteToWideChar(CP_UTF8, 0, from, len,
-			to, len);
+		r = MultiByteToWideChar(CP_UTF8, 0, from, len, to, len);
 
 		if (!r) {
 			pg_verifymbstr(from, len, false);
@@ -50,7 +55,7 @@ char2wchar( const wchar_t *to, const char *from, size_t len ) {
 				errhint("The server's LC_CTYPE locale is probably incompatible with the database encoding.")));
 		}
 
-		Assert(r <= nbytes);
+		Assert( r <= len );
 
 		return r;
 	}
diff --git a/contrib/tsearch2/ts_locale.h b/contrib/tsearch2/ts_locale.h
index a7ce6f1bbc5393db4f675d071c428d220ee52f2c..4935e70c6acae0ef0e56bc191908caedf6029c24 100644
--- a/contrib/tsearch2/ts_locale.h
+++ b/contrib/tsearch2/ts_locale.h
@@ -22,8 +22,8 @@
 
 #ifdef WIN32
 
-size_t wchar2char( const char *to, const wchar_t *from, size_t len );
-size_t char2wchar( const wchar_t *to, const char *from, size_t len );
+size_t wchar2char( char *to, const wchar_t *from, size_t len );
+size_t char2wchar( wchar_t *to, const char *from, size_t len );
 
 #else /* WIN32 */
 
diff --git a/contrib/tsearch2/wordparser/parser.c b/contrib/tsearch2/wordparser/parser.c
index d2ed28122cadcf85c79e89f8717a4d1a259d606f..565c3c1741651dd268db01613876b7f0449a0c52 100644
--- a/contrib/tsearch2/wordparser/parser.c
+++ b/contrib/tsearch2/wordparser/parser.c
@@ -79,7 +79,7 @@ TParserClose( TParser* prs ) {
 static int											\
 p_is##type(TParser *prs) {									\
 	Assert( prs->state );									\
-	return ( ( prs->usewide ) ? isw##type( (wint_t)*( prs->wstr + prs->state->poschar ) ) : \
+	return ( ( prs->usewide ) ? isw##type( (wint_t)*( prs->wstr + prs->state->poschar ) ) :	\
 		is##type( (unsigned char)*( prs->str + prs->state->posbyte ) ) );		\
 }												\
 												\
@@ -104,7 +104,7 @@ p_iseq(TParser *prs, char c) {
 static int											\
 p_is##type(TParser *prs) {									\
 	Assert( prs->state );									\
-	return is##type( (unsigned char)*( prs->str + prs->state->posbyte ) ) );		\
+	return is##type( (unsigned char)*( prs->str + prs->state->posbyte ) );			\
 }												\
 												\
 static int											\
@@ -116,7 +116,7 @@ p_isnot##type(TParser *prs) {									\
 static int
 p_iseq(TParser *prs, char c) {
 	Assert( prs->state );
-	return ( *( prs->str + prs->state->posbyte ) == c ) ) ? 1 : 0;
+	return ( *( prs->str + prs->state->posbyte ) == c ) ? 1 : 0;
 }
 
 #endif /* TS_USE_WIDE */