Commit 18bd0fa2 authored by Ramil Kalimullin's avatar Ramil Kalimullin

Fix for bug#44860: ALTER TABLE on view crashes server

Problem: executing queries like "ALTER TABLE view1;" we don't
check new view's name (which is not specified),
that leads to server crash.

Fix: do nothing (to be consistent with the behaviour for tables) 
in such cases.


mysql-test/r/view.result:
  Fix for bug#44860: ALTER TABLE on view crashes server
    - test result.
mysql-test/t/view.test:
  Fix for bug#44860: ALTER TABLE on view crashes server
    - test case.
sql/sql_rename.cc:
  Fix for bug#44860: ALTER TABLE on view crashes server
    - do_rename(): new view/table name must be specified, ASSERT() added.
sql/sql_table.cc:
  Fix for bug#44860: ALTER TABLE on view crashes server
    - mysql_alter_table(): renaming a view, check if new
  view name is specified.
parent 20076dea
...@@ -3836,6 +3836,14 @@ call p(); ...@@ -3836,6 +3836,14 @@ call p();
call p(); call p();
drop view a; drop view a;
drop procedure p; drop procedure p;
#
# Bug #44860: ALTER TABLE on view crashes server
#
CREATE TABLE t1 (a INT);
CREATE VIEW v1 AS SELECT a FROM t1;
ALTER TABLE v1;
DROP VIEW v1;
DROP TABLE t1;
# ----------------------------------------------------------------- # -----------------------------------------------------------------
# -- End of 5.1 tests. # -- End of 5.1 tests.
# ----------------------------------------------------------------- # -----------------------------------------------------------------
...@@ -3859,6 +3859,17 @@ drop procedure p; ...@@ -3859,6 +3859,17 @@ drop procedure p;
########################################################################### ###########################################################################
--echo #
--echo # Bug #44860: ALTER TABLE on view crashes server
--echo #
CREATE TABLE t1 (a INT);
CREATE VIEW v1 AS SELECT a FROM t1;
ALTER TABLE v1;
DROP VIEW v1;
DROP TABLE t1;
--echo # ----------------------------------------------------------------- --echo # -----------------------------------------------------------------
--echo # -- End of 5.1 tests. --echo # -- End of 5.1 tests.
--echo # ----------------------------------------------------------------- --echo # -----------------------------------------------------------------
...@@ -261,6 +261,8 @@ do_rename(THD *thd, TABLE_LIST *ren_table, char *new_db, char *new_table_name, ...@@ -261,6 +261,8 @@ do_rename(THD *thd, TABLE_LIST *ren_table, char *new_db, char *new_table_name,
old_alias= ren_table->table_name; old_alias= ren_table->table_name;
new_alias= new_table_name; new_alias= new_table_name;
} }
DBUG_ASSERT(new_alias);
build_table_filename(name, sizeof(name), build_table_filename(name, sizeof(name),
new_db, new_alias, reg_ext, 0); new_db, new_alias, reg_ext, 0);
if (!access(name,F_OK)) if (!access(name,F_OK))
......
...@@ -6139,6 +6139,20 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, ...@@ -6139,6 +6139,20 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
/* Sic: there is a race here */ /* Sic: there is a race here */
if (frm_type == FRMTYPE_VIEW && !(alter_info->flags & ~ALTER_RENAME)) if (frm_type == FRMTYPE_VIEW && !(alter_info->flags & ~ALTER_RENAME))
{ {
/*
The following branch handles "ALTER VIEW v1 /no arguments/;"
This feature is not documented one.
However, before "OPTIMIZE TABLE t1;" was implemented,
ALTER TABLE with no alter_specifications was used to force-rebuild
the table. That's why this grammar is allowed. That's why we ignore
it for views. So just do nothing in such a case.
*/
if (!new_name)
{
my_ok(thd);
DBUG_RETURN(FALSE);
}
/* /*
Avoid problems with a rename on a table that we have locked or Avoid problems with a rename on a table that we have locked or
if the user is trying to to do this in a transcation context if the user is trying to to do this in a transcation context
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment