summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_base.cc5
-rw-r--r--sql/sql_handler.cc7
-rw-r--r--sql/sql_parse.cc3
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);