diff --git a/storage/innobase/dict/dict0dict.cc b/storage/innobase/dict/dict0dict.cc index 90fc384c76d..d335e148ca8 100644 --- a/storage/innobase/dict/dict0dict.cc +++ b/storage/innobase/dict/dict0dict.cc @@ -2485,6 +2485,7 @@ dberr_t dict_index_add_to_cache_w_vcol(dict_table_t *table, dict_index_t *index, ut_ad(field->col->ord_part == 1); } + new_index->heap->check_zero_alloc = false; new_index->stat_n_diff_key_vals = static_cast(mem_heap_zalloc( new_index->heap, dict_index_get_n_unique(new_index) * sizeof(*new_index->stat_n_diff_key_vals))); diff --git a/storage/innobase/dict/mem.cc b/storage/innobase/dict/mem.cc index b35b3cdfe50..c58f16e6ca9 100644 --- a/storage/innobase/dict/mem.cc +++ b/storage/innobase/dict/mem.cc @@ -230,6 +230,7 @@ dict_table_t *dict_mem_table_create( table->cols = static_cast( mem_heap_alloc(heap, table->n_cols * sizeof(dict_col_t))); + heap->check_zero_alloc = false; table->v_cols = static_cast( mem_heap_alloc(heap, n_v_cols * sizeof(*table->v_cols))); diff --git a/storage/innobase/include/data0data.h b/storage/innobase/include/data0data.h index 649a9865dc6..f2cf6d78d04 100644 --- a/storage/innobase/include/data0data.h +++ b/storage/innobase/include/data0data.h @@ -498,6 +498,7 @@ struct multi_value_data { @param[in,out] heap memory heap */ void copy_low(const multi_value_data *multi_value, mem_heap_t *heap) { ut_ad(num_alc >= multi_value->num_v); + heap->check_zero_alloc = false; for (uint32_t i = 0; i < multi_value->num_v; ++i) { datap[i] = mem_heap_dup(heap, multi_value->datap[i], multi_value->data_len[i]); diff --git a/storage/innobase/include/data0data.ic b/storage/innobase/include/data0data.ic index aa260a3aa9a..773a0832832 100644 --- a/storage/innobase/include/data0data.ic +++ b/storage/innobase/include/data0data.ic @@ -217,6 +217,7 @@ static inline void dfield_dup( if (!dfield_is_null(field) && field->data != nullptr) { UNIV_MEM_ASSERT_RW(field->data, field->len); + heap->check_zero_alloc = false; field->data = mem_heap_dup(heap, field->data, field->len); } } diff --git a/storage/innobase/include/mem0mem.h b/storage/innobase/include/mem0mem.h index e4fc9b73fd2..86136f7ecdb 100644 --- a/storage/innobase/include/mem0mem.h +++ b/storage/innobase/include/mem0mem.h @@ -365,6 +365,7 @@ struct mem_block_info_t { /* if this block has been allocated from the buffer pool, this contains the buf_block_t handle; otherwise, this is NULL */ + bool check_zero_alloc; }; /* We use the UT_LIST_BASE_NODE_T_EXTERN instead of simpler UT_LIST_BASE_NODE_T because DevStudio12.6 initializes the pointer-to-member offset to 0 otherwise.*/ diff --git a/storage/innobase/include/mem0mem.ic b/storage/innobase/include/mem0mem.ic index a3a1bf47966..82729c8654f 100644 --- a/storage/innobase/include/mem0mem.ic +++ b/storage/innobase/include/mem0mem.ic @@ -152,7 +152,8 @@ static inline void *mem_heap_alloc(mem_heap_t *heap, ulint n) { byte *buf; ulint free; - if (n == 0) { + if (heap->check_zero_alloc && n == 0) { + ut_ad(0); return (nullptr); } diff --git a/storage/innobase/lob/lob0lob.cc b/storage/innobase/lob/lob0lob.cc index 959870f8fde..c1ebebc0acd 100644 --- a/storage/innobase/lob/lob0lob.cc +++ b/storage/innobase/lob/lob0lob.cc @@ -925,6 +925,7 @@ byte *btr_copy_externally_stored_field_func( extern_len = mach_read_from_4(data + local_len + BTR_EXTERN_LEN + 4); + heap->check_zero_alloc = false; buf = (byte *)mem_heap_alloc(heap, local_len + extern_len); ReadContext rctx(page_size, data, local_len + BTR_EXTERN_FIELD_REF_SIZE, diff --git a/storage/innobase/mem/memory.cc b/storage/innobase/mem/memory.cc index 310b6bb4452..6c47ba79504 100644 --- a/storage/innobase/mem/memory.cc +++ b/storage/innobase/mem/memory.cc @@ -335,6 +335,7 @@ mem_block_t *mem_heap_create_block_func( mem_block_set_type(block, type); mem_block_set_start(block, MEM_BLOCK_HEADER_SIZE); mem_block_set_free(block, MEM_BLOCK_HEADER_SIZE); + block->check_zero_alloc = true; if (UNIV_UNLIKELY(heap == nullptr)) { /* This is the first block of the heap. The field diff --git a/storage/innobase/page/page0zip.cc b/storage/innobase/page/page0zip.cc index 58f883bfe8f..74bb8a3a8bc 100644 --- a/storage/innobase/page/page0zip.cc +++ b/storage/innobase/page/page0zip.cc @@ -1053,6 +1053,7 @@ ibool page_zip_compress(page_zip_des_t *page_zip, /*!< in: size; out: data, n_dense * ((sizeof *recs) - PAGE_ZIP_DIR_SLOT_SIZE) + UNIV_PAGE_SIZE * 4 + (512 << MAX_MEM_LEVEL)); + heap->check_zero_alloc = false; recs = static_cast( mem_heap_zalloc(heap, n_dense * sizeof *recs)); diff --git a/storage/innobase/page/zipdecompress.cc b/storage/innobase/page/zipdecompress.cc index 72d8523585a..6edea680299 100644 --- a/storage/innobase/page/zipdecompress.cc +++ b/storage/innobase/page/zipdecompress.cc @@ -1421,6 +1421,7 @@ ibool page_zip_decompress_low( heap = mem_heap_create(n_dense * (3 * sizeof *recs) + UNIV_PAGE_SIZE); + heap->check_zero_alloc = false; recs = static_cast(mem_heap_alloc(heap, n_dense * sizeof *recs)); if (all) { diff --git a/storage/innobase/rem/rem0rec.cc b/storage/innobase/rem/rem0rec.cc index 32633ad1798..a9482207b4a 100644 --- a/storage/innobase/rem/rem0rec.cc +++ b/storage/innobase/rem/rem0rec.cc @@ -1071,6 +1071,7 @@ void rec_copy_prefix_to_dtuple( data = rec_get_nth_field_instant(rec, offsets, i, index, &len); if (len != UNIV_SQL_NULL) { + heap->check_zero_alloc = false; dfield_set_data(field, mem_heap_dup(heap, data, len), len); ut_ad(!rec_offs_nth_extern(offsets, i)); } else { diff --git a/storage/innobase/row/row0sel.cc b/storage/innobase/row/row0sel.cc index 76723dfa0dc..193ab9fc2d9 100644 --- a/storage/innobase/row/row0sel.cc +++ b/storage/innobase/row/row0sel.cc @@ -2905,6 +2905,7 @@ void row_sel_field_store_in_mysql_format_func(byte *dest, } heap = blob_heap; + heap->check_zero_alloc = false; data = static_cast(mem_heap_dup(heap, data, len)); }