diff options
Diffstat (limited to 'sql/table.cc')
-rw-r--r-- | sql/table.cc | 57 |
1 files changed, 35 insertions, 22 deletions
diff --git a/sql/table.cc b/sql/table.cc index 4604a9a6958..9c90e5026b8 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -2585,7 +2585,7 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share, bool is_create_table) { enum open_frm_error error; - uint records, i, bitmap_size; + uint records, i, bitmap_size, bitmap_count; bool error_reported= FALSE; uchar *record, *bitmaps; Field **field_ptr, **UNINIT_VAR(vfield_ptr), **UNINIT_VAR(dfield_ptr); @@ -2885,28 +2885,42 @@ partititon_err: /* Allocate bitmaps */ bitmap_size= share->column_bitmap_size; - if (!(bitmaps= (uchar*) alloc_root(&outparam->mem_root, bitmap_size*7))) + bitmap_count= 6; + if (share->vfields) + { + if (!(outparam->def_vcol_set= (MY_BITMAP*) + alloc_root(&outparam->mem_root, sizeof(*outparam->def_vcol_set)))) + goto err; + bitmap_count++; + } + if (!(bitmaps= (uchar*) alloc_root(&outparam->mem_root, + bitmap_size * bitmap_count))) goto err; + my_bitmap_init(&outparam->def_read_set, (my_bitmap_map*) bitmaps, share->fields, FALSE); + bitmaps+= bitmap_size; my_bitmap_init(&outparam->def_write_set, - (my_bitmap_map*) (bitmaps+bitmap_size), share->fields, - FALSE); - my_bitmap_init(&outparam->def_vcol_set, - (my_bitmap_map*) (bitmaps+bitmap_size*2), share->fields, - FALSE); + (my_bitmap_map*) bitmaps, share->fields, FALSE); + bitmaps+= bitmap_size; + if (share->vfields) + { + /* Don't allocate vcol_bitmap if we don't need it */ + my_bitmap_init(outparam->def_vcol_set, + (my_bitmap_map*) bitmaps, share->fields, FALSE); + bitmaps+= bitmap_size; + } my_bitmap_init(&outparam->tmp_set, - (my_bitmap_map*) (bitmaps+bitmap_size*3), share->fields, - FALSE); + (my_bitmap_map*) bitmaps, share->fields, FALSE); + bitmaps+= bitmap_size; my_bitmap_init(&outparam->eq_join_set, - (my_bitmap_map*) (bitmaps+bitmap_size*4), share->fields, - FALSE); + (my_bitmap_map*) bitmaps, share->fields, FALSE); + bitmaps+= bitmap_size; my_bitmap_init(&outparam->cond_set, - (my_bitmap_map*) (bitmaps+bitmap_size*5), share->fields, - FALSE); + (my_bitmap_map*) bitmaps, share->fields, FALSE); + bitmaps+= bitmap_size; my_bitmap_init(&outparam->def_rpl_write_set, - (my_bitmap_map*) (bitmaps+bitmap_size*6), share->fields, - FALSE); + (my_bitmap_map*) bitmaps, share->fields, FALSE); outparam->default_column_bitmaps(); outparam->cond_selectivity= 1.0; @@ -2955,10 +2969,6 @@ partititon_err: } } -#if defined(HAVE_valgrind) && !defined(DBUG_OFF) - bzero((char*) bitmaps, bitmap_size*3); -#endif - if (share->table_category == TABLE_CATEGORY_LOG) { outparam->no_replicate= TRUE; @@ -5683,10 +5693,13 @@ void TABLE::clear_column_bitmaps() Reset column read/write usage. It's identical to: bitmap_clear_all(&table->def_read_set); bitmap_clear_all(&table->def_write_set); - bitmap_clear_all(&table->def_vcol_set); + if (s->vfields) bitmap_clear_all(table->def_vcol_set); + The code assumes that the bitmaps are allocated after each other, as + guaranteed by open_table_from_share() */ - bzero((char*) def_read_set.bitmap, s->column_bitmap_size*3); - column_bitmaps_set(&def_read_set, &def_write_set, &def_vcol_set); + bzero((char*) def_read_set.bitmap, + s->column_bitmap_size * (s->vfields ? 3 : 2)); + column_bitmaps_set(&def_read_set, &def_write_set, def_vcol_set); rpl_write_set= 0; // Safety } |