Commit f65e9210 authored by unknown's avatar unknown
Browse files

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
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -179,7 +179,7 @@ a b c
2	two	two
alter table t1 drop index c;
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';
a	b	c
2	two	two
+1 −0
Original line number Diff line number Diff line
@@ -47,3 +47,4 @@ t2
t3
t4
drop table t1, t2, t3, t4;
drop table t1, t3, t4;
+1 −1
Original line number Diff line number Diff line
@@ -143,7 +143,7 @@ select * from t1 where b = 'two';
connection server1;
alter table t1 drop index c;
connection server2;
--error 1146
--error 1105
select * from t1 where b = 'two';
select * from t1 where b = 'two';
connection server1;
+2 −0
Original line number Diff line number Diff line
@@ -40,5 +40,7 @@ show status like 'handler_discover%';
show tables;

drop table t1, t2, t3, t4;
connection server2;
drop table t1, t3, t4;

+28 −2
Original line number Diff line number Diff line
@@ -113,7 +113,6 @@ static const err_code_mapping err_map[]=
  { 4244, HA_ERR_TABLE_EXIST, 1 },

  { 709, HA_ERR_NO_SUCH_TABLE, 1 },
  { 284, HA_ERR_NO_SUCH_TABLE, 1 },

  { 266, HA_ERR_LOCK_WAIT_TIMEOUT, 1 },
  { 274, HA_ERR_LOCK_WAIT_TIMEOUT, 1 },
@@ -363,7 +362,7 @@ void ha_ndbcluster::invalidateDictionaryCache()
int ha_ndbcluster::ndb_err(NdbConnection *trans)
{
  int res;
  const NdbError err= trans->getNdbError();
  NdbError err= trans->getNdbError();
  DBUG_ENTER("ndb_err");
  
  ERR_PRINT(err);
@@ -371,6 +370,33 @@ int ha_ndbcluster::ndb_err(NdbConnection *trans)
  case NdbError::SchemaError:
  {
    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;
  }
  default: