BUG#18676 when cluster stoage engine is down, mysqld can't normally create talbe with other storage engine. mysql-test/r/ndb_autodiscover.result changes ndbd error code to mysqld error code when no cluster connection sql/ha_ndbcluster.cc map 4009 error code to mysql not connected error sql/handler.cc define return codes to ha_table_exists_in_engine to something useful NOTE: in 5.1 this should call a handlerton method, not horrible ifdef ndb stuff sql/sql_table.cc clearly define what happens on create table if exists/not exists/not connected to engine Index: ndb/sql/handler.cc =================================================================== --- ndb.orig/sql/handler.cc 2007-02-08 18:23:34.713941250 +1100 +++ ndb/sql/handler.cc 2007-02-08 20:30:57.831606250 +1100 @@ -2447,14 +2447,14 @@ ha_find_files(THD *thd,const char *db,co Ask handler if the table exists in engine RETURN - 0 Table does not exist - 1 Table exists - # Error code + HA_ERR_NO_SUCH_TABLE Table does not exist + HA_ERR_TABLE_EXIST Table exists + # Error code */ int ha_table_exists_in_engine(THD* thd, const char* db, const char* name) { - int error= 0; + int error= HA_ERR_NO_SUCH_TABLE; DBUG_ENTER("ha_table_exists_in_engine"); DBUG_PRINT("enter", ("db: %s, name: %s", db, name)); #ifdef HAVE_NDBCLUSTER_DB Index: ndb/sql/sql_table.cc =================================================================== --- ndb.orig/sql/sql_table.cc 2007-02-08 18:23:34.729942250 +1100 +++ ndb/sql/sql_table.cc 2007-02-08 20:30:57.835606500 +1100 @@ -1695,6 +1695,7 @@ bool mysql_create_table(THD *thd,const c alias); DBUG_RETURN(FALSE); } + DBUG_PRINT("info",("1")); my_error(ER_TABLE_EXISTS_ERROR, MYF(0), alias); DBUG_RETURN(TRUE); } @@ -1705,6 +1706,7 @@ bool mysql_create_table(THD *thd,const c { if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS) goto warn; + DBUG_PRINT("info",("2")); my_error(ER_TABLE_EXISTS_ERROR,MYF(0),table_name); goto end; } @@ -1723,14 +1725,25 @@ bool mysql_create_table(THD *thd,const c { bool create_if_not_exists = create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS; - if (ha_table_exists_in_engine(thd, db, table_name)) + int retcode = ha_table_exists_in_engine(thd, db, table_name); + DBUG_PRINT("info", ("exists_in_engine: %u",retcode)); + switch (retcode) { - DBUG_PRINT("info", ("Table with same name already existed in handler")); + case HA_ERR_NO_SUCH_TABLE: + /* Normal case, no table exists. we can go and create it */ + break; + case HA_ERR_TABLE_EXIST: + DBUG_PRINT("info", ("Table existed in handler")); - if (create_if_not_exists) - goto warn; - my_error(ER_TABLE_EXISTS_ERROR,MYF(0),table_name); - goto end; + if (create_if_not_exists) + goto warn; + my_error(ER_TABLE_EXISTS_ERROR,MYF(0),table_name); + goto end; + break; + default: + DBUG_PRINT("info", ("error: %u from storage engine", retcode)); + my_error(retcode, MYF(0),table_name); + goto end; } } Index: ndb/mysql-test/r/ndb_autodiscover.result =================================================================== --- ndb.orig/mysql-test/r/ndb_autodiscover.result 2007-02-08 18:23:34.837949000 +1100 +++ ndb/mysql-test/r/ndb_autodiscover.result 2007-02-08 20:30:57.835606500 +1100 @@ -382,7 +382,7 @@ create table t1 (a int primary key) engi select * from t1; a select * from t1; -ERROR HY000: Can't lock file (errno: 4009) +ERROR HY000: Can't lock file (errno: 157) use test; drop database test_only_ndb_tables; CREATE TABLE t9 ( Index: ndb/sql/ha_ndbcluster.cc =================================================================== --- ndb.orig/sql/ha_ndbcluster.cc 2007-02-08 18:23:34.789946000 +1100 +++ ndb/sql/ha_ndbcluster.cc 2007-02-08 20:51:25.912356500 +1100 @@ -203,6 +203,8 @@ static const err_code_mapping err_map[]= { 284, HA_ERR_TABLE_DEF_CHANGED, 0 }, + {4009, HA_ERR_NO_CONNECTION, 1 }, + { 0, 1, 0 }, { -1, -1, 1 } @@ -5042,14 +5044,11 @@ int ndbcluster_table_exists_in_engine(TH dict->invalidateTable(name); if (!(tab= dict->getTable(name))) { - const NdbError err= dict->getNdbError(); - if (err.code == 709) - DBUG_RETURN(0); - ERR_RETURN(err); + ERR_RETURN(dict->getNdbError()); } DBUG_PRINT("info", ("Found table %s", tab->getName())); - DBUG_RETURN(1); + DBUG_RETURN(HA_ERR_TABLE_EXIST); } @@ -5234,7 +5233,7 @@ int ndbcluster_find_files(THD *thd,const DBUG_PRINT("info", ("%s existed on disk", name)); // The .ndb file exists on disk, but it's not in list of tables in ndb // Verify that handler agrees table is gone. - if (ndbcluster_table_exists_in_engine(thd, db, file_name) == 0) + if (ndbcluster_table_exists_in_engine(thd, db, file_name) == HA_ERR_NO_SUCH_TABLE) { DBUG_PRINT("info", ("NDB says %s does not exists", file_name)); it.remove();