From: Date: February 20 2008 1:00pm Subject: bk commit into 5.1 tree (anozdrin:1.2561) BUG#34337 List-Archive: http://lists.mysql.com/commits/42636 X-Bug: 34337 Message-Id: <20080220120010.C08851D5C6B@quad.opbmk> Below is the list of changes that have just been committed into a local 5.1 repository of anozdrin. When anozdrin does a push these changes will be propagated to the main repository and, within 24 hours after the push, to the public repository. For information on how to access the public repository see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html ChangeSet@stripped, 2008-02-20 15:00:07+03:00, anozdrin@quad. +3 -0 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@stripped, 2008-02-20 15:00:06+03:00, anozdrin@quad. +15 -0 Fix result file. mysql-test/t/view.test@stripped, 2008-02-20 15:00:06+03:00, anozdrin@quad. +28 -0 Add a test case for Bug#34337: Server crash when Altering a view using a table name. sql/sql_view.cc@stripped, 2008-02-20 15:00:06+03:00, anozdrin@quad. +19 -3 Report an error if we're going to work with a table. diff -Nrup a/mysql-test/r/view.result b/mysql-test/r/view.result --- a/mysql-test/r/view.result 2008-02-12 22:09:14 +03:00 +++ b/mysql-test/r/view.result 2008-02-20 15:00:06 +03:00 @@ -3721,5 +3721,20 @@ 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. # ----------------------------------------------------------------- diff -Nrup a/mysql-test/t/view.test b/mysql-test/t/view.test --- a/mysql-test/t/view.test 2008-02-12 22:09:14 +03:00 +++ b/mysql-test/t/view.test 2008-02-20 15:00:06 +03:00 @@ -3604,5 +3604,33 @@ 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 # ----------------------------------------------------------------- diff -Nrup a/sql/sql_view.cc b/sql/sql_view.cc --- a/sql/sql_view.cc 2008-02-19 15:45:17 +03:00 +++ b/sql/sql_view.cc 2008-02-20 15:00:06 +03:00 @@ -182,10 +182,26 @@ fill_defined_view_parts (THD *thd, TABLE TABLE_LIST decoy; memcpy (&decoy, view, sizeof (TABLE_LIST)); - if (!open_table(thd, &decoy, thd->mem_root, ¬_used, OPEN_VIEW_NO_PARSE) && - !decoy.view) + + /* + 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; }