Loading client/mysqltest.c +1 −1 Original line number Diff line number Diff line Loading @@ -2896,7 +2896,7 @@ static int run_query_stmt(MYSQL *mysql, struct st_query *q, int flags) /* Allocate array with bind structs, lengths and NULL flags */ bind= (MYSQL_BIND*) my_malloc(num_fields * sizeof(MYSQL_BIND), MYF(MY_WME | MY_FAE)); MYF(MY_WME | MY_FAE | MY_ZEROFILL)); length= (unsigned long*) my_malloc(num_fields * sizeof(unsigned long), MYF(MY_WME | MY_FAE)); is_null= (my_bool*) my_malloc(num_fields * sizeof(my_bool), Loading innobase/include/lock0lock.h +2 −0 Original line number Diff line number Diff line Loading @@ -612,6 +612,8 @@ extern lock_sys_t* lock_sys; #define LOCK_TABLE 16 /* these type values should be so high that */ #define LOCK_REC 32 /* they can be ORed to the lock mode */ #define LOCK_TABLE_EXP 80 /* explicit table lock (80 = 16 + 64) */ #define LOCK_TABLE_TRANSACTIONAL 144 /* transactional table lock (144 = 16 + 128)*/ #define LOCK_TYPE_MASK 0xF0UL /* mask used to extract lock type from the type_mode field in a lock */ /* Waiting lock flag */ Loading innobase/include/trx0trx.h +4 −0 Original line number Diff line number Diff line Loading @@ -464,6 +464,10 @@ struct trx_struct{ ulint n_lock_table_exp;/* number of explicit table locks (LOCK TABLES) reserved by the transaction, stored in trx_locks */ ulint n_lock_table_transactional; /* number of transactional table locks (LOCK TABLES..WHERE ENGINE) reserved by the transaction, stored in trx_locks */ UT_LIST_NODE_T(trx_t) trx_list; /* list of transactions */ UT_LIST_NODE_T(trx_t) Loading innobase/lock/lock0lock.c +32 −8 Original line number Diff line number Diff line Loading @@ -2207,7 +2207,8 @@ lock_grant( release it at the end of the SQL statement */ lock->trx->auto_inc_lock = lock; } else if (lock_get_type(lock) == LOCK_TABLE_EXP) { } else if (lock_get_type(lock) == LOCK_TABLE_EXP || lock_get_type(lock) == LOCK_TABLE_TRANSACTIONAL) { ut_a(lock_get_mode(lock) == LOCK_S || lock_get_mode(lock) == LOCK_X); } Loading Loading @@ -3421,6 +3422,10 @@ lock_table_create( lock->trx->n_lock_table_exp++; } if (lock_get_type(lock) == LOCK_TABLE_TRANSACTIONAL) { lock->trx->n_lock_table_transactional++; } lock->un_member.tab_lock.table = table; UT_LIST_ADD_LAST(un_member.tab_lock.locks, table->locks, lock); Loading Loading @@ -3458,7 +3463,11 @@ lock_table_remove_low( } if (lock_get_type(lock) == LOCK_TABLE_EXP) { lock->trx->n_lock_table_exp--; trx->n_lock_table_exp--; } if (lock_get_type(lock) == LOCK_TABLE_TRANSACTIONAL) { trx->n_lock_table_transactional--; } UT_LIST_REMOVE(trx_locks, trx->trx_locks, lock); Loading Loading @@ -3592,7 +3601,8 @@ lock_table( DB_DEADLOCK, or DB_QUE_THR_SUSPENDED */ ulint flags, /* in: if BTR_NO_LOCKING_FLAG bit is set, does nothing; if LOCK_TABLE_EXP bits are set, if LOCK_TABLE_EXP|LOCK_TABLE_TRANSACTIONAL bits are set, creates an explicit table lock */ dict_table_t* table, /* in: database table in dictionary cache */ ulint mode, /* in: lock mode */ Loading @@ -3608,7 +3618,8 @@ lock_table( return(DB_SUCCESS); } ut_a(flags == 0 || flags == LOCK_TABLE_EXP); ut_a(flags == 0 || flags == LOCK_TABLE_EXP || flags == LOCK_TABLE_TRANSACTIONAL); trx = thr_get_trx(thr); Loading @@ -3631,7 +3642,7 @@ lock_table( /* Another trx has a request on the table in an incompatible mode: this trx may have to wait */ err = lock_table_enqueue_waiting(mode, table, thr); err = lock_table_enqueue_waiting(mode | flags, table, thr); lock_mutex_exit_kernel(); Loading Loading @@ -3722,7 +3733,8 @@ lock_table_dequeue( ut_ad(mutex_own(&kernel_mutex)); #endif /* UNIV_SYNC_DEBUG */ ut_a(lock_get_type(in_lock) == LOCK_TABLE || lock_get_type(in_lock) == LOCK_TABLE_EXP); lock_get_type(in_lock) == LOCK_TABLE_EXP || lock_get_type(in_lock) == LOCK_TABLE_TRANSACTIONAL); lock = UT_LIST_GET_NEXT(un_member.tab_lock.locks, in_lock); Loading Loading @@ -3826,7 +3838,9 @@ lock_release_off_kernel( } lock_table_dequeue(lock); if (lock_get_type(lock) == LOCK_TABLE_EXP) { if (lock_get_type(lock) == LOCK_TABLE_EXP || lock_get_type(lock) == LOCK_TABLE_TRANSACTIONAL) { ut_a(lock_get_mode(lock) == LOCK_S || lock_get_mode(lock) == LOCK_X); } Loading @@ -3850,6 +3864,7 @@ lock_release_off_kernel( ut_a(trx->auto_inc_lock == NULL); ut_a(trx->n_lock_table_exp == 0); ut_a(trx->n_lock_table_transactional == 0); } /************************************************************************* Loading Loading @@ -3915,6 +3930,7 @@ lock_release_tables_off_kernel( } ut_a(trx->n_lock_table_exp == 0); ut_a(trx->n_lock_table_transactional == 0); } /************************************************************************* Loading Loading @@ -4028,11 +4044,15 @@ lock_table_print( ut_ad(mutex_own(&kernel_mutex)); #endif /* UNIV_SYNC_DEBUG */ ut_a(lock_get_type(lock) == LOCK_TABLE || lock_get_type(lock) == LOCK_TABLE_EXP); lock_get_type(lock) == LOCK_TABLE_EXP || lock_get_type(lock) == LOCK_TABLE_TRANSACTIONAL); if (lock_get_type(lock) == LOCK_TABLE_EXP) { fputs("EXPLICIT ", file); } else if (lock_get_type(lock) == LOCK_TABLE_TRANSACTIONAL) { fputs("TRANSACTIONAL ", file); } fputs("TABLE LOCK table ", file); ut_print_name(file, lock->trx, lock->un_member.tab_lock.table->name); fprintf(file, " trx id %lu %lu", Loading Loading @@ -4418,6 +4438,7 @@ lock_table_queue_validate( while (lock) { ut_a(((lock->trx)->conc_state == TRX_ACTIVE) || ((lock->trx)->conc_state == TRX_PREPARED) || ((lock->trx)->conc_state == TRX_COMMITTED_IN_MEMORY)); if (!lock_get_wait(lock)) { Loading Loading @@ -4465,6 +4486,7 @@ lock_rec_queue_validate( while (lock) { ut_a(lock->trx->conc_state == TRX_ACTIVE || lock->trx->conc_state == TRX_PREPARED || lock->trx->conc_state == TRX_COMMITTED_IN_MEMORY); Loading Loading @@ -4519,6 +4541,7 @@ lock_rec_queue_validate( while (lock) { ut_a(lock->trx->conc_state == TRX_ACTIVE || lock->trx->conc_state == TRX_PREPARED || lock->trx->conc_state == TRX_COMMITTED_IN_MEMORY); ut_a(trx_in_trx_list(lock->trx)); Loading Loading @@ -4601,6 +4624,7 @@ lock_rec_validate_page( ut_a(trx_in_trx_list(lock->trx)); ut_a(lock->trx->conc_state == TRX_ACTIVE || lock->trx->conc_state == TRX_PREPARED || lock->trx->conc_state == TRX_COMMITTED_IN_MEMORY); for (i = nth_bit; i < lock_rec_get_n_bits(lock); i++) { Loading innobase/row/row0mysql.c +9 −3 Original line number Diff line number Diff line Loading @@ -784,7 +784,7 @@ row_lock_table_for_mysql( table handle */ dict_table_t* table, /* in: table to lock, or NULL if prebuilt->table should be locked as LOCK_TABLE_EXP | locked or a prebuilt->select_lock_type */ ulint mode) /* in: lock mode of table */ { Loading Loading @@ -821,10 +821,16 @@ row_lock_table_for_mysql( if (table) { err = lock_table(0, table, mode, thr); } else { if (mode == LOCK_TABLE_TRANSACTIONAL) { err = lock_table(LOCK_TABLE_TRANSACTIONAL, prebuilt->table, prebuilt->select_lock_type, thr); } else { err = lock_table(LOCK_TABLE_EXP, prebuilt->table, prebuilt->select_lock_type, thr); } } trx->error_state = err; Loading Loading
client/mysqltest.c +1 −1 Original line number Diff line number Diff line Loading @@ -2896,7 +2896,7 @@ static int run_query_stmt(MYSQL *mysql, struct st_query *q, int flags) /* Allocate array with bind structs, lengths and NULL flags */ bind= (MYSQL_BIND*) my_malloc(num_fields * sizeof(MYSQL_BIND), MYF(MY_WME | MY_FAE)); MYF(MY_WME | MY_FAE | MY_ZEROFILL)); length= (unsigned long*) my_malloc(num_fields * sizeof(unsigned long), MYF(MY_WME | MY_FAE)); is_null= (my_bool*) my_malloc(num_fields * sizeof(my_bool), Loading
innobase/include/lock0lock.h +2 −0 Original line number Diff line number Diff line Loading @@ -612,6 +612,8 @@ extern lock_sys_t* lock_sys; #define LOCK_TABLE 16 /* these type values should be so high that */ #define LOCK_REC 32 /* they can be ORed to the lock mode */ #define LOCK_TABLE_EXP 80 /* explicit table lock (80 = 16 + 64) */ #define LOCK_TABLE_TRANSACTIONAL 144 /* transactional table lock (144 = 16 + 128)*/ #define LOCK_TYPE_MASK 0xF0UL /* mask used to extract lock type from the type_mode field in a lock */ /* Waiting lock flag */ Loading
innobase/include/trx0trx.h +4 −0 Original line number Diff line number Diff line Loading @@ -464,6 +464,10 @@ struct trx_struct{ ulint n_lock_table_exp;/* number of explicit table locks (LOCK TABLES) reserved by the transaction, stored in trx_locks */ ulint n_lock_table_transactional; /* number of transactional table locks (LOCK TABLES..WHERE ENGINE) reserved by the transaction, stored in trx_locks */ UT_LIST_NODE_T(trx_t) trx_list; /* list of transactions */ UT_LIST_NODE_T(trx_t) Loading
innobase/lock/lock0lock.c +32 −8 Original line number Diff line number Diff line Loading @@ -2207,7 +2207,8 @@ lock_grant( release it at the end of the SQL statement */ lock->trx->auto_inc_lock = lock; } else if (lock_get_type(lock) == LOCK_TABLE_EXP) { } else if (lock_get_type(lock) == LOCK_TABLE_EXP || lock_get_type(lock) == LOCK_TABLE_TRANSACTIONAL) { ut_a(lock_get_mode(lock) == LOCK_S || lock_get_mode(lock) == LOCK_X); } Loading Loading @@ -3421,6 +3422,10 @@ lock_table_create( lock->trx->n_lock_table_exp++; } if (lock_get_type(lock) == LOCK_TABLE_TRANSACTIONAL) { lock->trx->n_lock_table_transactional++; } lock->un_member.tab_lock.table = table; UT_LIST_ADD_LAST(un_member.tab_lock.locks, table->locks, lock); Loading Loading @@ -3458,7 +3463,11 @@ lock_table_remove_low( } if (lock_get_type(lock) == LOCK_TABLE_EXP) { lock->trx->n_lock_table_exp--; trx->n_lock_table_exp--; } if (lock_get_type(lock) == LOCK_TABLE_TRANSACTIONAL) { trx->n_lock_table_transactional--; } UT_LIST_REMOVE(trx_locks, trx->trx_locks, lock); Loading Loading @@ -3592,7 +3601,8 @@ lock_table( DB_DEADLOCK, or DB_QUE_THR_SUSPENDED */ ulint flags, /* in: if BTR_NO_LOCKING_FLAG bit is set, does nothing; if LOCK_TABLE_EXP bits are set, if LOCK_TABLE_EXP|LOCK_TABLE_TRANSACTIONAL bits are set, creates an explicit table lock */ dict_table_t* table, /* in: database table in dictionary cache */ ulint mode, /* in: lock mode */ Loading @@ -3608,7 +3618,8 @@ lock_table( return(DB_SUCCESS); } ut_a(flags == 0 || flags == LOCK_TABLE_EXP); ut_a(flags == 0 || flags == LOCK_TABLE_EXP || flags == LOCK_TABLE_TRANSACTIONAL); trx = thr_get_trx(thr); Loading @@ -3631,7 +3642,7 @@ lock_table( /* Another trx has a request on the table in an incompatible mode: this trx may have to wait */ err = lock_table_enqueue_waiting(mode, table, thr); err = lock_table_enqueue_waiting(mode | flags, table, thr); lock_mutex_exit_kernel(); Loading Loading @@ -3722,7 +3733,8 @@ lock_table_dequeue( ut_ad(mutex_own(&kernel_mutex)); #endif /* UNIV_SYNC_DEBUG */ ut_a(lock_get_type(in_lock) == LOCK_TABLE || lock_get_type(in_lock) == LOCK_TABLE_EXP); lock_get_type(in_lock) == LOCK_TABLE_EXP || lock_get_type(in_lock) == LOCK_TABLE_TRANSACTIONAL); lock = UT_LIST_GET_NEXT(un_member.tab_lock.locks, in_lock); Loading Loading @@ -3826,7 +3838,9 @@ lock_release_off_kernel( } lock_table_dequeue(lock); if (lock_get_type(lock) == LOCK_TABLE_EXP) { if (lock_get_type(lock) == LOCK_TABLE_EXP || lock_get_type(lock) == LOCK_TABLE_TRANSACTIONAL) { ut_a(lock_get_mode(lock) == LOCK_S || lock_get_mode(lock) == LOCK_X); } Loading @@ -3850,6 +3864,7 @@ lock_release_off_kernel( ut_a(trx->auto_inc_lock == NULL); ut_a(trx->n_lock_table_exp == 0); ut_a(trx->n_lock_table_transactional == 0); } /************************************************************************* Loading Loading @@ -3915,6 +3930,7 @@ lock_release_tables_off_kernel( } ut_a(trx->n_lock_table_exp == 0); ut_a(trx->n_lock_table_transactional == 0); } /************************************************************************* Loading Loading @@ -4028,11 +4044,15 @@ lock_table_print( ut_ad(mutex_own(&kernel_mutex)); #endif /* UNIV_SYNC_DEBUG */ ut_a(lock_get_type(lock) == LOCK_TABLE || lock_get_type(lock) == LOCK_TABLE_EXP); lock_get_type(lock) == LOCK_TABLE_EXP || lock_get_type(lock) == LOCK_TABLE_TRANSACTIONAL); if (lock_get_type(lock) == LOCK_TABLE_EXP) { fputs("EXPLICIT ", file); } else if (lock_get_type(lock) == LOCK_TABLE_TRANSACTIONAL) { fputs("TRANSACTIONAL ", file); } fputs("TABLE LOCK table ", file); ut_print_name(file, lock->trx, lock->un_member.tab_lock.table->name); fprintf(file, " trx id %lu %lu", Loading Loading @@ -4418,6 +4438,7 @@ lock_table_queue_validate( while (lock) { ut_a(((lock->trx)->conc_state == TRX_ACTIVE) || ((lock->trx)->conc_state == TRX_PREPARED) || ((lock->trx)->conc_state == TRX_COMMITTED_IN_MEMORY)); if (!lock_get_wait(lock)) { Loading Loading @@ -4465,6 +4486,7 @@ lock_rec_queue_validate( while (lock) { ut_a(lock->trx->conc_state == TRX_ACTIVE || lock->trx->conc_state == TRX_PREPARED || lock->trx->conc_state == TRX_COMMITTED_IN_MEMORY); Loading Loading @@ -4519,6 +4541,7 @@ lock_rec_queue_validate( while (lock) { ut_a(lock->trx->conc_state == TRX_ACTIVE || lock->trx->conc_state == TRX_PREPARED || lock->trx->conc_state == TRX_COMMITTED_IN_MEMORY); ut_a(trx_in_trx_list(lock->trx)); Loading Loading @@ -4601,6 +4624,7 @@ lock_rec_validate_page( ut_a(trx_in_trx_list(lock->trx)); ut_a(lock->trx->conc_state == TRX_ACTIVE || lock->trx->conc_state == TRX_PREPARED || lock->trx->conc_state == TRX_COMMITTED_IN_MEMORY); for (i = nth_bit; i < lock_rec_get_n_bits(lock); i++) { Loading
innobase/row/row0mysql.c +9 −3 Original line number Diff line number Diff line Loading @@ -784,7 +784,7 @@ row_lock_table_for_mysql( table handle */ dict_table_t* table, /* in: table to lock, or NULL if prebuilt->table should be locked as LOCK_TABLE_EXP | locked or a prebuilt->select_lock_type */ ulint mode) /* in: lock mode of table */ { Loading Loading @@ -821,10 +821,16 @@ row_lock_table_for_mysql( if (table) { err = lock_table(0, table, mode, thr); } else { if (mode == LOCK_TABLE_TRANSACTIONAL) { err = lock_table(LOCK_TABLE_TRANSACTIONAL, prebuilt->table, prebuilt->select_lock_type, thr); } else { err = lock_table(LOCK_TABLE_EXP, prebuilt->table, prebuilt->select_lock_type, thr); } } trx->error_state = err; Loading