From: Christopher Powers Date: November 18 2010 7:57pm Subject: bzr push into mysql-5.5-bugteam branch (chris.powers:3127 to 3129) Bug#35333 List-Archive: http://lists.mysql.com/commits/124302 X-Bug: 35333 Message-Id: <20101118195714.6CB221DB0311@xeno.mysql.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============3258659493997101726==" --===============3258659493997101726== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3129 Christopher Powers 2010-11-18 Bug#35333, "If Federated table can't connect to remote host, can't retrieve metadata" Improved error handling such that queries against Information_Schema.Tables won't fail if a federated table can't make a remote connection. @ mysql-test/r/lock_multi.result Updated with warnings that were previously masked. @ mysql-test/r/mdl_sync.result Updated with warnings that were previously masked. @ mysql-test/r/merge.result Updated with warnings that were previously masked. @ mysql-test/r/show_check.result Updated with warnings that were previously masked. @ mysql-test/r/view.result Updated with warnings that were previously masked. @ mysql-test/suite/federated/federated_bug_35333.result Changes per code review. @ mysql-test/suite/federated/federated_bug_35333.test Changes per code review. @ sql/sql_show.cc If get_schema_tables_record() encounters an error, push a warning, set the TABLE COMMENT column with the error text, and clear the error so that the operation can continue. modified: mysql-test/r/lock_multi.result mysql-test/r/mdl_sync.result mysql-test/r/merge.result mysql-test/r/show_check.result mysql-test/r/view.result mysql-test/suite/federated/federated_bug_35333.result mysql-test/suite/federated/federated_bug_35333.test sql/sql_show.cc 3128 Christopher Powers 2010-11-17 Bug#35333, "If Federated table can't connect to remote host, can't retrieve metadata" Improved error handling such that queries against Information_Schema.Tables won't fail if a federated table can't make a remote connection. @ sql/sql_show.cc If get_schema_tables_record() encounters an error, push a warning, set the TABLE COMMENT column with the error text, and clear the error so that the operation can continue. added: mysql-test/suite/federated/federated_bug_35333.result mysql-test/suite/federated/federated_bug_35333.test modified: sql/sql_show.cc 3127 Davi Arnaut 2010-11-17 [merge] Merge of mysql-5.1-bugteam into mysql-5.5-bugteam. modified: include/m_string.h === modified file 'mysql-test/r/lock_multi.result' --- a/mysql-test/r/lock_multi.result 2010-02-26 12:40:25 +0000 +++ b/mysql-test/r/lock_multi.result 2010-11-18 19:56:42 +0000 @@ -430,6 +430,8 @@ SELECT table_name, table_comment FROM in WHERE table_schema= 'test' AND table_name= 't1'; table_name table_comment t1 Lock wait timeout exceeded; try restarting transaction +Warnings: +Warning 1205 Lock wait timeout exceeded; try restarting transaction # Connection default UNLOCK TABLES; # Connection con3 === modified file 'mysql-test/r/mdl_sync.result' --- a/mysql-test/r/mdl_sync.result 2010-10-06 14:34:28 +0000 +++ b/mysql-test/r/mdl_sync.result 2010-11-18 19:56:42 +0000 @@ -2322,6 +2322,8 @@ select table_name, table_type, auto_incr from information_schema.tables where table_schema='test' and table_name='t2'; table_name table_type auto_increment table_comment t2 BASE TABLE NULL Table 'test'.'t2' was skipped since its definition is being modified by concurrent DDL statement +Warnings: +Warning 1684 Table 'test'.'t2' was skipped since its definition is being modified by concurrent DDL statement # Switching to connection 'default'. unlock tables; # Switching to connection 'con46044'. === modified file 'mysql-test/r/merge.result' --- a/mysql-test/r/merge.result 2010-10-06 07:56:29 +0000 +++ b/mysql-test/r/merge.result 2010-11-18 19:56:42 +0000 @@ -2084,6 +2084,8 @@ SELECT * FROM INFORMATION_SCHEMA.TABLES TABLE_SCHEMA = 'test' and TABLE_NAME='tm1'; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT def test tm1 BASE TABLE NULL NULL NULL # # # # # # # # # # NULL # # Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist +Warnings: +Warning 1168 Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist DROP TABLE tm1; CREATE TABLE t1(C1 INT, C2 INT, KEY C1(C1), KEY C2(C2)) ENGINE=MYISAM; CREATE TABLE t2(C1 INT, C2 INT, KEY C1(C1), KEY C2(C2)) ENGINE=MYISAM; === modified file 'mysql-test/r/show_check.result' --- a/mysql-test/r/show_check.result 2010-07-23 08:44:55 +0000 +++ b/mysql-test/r/show_check.result 2010-11-18 19:56:42 +0000 @@ -663,6 +663,8 @@ flush tables; SHOW TABLE STATUS like 't1'; Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment t1 NULL NULL NULL NULL # # # # NULL NULL NULL NULL NULL NULL NULL NULL Incorrect information in file: './test/t1.frm' +Warnings: +Warning 1033 Incorrect information in file: './test/t1.frm' show create table t1; ERROR HY000: Incorrect information in file: './test/t1.frm' drop table if exists t1; === modified file 'mysql-test/r/view.result' --- a/mysql-test/r/view.result 2010-07-30 15:28:36 +0000 +++ b/mysql-test/r/view.result 2010-11-18 19:56:42 +0000 @@ -840,6 +840,8 @@ show table status; Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment t1 MyISAM 10 Fixed 0 0 0 # 1024 0 NULL # # NULL latin1_swedish_ci NULL v1 NULL NULL NULL NULL NULL NULL # NULL NULL NULL # # NULL NULL NULL NULL View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them +Warnings: +Warning 1356 View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them drop view v1; drop table t1; create view v1 as select 99999999999999999999999999999999999999999999999999999 as col1; === added file 'mysql-test/suite/federated/federated_bug_35333.result' --- a/mysql-test/suite/federated/federated_bug_35333.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/federated/federated_bug_35333.result 2010-11-18 19:56:42 +0000 @@ -0,0 +1,68 @@ +# +# Bug 35333 "If a Federated table can't connect to the remote hose, can't retrieve metadata" +# +# Queries such as SHOW TABLE STATUS and SELECT * FROM INFORMATION_SCHEMA.TABLES fail +# when encountering a federated table that cannot connect to its remote table. +# +# The fix is to store the error text in the TABLE COMMENTS column of I_S.TABLES, clear +# the remote connection error and push a warning instead. This allows the SELECT operation +# to complete while still indicating a problem. This fix applies to any non-fatal system +# error that occurs during a query against I_S.TABLES. +CREATE DATABASE federated; +CREATE DATABASE federated; +CREATE DATABASE IF NOT EXISTS realdb; +DROP TABLE IF EXISTS realdb.t0; +DROP TABLE IF EXISTS federated.t0; +# +# Create the base table to be referenced +# +CREATE TABLE realdb.t0 (a text, b text) ENGINE=MYISAM; +# +# Create a federated table with a bogus port number +# +CREATE TABLE federated.t0 (a text, b text) ENGINE=FEDERATED +CONNECTION='mysql://root@stripped:63333/realdb/t0'; +# +# Trigger a federated system error during a INFORMATION_SCHEMA.TABLES query +# +SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, ENGINE, ROW_FORMAT, TABLE_ROWS, DATA_LENGTH, TABLE_COMMENT +FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'realdb' or TABLE_SCHEMA = 'federated'; +TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE ROW_FORMAT TABLE_ROWS DATA_LENGTH TABLE_COMMENT +federated t0 BASE TABLE FEDERATED NULL 0 Unable to connect to foreign data source: Can't connect to MySQL server on '127.0.0.1' (111) +realdb t0 BASE TABLE MyISAM Dynamic 0 0 +Warnings: +Warning 1429 Unable to connect to foreign data source: Can't connect to MySQL server on '127.0.0.1' (111) +SHOW WARNINGS; +Level Code Message +Warning 1429 Unable to connect to foreign data source: Can't connect to MySQL server on '127.0.0.1' (111) +# +# Create a MyISAM table then corrupt the file +# +USE realdb; +CREATE TABLE t1 (c1 int) ENGINE=MYISAM; +# +# Corrupt the MyISAM table by deleting the base file +# +/home/cpowers/work/dev/mysql-5.5-bugteam/mysql-test/var/mysqld.2/data/ +# +# Trigger a MyISAM system error during an INFORMATION_SCHEMA.TABLES query +# +SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, ENGINE, ROW_FORMAT, TABLE_ROWS, DATA_LENGTH, TABLE_COMMENT +FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE ROW_FORMAT TABLE_ROWS DATA_LENGTH TABLE_COMMENT +realdb t1 BASE TABLE NULL NULL NULL NULL Can't find file: 't1' (errno: 2) +Warnings: +Warning 1017 Can't find file: 't1' (errno: 2) +SHOW WARNINGS; +Level Code Message +Warning 1017 Can't find file: 't1' (errno: 2) +# +# Cleanup +# +DROP TABLE IF EXISTS realdb.t0; +DROP TABLE IF EXISTS federated.t0; +DROP DATABASE realdb; +DROP TABLE IF EXISTS federated.t1; +DROP DATABASE federated; +DROP TABLE IF EXISTS federated.t1; +DROP DATABASE federated; === added file 'mysql-test/suite/federated/federated_bug_35333.test' --- a/mysql-test/suite/federated/federated_bug_35333.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/federated/federated_bug_35333.test 2010-11-18 19:56:42 +0000 @@ -0,0 +1,71 @@ +--echo # +--echo # Bug 35333 "If a Federated table can't connect to the remote hose, can't retrieve metadata" +--echo # +--echo # Queries such as SHOW TABLE STATUS and SELECT * FROM INFORMATION_SCHEMA.TABLES fail +--echo # when encountering a federated table that cannot connect to its remote table. +--echo # +--echo # The fix is to store the error text in the TABLE COMMENTS column of I_S.TABLES, clear +--echo # the remote connection error and push a warning instead. This allows the SELECT operation +--echo # to complete while still indicating a problem. This fix applies to any non-fatal system +--echo # error that occurs during a query against I_S.TABLES. + +--source federated.inc + +--disable_warnings +CREATE DATABASE IF NOT EXISTS realdb; +# Federated database exists +DROP TABLE IF EXISTS realdb.t0; +DROP TABLE IF EXISTS federated.t0; +--enable_warnings + +--echo # +--echo # Create the base table to be referenced +--echo # +CREATE TABLE realdb.t0 (a text, b text) ENGINE=MYISAM; + +--echo # +--echo # Create a federated table with a bogus port number +--echo # +CREATE TABLE federated.t0 (a text, b text) ENGINE=FEDERATED + CONNECTION='mysql://root@stripped:63333/realdb/t0'; + +#--warning ER_CONNECT_TO_FOREIGN_DATA_SOURCE + +--echo # +--echo # Trigger a federated system error during a INFORMATION_SCHEMA.TABLES query +--echo # +SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, ENGINE, ROW_FORMAT, TABLE_ROWS, DATA_LENGTH, TABLE_COMMENT + FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'realdb' or TABLE_SCHEMA = 'federated'; + +SHOW WARNINGS; + +--echo # +--echo # Create a MyISAM table then corrupt the file +--echo # +USE realdb; +CREATE TABLE t1 (c1 int) ENGINE=MYISAM; +--echo # +--echo # Corrupt the MyISAM table by deleting the base file +--echo # +let $MYSQLD_DATADIR= `SELECT @@datadir`; +--echo $MYSQLD_DATADIR +--remove_file $MYSQLD_DATADIR/realdb/t1.MYD +--remove_file $MYSQLD_DATADIR/realdb/t1.MYI + +--echo # +--echo # Trigger a MyISAM system error during an INFORMATION_SCHEMA.TABLES query +--echo # +SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, ENGINE, ROW_FORMAT, TABLE_ROWS, DATA_LENGTH, TABLE_COMMENT + FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; + +SHOW WARNINGS; +--echo # +--echo # Cleanup +--echo # +--disable_warnings +DROP TABLE IF EXISTS realdb.t0; +DROP TABLE IF EXISTS federated.t0; +DROP DATABASE realdb; +--enable_warnings + +--source federated_cleanup.inc === modified file 'sql/sql_show.cc' --- a/sql/sql_show.cc 2010-11-02 14:02:16 +0000 +++ b/sql/sql_show.cc 2010-11-18 19:56:42 +0000 @@ -3778,6 +3778,7 @@ static int get_schema_tables_record(THD { const char *tmp_buff; MYSQL_TIME time; + int info_error= 0; CHARSET_INFO *cs= system_charset_info; DBUG_ENTER("get_schema_tables_record"); @@ -3785,22 +3786,21 @@ static int get_schema_tables_record(THD table->field[0]->store(STRING_WITH_LEN("def"), cs); table->field[1]->store(db_name->str, db_name->length, cs); table->field[2]->store(table_name->str, table_name->length, cs); + if (res) { - /* - there was errors during opening tables - */ - const char *error= thd->is_error() ? thd->stmt_da->message() : ""; + /* There was a table open error, so set the table type and return */ if (tables->view) table->field[3]->store(STRING_WITH_LEN("VIEW"), cs); else if (tables->schema_table) table->field[3]->store(STRING_WITH_LEN("SYSTEM VIEW"), cs); else table->field[3]->store(STRING_WITH_LEN("BASE TABLE"), cs); - table->field[20]->store(error, strlen(error), cs); - thd->clear_error(); + + goto err; } - else if (tables->view) + + if (tables->view) { table->field[3]->store(STRING_WITH_LEN("VIEW"), cs); table->field[20]->store(STRING_WITH_LEN("VIEW"), cs); @@ -3815,6 +3815,7 @@ static int get_schema_tables_record(THD #ifdef WITH_PARTITION_STORAGE_ENGINE bool is_partitioned= FALSE; #endif + if (share->tmp_table == SYSTEM_TMP_TABLE) table->field[3]->store(STRING_WITH_LEN("SYSTEM VIEW"), cs); else if (share->tmp_table) @@ -3828,6 +3829,9 @@ static int get_schema_tables_record(THD continue; table->field[i]->set_notnull(); } + + /* Collect table info from the table share */ + #ifdef WITH_PARTITION_STORAGE_ENGINE if (share->db_type() == partition_hton && share->partition_info_str_len) @@ -3836,62 +3840,82 @@ static int get_schema_tables_record(THD is_partitioned= TRUE; } #endif + tmp_buff= (char *) ha_resolve_storage_engine_name(tmp_db_type); table->field[4]->store(tmp_buff, strlen(tmp_buff), cs); table->field[5]->store((longlong) share->frm_version, TRUE); ptr=option_buff; + if (share->min_rows) { ptr=strmov(ptr," min_rows="); ptr=longlong10_to_str(share->min_rows,ptr,10); } + if (share->max_rows) { ptr=strmov(ptr," max_rows="); ptr=longlong10_to_str(share->max_rows,ptr,10); } + if (share->avg_row_length) { ptr=strmov(ptr," avg_row_length="); ptr=longlong10_to_str(share->avg_row_length,ptr,10); } + if (share->db_create_options & HA_OPTION_PACK_KEYS) ptr=strmov(ptr," pack_keys=1"); + if (share->db_create_options & HA_OPTION_NO_PACK_KEYS) ptr=strmov(ptr," pack_keys=0"); + /* We use CHECKSUM, instead of TABLE_CHECKSUM, for backward compability */ if (share->db_create_options & HA_OPTION_CHECKSUM) ptr=strmov(ptr," checksum=1"); + if (share->db_create_options & HA_OPTION_DELAY_KEY_WRITE) ptr=strmov(ptr," delay_key_write=1"); + if (share->row_type != ROW_TYPE_DEFAULT) ptr=strxmov(ptr, " row_format=", ha_row_type[(uint) share->row_type], NullS); + if (share->key_block_size) { ptr= strmov(ptr, " KEY_BLOCK_SIZE="); ptr= longlong10_to_str(share->key_block_size, ptr, 10); } + #ifdef WITH_PARTITION_STORAGE_ENGINE if (is_partitioned) ptr= strmov(ptr, " partitioned"); #endif + table->field[19]->store(option_buff+1, (ptr == option_buff ? 0 : (uint) (ptr-option_buff)-1), cs); tmp_buff= (share->table_charset ? share->table_charset->name : "default"); + table->field[17]->store(tmp_buff, strlen(tmp_buff), cs); if (share->comment.str) table->field[20]->store(share->comment.str, share->comment.length, cs); + /* Collect table info from the storage engine */ + if(file) { - file->info(HA_STATUS_VARIABLE | HA_STATUS_TIME | HA_STATUS_AUTO); + /* If info() fails, then there's nothing else to do */ + if ((info_error= file->info(HA_STATUS_VARIABLE | + HA_STATUS_TIME | + HA_STATUS_AUTO)) != 0) + goto err; + enum row_type row_type = file->get_row_type(); switch (row_type) { case ROW_TYPE_NOT_USED: @@ -3920,7 +3944,9 @@ static int get_schema_tables_record(THD tmp_buff= "Paged"; break; } + table->field[6]->store(tmp_buff, strlen(tmp_buff), cs); + if (!tables->schema_table) { table->field[7]->store((longlong) file->stats.records, TRUE); @@ -3969,6 +3995,26 @@ static int get_schema_tables_record(THD } } } + +err: + if (res || info_error) + { + /* + If an error was encountered, push a warning, set the TABLE COMMENT + column with the error text, and clear the error so that the operation + can continue. + */ + const char *error= thd->is_error() ? thd->stmt_da->message() : ""; + table->field[20]->store(error, strlen(error), cs); + + if (thd->is_error()) + { + push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + thd->stmt_da->sql_errno(), thd->stmt_da->message()); + thd->clear_error(); + } + } + DBUG_RETURN(schema_table_store_record(thd, table)); } --===============3258659493997101726== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/chris.powers@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: chris.powers@stripped # target_branch: file:///home/cpowers/work/dev/mysql-5.5-bugteam/ # testament_sha1: 8c49aa2cd7f9045d3265efa66e310b4d7255ff29 # timestamp: 2010-11-18 13:57:14 -0600 # base_revision_id: davi.arnaut@stripped\ # l07cze14rkfwghug # # Begin bundle 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 --===============3258659493997101726==--