Commit 5203ea6c authored by unknown's avatar unknown
Browse files

BUG#18676 when cluster storage engine is down, misleading error message on create table with 4009.


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 exits/not exists/not connected to engine
parent 1f7b3e56
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -382,7 +382,7 @@ create table t1 (a int primary key) engine=ndb;
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 (
+5 −6
Original line number Diff line number Diff line
@@ -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(THD* thd, const char *db, const char *name
  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 char *db,const char *path,
    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();
+4 −4
Original line number Diff line number Diff line
@@ -2442,14 +2442,14 @@ ha_find_files(THD *thd,const char *db,const char *path,
  Ask handler if the table exists in engine

  RETURN
    0                   Table does not exist
    1                   Table exists
    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
+19 −6
Original line number Diff line number Diff line
@@ -1696,6 +1696,7 @@ bool mysql_create_table(THD *thd,const char *db, const char *table_name,
                          alias);
      DBUG_RETURN(FALSE);
    }
    DBUG_PRINT("info",("1"));
    my_error(ER_TABLE_EXISTS_ERROR, MYF(0), alias);
    DBUG_RETURN(TRUE);
  }
@@ -1706,6 +1707,7 @@ bool mysql_create_table(THD *thd,const char *db, const char *table_name,
    {
      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;
    }
@@ -1724,14 +1726,25 @@ bool mysql_create_table(THD *thd,const char *db, const char *table_name,
  {
    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;
        break;
      default:
        DBUG_PRINT("info", ("error: %u from storage engine", retcode));
        my_error(retcode, MYF(0),table_name);
        goto end;
    }
  }