mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 21:12:26 +01:00
Fix for BUG#20866 "show table status on innodb raises assertion"
and its duplicate BUG#19057 "Test 'rpl_row_func003' fails on SuSE SLES9 x86". It was an assertion failure, only in debug builds, not present in released versions (nothing to document). It happened when doing SHOW TABLE STATUS on an InnoDB table having an auto_increment column, right after creating the table. The test which would have caught this problem was disabled in mid-April for another reason (how much I like tests disabled for months...). mysql-test/t/disabled.def: test now passes (and serves as the test for this bugfix) sql/ha_innodb.cc: Before a val_() calls on a Field object, if that field was not marked for read, we need to mark it. This is explained here: ChangeSet 1.2119.601.1 2006/06/04 18:52:22 monty@mysql.com quoting the changeset's comment: - If a handler needs to call Field->val() or Field->store() on columns that are not used in the query, one should install a temporary all-columns-used map while doing so. For this, we provide the following functions: my_bitmap_map *old_map= dbug_tmp_use_all_columns(table, table->read_set); field->val(); dbug_tmp_restore_column_map(table->read_set, old_map); and similar for the write map: my_bitmap_map *old_map= dbug_tmp_use_all_columns(table, table->write_set); field->val(); dbug_tmp_restore_column_map(table->write_set, old_map); If this is not done, you will sooner or later hit a DBUG_ASSERT in the field store() / val() functions. (For not DBUG binaries, the dbug_tmp_restore_column_map() and dbug_tmp_restore_column_map() are inline dummy functions and should be optimized away be the compiler). Note that I verified that the bug didn't exist in non-debug builds.
This commit is contained in:
parent
a9a675a8e5
commit
4eb10f0bab
2 changed files with 7 additions and 2 deletions
|
@ -34,7 +34,6 @@ rpl_ndb_innodb2ndb : Bug #19710 Cluster replication to partition table fa
|
|||
#rpl_ndb_log : BUG#18947 2006-03-21 tomas CRBR: order in binlog of create table and insert (on different table) not determ
|
||||
rpl_ndb_myisam2ndb : Bug #19710 Cluster replication to partition table fails on DELETE FROM statement
|
||||
rpl_row_blob_innodb : BUG#18980 2006-04-10 kent Test fails randomly
|
||||
rpl_row_func003 : BUG#19074 2006-13-04 andrei test failed
|
||||
rpl_sp : BUG#16456 2006-02-16 jmiller
|
||||
rpl_sp_effects : BUG#19862 2006-06-15 mkindahl
|
||||
|
||||
|
|
|
@ -7067,10 +7067,16 @@ ha_innobase::innobase_read_and_init_auto_inc(
|
|||
'found_next_number_field' below because MySQL in SHOW TABLE
|
||||
STATUS does not seem to set 'next_number_field'. The comment
|
||||
in table.h says that 'next_number_field' is set when it is
|
||||
'active'. */
|
||||
'active'.
|
||||
Since 5.1 MySQL enforces that we announce fields which we will
|
||||
read; as we only do a val_*() call, dbug_tmp_use_all_columns()
|
||||
with read_set is sufficient. */
|
||||
|
||||
my_bitmap_map *old_map;
|
||||
old_map= dbug_tmp_use_all_columns(table, table->read_set);
|
||||
auto_inc = (longlong) table->found_next_number_field->
|
||||
val_int_offset(table->s->rec_buff_length) + 1;
|
||||
dbug_tmp_restore_column_map(table->read_set, old_map);
|
||||
}
|
||||
|
||||
dict_table_autoinc_initialize(prebuilt->table, auto_inc);
|
||||
|
|
Loading…
Reference in a new issue