summaryrefslogtreecommitdiffstats
path: root/sql/handler.cc
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--sql/handler.cc14
1 files changed, 12 insertions, 2 deletions
diff --git a/sql/handler.cc b/sql/handler.cc
index 230bcf5e..17cf018b 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -619,7 +619,7 @@ int ha_finalize_handlerton(st_plugin_int *plugin)
const char *hton_no_exts[]= { 0 };
-
+static bool ddl_recovery_done= false;
int ha_initialize_handlerton(st_plugin_int *plugin)
{
@@ -769,6 +769,9 @@ int ha_initialize_handlerton(st_plugin_int *plugin)
resolve_sysvar_table_options(hton);
update_discovery_counters(hton, 1);
+ if (ddl_recovery_done && hton->signal_ddl_recovery_done)
+ hton->signal_ddl_recovery_done(hton);
+
DBUG_RETURN(ret);
err_deinit:
@@ -955,7 +958,8 @@ static my_bool signal_ddl_recovery_done(THD *, plugin_ref plugin, void *)
{
handlerton *hton= plugin_hton(plugin);
if (hton->signal_ddl_recovery_done)
- (hton->signal_ddl_recovery_done)(hton);
+ if ((hton->signal_ddl_recovery_done)(hton))
+ plugin_ref_to_int(plugin)->state= PLUGIN_IS_DELETED;
return 0;
}
@@ -965,6 +969,7 @@ void ha_signal_ddl_recovery_done()
DBUG_ENTER("ha_signal_ddl_recovery_done");
plugin_foreach(NULL, signal_ddl_recovery_done, MYSQL_STORAGE_ENGINE_PLUGIN,
NULL);
+ ddl_recovery_done= true;
DBUG_VOID_RETURN;
}
@@ -7642,7 +7647,12 @@ int handler::ha_write_row(const uchar *buf)
{
DBUG_ASSERT(inited == NONE || lookup_handler != this);
if ((error= check_duplicate_long_entries(buf)))
+ {
+ if (table->next_number_field && buf == table->record[0])
+ if (int err= update_auto_increment())
+ error= err;
DBUG_RETURN(error);
+ }
}
MYSQL_INSERT_ROW_START(table_share->db.str, table_share->table_name.str);