diff options
author | unknown <monty@donna.mysql.fi> | 2001-03-06 20:39:10 +0200 |
---|---|---|
committer | unknown <monty@donna.mysql.fi> | 2001-03-06 20:39:10 +0200 |
commit | 6068405ca64ea9ee5fef22d2133cc374639a1407 (patch) | |
tree | ba2f7b904fc9d9c6bee64d91dbd4af3a0425e2b4 | |
parent | 08d7d5cf331a9f0e860792c356201ef386ceea5d (diff) | |
parent | e58c19253841961fa558625746a8a0e780427f0d (diff) | |
download | mariadb-git-6068405ca64ea9ee5fef22d2133cc374639a1407.tar.gz |
Merge work:/my/mysql into donna.mysql.fi:/home/my/bk/mysql
sql/ha_innobase.cc:
Auto merged
-rw-r--r-- | innobase/include/row0mysql.h | 8 | ||||
-rw-r--r-- | innobase/include/trx0trx.h | 3 | ||||
-rw-r--r-- | innobase/row/row0ins.c | 5 | ||||
-rw-r--r-- | innobase/row/row0mysql.c | 30 | ||||
-rw-r--r-- | sql/ha_innobase.cc | 32 |
5 files changed, 60 insertions, 18 deletions
diff --git a/innobase/include/row0mysql.h b/innobase/include/row0mysql.h index ee631bc02dc..d47fa729dce 100644 --- a/innobase/include/row0mysql.h +++ b/innobase/include/row0mysql.h @@ -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 diff --git a/innobase/include/trx0trx.h b/innobase/include/trx0trx.h index e2a1b4435e7..b74dea2319e 100644 --- a/innobase/include/trx0trx.h +++ b/innobase/include/trx0trx.h @@ -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, ... */ diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c index 89a85a39a55..4c5a46536cb 100644 --- a/innobase/row/row0ins.c +++ b/innobase/row/row0ins.c @@ -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); } @@ -468,7 +469,8 @@ 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); } } @@ -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); } diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c index 8a745dc216e..10ddf381166 100644 --- a/innobase/row/row0mysql.c +++ b/innobase/row/row0mysql.c @@ -762,6 +762,36 @@ row_table_got_default_clust_index( } /************************************************************************* +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. */ int diff --git a/sql/ha_innobase.cc b/sql/ha_innobase.cc index b1008737ca4..06b154252de 100644 --- a/sql/ha_innobase.cc +++ b/sql/ha_innobase.cc @@ -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. */ @@ -415,10 +409,10 @@ innobase_init(void) /*===============*/ /* out: TRUE if error */ { - int err; - bool ret; - ibool test_bool; - static char current_dir[3]; + static char current_dir[3]; + int err; + bool ret; + DBUG_ENTER("innobase_init"); /* Use current_dir if no paths are set */ @@ -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; @@ -1686,7 +1680,7 @@ ha_innobase::change_active_index( build_template(prebuilt, user_thd, table, ROW_MYSQL_WHOLE_ROW); - DBUG_RETURN(0); + return(0); } /************************************************************************** @@ -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; @@ -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); @@ -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) { @@ -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; |