diff --git a/src/backend/utils/adt/jsonb_util.c b/src/backend/utils/adt/jsonb_util.c
index 04f35bf..2297504 100644
*** a/src/backend/utils/adt/jsonb_util.c
--- b/src/backend/utils/adt/jsonb_util.c
*************** convertJsonbArray(StringInfo buffer, JEn
*** 1378,1385 ****
  					 errmsg("total size of jsonb array elements exceeds the maximum of %u bytes",
  							JENTRY_POSMASK)));
  
- 		if (i > 0)
- 			meta = (meta & ~JENTRY_POSMASK) | totallen;
  		copyToBuffer(buffer, metaoffset, (char *) &meta, sizeof(JEntry));
  		metaoffset += sizeof(JEntry);
  	}
--- 1378,1383 ----
*************** convertJsonbObject(StringInfo buffer, JE
*** 1430,1437 ****
  					 errmsg("total size of jsonb array elements exceeds the maximum of %u bytes",
  							JENTRY_POSMASK)));
  
- 		if (i > 0)
- 			meta = (meta & ~JENTRY_POSMASK) | totallen;
  		copyToBuffer(buffer, metaoffset, (char *) &meta, sizeof(JEntry));
  		metaoffset += sizeof(JEntry);
  
--- 1428,1433 ----
*************** convertJsonbObject(StringInfo buffer, JE
*** 1445,1451 ****
  					 errmsg("total size of jsonb array elements exceeds the maximum of %u bytes",
  							JENTRY_POSMASK)));
  
- 		meta = (meta & ~JENTRY_POSMASK) | totallen;
  		copyToBuffer(buffer, metaoffset, (char *) &meta, sizeof(JEntry));
  		metaoffset += sizeof(JEntry);
  	}
--- 1441,1446 ----
*************** uniqueifyJsonbObject(JsonbValue *object)
*** 1592,1594 ****
--- 1587,1600 ----
  		object->val.object.nPairs = res + 1 - object->val.object.pairs;
  	}
  }
+ 
+ uint32
+ jsonb_get_offset(const JEntry *ja, int index)
+ {
+ 	uint32	off = 0;
+ 	int i;
+ 
+ 	for (i = 0; i < index; i++)
+ 		off += JBE_LEN(ja, i);
+ 	return off;
+ }
diff --git a/src/include/utils/jsonb.h b/src/include/utils/jsonb.h
index 5f2594b..c9b18e1 100644
*** a/src/include/utils/jsonb.h
--- b/src/include/utils/jsonb.h
*************** typedef uint32 JEntry;
*** 153,162 ****
   * Macros for getting the offset and length of an element. Note multiple
   * evaluations and access to prior array element.
   */
! #define JBE_ENDPOS(je_)			((je_) & JENTRY_POSMASK)
! #define JBE_OFF(ja, i)			((i) == 0 ? 0 : JBE_ENDPOS((ja)[i - 1]))
! #define JBE_LEN(ja, i)			((i) == 0 ? JBE_ENDPOS((ja)[i]) \
! 								 : JBE_ENDPOS((ja)[i]) - JBE_ENDPOS((ja)[i - 1]))
  
  /*
   * A jsonb array or object node, within a Jsonb Datum.
--- 153,163 ----
   * Macros for getting the offset and length of an element. Note multiple
   * evaluations and access to prior array element.
   */
! #define JBE_LENFLD(je_)			((je_) & JENTRY_POSMASK)
! #define JBE_OFF(ja, i)			jsonb_get_offset(ja, i)
! #define JBE_LEN(ja, i)			JBE_LENFLD((ja)[i])
! 
! extern uint32 jsonb_get_offset(const JEntry *ja, int index);
  
  /*
   * A jsonb array or object node, within a Jsonb Datum.
