Commit d2b05129 authored by monty@donna.mysql.fi's avatar monty@donna.mysql.fi

Merge work:/my/mysql into donna.mysql.fi:/home/my/bk/mysql

parents e829e96d 0ba8d3ef
......@@ -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
......
......@@ -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,
... */
......
......@@ -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);
}
......
......@@ -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. */
......
......@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment