summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--innobase/include/row0mysql.h8
-rw-r--r--innobase/include/trx0trx.h3
-rw-r--r--innobase/row/row0ins.c5
-rw-r--r--innobase/row/row0mysql.c30
-rw-r--r--sql/ha_innobase.cc32
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;