From: Christopher Powers Date: November 30 2010 5:21pm Subject: bzr push into mysql-5.5-bugteam branch (chris.powers:3150 to 3151) Bug#35333 List-Archive: http://lists.mysql.com/commits/125533 X-Bug: 35333 Message-Id: <20101130172128.5D73E1DB031E@xeno.mysql.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1206511535072449994==" --===============1206511535072449994== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3151 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 or bug#35333 @ 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: 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 3150 Georgi Kodinov 2010-11-29 [merge] merge === 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 17:20:56 +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-11 17:11:05 +0000 +++ b/mysql-test/r/mdl_sync.result 2010-11-30 17:20:56 +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-30 17:20:56 +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:33:34 +0000 +++ b/mysql-test/r/show_check.result 2010-11-30 17:20:56 +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-30 17:20:56 +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 17:20:56 +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 17:20:56 +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-22 16:10:44 +0000 +++ b/sql/sql_show.cc 2010-11-30 17:20:56 +0000 @@ -3781,6 +3781,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"); @@ -3788,22 +3789,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); @@ -3818,6 +3818,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) @@ -3831,6 +3832,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) @@ -3839,62 +3843,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: @@ -3923,7 +3947,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); @@ -3972,6 +3998,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)); } --===============1206511535072449994== 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: 51e114804c8ab7d40db09dd9296c118705e82ed7 # timestamp: 2010-11-30 11:21:28 -0600 # base_revision_id: georgi.kodinov@stripped\ # 79xf3b8exzq0ebzk # # Begin bundle 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 v+LuSKcKEgz62yKA --===============1206511535072449994==--