mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
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.
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user