diff --git a/mysql-test/suite/perfschema/r/update_order-3837.result b/mysql-test/suite/perfschema/r/update_order-3837.result new file mode 100644 index 00000000000..5d19d640a2f --- /dev/null +++ b/mysql-test/suite/perfschema/r/update_order-3837.result @@ -0,0 +1 @@ +UPDATE performance_schema.setup_instruments SET timed = 'YES' ORDER BY name; diff --git a/mysql-test/suite/perfschema/t/update_order-3837.test b/mysql-test/suite/perfschema/t/update_order-3837.test new file mode 100644 index 00000000000..72e3941fcde --- /dev/null +++ b/mysql-test/suite/perfschema/t/update_order-3837.test @@ -0,0 +1,8 @@ +--source include/not_embedded.inc +--source include/have_perfschema.inc + +# +# MDEV-3837 Assertion `table->read_set == &table->def_read_set' failed on updating a performance_schema table +# +UPDATE performance_schema.setup_instruments SET timed = 'YES' ORDER BY name; + diff --git a/sql/handler.cc b/sql/handler.cc index ed671a921bb..271ed73ad53 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -5446,7 +5446,7 @@ int handler::ha_delete_row(const uchar *buf) void handler::use_hidden_primary_key() { /* fallback to use all columns in the table to identify row */ - table->use_all_columns(); + table->column_bitmaps_set(&table->s->all_set, table->write_set); } diff --git a/sql/sql_update.cc b/sql/sql_update.cc index d7ff610921f..c131db1bffc 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -480,10 +480,8 @@ int mysql_update(THD *thd, We can't update table directly; We must first search after all matching rows before updating the table! */ - - // Verify that table->restore_column_maps_after_mark_index() will work - DBUG_ASSERT(table->read_set == &table->def_read_set); - DBUG_ASSERT(table->write_set == &table->def_write_set); + MY_BITMAP *save_read_set= table->read_set; + MY_BITMAP *save_write_set= table->write_set; if (used_index < MAX_KEY && old_covering_keys.is_set(used_index)) table->add_read_columns_used_by_index(used_index); @@ -622,11 +620,8 @@ int mysql_update(THD *thd, if (error >= 0) goto err; } - /* - This restore bitmaps, works for add_read_columns_used_by_index() and - use_all_columns(): - */ - table->restore_column_maps_after_mark_index(); + table->disable_keyread(); + table->column_bitmaps_set(save_read_set, save_write_set); } if (ignore)