diff --git a/contrib/btree_gist/btree_bit.c b/contrib/btree_gist/btree_bit.c
index 76297515c5e23f626fa674523f84f0ff5f0e80e2..af210439f06a377fa4903fffb6483774d729e096 100644
--- a/contrib/btree_gist/btree_bit.c
+++ b/contrib/btree_gist/btree_bit.c
@@ -99,7 +99,7 @@ gbt_bit_l2n(GBT_VARKEY *leaf)
 
 	o = gbt_bit_xfrm(r.lower);
 	r.upper = r.lower = o;
-	out = gbt_var_key_copy(&r, TRUE);
+	out = gbt_var_key_copy(&r);
 	pfree(o);
 
 	return out;
diff --git a/contrib/btree_gist/btree_cash.c b/contrib/btree_gist/btree_cash.c
index 63f86ebeefe03e26a8ba85dff102f47055e8e253..d9b53d5e34ee4b33d29c6c4a52d94988cfabcb79 100644
--- a/contrib/btree_gist/btree_cash.c
+++ b/contrib/btree_gist/btree_cash.c
@@ -119,9 +119,8 @@ Datum
 gbt_cash_compress(PG_FUNCTION_ARGS)
 {
 	GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-	GISTENTRY  *retval = NULL;
 
-	PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo));
+	PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo));
 }
 
 
diff --git a/contrib/btree_gist/btree_date.c b/contrib/btree_gist/btree_date.c
index 7a4c6aa6003fa05c6ab629bf2ae4f8035630eccc..153e0eb9b6fdd2331ad8e2c694d4fe5a4ea55f29 100644
--- a/contrib/btree_gist/btree_date.c
+++ b/contrib/btree_gist/btree_date.c
@@ -130,9 +130,8 @@ Datum
 gbt_date_compress(PG_FUNCTION_ARGS)
 {
 	GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-	GISTENTRY  *retval = NULL;
 
-	PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo));
+	PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo));
 }
 
 
diff --git a/contrib/btree_gist/btree_float4.c b/contrib/btree_gist/btree_float4.c
index 778d8dad84407c68fd90d567eaf26f3181c3373a..6a1db380eafb8ede199c137213f2e94ae8ed18ed 100644
--- a/contrib/btree_gist/btree_float4.c
+++ b/contrib/btree_gist/btree_float4.c
@@ -112,9 +112,8 @@ Datum
 gbt_float4_compress(PG_FUNCTION_ARGS)
 {
 	GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-	GISTENTRY  *retval = NULL;
 
-	PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo));
+	PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo));
 }
 
 
diff --git a/contrib/btree_gist/btree_float8.c b/contrib/btree_gist/btree_float8.c
index c898bf2d975ce26e4761d06a969654258e724133..3b6661038a121662f34b89e039052c4273be374b 100644
--- a/contrib/btree_gist/btree_float8.c
+++ b/contrib/btree_gist/btree_float8.c
@@ -119,9 +119,8 @@ Datum
 gbt_float8_compress(PG_FUNCTION_ARGS)
 {
 	GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-	GISTENTRY  *retval = NULL;
 
-	PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo));
+	PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo));
 }
 
 
diff --git a/contrib/btree_gist/btree_int2.c b/contrib/btree_gist/btree_int2.c
index a88aae64537c32d2caeeb18d2d58da96eda5e2d9..8db533c6e582e19d48a7e451d79a193a8bdbc69d 100644
--- a/contrib/btree_gist/btree_int2.c
+++ b/contrib/btree_gist/btree_int2.c
@@ -119,9 +119,8 @@ Datum
 gbt_int2_compress(PG_FUNCTION_ARGS)
 {
 	GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-	GISTENTRY  *retval = NULL;
 
-	PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo));
+	PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo));
 }
 
 
diff --git a/contrib/btree_gist/btree_int4.c b/contrib/btree_gist/btree_int4.c
index 889a5120783346855056ecc16603653678957058..221301c001d9cf6d3b15ce202b9ea7296561f831 100644
--- a/contrib/btree_gist/btree_int4.c
+++ b/contrib/btree_gist/btree_int4.c
@@ -120,9 +120,8 @@ Datum
 gbt_int4_compress(PG_FUNCTION_ARGS)
 {
 	GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-	GISTENTRY  *retval = NULL;
 
-	PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo));
+	PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo));
 }
 
 
