Loading innobase/include/row0mysql.h +8 −0 Original line number Diff line number Diff line Loading @@ -170,6 +170,14 @@ row_table_got_default_clust_index( /*==============================*/ dict_table_t* table); /************************************************************************* Calculates the key number used inside MySQL for an Innobase index. We have to take into account if we generated a default clustered index for the table */ ulint row_get_mysql_key_number_for_index( /*===============================*/ dict_index_t* index); /************************************************************************* Does an update or delete of a row for MySQL. */ int Loading innobase/include/trx0trx.h +3 −0 Original line number Diff line number Diff line Loading @@ -307,6 +307,9 @@ struct trx_struct{ /*------------------------------*/ ulint error_state; /* 0 if no error, otherwise error number */ void* error_info; /* if the error number indicates a duplicate key error, a pointer to the problematic index is stored here */ sess_t* sess; /* session of the trx, NULL if none */ ulint que_state; /* TRX_QUE_RUNNING, TRX_QUE_LOCK_WAIT, ... */ Loading innobase/row/row0ins.c +4 −1 Original line number Diff line number Diff line Loading @@ -407,6 +407,7 @@ row_ins_scan_sec_index_for_duplicate( ut_a(dupl_count >= 1); if (dupl_count > 1) { trx->error_info = index; return(DB_DUPLICATE_KEY); } Loading Loading @@ -468,6 +469,7 @@ row_ins_duplicate_error( if (row_ins_dupl_error_with_rec(rec, entry, cursor->index, trx)) { *dupl_rec = rec; trx->error_info = cursor->index; return(DB_DUPLICATE_KEY); } Loading @@ -484,6 +486,7 @@ row_ins_duplicate_error( if (row_ins_dupl_error_with_rec(rec, entry, cursor->index, trx)) { *dupl_rec = rec; trx->error_info = cursor->index; return(DB_DUPLICATE_KEY); } Loading innobase/row/row0mysql.c +30 −0 Original line number Diff line number Diff line Loading @@ -761,6 +761,36 @@ row_table_got_default_clust_index( return(FALSE); } /************************************************************************* Calculates the key number used inside MySQL for an Innobase index. We have to take into account if we generated a default clustered index for the table */ ulint row_get_mysql_key_number_for_index( /*===============================*/ dict_index_t* index) { dict_index_t* ind; ulint i; ut_a(index); i = 0; ind = dict_table_get_first_index(index->table); while (index != ind) { ind = dict_table_get_next_index(ind); i++; } if (row_table_got_default_clust_index(index->table)) { ut_a(i > 0); i--; } return(i); } /************************************************************************* Does a table creation operation for MySQL. */ Loading sql/ha_innobase.cc +15 −17 Original line number Diff line number Diff line Loading @@ -18,12 +18,6 @@ Innobase */ /* TODO list for the Innobase handler: - How to check for deadlocks if Innobase tables are used alongside other MySQL table types? Solution: we will use a timeout. - Innobase currently includes the path to a table name: the path should actually be dropped off, because we may move a whole database to a new directory. - Add a deadlock error message to MySQL. - Ask Monty if strings of different languages can exist in the same database. Answer: in near future yes, but not yet. */ Loading Loading @@ -415,10 +409,10 @@ innobase_init(void) /*===============*/ /* out: TRUE if error */ { static char current_dir[3]; int err; bool ret; ibool test_bool; static char current_dir[3]; DBUG_ENTER("innobase_init"); /* Use current_dir if no paths are set */ Loading Loading @@ -1660,7 +1654,7 @@ ha_innobase::change_active_index( statistic_increment(ha_read_key_count, &LOCK_status); DBUG_ENTER("ha_innobase::change_active_index"); DBUG_ENTER("index_read_idx"); active_index = keynr; Loading @@ -1686,7 +1680,7 @@ ha_innobase::change_active_index( build_template(prebuilt, user_thd, table, ROW_MYSQL_WHOLE_ROW); DBUG_RETURN(0); return(0); } /************************************************************************** Loading Loading @@ -2220,7 +2214,6 @@ ha_innobase::create( { int error; dict_table_t* innobase_table; uint name_len; trx_t* trx; int primary_key_no = -1; KEY* key; Loading @@ -2238,7 +2231,7 @@ ha_innobase::create( /* Create the table definition in Innobase */ if ((error = create_table_def(trx, form, norm_name))) { if (error = create_table_def(trx, form, norm_name)) { trx_commit_for_mysql(trx); Loading @@ -2257,6 +2250,11 @@ ha_innobase::create( } } /* Our function row_get_mysql_key_number_for_index assumes the primary key is always number 0, if it exists */ assert(primary_key_no == -1 || primary_key_no == 0); /* Create the keys */ if (form->keys == 0 || primary_key_no == -1) { Loading Loading @@ -2570,9 +2568,9 @@ ha_innobase::info( } if (flag & HA_STATUS_ERRKEY) { errkey = (unsigned int)-1; /* TODO: get the key number from Innobase */ errkey = (unsigned int) row_get_mysql_key_number_for_index( (dict_index_t*) prebuilt->trx->error_info); } DBUG_VOID_RETURN; Loading Loading
innobase/include/row0mysql.h +8 −0 Original line number Diff line number Diff line Loading @@ -170,6 +170,14 @@ row_table_got_default_clust_index( /*==============================*/ dict_table_t* table); /************************************************************************* Calculates the key number used inside MySQL for an Innobase index. We have to take into account if we generated a default clustered index for the table */ ulint row_get_mysql_key_number_for_index( /*===============================*/ dict_index_t* index); /************************************************************************* Does an update or delete of a row for MySQL. */ int Loading
innobase/include/trx0trx.h +3 −0 Original line number Diff line number Diff line Loading @@ -307,6 +307,9 @@ struct trx_struct{ /*------------------------------*/ ulint error_state; /* 0 if no error, otherwise error number */ void* error_info; /* if the error number indicates a duplicate key error, a pointer to the problematic index is stored here */ sess_t* sess; /* session of the trx, NULL if none */ ulint que_state; /* TRX_QUE_RUNNING, TRX_QUE_LOCK_WAIT, ... */ Loading
innobase/row/row0ins.c +4 −1 Original line number Diff line number Diff line Loading @@ -407,6 +407,7 @@ row_ins_scan_sec_index_for_duplicate( ut_a(dupl_count >= 1); if (dupl_count > 1) { trx->error_info = index; return(DB_DUPLICATE_KEY); } Loading Loading @@ -468,6 +469,7 @@ row_ins_duplicate_error( if (row_ins_dupl_error_with_rec(rec, entry, cursor->index, trx)) { *dupl_rec = rec; trx->error_info = cursor->index; return(DB_DUPLICATE_KEY); } Loading @@ -484,6 +486,7 @@ row_ins_duplicate_error( if (row_ins_dupl_error_with_rec(rec, entry, cursor->index, trx)) { *dupl_rec = rec; trx->error_info = cursor->index; return(DB_DUPLICATE_KEY); } Loading
innobase/row/row0mysql.c +30 −0 Original line number Diff line number Diff line Loading @@ -761,6 +761,36 @@ row_table_got_default_clust_index( return(FALSE); } /************************************************************************* Calculates the key number used inside MySQL for an Innobase index. We have to take into account if we generated a default clustered index for the table */ ulint row_get_mysql_key_number_for_index( /*===============================*/ dict_index_t* index) { dict_index_t* ind; ulint i; ut_a(index); i = 0; ind = dict_table_get_first_index(index->table); while (index != ind) { ind = dict_table_get_next_index(ind); i++; } if (row_table_got_default_clust_index(index->table)) { ut_a(i > 0); i--; } return(i); } /************************************************************************* Does a table creation operation for MySQL. */ Loading
sql/ha_innobase.cc +15 −17 Original line number Diff line number Diff line Loading @@ -18,12 +18,6 @@ Innobase */ /* TODO list for the Innobase handler: - How to check for deadlocks if Innobase tables are used alongside other MySQL table types? Solution: we will use a timeout. - Innobase currently includes the path to a table name: the path should actually be dropped off, because we may move a whole database to a new directory. - Add a deadlock error message to MySQL. - Ask Monty if strings of different languages can exist in the same database. Answer: in near future yes, but not yet. */ Loading Loading @@ -415,10 +409,10 @@ innobase_init(void) /*===============*/ /* out: TRUE if error */ { static char current_dir[3]; int err; bool ret; ibool test_bool; static char current_dir[3]; DBUG_ENTER("innobase_init"); /* Use current_dir if no paths are set */ Loading Loading @@ -1660,7 +1654,7 @@ ha_innobase::change_active_index( statistic_increment(ha_read_key_count, &LOCK_status); DBUG_ENTER("ha_innobase::change_active_index"); DBUG_ENTER("index_read_idx"); active_index = keynr; Loading @@ -1686,7 +1680,7 @@ ha_innobase::change_active_index( build_template(prebuilt, user_thd, table, ROW_MYSQL_WHOLE_ROW); DBUG_RETURN(0); return(0); } /************************************************************************** Loading Loading @@ -2220,7 +2214,6 @@ ha_innobase::create( { int error; dict_table_t* innobase_table; uint name_len; trx_t* trx; int primary_key_no = -1; KEY* key; Loading @@ -2238,7 +2231,7 @@ ha_innobase::create( /* Create the table definition in Innobase */ if ((error = create_table_def(trx, form, norm_name))) { if (error = create_table_def(trx, form, norm_name)) { trx_commit_for_mysql(trx); Loading @@ -2257,6 +2250,11 @@ ha_innobase::create( } } /* Our function row_get_mysql_key_number_for_index assumes the primary key is always number 0, if it exists */ assert(primary_key_no == -1 || primary_key_no == 0); /* Create the keys */ if (form->keys == 0 || primary_key_no == -1) { Loading Loading @@ -2570,9 +2568,9 @@ ha_innobase::info( } if (flag & HA_STATUS_ERRKEY) { errkey = (unsigned int)-1; /* TODO: get the key number from Innobase */ errkey = (unsigned int) row_get_mysql_key_number_for_index( (dict_index_t*) prebuilt->trx->error_info); } DBUG_VOID_RETURN; Loading