diff --git a/row/row0merge.c b/row/row0merge.c index 66d7c113d0e..fb6bc4e6b64 100644 --- a/row/row0merge.c +++ b/row/row0merge.c @@ -277,7 +277,7 @@ row_merge_buf_add( the encoded length of extra_size and the extra bytes (extra_size). See row_merge_buf_write() for the variable-length encoding of extra_size. */ - data_size += extra_size + (extra_size >= 127); + data_size += (extra_size + 1) + ((extra_size + 1) >= 0x80); /* Reserve one byte for the end marker of row_merge_block_t. */ if (buf->total_size + data_size >= sizeof(row_merge_block_t) - 1) { @@ -400,7 +400,7 @@ row_merge_buf_write( if (extra_size + 1 < 0x80) { *b++ = extra_size + 1; } else { - ut_ad(extra_size < 0x8000); + ut_ad((extra_size + 1) < 0x8000); *b++ = 0x80 | ((extra_size + 1) >> 8); *b++ = (byte) (extra_size + 1); } @@ -416,6 +416,7 @@ row_merge_buf_write( /* Write an "end-of-chunk" marker. */ ut_a(b < block[1]); + ut_a(b == block[0] + buf->total_size); *b++ = 0; #ifdef UNIV_DEBUG_VALGRIND /* The rest of the block is uninitialized. Initialize it @@ -435,7 +436,7 @@ row_merge_heap_create( ulint** offsets1, /* out: offsets */ ulint** offsets2) /* out: offsets */ { - ulint i = REC_OFFS_HEADER_SIZE + ulint i = 1 + REC_OFFS_HEADER_SIZE + dict_index_get_n_fields(index); mem_heap_t* heap = mem_heap_create(2 * i * sizeof *offsets1); @@ -552,7 +553,7 @@ row_merge_read_rec( ut_ad(mrec); ut_ad(offsets); - ut_ad(*offsets == REC_OFFS_HEADER_SIZE + ut_ad(*offsets == 1 + REC_OFFS_HEADER_SIZE + dict_index_get_n_fields(index)); extra_size = *b++; @@ -1048,16 +1049,17 @@ merged: if (mrec0) { /* append all mrec0 to output */ for (;;) { - ROW_MERGE_WRITE_GET_NEXT(0, break); + ROW_MERGE_WRITE_GET_NEXT(0, goto done0); } } - +done0: if (mrec1) { /* append all mrec1 to output */ for (;;) { - ROW_MERGE_WRITE_GET_NEXT(1, break); + ROW_MERGE_WRITE_GET_NEXT(1, goto done1); } } +done1: mem_heap_free(heap); b2 = row_merge_write_eof(&block[2], b2, of->fd, &of->offset); @@ -1199,7 +1201,7 @@ row_merge_insert_index_tuples( tuple_heap = mem_heap_create(1000); { - ulint i = REC_OFFS_HEADER_SIZE + ulint i = 1 + REC_OFFS_HEADER_SIZE + dict_index_get_n_fields(index); offsets = mem_heap_alloc(graph_heap, i * sizeof *offsets); offsets[0] = i;