diff --git a/contrib/btree_gist/btree_int8.c b/contrib/btree_gist/btree_int8.c
index 8685cee1760ac24eccdeca9a747c885bac79bf35..9fade3c6d87f76deca093b061c212be8e3b16a52 100644
--- a/contrib/btree_gist/btree_int8.c
+++ b/contrib/btree_gist/btree_int8.c
@@ -120,9 +120,8 @@ Datum
 gbt_int8_compress(PG_FUNCTION_ARGS)
 {
 	GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-	GISTENTRY  *retval = NULL;
 
-	PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo));
+	PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo));
 }
 
 
diff --git a/contrib/btree_gist/btree_macaddr.c b/contrib/btree_gist/btree_macaddr.c
index ed58a1b7429b31493c8466ab31db87ef648477c0..69d7a72afb3332fd2879ea7dfc7e4b69c7d4f5ea 100644
--- a/contrib/btree_gist/btree_macaddr.c
+++ b/contrib/btree_gist/btree_macaddr.c
@@ -110,9 +110,8 @@ Datum
 gbt_macad_compress(PG_FUNCTION_ARGS)
 {
 	GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-	GISTENTRY  *retval = NULL;
 
-	PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo));
+	PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo));
 }
 
 
diff --git a/contrib/btree_gist/btree_numeric.c b/contrib/btree_gist/btree_numeric.c
index 02ccca86471ac0be76bf835562231262bea4b956..47b00209c8dbe6ce8e53db90a8fc2729a1d8f893 100644
--- a/contrib/btree_gist/btree_numeric.c
+++ b/contrib/btree_gist/btree_numeric.c
@@ -170,7 +170,7 @@ gbt_numeric_penalty(PG_FUNCTION_ARGS)
 				uk;
 
 	rk = gbt_var_key_readable(org);
-	uni = PointerGetDatum(gbt_var_key_copy(&rk, TRUE));
+	uni = PointerGetDatum(gbt_var_key_copy(&rk));
 	gbt_var_bin_union(&uni, newe, PG_GET_COLLATION(), &tinfo);
 	ok = gbt_var_key_readable(org);
 	uk = gbt_var_key_readable((GBT_VARKEY *) DatumGetPointer(uni));
diff --git a/contrib/btree_gist/btree_oid.c b/contrib/btree_gist/btree_oid.c
index f6b7bfa05b729bc97d28a65446710f8390f83c26..751b35df8eed1e00b186440bbe4ce37d7891104e 100644
--- a/contrib/btree_gist/btree_oid.c
+++ b/contrib/btree_gist/btree_oid.c
@@ -120,9 +120,8 @@ Datum
 gbt_oid_compress(PG_FUNCTION_ARGS)
 {
 	GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-	GISTENTRY  *retval = NULL;
 
-	PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo));
+	PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo));
 }
 
 
diff --git a/contrib/btree_gist/btree_time.c b/contrib/btree_gist/btree_time.c
index cdf81711e76513022692fabd228a0e892b08d3f8..a620e4a23c0730d60dc09fa07ddee9e8d38f653e 100644
--- a/contrib/btree_gist/btree_time.c
+++ b/contrib/btree_gist/btree_time.c
@@ -157,9 +157,8 @@ Datum
 gbt_time_compress(PG_FUNCTION_ARGS)
 {
 	GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-	GISTENTRY  *retval = NULL;
 
-	PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo));
+	PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo));
 }
 
 
diff --git a/contrib/btree_gist/btree_ts.c b/contrib/btree_gist/btree_ts.c
index d472d494c9c261bcd509ab01f3d0e0e6768d4b4f..80bbe34ff65a66ccbdd5ff1bf85ca158d25559a4 100644
--- a/contrib/btree_gist/btree_ts.c
+++ b/contrib/btree_gist/btree_ts.c
@@ -212,9 +212,8 @@ Datum
 gbt_ts_compress(PG_FUNCTION_ARGS)
 {
 	GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-	GISTENTRY  *retval = NULL;
 
-	PG_RETURN_POINTER(gbt_num_compress(retval, entry, &tinfo));
+	PG_RETURN_POINTER(gbt_num_compress(entry, &tinfo));
 }
 
 
