Index: include/data0type.h
===================================================================
--- include/data0type.h	(revision 782)
+++ include/data0type.h	(working copy)
@@ -366,7 +366,9 @@ dtype_new_store_for_order_and_null_size(
 	byte*		buf,	/* in: buffer for
 				DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE
 				bytes where we store the info */
-	dtype_t*	type);	/* in: type struct */
+	dtype_t*	type,	/* in: type struct */
+	ulint		prefix_len);/* in: prefix length to
+				replace type->len, or 0 */
 /**************************************************************************
 Reads to a type the stored information which determines its alphabetical
 ordering and the storage size of an SQL NULL value. This is the 4.1.x storage
Index: include/data0type.ic
===================================================================
--- include/data0type.ic	(revision 782)
+++ include/data0type.ic	(working copy)
@@ -230,11 +230,14 @@ dtype_new_store_for_order_and_null_size(
 	byte*		buf,	/* in: buffer for
 				DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE
 				bytes where we store the info */
-	dtype_t*	type)	/* in: type struct */
+	dtype_t*	type,	/* in: type struct */
+	ulint		prefix_len)/* in: prefix length to
+				replace type->len, or 0 */
 {
 #if 6 != DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE
 #error "6 != DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE"
 #endif
+	ulint	len;
 
 	buf[0] = (byte)(type->mtype & 0xFFUL);
 
@@ -249,7 +252,9 @@ dtype_new_store_for_order_and_null_size(
 
 	buf[1] = (byte)(type->prtype & 0xFFUL);
 
-	mach_write_to_2(buf + 2, type->len & 0xFFFFUL);
+	len = prefix_len ? prefix_len : type->len;
+
+	mach_write_to_2(buf + 2, len & 0xFFFFUL);
 
 	ut_ad(dtype_get_charset_coll(type->prtype) < 256);
 	mach_write_to_2(buf + 4, dtype_get_charset_coll(type->prtype));
Index: ibuf/ibuf0ibuf.c
===================================================================
--- ibuf/ibuf0ibuf.c	(revision 782)
+++ ibuf/ibuf0ibuf.c	(working copy)
@@ -1361,8 +1361,8 @@ ibuf_entry_build(
 				index tree; NOTE that the original entry
 				must be kept because we copy pointers to its
 				fields */
+	dict_index_t*	index,	/* in: non-clustered index */
 	dtuple_t*	entry,	/* in: entry for a non-clustered index */
-	ibool		comp,	/* in: flag: TRUE=compact record format */
 	ulint		space,	/* in: space id */
 	ulint		page_no,/* in: index page number where entry should
 				be inserted */
@@ -1426,13 +1426,13 @@ ibuf_entry_build(
 
 	dfield_set_data(field, buf, 4);
 
-	ut_ad(comp == 0 || comp == 1);
+	ut_ad(index->table->comp <= 1);
 	/* Store the type info in buf2, and add the fields from entry to
 	tuple */
 	buf2 = mem_heap_alloc(heap, n_fields
 					* DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE
-					+ comp);
-	if (comp) {
+					+ index->table->comp);
+	if (index->table->comp) {
 		*buf2++ = 0; /* write the compact format indicator */
 	}
 	for (i = 0; i < n_fields; i++) {
@@ -1445,20 +1445,22 @@ ibuf_entry_build(
 
 		dtype_new_store_for_order_and_null_size(
 				buf2 + i * DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE,
-				dfield_get_type(entry_field));
+				dfield_get_type(entry_field),
+				dict_index_get_nth_field(index, i)
+				->prefix_len);
 	}
 
 	/* Store the type info in buf2 to field 3 of tuple */
 
 	field = dtuple_get_nth_field(tuple, 3);
 
-	if (comp) {
+	if (index->table->comp) {
 		buf2--;
 	}
 
 	dfield_set_data(field, buf2, n_fields
 					* DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE
-					+ comp);
+					+ index->table->comp);
 	/* Set all the types in the new tuple binary */
 
 	dtuple_set_types_binary(tuple, n_fields + 4);
@@ -2589,8 +2591,7 @@ ibuf_insert_low(
 	the first fields and the type information for other fields, and which
 	will be inserted to the insert buffer. */
 
-	ibuf_entry = ibuf_entry_build(entry, index->table->comp,
-						space, page_no, heap);
+	ibuf_entry = ibuf_entry_build(index, entry, space, page_no, heap);
 
 	/* Open a cursor to the insert buffer tree to calculate if we can add
 	the new entry to it without exceeding the free space limit for the
