Loading mysql-test/r/view.result +20 −1 Original line number Diff line number Diff line Loading @@ -193,7 +193,7 @@ c d 2 5 3 10 drop view v100; ERROR 42S02: Unknown table 'test.v100' ERROR 42S02: Unknown table 'v100' drop view t1; ERROR HY000: 'test.t1' is not VIEW drop table v1; Loading Loading @@ -2831,3 +2831,22 @@ b c DROP VIEW v1, v2; DROP TABLE t1; CREATE TABLE t1 (id INT); CREATE VIEW v1 AS SELECT id FROM t1; SHOW TABLES; Tables_in_test t1 v1 DROP VIEW v2,v1; ERROR 42S02: Unknown table 'v2' SHOW TABLES; Tables_in_test t1 CREATE VIEW v1 AS SELECT id FROM t1; DROP VIEW t1,v1; ERROR HY000: 'test.t1' is not VIEW SHOW TABLES; Tables_in_test t1 DROP TABLE t1; DROP VIEW IF EXISTS v1; mysql-test/t/view.test +21 −0 Original line number Diff line number Diff line Loading @@ -2697,3 +2697,24 @@ INSERT INTO v2 (col) VALUES ('c'); SELECT s1 FROM t1; DROP VIEW v1, v2; DROP TABLE t1; # # Bug #11551: Asymmetric + undocumented behaviour of DROP VIEW and DROP TABLE # CREATE TABLE t1 (id INT); CREATE VIEW v1 AS SELECT id FROM t1; SHOW TABLES; --error 1051 DROP VIEW v2,v1; SHOW TABLES; CREATE VIEW v1 AS SELECT id FROM t1; --error 1347 DROP VIEW t1,v1; SHOW TABLES; DROP TABLE t1; --disable_warnings DROP VIEW IF EXISTS v1; --enable_warnings sql/sql_view.cc +38 −13 Original line number Diff line number Diff line Loading @@ -1282,8 +1282,11 @@ bool mysql_drop_view(THD *thd, TABLE_LIST *views, enum_drop_mode drop_mode) DBUG_ENTER("mysql_drop_view"); char path[FN_REFLEN]; TABLE_LIST *view; bool type= 0; frm_type_enum type; db_type not_used; String non_existant_views; char *wrong_object_db= NULL, *wrong_object_name= NULL; bool error= FALSE; for (view= views; view; view= view->next_local) { Loading @@ -1291,8 +1294,9 @@ bool mysql_drop_view(THD *thd, TABLE_LIST *views, enum_drop_mode drop_mode) view->table_name, reg_ext, NullS); (void) unpack_filename(path, path); VOID(pthread_mutex_lock(&LOCK_open)); type= FRMTYPE_ERROR; if (access(path, F_OK) || (type= (mysql_frm_type(thd, path, ¬_used) != FRMTYPE_VIEW))) FRMTYPE_VIEW != (type= mysql_frm_type(thd, path, ¬_used))) { char name[FN_REFLEN]; my_snprintf(name, sizeof(name), "%s.%s", view->db, view->table_name); Loading @@ -1304,25 +1308,46 @@ bool mysql_drop_view(THD *thd, TABLE_LIST *views, enum_drop_mode drop_mode) VOID(pthread_mutex_unlock(&LOCK_open)); continue; } if (type) my_error(ER_WRONG_OBJECT, MYF(0), view->db, view->table_name, "VIEW"); if (type == FRMTYPE_TABLE) { if (!wrong_object_name) { wrong_object_db= view->db; wrong_object_name= view->table_name; } } else my_error(ER_BAD_TABLE_ERROR, MYF(0), name); goto err; { if (non_existant_views.length()) non_existant_views.append(','); non_existant_views.append(String(view->table_name,system_charset_info)); } VOID(pthread_mutex_unlock(&LOCK_open)); continue; } if (my_delete(path, MYF(MY_WME))) goto err; error= TRUE; query_cache_invalidate3(thd, view, 0); sp_cache_invalidate(); VOID(pthread_mutex_unlock(&LOCK_open)); } if (error) { DBUG_RETURN(TRUE); } if (wrong_object_name) { my_error(ER_WRONG_OBJECT, MYF(0), wrong_object_db, wrong_object_name, "VIEW"); DBUG_RETURN(TRUE); } if (non_existant_views.length()) { my_error(ER_BAD_TABLE_ERROR, MYF(0), non_existant_views.c_ptr()); DBUG_RETURN(TRUE); } send_ok(thd); DBUG_RETURN(FALSE); err: VOID(pthread_mutex_unlock(&LOCK_open)); DBUG_RETURN(TRUE); } Loading Loading
mysql-test/r/view.result +20 −1 Original line number Diff line number Diff line Loading @@ -193,7 +193,7 @@ c d 2 5 3 10 drop view v100; ERROR 42S02: Unknown table 'test.v100' ERROR 42S02: Unknown table 'v100' drop view t1; ERROR HY000: 'test.t1' is not VIEW drop table v1; Loading Loading @@ -2831,3 +2831,22 @@ b c DROP VIEW v1, v2; DROP TABLE t1; CREATE TABLE t1 (id INT); CREATE VIEW v1 AS SELECT id FROM t1; SHOW TABLES; Tables_in_test t1 v1 DROP VIEW v2,v1; ERROR 42S02: Unknown table 'v2' SHOW TABLES; Tables_in_test t1 CREATE VIEW v1 AS SELECT id FROM t1; DROP VIEW t1,v1; ERROR HY000: 'test.t1' is not VIEW SHOW TABLES; Tables_in_test t1 DROP TABLE t1; DROP VIEW IF EXISTS v1;
mysql-test/t/view.test +21 −0 Original line number Diff line number Diff line Loading @@ -2697,3 +2697,24 @@ INSERT INTO v2 (col) VALUES ('c'); SELECT s1 FROM t1; DROP VIEW v1, v2; DROP TABLE t1; # # Bug #11551: Asymmetric + undocumented behaviour of DROP VIEW and DROP TABLE # CREATE TABLE t1 (id INT); CREATE VIEW v1 AS SELECT id FROM t1; SHOW TABLES; --error 1051 DROP VIEW v2,v1; SHOW TABLES; CREATE VIEW v1 AS SELECT id FROM t1; --error 1347 DROP VIEW t1,v1; SHOW TABLES; DROP TABLE t1; --disable_warnings DROP VIEW IF EXISTS v1; --enable_warnings
sql/sql_view.cc +38 −13 Original line number Diff line number Diff line Loading @@ -1282,8 +1282,11 @@ bool mysql_drop_view(THD *thd, TABLE_LIST *views, enum_drop_mode drop_mode) DBUG_ENTER("mysql_drop_view"); char path[FN_REFLEN]; TABLE_LIST *view; bool type= 0; frm_type_enum type; db_type not_used; String non_existant_views; char *wrong_object_db= NULL, *wrong_object_name= NULL; bool error= FALSE; for (view= views; view; view= view->next_local) { Loading @@ -1291,8 +1294,9 @@ bool mysql_drop_view(THD *thd, TABLE_LIST *views, enum_drop_mode drop_mode) view->table_name, reg_ext, NullS); (void) unpack_filename(path, path); VOID(pthread_mutex_lock(&LOCK_open)); type= FRMTYPE_ERROR; if (access(path, F_OK) || (type= (mysql_frm_type(thd, path, ¬_used) != FRMTYPE_VIEW))) FRMTYPE_VIEW != (type= mysql_frm_type(thd, path, ¬_used))) { char name[FN_REFLEN]; my_snprintf(name, sizeof(name), "%s.%s", view->db, view->table_name); Loading @@ -1304,25 +1308,46 @@ bool mysql_drop_view(THD *thd, TABLE_LIST *views, enum_drop_mode drop_mode) VOID(pthread_mutex_unlock(&LOCK_open)); continue; } if (type) my_error(ER_WRONG_OBJECT, MYF(0), view->db, view->table_name, "VIEW"); if (type == FRMTYPE_TABLE) { if (!wrong_object_name) { wrong_object_db= view->db; wrong_object_name= view->table_name; } } else my_error(ER_BAD_TABLE_ERROR, MYF(0), name); goto err; { if (non_existant_views.length()) non_existant_views.append(','); non_existant_views.append(String(view->table_name,system_charset_info)); } VOID(pthread_mutex_unlock(&LOCK_open)); continue; } if (my_delete(path, MYF(MY_WME))) goto err; error= TRUE; query_cache_invalidate3(thd, view, 0); sp_cache_invalidate(); VOID(pthread_mutex_unlock(&LOCK_open)); } if (error) { DBUG_RETURN(TRUE); } if (wrong_object_name) { my_error(ER_WRONG_OBJECT, MYF(0), wrong_object_db, wrong_object_name, "VIEW"); DBUG_RETURN(TRUE); } if (non_existant_views.length()) { my_error(ER_BAD_TABLE_ERROR, MYF(0), non_existant_views.c_ptr()); DBUG_RETURN(TRUE); } send_ok(thd); DBUG_RETURN(FALSE); err: VOID(pthread_mutex_unlock(&LOCK_open)); DBUG_RETURN(TRUE); } Loading