diff --git a/contrib/btree_gist/btree_utils_num.c b/contrib/btree_gist/btree_utils_num.c
index 7adf3aac48e61e23e9e436163f579a3bfb6e542e..86a7f486f9f7c7dfe3b8dc7bce53fbefe3f274e8 100644
--- a/contrib/btree_gist/btree_utils_num.c
+++ b/contrib/btree_gist/btree_utils_num.c
@@ -11,8 +11,10 @@
 
 
 GISTENTRY *
-gbt_num_compress(GISTENTRY *retval, GISTENTRY *entry, const gbtree_ninfo *tinfo)
+gbt_num_compress(GISTENTRY *entry, const gbtree_ninfo *tinfo)
 {
+	GISTENTRY *retval;
+
 	if (entry->leafkey)
 	{
 		union
diff --git a/contrib/btree_gist/btree_utils_num.h b/contrib/btree_gist/btree_utils_num.h
index 0d79cd2a7f7c1d861d442fd6f381c94a5b952f01..05a313a1314981ace6ecb353ecde65f57ebafd9f 100644
--- a/contrib/btree_gist/btree_utils_num.h
+++ b/contrib/btree_gist/btree_utils_num.h
@@ -128,8 +128,7 @@ extern float8 gbt_num_distance(const GBT_NUMKEY_R *key, const void *query,
 extern GIST_SPLITVEC *gbt_num_picksplit(const GistEntryVector *entryvec, GIST_SPLITVEC *v,
 				  const gbtree_ninfo *tinfo);
 
-extern GISTENTRY *gbt_num_compress(GISTENTRY *retval, GISTENTRY *entry,
-				 const gbtree_ninfo *tinfo);
+extern GISTENTRY *gbt_num_compress(GISTENTRY *entry, const gbtree_ninfo *tinfo);
 
 
 extern void *gbt_num_union(GBT_NUMKEY *out, const GistEntryVector *entryvec,
diff --git a/contrib/btree_gist/btree_utils_var.c b/contrib/btree_gist/btree_utils_var.c
index 6ad33478d09f0b05fe54a145b702047481410d4a..e664211198e2efd0dd215036b2eb7ec08355a17b 100644
--- a/contrib/btree_gist/btree_utils_var.c
+++ b/contrib/btree_gist/btree_utils_var.c
@@ -66,26 +66,37 @@ gbt_var_key_readable(const GBT_VARKEY *k)
 }
 
 
+/*
+ * Create a leaf-entry to store in the index, from a single Datum.
+ */
+static GBT_VARKEY *
+gbt_var_key_from_datum(const struct varlena *u)
+{
+	int32		lowersize = VARSIZE(u);
+	GBT_VARKEY *r;
+
+	r = (GBT_VARKEY *) palloc(lowersize + VARHDRSZ);
+	memcpy(VARDATA(r), u, lowersize);
+	SET_VARSIZE(r, lowersize + VARHDRSZ);
+
+	return r;
+}
+
+/*
+ * Create an entry to store in the index, from lower and upper bound.
+ */
 GBT_VARKEY *
-gbt_var_key_copy(const GBT_VARKEY_R *u, bool force_node)
+gbt_var_key_copy(const GBT_VARKEY_R *u)
 {
-	GBT_VARKEY *r = NULL;
 	int32		lowersize = VARSIZE(u->lower);
 	int32		uppersize = VARSIZE(u->upper);
+	GBT_VARKEY *r;
+
+	r = (GBT_VARKEY *) palloc0(INTALIGN(lowersize) + uppersize + VARHDRSZ);
+	memcpy(VARDATA(r), u->lower, lowersize);
+	memcpy(VARDATA(r) + INTALIGN(lowersize), u->upper, uppersize);
+	SET_VARSIZE(r, INTALIGN(lowersize) + uppersize + VARHDRSZ);
 
-	if (u->lower == u->upper && !force_node)
-	{							/* leaf key mode */
-		r = (GBT_VARKEY *) palloc(lowersize + VARHDRSZ);
-		memcpy(VARDATA(r), u->lower, lowersize);
-		SET_VARSIZE(r, lowersize + VARHDRSZ);
-	}
-	else
-	{							/* node key mode  */
-		r = (GBT_VARKEY *) palloc0(INTALIGN(lowersize) + uppersize + VARHDRSZ);
-		memcpy(VARDATA(r), u->lower, lowersize);
-		memcpy(VARDATA(r) + INTALIGN(lowersize), u->upper, uppersize);
-		SET_VARSIZE(r, INTALIGN(lowersize) + uppersize + VARHDRSZ);
-	}
 	return r;
 }
 
@@ -255,18 +266,17 @@ gbt_var_bin_union(Datum *u, GBT_VARKEY *e, Oid collation,
 		}
 
 		if (update)
-			*u = PointerGetDatum(gbt_var_key_copy(&nr, TRUE));
+			*u = PointerGetDatum(gbt_var_key_copy(&nr));
 	}
 	else
 	{
 		nr.lower = eo.lower;
 		nr.upper = eo.upper;
-		*u = PointerGetDatum(gbt_var_key_copy(&nr, TRUE));
+		*u = PointerGetDatum(gbt_var_key_copy(&nr));
 	}
 }
 
 
-
 GISTENTRY *
 gbt_var_compress(GISTENTRY *entry, const gbtree_vinfo *tinfo)
 {
@@ -274,12 +284,10 @@ gbt_var_compress(GISTENTRY *entry, const gbtree_vinfo *tinfo)
 
 	if (entry->leafkey)
 	{
-		GBT_VARKEY *r = NULL;
-		bytea	   *leaf = (bytea *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
-		GBT_VARKEY_R u;
+		struct varlena *leaf = PG_DETOAST_DATUM(entry->key);
+		GBT_VARKEY *r;
 
-		u.lower = u.upper = leaf;
-		r = gbt_var_key_copy(&u, FALSE);
+		r = gbt_var_key_from_datum(leaf);
 
 		retval = palloc(sizeof(GISTENTRY));
 		gistentryinit(*retval, PointerGetDatum(r),
@@ -293,7 +301,6 @@ gbt_var_compress(GISTENTRY *entry, const gbtree_vinfo *tinfo)
 }
 
 
-
 GBT_VARKEY *
 gbt_var_union(const GistEntryVector *entryvec, int32 *size, Oid collation,
 			  const gbtree_vinfo *tinfo)
@@ -308,7 +315,7 @@ gbt_var_union(const GistEntryVector *entryvec, int32 *size, Oid collation,
 
 	cur = (GBT_VARKEY *) DatumGetPointer(entryvec->vector[0].key);
 	rk = gbt_var_key_readable(cur);
-	out = PointerGetDatum(gbt_var_key_copy(&rk, TRUE));
+	out = PointerGetDatum(gbt_var_key_copy(&rk));
 
 	for (i = 1; i < numranges; i++)
 	{
diff --git a/contrib/btree_gist/btree_utils_var.h b/contrib/btree_gist/btree_utils_var.h
index 7a3eeec01a0e057d45f0afdf92e0e5e0101fe87a..9a7c4d10554a527fa4fd038e6ea9650be22391c8 100644
--- a/contrib/btree_gist/btree_utils_var.h
+++ b/contrib/btree_gist/btree_utils_var.h
@@ -47,7 +47,7 @@ typedef struct
 
 extern GBT_VARKEY_R gbt_var_key_readable(const GBT_VARKEY *k);
 
-extern GBT_VARKEY *gbt_var_key_copy(const GBT_VARKEY_R *u, bool force_node);
+extern GBT_VARKEY *gbt_var_key_copy(const GBT_VARKEY_R *u);
 
 extern GISTENTRY *gbt_var_compress(GISTENTRY *entry, const gbtree_vinfo *tinfo);