diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 0c6f7837235f973952fd97c31913c5bc872764ca..5719f77e3ef8ac4dc7f11aadcfb3bc372090f0cc 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -1384,7 +1384,7 @@ bool reopen_tables(THD *thd,bool get_locks,bool in_refresh)
     MYSQL_LOCK *lock;
     /* We should always get these locks */
     thd->some_tables_deleted=0;
-    if ((lock= mysql_lock_tables(thd, tables, (uint) (tables_ptr-tables), 0)))
+    if ((lock= mysql_lock_tables(thd, tables, (uint) (tables_ptr - tables), 0)))
     {
       thd->locked_tables=mysql_lock_merge(thd->locked_tables,lock);
     }
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 18594568a7a33f88631a012df0f9dbfbbe9e09cf..b1863953e1d0b988459eb9470427750c5c775bae 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -2808,7 +2808,7 @@ mysql_execute_command(THD *thd)
             unique_table(create_table, select_tables))
         {
           my_error(ER_UPDATE_TABLE_USED, MYF(0), create_table->table_name);
-          goto unsent_create_error;
+          goto unsent_create_error1;
         }
         /* If we create merge table, we have to test tables in merge, too */
         if (lex->create_info.used_fields & HA_CREATE_USED_UNION)
@@ -2821,7 +2821,7 @@ mysql_execute_command(THD *thd)
             if (unique_table(tab, select_tables))
             {
               my_error(ER_UPDATE_TABLE_USED, MYF(0), tab->table_name);
-              goto unsent_create_error;
+              goto unsent_create_error1;
             }
           }
         }
@@ -2872,6 +2872,13 @@ mysql_execute_command(THD *thd)
     lex->link_first_table_back(create_table, link_to_local);
     break;
 
+unsent_create_error1:
+    /*
+      Release the protection against the global read lock and wake
+      everyone, who might want to set a global read lock.
+    */
+    start_waiting_global_read_lock(thd);
+
     /* put tables back for PS rexecuting */
 unsent_create_error:
     lex->link_first_table_back(create_table, link_to_local);
@@ -6959,6 +6966,8 @@ bool create_table_precheck(THD *thd, TABLE_LIST *tables,
   {
     /* Check permissions for used tables in CREATE TABLE ... SELECT */
 
+#ifdef NOT_NECESSARY_TO_CHECK_CREATE_TABLE_EXIST_WHEN_PREPARING_STATEMENT
+    /* This code throws an ill error for CREATE TABLE t1 SELECT * FROM t1 */
     /*
       Only do the check for PS, becasue we on execute we have to check that
       against the opened tables to ensure we don't use a table that is part
@@ -6977,6 +6986,7 @@ bool create_table_precheck(THD *thd, TABLE_LIST *tables,
         goto err;
       }
     }
+#endif
     if (tables && check_table_access(thd, SELECT_ACL, tables,0))
       goto err;
   }
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 27d73e9ad0a0aaeadfdb09243bc391214e5b1b97..9b608c30ec939ed70b72544f3f047a159ca48dfc 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -7083,12 +7083,13 @@ field_ident:
             TABLE_LIST *table= (TABLE_LIST*) Select->table_list.first;
             if (my_strcasecmp(table_alias_charset, $1.str, table->db))
             {
-              net_printf(YYTHD, ER_WRONG_DB_NAME, $1.str);
+              my_error(ER_WRONG_DB_NAME, MYF(0), $1.str);
               YYABORT;
             }
-            if (my_strcasecmp(table_alias_charset, $3.str, table->real_name))
+            if (my_strcasecmp(table_alias_charset, $3.str,
+                              table->table_name))
             {
-              net_printf(YYTHD, ER_WRONG_TABLE_NAME, $3.str);
+              my_error(ER_WRONG_TABLE_NAME, MYF(0), $3.str);
               YYABORT;
             }
             $$=$5;
@@ -7098,7 +7099,7 @@ field_ident:
             TABLE_LIST *table= (TABLE_LIST*) Select->table_list.first;
             if (my_strcasecmp(table_alias_charset, $1.str, table->alias))
             {
-              net_printf(YYTHD, ER_WRONG_TABLE_NAME, $1.str);
+              my_error(ER_WRONG_TABLE_NAME, MYF(0), $1.str);
               YYABORT;
             }
             $$=$3;