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();
