From dde57f082bfcc955cb41291ad1119cf406d509a9 Mon Sep 17 00:00:00 2001 From: "andrey@lmy004." <> Date: Thu, 25 Aug 2005 09:24:21 +0200 Subject: [PATCH] fix for bug #12533 (crash on DESCRIBE after renaming base table column) --- mysql-test/r/view.result | 12 ++++++++++++ mysql-test/t/view.test | 17 +++++++++++++++++ sql/sql_show.cc | 17 ++++++++++------- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index f56c6558e4f..4767ca0eca7 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -2115,3 +2115,15 @@ CREATE VIEW v1 AS SELECT f1(); ERROR HY000: View's SELECT refers to a temporary table 't1' DROP FUNCTION f1; DROP TABLE t1; +DROP TABLE IF EXISTS t1; +DROP VIEW IF EXISTS v1; +CREATE TABLE t1 (f4 CHAR(5)); +CREATE VIEW v1 AS SELECT * FROM t1; +DESCRIBE v1; +Field Type Null Key Default Extra +f4 char(5) YES NULL +ALTER TABLE t1 CHANGE COLUMN f4 f4x CHAR(5); +DESCRIBE v1; +ERROR HY000: View 'test.v1' references invalid table(s) or column(s) or function(s) +DROP TABLE t1; +DROP VIEW v1; diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index a5b72a16972..4c11f93e683 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -1966,3 +1966,20 @@ CREATE VIEW v1 AS SELECT f1(); DROP FUNCTION f1; DROP TABLE t1; +# +# BUG #12533 (crash on DESCRIBE after renaming base table column) +# +--disable_warnings +DROP TABLE IF EXISTS t1; +DROP VIEW IF EXISTS v1; +--enable_warnings + +CREATE TABLE t1 (f4 CHAR(5)); +CREATE VIEW v1 AS SELECT * FROM t1; +DESCRIBE v1; + +ALTER TABLE t1 CHANGE COLUMN f4 f4x CHAR(5); +--error 1356 +DESCRIBE v1; +DROP TABLE t1; +DROP VIEW v1; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 3bb349d7c29..7e7771c5b37 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1985,13 +1985,15 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond) lex->all_selects_list= lsel; res= open_normal_and_derived_tables(thd, show_table_list, MYSQL_LOCK_IGNORE_FLUSH); - if (schema_table->process_table(thd, show_table_list, + /* + get_all_tables() returns 1 on failure and 0 on success thus + return only these and not the result code of ::process_table() + */ + error= test(schema_table->process_table(thd, show_table_list, table, res, show_table_list->db, - show_table_list->alias)) - goto err; + show_table_list->alias)); close_thread_tables(thd); show_table_list->table= 0; - error= 0; goto err; } @@ -2090,11 +2092,12 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond) lex->derived_tables= 0; res= open_normal_and_derived_tables(thd, show_table_list, MYSQL_LOCK_IGNORE_FLUSH); - if (schema_table->process_table(thd, show_table_list, table, + res= schema_table->process_table(thd, show_table_list, table, res, base_name, - show_table_list->alias)) - goto err; + show_table_list->alias); close_thread_tables(thd); + if (res) + goto err; } } }