diff --git a/contrib/btree_gist/btree_utils_var.c b/contrib/btree_gist/btree_utils_var.c
index 691b10388eda6ebcd89ba84437fa5b170909258f..d7387e63d6d4136dfe44fff6a5a4a3ffa3ff6a50 100644
--- a/contrib/btree_gist/btree_utils_var.c
+++ b/contrib/btree_gist/btree_utils_var.c
@@ -108,14 +108,12 @@ gbt_var_leaf2node(GBT_VARKEY *leaf, const gbtree_vinfo *tinfo)
 static int32
 gbt_var_node_cp_len(const GBT_VARKEY *node, const gbtree_vinfo *tinfo)
 {
-
 	GBT_VARKEY_R r = gbt_var_key_readable(node);
 	int32		i = 0;
 	int32		l = 0;
 	int32		t1len = VARSIZE(r.lower) - VARHDRSZ;
 	int32		t2len = VARSIZE(r.upper) - VARHDRSZ;
 	int32		ml = Min(t1len, t2len);
-
 	char	   *p1 = VARDATA(r.lower);
 	char	   *p2 = VARDATA(r.upper);
 
@@ -126,7 +124,6 @@ gbt_var_node_cp_len(const GBT_VARKEY *node, const gbtree_vinfo *tinfo)
 	{
 		if (tinfo->eml > 1 && l == 0)
 		{
-
 			if ((l = pg_mblen(p1)) != pg_mblen(p2))
 			{
 				return i;
@@ -369,13 +366,14 @@ gbt_var_penalty(float *res, const GISTENTRY *o, const GISTENTRY *n,
 	GBT_VARKEY *newe = (GBT_VARKEY *) DatumGetPointer(n->key);
 	GBT_VARKEY_R ok,
 				nk;
-	GBT_VARKEY *tmp = NULL;
 
 	*res = 0.0;
 
 	nk = gbt_var_key_readable(newe);
 	if (nk.lower == nk.upper)	/* leaf */
 	{
+		GBT_VARKEY *tmp;
+
 		tmp = gbt_var_leaf2node(newe, tinfo);
 		if (tmp != newe)
 			nk = gbt_var_key_readable(tmp);
@@ -390,7 +388,7 @@ gbt_var_penalty(float *res, const GISTENTRY *o, const GISTENTRY *n,
 				gbt_bytea_pf_match(ok.upper, nk.upper, tinfo))))
 	{
 		Datum		d = PointerGetDatum(0);
-		double		dres = 0.0;
+		double		dres;
 		int32		ol,
 					ul;
 
@@ -401,20 +399,18 @@ gbt_var_penalty(float *res, const GISTENTRY *o, const GISTENTRY *n,
 
 		if (ul < ol)
 		{
-			dres = (ol - ul);	/* lost of common prefix len */
+			dres = (ol - ul);	/* reduction of common prefix len */
 		}
 		else
 		{
 			GBT_VARKEY_R uk = gbt_var_key_readable((GBT_VARKEY *) DatumGetPointer(d));
+			unsigned char tmp[4];
 
-			char		tmp[4];
-
-			tmp[0] = ((VARSIZE(ok.lower) - VARHDRSZ) == ul) ? (CHAR_MIN) : (VARDATA(ok.lower)[ul]);
-			tmp[1] = ((VARSIZE(uk.lower) - VARHDRSZ) == ul) ? (CHAR_MIN) : (VARDATA(uk.lower)[ul]);
-			tmp[2] = ((VARSIZE(ok.upper) - VARHDRSZ) == ul) ? (CHAR_MIN) : (VARDATA(ok.upper)[ul]);
-			tmp[3] = ((VARSIZE(uk.upper) - VARHDRSZ) == ul) ? (CHAR_MIN) : (VARDATA(uk.upper)[ul]);
-			dres = (tmp[0] - tmp[1]) +
-				(tmp[3] - tmp[2]);
+			tmp[0] = (unsigned char) (((VARSIZE(ok.lower) - VARHDRSZ) <= ul) ? 0 : (VARDATA(ok.lower)[ul]));
+			tmp[1] = (unsigned char) (((VARSIZE(uk.lower) - VARHDRSZ) <= ul) ? 0 : (VARDATA(uk.lower)[ul]));
+			tmp[2] = (unsigned char) (((VARSIZE(ok.upper) - VARHDRSZ) <= ul) ? 0 : (VARDATA(ok.upper)[ul]));
+			tmp[3] = (unsigned char) (((VARSIZE(uk.upper) - VARHDRSZ) <= ul) ? 0 : (VARDATA(uk.upper)[ul]));
+			dres = Abs(tmp[0] - tmp[1]) + Abs(tmp[3] - tmp[2]);
 			dres /= 256.0;
 		}