summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMonty <monty@mariadb.org>2015-11-06 13:02:19 +0200
committerMonty <monty@mariadb.org>2015-11-10 13:46:57 +0200
commite3868ee07273b1ea2c495d92891fd7d1ed1eea9e (patch)
tree63e0bc0ba9c05cf3fb098b83cbb6782df47a8897
parent93d1e5ce0b841bedbc071da85995f15611ed3d34 (diff)
downloadmariadb-git-e3868ee07273b1ea2c495d92891fd7d1ed1eea9e.tar.gz
Don't store vcol bitmaps in TABLE if table doesn't have virtual fields.
(Makes TABLE a bit smaller)
-rw-r--r--sql/field.cc2
-rw-r--r--sql/sql_handler.cc3
-rw-r--r--sql/sql_insert.cc15
-rw-r--r--sql/sql_lex.cc3
-rw-r--r--sql/sql_select.cc19
-rw-r--r--sql/table.cc57
-rw-r--r--sql/table.h9
7 files changed, 67 insertions, 41 deletions
diff --git a/sql/field.cc b/sql/field.cc
index e3794986161..585abad2cdc 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -71,7 +71,7 @@ const char field_separator=',';
((ulong) ((1LL << MY_MIN(arg, 4) * 8) - 1))
#define ASSERT_COLUMN_MARKED_FOR_READ DBUG_ASSERT(!table || (!table->read_set || bitmap_is_set(table->read_set, field_index)))
-#define ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED DBUG_ASSERT(is_stat_field || !table || (!table->write_set || bitmap_is_set(table->write_set, field_index) || bitmap_is_set(table->vcol_set, field_index)))
+#define ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED DBUG_ASSERT(is_stat_field || !table || (!table->write_set || bitmap_is_set(table->write_set, field_index) || (table->vcol_set && bitmap_is_set(table->vcol_set, field_index))))
#define FLAGSTR(S,F) ((S) & (F) ? #F " " : "")
diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc
index 673af54ffeb..05e333e37fc 100644
--- a/sql/sql_handler.cc
+++ b/sql/sql_handler.cc
@@ -375,7 +375,8 @@ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, SQL_HANDLER *reopen)
/* Always read all columns */
table->read_set= &table->s->all_set;
- table->vcol_set= &table->s->all_set;
+ if (table->vcol_set)
+ table->vcol_set= &table->s->all_set;
/* Restore the state. */
thd->set_open_tables(backup_open_tables);
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 8d36a763b90..574e0892872 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -2470,6 +2470,9 @@ TABLE *Delayed_insert::get_local_table(THD* client_thd)
if (share->vfields)
{
+ if (!(copy->def_vcol_set= (MY_BITMAP*) alloc_root(client_thd->mem_root,
+ sizeof(MY_BITMAP))))
+ goto error;
copy->vfield= vfield;
for (field= copy->field; *field; field++)
{
@@ -2502,13 +2505,17 @@ TABLE *Delayed_insert::get_local_table(THD* client_thd)
copy->def_read_set.bitmap= (my_bitmap_map*) bitmap;
copy->def_write_set.bitmap= ((my_bitmap_map*)
(bitmap + share->column_bitmap_size));
- copy->def_vcol_set.bitmap= ((my_bitmap_map*)
- (bitmap + 2*share->column_bitmap_size));
+ if (share->vfields)
+ {
+ my_bitmap_init(copy->def_vcol_set,
+ (my_bitmap_map*) (bitmap + 2*share->column_bitmap_size),
+ share->fields, FALSE);
+ copy->vcol_set= copy->def_vcol_set;
+ }
copy->tmp_set.bitmap= 0; // To catch errors
- bzero((char*) bitmap, share->column_bitmap_size*3);
+ bzero((char*) bitmap, share->column_bitmap_size + (share->vfields ? 3 : 2));
copy->read_set= &copy->def_read_set;
copy->write_set= &copy->def_write_set;
- copy->vcol_set= &copy->def_vcol_set;
DBUG_RETURN(copy);
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index 8b3b9075d26..3c4f99d1a7c 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -3867,7 +3867,8 @@ void SELECT_LEX::update_used_tables()
tab->covering_keys.intersect(tab->keys_in_use_for_query);
tab->merge_keys.clear_all();
bitmap_clear_all(tab->read_set);
- bitmap_clear_all(tab->vcol_set);
+ if (tab->vcol_set)
+ bitmap_clear_all(tab->vcol_set);
break;
}
}
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index d22f43a5bbc..78cf91decc7 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -16141,20 +16141,21 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
void setup_tmp_table_column_bitmaps(TABLE *table, uchar *bitmaps)
{
uint field_count= table->s->fields;
+ uint bitmap_size= bitmap_buffer_size(field_count);
+
+ DBUG_ASSERT(table->s->vfields == 0 && table->def_vcol_set == 0);
+
my_bitmap_init(&table->def_read_set, (my_bitmap_map*) bitmaps, field_count,
FALSE);
- my_bitmap_init(&table->def_vcol_set,
- (my_bitmap_map*) (bitmaps+ bitmap_buffer_size(field_count)),
- field_count, FALSE);
+ bitmaps+= bitmap_size;
my_bitmap_init(&table->tmp_set,
- (my_bitmap_map*) (bitmaps+ 2*bitmap_buffer_size(field_count)),
- field_count, FALSE);
+ (my_bitmap_map*) bitmaps, field_count, FALSE);
+ bitmaps+= bitmap_size;
my_bitmap_init(&table->eq_join_set,
- (my_bitmap_map*) (bitmaps+ 3*bitmap_buffer_size(field_count)),
- field_count, FALSE);
+ (my_bitmap_map*) bitmaps, field_count, FALSE);
+ bitmaps+= bitmap_size;
my_bitmap_init(&table->cond_set,
- (my_bitmap_map*) (bitmaps+ 4*bitmap_buffer_size(field_count)),
- field_count, FALSE);
+ (my_bitmap_map*) bitmaps, field_count, FALSE);
/* write_set and all_set are copies of read_set */
table->def_write_set= table->def_read_set;
table->s->all_set= table->def_read_set;
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
}
diff --git a/sql/table.h b/sql/table.h
index 6ecfdefc088..ab3960300e6 100644
--- a/sql/table.h
+++ b/sql/table.h
@@ -1065,12 +1065,15 @@ public:
ORDER *group;
String alias; /* alias or table name */
uchar *null_flags;
- MY_BITMAP def_read_set, def_write_set, def_vcol_set, tmp_set;
+ MY_BITMAP def_read_set, def_write_set, tmp_set;
MY_BITMAP def_rpl_write_set;
MY_BITMAP eq_join_set; /* used to mark equi-joined fields */
MY_BITMAP cond_set; /* used to mark fields from sargable conditions*/
/* Active column sets */
- MY_BITMAP *read_set, *write_set, *vcol_set, *rpl_write_set;
+ MY_BITMAP *read_set, *write_set, *rpl_write_set;
+ /* Set if using virtual fields */
+ MY_BITMAP *vcol_set, *def_vcol_set;
+
/*
The ID of the query that opened and is using this table. Has different
meanings depending on the table type.
@@ -1322,7 +1325,7 @@ public:
{
read_set= &def_read_set;
write_set= &def_write_set;
- vcol_set= &def_vcol_set;
+ vcol_set= def_vcol_set; /* Note that this may be 0 */
rpl_write_set= 0;
}
/** Should this instance of the table be reopened? */