diff options
Diffstat (limited to 'sql')
-rw-r--r-- | sql/sql_base.cc | 5 | ||||
-rw-r--r-- | sql/sql_handler.cc | 7 | ||||
-rw-r--r-- | sql/sql_parse.cc | 3 |
3 files changed, 11 insertions, 4 deletions
diff --git a/sql/sql_base.cc b/sql/sql_base.cc index d3832a7068e..d4045c804d7 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -2150,6 +2150,11 @@ Locked_tables_list::unlock_locked_tables(THD *thd) request for metadata locks and TABLE_LIST elements. */ reset(); + if (thd->variables.option_bits & OPTION_AUTOCOMMIT) + { + thd->variables.option_bits&= ~(OPTION_NOT_AUTOCOMMIT); + thd->server_status|= SERVER_STATUS_AUTOCOMMIT; + } } diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc index 95417c73c74..405e7ce8c38 100644 --- a/sql/sql_handler.cc +++ b/sql/sql_handler.cc @@ -282,7 +282,7 @@ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, SQL_HANDLER *reopen) back-off for such locks. */ tables->mdl_request.init(MDL_key::TABLE, tables->db, tables->table_name, - MDL_SHARED, MDL_TRANSACTION); + MDL_SHARED_READ, MDL_TRANSACTION); mdl_savepoint= thd->mdl_context.mdl_savepoint(); /* for now HANDLER can be used only for real TABLES */ @@ -750,11 +750,12 @@ retry: tables->table= table; // This is used by fix_fields table->pos_in_table_list= tables; - if (handler->lock->lock_count > 0) + if (handler->lock->table_count > 0) { int lock_error; - handler->lock->locks[0]->type= handler->lock->locks[0]->org_type; + if (handler->lock->lock_count > 0) + handler->lock->locks[0]->type= handler->lock->locks[0]->org_type; /* save open_tables state */ TABLE* backup_open_tables= thd->open_tables; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index ddb5e2744cb..ed7cb1f4bd8 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4792,7 +4792,8 @@ end_with_restore_list: if (lock_tables_precheck(thd, all_tables)) goto error; - thd->variables.option_bits|= OPTION_TABLE_LOCK; + thd->variables.option_bits|= OPTION_TABLE_LOCK | OPTION_NOT_AUTOCOMMIT; + thd->server_status&= ~SERVER_STATUS_AUTOCOMMIT; res= lock_tables_open_and_lock_tables(thd, all_tables); |