Commit f65e9210 authored by unknown's avatar unknown

BUG#6762 ALTER TABLE gives weird results and error message

  - Better error message when table definition has changed


mysql-test/r/ndb_alter_table.result:
  New error message and code when table definition has changed.
mysql-test/r/ndb_multi.result:
  Safety, drop tables in second server as well
mysql-test/t/ndb_alter_table.test:
  New error message and code when table definition has changed.
mysql-test/t/ndb_multi.test:
  Safety, drop tables in second server as well
sql/ha_ndbcluster.cc:
  When error 284 is returned from NDB a check must be made to see what the error really means.
   - if table does not exists any more, return 709 -> No such table exists
   - if table still exists, table has most likely been altered and table id and version has 
     changed, print  hardcoded  errormessage indicating that transaction should retried
    (this error message should be translated to a langauge dependent error message in 5.0)
    
  Remove mapping from 284 to HA_ERR_NO_SUCH_TABLE
parent 8ef1afba
...@@ -179,7 +179,7 @@ a b c ...@@ -179,7 +179,7 @@ a b c
2 two two 2 two two
alter table t1 drop index c; alter table t1 drop index c;
select * from t1 where b = 'two'; select * from t1 where b = 'two';
ERROR 42S02: Table 'test.t1' doesn't exist ERROR HY000: Table definition has changed, please retry transaction
select * from t1 where b = 'two'; select * from t1 where b = 'two';
a b c a b c
2 two two 2 two two
......
...@@ -47,3 +47,4 @@ t2 ...@@ -47,3 +47,4 @@ t2
t3 t3
t4 t4
drop table t1, t2, t3, t4; drop table t1, t2, t3, t4;
drop table t1, t3, t4;
...@@ -143,7 +143,7 @@ select * from t1 where b = 'two'; ...@@ -143,7 +143,7 @@ select * from t1 where b = 'two';
connection server1; connection server1;
alter table t1 drop index c; alter table t1 drop index c;
connection server2; connection server2;
--error 1146 --error 1105
select * from t1 where b = 'two'; select * from t1 where b = 'two';
select * from t1 where b = 'two'; select * from t1 where b = 'two';
connection server1; connection server1;
......
...@@ -40,5 +40,7 @@ show status like 'handler_discover%'; ...@@ -40,5 +40,7 @@ show status like 'handler_discover%';
show tables; show tables;
drop table t1, t2, t3, t4; drop table t1, t2, t3, t4;
connection server2;
drop table t1, t3, t4;
...@@ -113,7 +113,6 @@ static const err_code_mapping err_map[]= ...@@ -113,7 +113,6 @@ static const err_code_mapping err_map[]=
{ 4244, HA_ERR_TABLE_EXIST, 1 }, { 4244, HA_ERR_TABLE_EXIST, 1 },
{ 709, HA_ERR_NO_SUCH_TABLE, 1 }, { 709, HA_ERR_NO_SUCH_TABLE, 1 },
{ 284, HA_ERR_NO_SUCH_TABLE, 1 },
{ 266, HA_ERR_LOCK_WAIT_TIMEOUT, 1 }, { 266, HA_ERR_LOCK_WAIT_TIMEOUT, 1 },
{ 274, HA_ERR_LOCK_WAIT_TIMEOUT, 1 }, { 274, HA_ERR_LOCK_WAIT_TIMEOUT, 1 },
...@@ -363,7 +362,7 @@ void ha_ndbcluster::invalidateDictionaryCache() ...@@ -363,7 +362,7 @@ void ha_ndbcluster::invalidateDictionaryCache()
int ha_ndbcluster::ndb_err(NdbConnection *trans) int ha_ndbcluster::ndb_err(NdbConnection *trans)
{ {
int res; int res;
const NdbError err= trans->getNdbError(); NdbError err= trans->getNdbError();
DBUG_ENTER("ndb_err"); DBUG_ENTER("ndb_err");
ERR_PRINT(err); ERR_PRINT(err);
...@@ -371,6 +370,33 @@ int ha_ndbcluster::ndb_err(NdbConnection *trans) ...@@ -371,6 +370,33 @@ int ha_ndbcluster::ndb_err(NdbConnection *trans)
case NdbError::SchemaError: case NdbError::SchemaError:
{ {
invalidateDictionaryCache(); invalidateDictionaryCache();
if (err.code==284)
{
/*
Check if the table is _really_ gone or if the table has
been alterend and thus changed table id
*/
NDBDICT *dict= get_ndb()->getDictionary();
DBUG_PRINT("info", ("Check if table %s is really gone", m_tabname));
if (!(dict->getTable(m_tabname)))
{
err= dict->getNdbError();
DBUG_PRINT("info", ("Table not found, error: %d", err.code));
if (err.code != 709)
DBUG_RETURN(1);
}
else
{
DBUG_PRINT("info", ("Table exist but must have changed"));
/* In 5.0, this should be replaced with a mapping to a mysql error */
my_printf_error(ER_UNKNOWN_ERROR,
"Table definition has changed, "\
"please retry transaction",
MYF(0));
DBUG_RETURN(1);
}
}
break; break;
} }
default: default:
......
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