From: Christopher Powers Date: November 30 2010 5:21pm Subject: bzr push into mysql-trunk-bugfixing branch (chris.powers:3394 to 3395) Bug#35333 List-Archive: http://lists.mysql.com/commits/125537 X-Bug: 35333 Message-Id: <20101130172146.8C0B11DB031E@xeno.mysql.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7996476372721610033==" --===============7996476372721610033== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3395 Christopher Powers 2010-11-30 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 New test results for bug#35333 @ mysql-test/suite/federated/federated_bug_35333.test New test for bug#35333 added: mysql-test/suite/federated/federated_bug_35333.result mysql-test/suite/federated/federated_bug_35333.test 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 sql/sql_show.cc 3394 Guilhem Bichot 2010-11-30 uint=double is a warning modified: sql/sql_select.cc === 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-30 16:58:48 +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-11-18 16:34:56 +0000 +++ b/mysql-test/r/mdl_sync.result 2010-11-30 16:58:48 +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-11-17 15:23:17 +0000 +++ b/mysql-test/r/merge.result 2010-11-30 16:58:48 +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-11-19 05:47:50 +0000 +++ b/mysql-test/r/show_check.result 2010-11-30 16:58:48 +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-08-30 06:38:09 +0000 +++ b/mysql-test/r/view.result 2010-11-30 16:58:48 +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-30 16:58:48 +0000 @@ -0,0 +1,67 @@ +# +# 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.de +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' (socket errno) +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' (socket errno) +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' (socket errno) +# +# 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 +# +# +# 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-30 16:58:48 +0000 @@ -0,0 +1,74 @@ +--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.de + +--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 # +# Remove O/S-specific socket error +--replace_regex /\(.*\)/(socket errno)/ +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'; + +# Remove O/S-specific socket error +--replace_regex /\(.*\)/(socket errno)/ +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`; +--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-29 16:27:58 +0000 +++ b/sql/sql_show.cc 2010-11-30 16:58:48 +0000 @@ -3786,6 +3786,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"); @@ -3793,22 +3794,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); @@ -3823,6 +3823,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) @@ -3836,6 +3837,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) @@ -3844,62 +3848,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: @@ -3928,7 +3952,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); @@ -3977,6 +4003,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)); } --===============7996476372721610033== 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/base_mysql-trunk-\ # bugfixing/ # testament_sha1: fdee15d88a2ff23708ca3533ed20fe0ff09a3779 # timestamp: 2010-11-30 11:21:46 -0600 # base_revision_id: guilhem@stripped # # Begin bundle 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 --===============7996476372721610033==--