diff --git a/contrib/btree_gist/btree_utils_var.c b/contrib/btree_gist/btree_utils_var.c
index 9f8a132..691b103 100644
*** a/contrib/btree_gist/btree_utils_var.c
--- b/contrib/btree_gist/btree_utils_var.c
*************** void
*** 225,237 ****
  gbt_var_bin_union(Datum *u, GBT_VARKEY *e, Oid collation,
  				  const gbtree_vinfo *tinfo)
  {
- 	GBT_VARKEY *nk = NULL;
- 	GBT_VARKEY *tmp = NULL;
- 	GBT_VARKEY_R nr;
  	GBT_VARKEY_R eo = gbt_var_key_readable(e);
  
  	if (eo.lower == eo.upper)	/* leaf */
  	{
  		tmp = gbt_var_leaf2node(e, tinfo);
  		if (tmp != e)
  			eo = gbt_var_key_readable(tmp);
--- 225,237 ----
  gbt_var_bin_union(Datum *u, GBT_VARKEY *e, Oid collation,
  				  const gbtree_vinfo *tinfo)
  {
  	GBT_VARKEY_R eo = gbt_var_key_readable(e);
+ 	GBT_VARKEY_R nr;
  
  	if (eo.lower == eo.upper)	/* leaf */
  	{
+ 		GBT_VARKEY *tmp;
+ 
  		tmp = gbt_var_leaf2node(e, tinfo);
  		if (tmp != e)
  			eo = gbt_var_key_readable(tmp);
*************** gbt_var_bin_union(Datum *u, GBT_VARKEY *
*** 239,263 ****
  
  	if (DatumGetPointer(*u))
  	{
- 
  		GBT_VARKEY_R ro = gbt_var_key_readable((GBT_VARKEY *) DatumGetPointer(*u));
  
  		if ((*tinfo->f_cmp) (ro.lower, eo.lower, collation) > 0)
  		{
  			nr.lower = eo.lower;
! 			nr.upper = ro.upper;
! 			nk = gbt_var_key_copy(&nr, TRUE);
  		}
  
  		if ((*tinfo->f_cmp) (ro.upper, eo.upper, collation) < 0)
  		{
  			nr.upper = eo.upper;
! 			nr.lower = ro.lower;
! 			nk = gbt_var_key_copy(&nr, TRUE);
  		}
  
! 		if (nk)
! 			*u = PointerGetDatum(nk);
  	}
  	else
  	{
--- 239,264 ----
  
  	if (DatumGetPointer(*u))
  	{
  		GBT_VARKEY_R ro = gbt_var_key_readable((GBT_VARKEY *) DatumGetPointer(*u));
+ 		bool		update = false;
+ 
+ 		nr.lower = ro.lower;
+ 		nr.upper = ro.upper;
  
  		if ((*tinfo->f_cmp) (ro.lower, eo.lower, collation) > 0)
  		{
  			nr.lower = eo.lower;
! 			update = true;
  		}
  
  		if ((*tinfo->f_cmp) (ro.upper, eo.upper, collation) < 0)
  		{
  			nr.upper = eo.upper;
! 			update = true;
  		}
  
! 		if (update)
! 			*u = PointerGetDatum(gbt_var_key_copy(&nr, TRUE));
  	}
  	else
  	{
diff --git a/src/backend/access/gist/gistsplit.c b/src/backend/access/gist/gistsplit.c
index a96b881..eac4977 100644
*** a/src/backend/access/gist/gistsplit.c
--- b/src/backend/access/gist/gistsplit.c
*************** gistunionsubkeyvec(GISTSTATE *giststate,
*** 49,55 ****
  		cleanedItVec[cleanedLen++] = itvec[gsvp->entries[i] - 1];
  	}
  
! 	gistMakeUnionItVec(giststate, cleanedItVec, cleanedLen, startkey,
  					   gsvp->attr, gsvp->isnull);
  
  	pfree(cleanedItVec);
--- 49,57 ----
  		cleanedItVec[cleanedLen++] = itvec[gsvp->entries[i] - 1];
  	}
  
! 	memset(gsvp->isnull, TRUE, sizeof(bool) * giststate->tupdesc->natts);
! 
! 	gistMakeUnionItVec(giststate, cleanedItVec, cleanedLen, 0,
  					   gsvp->attr, gsvp->isnull);
  
  	pfree(cleanedItVec);
