Fix for Bug#34337: Server crash when Altering a view using
a table name. The problem was that fill_defined_view_parts() did not return an error if a table is going to be altered. That happened if the table was already in the table cache. In that case, open_table() returned non-NULL value (valid TABLE-instance from the cache). The fix is to ensure that an error is thrown even if the table is in the cache. mysql-test/r/view.result: Fix result file. mysql-test/t/view.test: Add a test case for Bug#34337: Server crash when Altering a view using a table name. sql/sql_view.cc: Report an error if we're going to work with a table.
This commit is contained in:
parent
0b6bc7ef84
commit
985e952347
@ -3720,6 +3720,21 @@ DROP VIEW v1;
|
||||
|
||||
# -- End of test case for Bug#32538.
|
||||
|
||||
# -----------------------------------------------------------------
|
||||
# -- Bug#34337: Server crash when Altering a view using a table name.
|
||||
# -----------------------------------------------------------------
|
||||
|
||||
DROP TABLE IF EXISTS t1;
|
||||
|
||||
CREATE TABLE t1(c1 INT);
|
||||
|
||||
ALTER ALGORITHM=TEMPTABLE SQL SECURITY INVOKER VIEW t1 (c2) AS SELECT (1);
|
||||
ERROR HY000: 'test.t1' is not VIEW
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
# -- End of test case for Bug#34337.
|
||||
|
||||
# -----------------------------------------------------------------
|
||||
# -- End of 5.1 tests.
|
||||
# -----------------------------------------------------------------
|
||||
|
@ -3603,6 +3603,34 @@ DROP VIEW v1;
|
||||
|
||||
###########################################################################
|
||||
|
||||
--echo # -----------------------------------------------------------------
|
||||
--echo # -- Bug#34337: Server crash when Altering a view using a table name.
|
||||
--echo # -----------------------------------------------------------------
|
||||
--echo
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--enable_warnings
|
||||
|
||||
--echo
|
||||
|
||||
CREATE TABLE t1(c1 INT);
|
||||
|
||||
--echo
|
||||
|
||||
--error ER_WRONG_OBJECT
|
||||
ALTER ALGORITHM=TEMPTABLE SQL SECURITY INVOKER VIEW t1 (c2) AS SELECT (1);
|
||||
|
||||
--echo
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo
|
||||
--echo # -- End of test case for Bug#34337.
|
||||
--echo
|
||||
|
||||
###########################################################################
|
||||
|
||||
--echo # -----------------------------------------------------------------
|
||||
--echo # -- End of 5.1 tests.
|
||||
--echo # -----------------------------------------------------------------
|
||||
|
@ -182,10 +182,33 @@ fill_defined_view_parts (THD *thd, TABLE_LIST *view)
|
||||
TABLE_LIST decoy;
|
||||
|
||||
memcpy (&decoy, view, sizeof (TABLE_LIST));
|
||||
if (!open_table(thd, &decoy, thd->mem_root, ¬_used, OPEN_VIEW_NO_PARSE) &&
|
||||
!decoy.view)
|
||||
|
||||
/*
|
||||
Let's reset decoy.view before calling open_table(): when we start
|
||||
supporting ALTER VIEW in PS/SP that may save us from a crash.
|
||||
*/
|
||||
|
||||
decoy.view= NULL;
|
||||
|
||||
/*
|
||||
open_table() will return NULL if 'decoy' is idenitifying a view *and*
|
||||
there is no TABLE object for that view in the table cache. However,
|
||||
decoy.view will be set to 1.
|
||||
|
||||
If there is a TABLE-instance for the oject identified by 'decoy',
|
||||
open_table() will return that instance no matter if it is a table or
|
||||
a view.
|
||||
|
||||
Thus, there is no need to check for the return value of open_table(),
|
||||
since the return value itself does not mean anything.
|
||||
*/
|
||||
|
||||
open_table(thd, &decoy, thd->mem_root, ¬_used, OPEN_VIEW_NO_PARSE);
|
||||
|
||||
if (!decoy.view)
|
||||
{
|
||||
/* It's a table */
|
||||
/* It's a table. */
|
||||
my_error(ER_WRONG_OBJECT, MYF(0), view->db, view->table_name, "VIEW");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user