Loading sql/handler.cc +28 −26 Original line number Diff line number Diff line Loading @@ -3263,19 +3263,20 @@ namespace int write_locked_table_maps(THD *thd) { DBUG_ENTER("write_locked_table_maps"); DBUG_PRINT("enter", ("thd=%p, thd->lock=%p, thd->locked_tables=%p", thd, thd->lock, thd->locked_tables)); DBUG_PRINT("enter", ("thd=%p, thd->lock=%p, thd->locked_tables=%p, thd->extra_lock", thd, thd->lock, thd->locked_tables, thd->extra_lock)); if (thd->get_binlog_table_maps() == 0) { /* Exactly one table has to be locked, otherwise this code is not guaranteed to work. */ DBUG_ASSERT((thd->lock != NULL) + (thd->locked_tables != NULL) == 1); MYSQL_LOCK *const locks[] = { thd->extra_lock, thd->lock, thd->locked_tables }; for (my_ptrdiff_t i= 0 ; i < sizeof(locks)/sizeof(*locks) ; ++i ) { MYSQL_LOCK const *const lock= locks[i]; if (lock == NULL) continue; MYSQL_LOCK *lock= thd->lock ? thd->lock : thd->locked_tables; DBUG_ASSERT(lock->table_count > 0); TABLE **const end_ptr= lock->table + lock->table_count; for (TABLE **table_ptr= lock->table ; table_ptr != end_ptr ; Loading @@ -3297,6 +3298,7 @@ namespace } } } } DBUG_RETURN(0); } Loading sql/sql_class.h +9 −4 Original line number Diff line number Diff line Loading @@ -692,6 +692,14 @@ class Open_tables_state THD::prelocked_mode for more info.) */ MYSQL_LOCK *locked_tables; /* CREATE-SELECT keeps an extra lock for the table being created. This field is used to keep the extra lock available for lower level routines, which would otherwise miss that lock. */ MYSQL_LOCK *extra_lock; /* prelocked_mode_type enum and prelocked_mode member are used for indicating whenever "prelocked mode" is on, and what type of Loading Loading @@ -744,7 +752,7 @@ class Open_tables_state void reset_open_tables_state() { open_tables= temporary_tables= handler_tables= derived_tables= 0; lock= locked_tables= 0; extra_lock= lock= locked_tables= 0; prelocked_mode= NON_PRELOCKED; state_flags= 0U; } Loading Loading @@ -1595,9 +1603,6 @@ class select_insert :public select_result_interceptor { bool send_eof(); /* not implemented: select_insert is never re-used in prepared statements */ void cleanup(); protected: MYSQL_LOCK *lock; }; Loading sql/sql_insert.cc +9 −35 Original line number Diff line number Diff line Loading @@ -2188,7 +2188,6 @@ select_insert::select_insert(TABLE_LIST *table_list_par, TABLE *table_par, bool ignore_check_option_errors) :table_list(table_list_par), table(table_par), fields(fields_par), last_insert_id(0), lock(0), insert_into_view(table_list_par && table_list_par->view != 0) { bzero((char*) &info,sizeof(info)); Loading Loading @@ -2356,6 +2355,7 @@ bool select_insert::send_data(List<Item> &values) { DBUG_ENTER("select_insert::send_data"); bool error=0; if (unit->offset_limit_cnt) { // using limit offset,count unit->offset_limit_cnt--; Loading @@ -2377,34 +2377,8 @@ bool select_insert::send_data(List<Item> &values) } } /* The thd->lock lock contain the locks for the select part of the statement and the 'lock' variable contain the write lock for the currently locked table that is being created or inserted into. However, the row-based replication will investigate the thd->lock to decide what table maps are to be written, so this one has to contain the tables locked for writing. To be able to write table map for the table being created, we temporarily set THD::lock to select_insert::lock while writing the record to the storage engine. We cannot set this elsewhere, since the execution of a stored function inside the select expression might cause the lock structures to be NULL. */ { MYSQL_LOCK *saved_lock= NULL; if (lock) { saved_lock= thd->lock; thd->lock= lock; } error= write_record(thd, table, &info); if (lock) thd->lock= saved_lock; } if (!error) { if (table->triggers || info.handle_duplicates == DUP_UPDATE) Loading Loading @@ -2776,8 +2750,8 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u) unit= u; if (!(table= create_table_from_items(thd, create_info, create_table, extra_fields, keys, &values, &lock, hook_ptr))) extra_fields, keys, &values, &thd->extra_lock, hook_ptr))) DBUG_RETURN(-1); // abort() deletes table if (table->s->fields < values.elements) Loading Loading @@ -2884,13 +2858,13 @@ bool select_create::send_eof() { table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY); VOID(pthread_mutex_lock(&LOCK_open)); mysql_unlock_tables(thd, lock); mysql_unlock_tables(thd, thd->extra_lock); if (!table->s->tmp_table) { if (close_thread_table(thd, &table)) VOID(pthread_cond_broadcast(&COND_refresh)); } lock=0; thd->extra_lock=0; table=0; VOID(pthread_mutex_unlock(&LOCK_open)); } Loading @@ -2900,10 +2874,10 @@ bool select_create::send_eof() void select_create::abort() { VOID(pthread_mutex_lock(&LOCK_open)); if (lock) if (thd->extra_lock) { mysql_unlock_tables(thd, lock); lock=0; mysql_unlock_tables(thd, thd->extra_lock); thd->extra_lock=0; } if (table) { Loading storage/ndb/include/kernel/GlobalSignalNumbers.h +6 −4 Original line number Diff line number Diff line Loading @@ -517,16 +517,12 @@ extern const GlobalSignalNumber NO_OF_SIGNAL_NAMES; #define GSN_TEST_ORD 407 #define GSN_TESTSIG 408 #define GSN_TIME_SIGNAL 409 /* 410 unused */ /* 411 unused */ /* 412 unused */ #define GSN_TUP_ABORTREQ 414 #define GSN_TUP_ADD_ATTCONF 415 #define GSN_TUP_ADD_ATTRREF 416 #define GSN_TUP_ADD_ATTRREQ 417 #define GSN_TUP_ATTRINFO 418 #define GSN_TUP_COMMITREQ 419 /* 420 unused */ /* 421 unused */ /* 422 unused */ Loading Loading @@ -981,4 +977,10 @@ extern const GlobalSignalNumber NO_OF_SIGNAL_NAMES; #define GSN_DICT_ABORT_REF 668 #define GSN_DICT_ABORT_CONF 669 /* DICT LOCK signals */ #define GSN_DICT_LOCK_REQ 410 #define GSN_DICT_LOCK_CONF 411 #define GSN_DICT_LOCK_REF 412 #define GSN_DICT_UNLOCK_ORD 420 #endif storage/ndb/include/kernel/signaldata/AlterTable.hpp +1 −0 Original line number Diff line number Diff line Loading @@ -196,6 +196,7 @@ public: InvalidTableVersion = 241, DropInProgress = 283, Busy = 701, BusyWithNR = 711, NotMaster = 702, InvalidFormat = 703, AttributeNameTooLong = 704, Loading Loading
sql/handler.cc +28 −26 Original line number Diff line number Diff line Loading @@ -3263,19 +3263,20 @@ namespace int write_locked_table_maps(THD *thd) { DBUG_ENTER("write_locked_table_maps"); DBUG_PRINT("enter", ("thd=%p, thd->lock=%p, thd->locked_tables=%p", thd, thd->lock, thd->locked_tables)); DBUG_PRINT("enter", ("thd=%p, thd->lock=%p, thd->locked_tables=%p, thd->extra_lock", thd, thd->lock, thd->locked_tables, thd->extra_lock)); if (thd->get_binlog_table_maps() == 0) { /* Exactly one table has to be locked, otherwise this code is not guaranteed to work. */ DBUG_ASSERT((thd->lock != NULL) + (thd->locked_tables != NULL) == 1); MYSQL_LOCK *const locks[] = { thd->extra_lock, thd->lock, thd->locked_tables }; for (my_ptrdiff_t i= 0 ; i < sizeof(locks)/sizeof(*locks) ; ++i ) { MYSQL_LOCK const *const lock= locks[i]; if (lock == NULL) continue; MYSQL_LOCK *lock= thd->lock ? thd->lock : thd->locked_tables; DBUG_ASSERT(lock->table_count > 0); TABLE **const end_ptr= lock->table + lock->table_count; for (TABLE **table_ptr= lock->table ; table_ptr != end_ptr ; Loading @@ -3297,6 +3298,7 @@ namespace } } } } DBUG_RETURN(0); } Loading
sql/sql_class.h +9 −4 Original line number Diff line number Diff line Loading @@ -692,6 +692,14 @@ class Open_tables_state THD::prelocked_mode for more info.) */ MYSQL_LOCK *locked_tables; /* CREATE-SELECT keeps an extra lock for the table being created. This field is used to keep the extra lock available for lower level routines, which would otherwise miss that lock. */ MYSQL_LOCK *extra_lock; /* prelocked_mode_type enum and prelocked_mode member are used for indicating whenever "prelocked mode" is on, and what type of Loading Loading @@ -744,7 +752,7 @@ class Open_tables_state void reset_open_tables_state() { open_tables= temporary_tables= handler_tables= derived_tables= 0; lock= locked_tables= 0; extra_lock= lock= locked_tables= 0; prelocked_mode= NON_PRELOCKED; state_flags= 0U; } Loading Loading @@ -1595,9 +1603,6 @@ class select_insert :public select_result_interceptor { bool send_eof(); /* not implemented: select_insert is never re-used in prepared statements */ void cleanup(); protected: MYSQL_LOCK *lock; }; Loading
sql/sql_insert.cc +9 −35 Original line number Diff line number Diff line Loading @@ -2188,7 +2188,6 @@ select_insert::select_insert(TABLE_LIST *table_list_par, TABLE *table_par, bool ignore_check_option_errors) :table_list(table_list_par), table(table_par), fields(fields_par), last_insert_id(0), lock(0), insert_into_view(table_list_par && table_list_par->view != 0) { bzero((char*) &info,sizeof(info)); Loading Loading @@ -2356,6 +2355,7 @@ bool select_insert::send_data(List<Item> &values) { DBUG_ENTER("select_insert::send_data"); bool error=0; if (unit->offset_limit_cnt) { // using limit offset,count unit->offset_limit_cnt--; Loading @@ -2377,34 +2377,8 @@ bool select_insert::send_data(List<Item> &values) } } /* The thd->lock lock contain the locks for the select part of the statement and the 'lock' variable contain the write lock for the currently locked table that is being created or inserted into. However, the row-based replication will investigate the thd->lock to decide what table maps are to be written, so this one has to contain the tables locked for writing. To be able to write table map for the table being created, we temporarily set THD::lock to select_insert::lock while writing the record to the storage engine. We cannot set this elsewhere, since the execution of a stored function inside the select expression might cause the lock structures to be NULL. */ { MYSQL_LOCK *saved_lock= NULL; if (lock) { saved_lock= thd->lock; thd->lock= lock; } error= write_record(thd, table, &info); if (lock) thd->lock= saved_lock; } if (!error) { if (table->triggers || info.handle_duplicates == DUP_UPDATE) Loading Loading @@ -2776,8 +2750,8 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u) unit= u; if (!(table= create_table_from_items(thd, create_info, create_table, extra_fields, keys, &values, &lock, hook_ptr))) extra_fields, keys, &values, &thd->extra_lock, hook_ptr))) DBUG_RETURN(-1); // abort() deletes table if (table->s->fields < values.elements) Loading Loading @@ -2884,13 +2858,13 @@ bool select_create::send_eof() { table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY); VOID(pthread_mutex_lock(&LOCK_open)); mysql_unlock_tables(thd, lock); mysql_unlock_tables(thd, thd->extra_lock); if (!table->s->tmp_table) { if (close_thread_table(thd, &table)) VOID(pthread_cond_broadcast(&COND_refresh)); } lock=0; thd->extra_lock=0; table=0; VOID(pthread_mutex_unlock(&LOCK_open)); } Loading @@ -2900,10 +2874,10 @@ bool select_create::send_eof() void select_create::abort() { VOID(pthread_mutex_lock(&LOCK_open)); if (lock) if (thd->extra_lock) { mysql_unlock_tables(thd, lock); lock=0; mysql_unlock_tables(thd, thd->extra_lock); thd->extra_lock=0; } if (table) { Loading
storage/ndb/include/kernel/GlobalSignalNumbers.h +6 −4 Original line number Diff line number Diff line Loading @@ -517,16 +517,12 @@ extern const GlobalSignalNumber NO_OF_SIGNAL_NAMES; #define GSN_TEST_ORD 407 #define GSN_TESTSIG 408 #define GSN_TIME_SIGNAL 409 /* 410 unused */ /* 411 unused */ /* 412 unused */ #define GSN_TUP_ABORTREQ 414 #define GSN_TUP_ADD_ATTCONF 415 #define GSN_TUP_ADD_ATTRREF 416 #define GSN_TUP_ADD_ATTRREQ 417 #define GSN_TUP_ATTRINFO 418 #define GSN_TUP_COMMITREQ 419 /* 420 unused */ /* 421 unused */ /* 422 unused */ Loading Loading @@ -981,4 +977,10 @@ extern const GlobalSignalNumber NO_OF_SIGNAL_NAMES; #define GSN_DICT_ABORT_REF 668 #define GSN_DICT_ABORT_CONF 669 /* DICT LOCK signals */ #define GSN_DICT_LOCK_REQ 410 #define GSN_DICT_LOCK_CONF 411 #define GSN_DICT_LOCK_REF 412 #define GSN_DICT_UNLOCK_ORD 420 #endif
storage/ndb/include/kernel/signaldata/AlterTable.hpp +1 −0 Original line number Diff line number Diff line Loading @@ -196,6 +196,7 @@ public: InvalidTableVersion = 241, DropInProgress = 283, Busy = 701, BusyWithNR = 711, NotMaster = 702, InvalidFormat = 703, AttributeNameTooLong = 704, Loading