From: Christopher Powers Date: November 30 2010 3:57am Subject: bzr push into mysql-5.0-bugteam branch (chris.powers:2891) List-Archive: http://lists.mysql.com/commits/125436 Message-Id: <20101130035734.7A42C1DB031E@xeno.mysql.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7202898494527875804==" --===============7202898494527875804== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 2891 Christopher Powers 2010-11-29 [merge] merge modified: Makefile.am libmysql/Makefile.am libmysql/Makefile.shared libmysql/conf_to_src.c libmysql/dll.c libmysql/errmsg.c libmysql/get_password.c libmysql/libmysql.c libmysql/manager.c libmysql_r/Makefile.am mysql-test/collections/default.push scripts/make_binary_distribution.sh scripts/make_win_bin_dist scripts/make_win_src_distribution_old.sh support-files/mysql.spec.sh === added file 'mysql-test/r/federated_bug_35333.result' --- a/mysql-test/r/federated_bug_35333.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/r/federated_bug_35333.result 2010-11-30 00:51:46 +0000 @@ -0,0 +1,76 @@ +# +# 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 +stop slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +reset master; +reset slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +start slave; +stop slave; +DROP DATABASE IF EXISTS federated; +CREATE DATABASE federated; +DROP DATABASE IF EXISTS 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 NULL NULL NULL NULL Unable to connect to foreign data source: Can't connect to MySQL server on '127. +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 IF EXISTS federated; +DROP TABLE IF EXISTS federated.t1; +DROP DATABASE IF EXISTS federated; === modified file 'mysql-test/r/information_schema.result' --- a/mysql-test/r/information_schema.result 2009-05-12 13:14:23 +0000 +++ b/mysql-test/r/information_schema.result 2010-11-30 00:51:46 +0000 @@ -1053,6 +1053,8 @@ select table_type from information_schem where table_name="v1"; table_type VIEW +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; create temporary table t1(f1 int, index(f1)); show columns from t1; === modified file 'mysql-test/r/information_schema_db.result' --- a/mysql-test/r/information_schema_db.result 2009-05-15 15:41:35 +0000 +++ b/mysql-test/r/information_schema_db.result 2010-11-30 00:51:46 +0000 @@ -65,10 +65,14 @@ select table_name, table_type, table_com where table_schema='inf%' and func2(); table_name table_type table_comment v1 VIEW View 'inf%.v1' references invalid table(s) or column(s) or function(s) or define +Warnings: +Warning 1356 View 'inf%.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them select table_name, table_type, table_comment from information_schema.tables where table_schema='inf%' and func2(); table_name table_type table_comment v1 VIEW View 'inf%.v1' references invalid table(s) or column(s) or function(s) or define +Warnings: +Warning 1356 View 'inf%.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 function func1; drop function func2; === modified file 'mysql-test/r/show_check.result' --- a/mysql-test/r/show_check.result 2009-03-05 13:35:03 +0000 +++ b/mysql-test/r/show_check.result 2010-11-30 00:51:46 +0000 @@ -622,6 +622,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 t1; === modified file 'mysql-test/r/view.result' --- a/mysql-test/r/view.result 2009-08-11 16:59:20 +0000 +++ b/mysql-test/r/view.result 2010-11-30 00:51:46 +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 define +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/t/federated_bug_35333.test' --- a/mysql-test/t/federated_bug_35333.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/t/federated_bug_35333.test 2010-11-30 00:51:46 +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 include/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 include/federated_cleanup.inc === modified file 'sql/sql_show.cc' --- a/sql/sql_show.cc 2009-08-28 15:51:31 +0000 +++ b/sql/sql_show.cc 2010-11-30 00:51:46 +0000 @@ -48,7 +48,7 @@ bool schema_table_store_record(THD *thd, /*************************************************************************** -** List all table types supported +** List all table types supported ***************************************************************************/ bool mysqld_show_storage_engines(THD *thd) @@ -65,7 +65,7 @@ bool mysqld_show_storage_engines(THD *th Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF)) DBUG_RETURN(TRUE); - const char *default_type_name= + const char *default_type_name= ha_get_storage_engine((enum db_type)thd->variables.table_type); handlerton **types; @@ -406,7 +406,7 @@ mysqld_show_create(THD *thd, TABLE_LIST /* Clear all messages with 'error' level status and - issue a warning with 'warning' level status in + issue a warning with 'warning' level status in case of invalid view and last error is ER_VIEW_INVALID */ mysql_reset_errors(thd, true); @@ -603,7 +603,7 @@ mysqld_list_fields(THD *thd, TABLE_LIST Field **ptr,*field; for (ptr=table->field ; (field= *ptr); ptr++) { - if (!wild || !wild[0] || + if (!wild || !wild[0] || !wild_case_compare(system_charset_info, field->field_name,wild)) { if (table_list->view) @@ -809,13 +809,13 @@ static bool get_field_default_value(THD bool has_default; bool has_now_default; enum enum_field_types field_type= field->type(); - /* + /* We are using CURRENT_TIMESTAMP instead of NOW because it is more standard */ - has_now_default= table->timestamp_field == field && + has_now_default= table->timestamp_field == field && field->unireg_check != Field::TIMESTAMP_UN_FIELD; - + has_default= (field_type != FIELD_TYPE_BLOB && !(field->flags & NO_DEFAULT_VALUE_FLAG) && field->unireg_check != Field::NEXT_NUMBER && @@ -837,7 +837,7 @@ static bool get_field_default_value(THD char *ptr= longlong2str(dec, tmp + 2, 2); uint32 length= (uint32) (ptr - tmp); tmp[0]= 'b'; - tmp[1]= '\''; + tmp[1]= '\''; tmp[length]= '\''; type.length(length + 1); quoted= 0; @@ -929,7 +929,7 @@ store_create_info(THD *thd, TABLE_LIST * field->sql_type(type); packet->append(type.ptr(), type.length(), system_charset_info); - if (field->has_charset() && + if (field->has_charset() && !(thd->variables.sql_mode & (MODE_MYSQL323 | MODE_MYSQL40))) { if (field->charset() != share->table_charset) @@ -937,8 +937,8 @@ store_create_info(THD *thd, TABLE_LIST * packet->append(STRING_WITH_LEN(" character set ")); packet->append(field->charset()->csname); } - /* - For string types dump collation name only if + /* + For string types dump collation name only if collation is not primary for the given charset */ if (!(field->charset()->state & MY_CS_PRIMARY)) @@ -965,11 +965,11 @@ store_create_info(THD *thd, TABLE_LIST * packet->append(def_value.ptr(), def_value.length(), system_charset_info); } - if (!limited_mysql_mode && table->timestamp_field == field && + if (!limited_mysql_mode && table->timestamp_field == field && field->unireg_check != Field::TIMESTAMP_DN_FIELD) packet->append(STRING_WITH_LEN(" on update CURRENT_TIMESTAMP")); - if (field->unireg_check == Field::NEXT_NUMBER && + if (field->unireg_check == Field::NEXT_NUMBER && !(thd->variables.sql_mode & MODE_NO_FIELD_OPTIONS)) packet->append(STRING_WITH_LEN(" auto_increment")); @@ -1088,7 +1088,7 @@ store_create_info(THD *thd, TABLE_LIST * packet->append(buff, (uint) (end - buff)); } - + if (share->table_charset && !(thd->variables.sql_mode & MODE_MYSQL323) && !(thd->variables.sql_mode & MODE_MYSQL40)) @@ -1179,7 +1179,7 @@ view_store_options(THD *thd, TABLE_LIST /* Append DEFINER clause to the given buffer. - + SYNOPSIS append_definer() thd [in] thread handle @@ -1209,7 +1209,7 @@ static void append_algorithm(TABLE_LIST /* Append DEFINER clause to the given buffer. - + SYNOPSIS append_definer() thd [in] thread handle @@ -1374,8 +1374,8 @@ void mysqld_list_processes(THD *thd,cons "%s:%u", tmp_sctx->host_or_ip, tmp->peer_port); } else - thd_info->host= thd->strdup(tmp_sctx->host_or_ip[0] ? - tmp_sctx->host_or_ip : + thd_info->host= thd->strdup(tmp_sctx->host_or_ip[0] ? + tmp_sctx->host_or_ip : tmp_sctx->host ? tmp_sctx->host : ""); if ((thd_info->db=tmp->db)) // Safe test thd_info->db=thd->strdup(thd_info->db); @@ -1852,14 +1852,14 @@ void calc_sum_of_all_status(STATUS_VAR * I_List_iterator it(threads); THD *tmp; - + /* Get global values as base */ *to= global_status_var; - + /* Add to this status from existing threads */ while ((tmp= it++)) add_to_status(to, &tmp->status_var); - + VOID(pthread_mutex_unlock(&LOCK_thread_count)); DBUG_VOID_RETURN; } @@ -1911,7 +1911,7 @@ bool schema_table_store_record(THD *thd, int error; if ((error= table->file->write_row(table->record[0]))) { - if (create_myisam_from_heap(thd, table, + if (create_myisam_from_heap(thd, table, table->pos_in_table_list->schema_table_param, error, 0)) return 1; @@ -1946,7 +1946,7 @@ int make_table_list(THD *thd, SELECT_LEX { Table_ident *table_ident; LEX_STRING ident_db, ident_table; - ident_db.str= db; + ident_db.str= db; ident_db.length= (uint) strlen(db); ident_table.str= table; ident_table.length= (uint) strlen(table); @@ -1980,10 +1980,10 @@ bool uses_only_table_name_fields(Item *i const char *field_name2= schema_table->idx_field2 >= 0 ? field_info[schema_table->idx_field2].field_name : ""; if (table->table != item_field->field->table || (cs->coll->strnncollsp(cs, (uchar *) field_name1, (uint) strlen(field_name1), - (uchar *) item_field->field_name, + (uchar *) item_field->field_name, (uint) strlen(item_field->field_name), 0) && cs->coll->strnncollsp(cs, (uchar *) field_name2, (uint) strlen(field_name2), - (uchar *) item_field->field_name, + (uchar *) item_field->field_name, (uint) strlen(item_field->field_name), 0))) return 0; } @@ -2072,7 +2072,7 @@ enum enum_schema_tables get_schema_table with_i_schema returns 1 if we added 'IS' name to list otherwise returns 0 is_wild_value if value is 1 then idx_field_vals->db_name is - wild string otherwise it's db name; + wild string otherwise it's db name; RETURN zero success @@ -2094,7 +2094,7 @@ int make_db_list(THD *thd, List *f LIKE clause (see also get_index_field_values() function) */ if (!idx_field_vals->db_value || - !wild_case_compare(system_charset_info, + !wild_case_compare(system_charset_info, INFORMATION_SCHEMA_NAME.str, idx_field_vals->db_value)) { @@ -2179,7 +2179,7 @@ int get_all_tables(THD *thd, TABLE_LIST List bases; List_iterator_fast it(bases); COND *partial_cond; - uint derived_tables= lex->derived_tables; + uint derived_tables= lex->derived_tables; int error= 1; db_type not_used; Open_tables_state open_tables_state_backup; @@ -2217,7 +2217,7 @@ int get_all_tables(THD *thd, TABLE_LIST Let us set fake sql_command so views won't try to merge themselves into main statement. If we don't do this, SELECT * from information_schema.xxxx will cause problems. - SQLCOM_SHOW_FIELDS is used because it satisfies 'only_view_structure()' + SQLCOM_SHOW_FIELDS is used because it satisfies 'only_view_structure()' */ lex->sql_command= SQLCOM_SHOW_FIELDS; res= open_normal_and_derived_tables(thd, show_table_list, @@ -2227,15 +2227,15 @@ int get_all_tables(THD *thd, 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() - We should use show_table_list->alias instead of + We should use show_table_list->alias instead of show_table_list->table_name because table_name could be changed during opening of I_S tables. It's safe - to use alias because alias contains original table name - in this case(this part of code is used only for + to use alias because alias contains original table name + in this case(this part of code is used only for 'show columns' & 'show statistics' commands). */ error= test(schema_table->process_table(thd, show_table_list, - table, res, + table, res, (show_table_list->view ? show_table_list->view_db.str : show_table_list->db), @@ -2263,7 +2263,7 @@ int get_all_tables(THD *thd, TABLE_LIST (base_name= select_lex->db) && !bases.elements)) { #ifndef NO_EMBEDDED_ACCESS_CHECKS - if (!check_access(thd,SELECT_ACL, base_name, + if (!check_access(thd,SELECT_ACL, base_name, &thd->col_access, 0, 1, with_i_schema) || sctx->master_access & (DB_ACLS | SHOW_DB_ACL) || acl_get(sctx->host, sctx->ip, sctx->priv_user, base_name,0) || @@ -2281,7 +2281,7 @@ int get_all_tables(THD *thd, TABLE_LIST strxmov(path, mysql_data_home, "/", base_name, NullS); end= path + (len= unpack_dirname(path,path)); len= FN_LEN - len; - find_files_result res= find_files(thd, &files, base_name, + find_files_result res= find_files(thd, &files, base_name, path, idx_field_vals.table_value, 0); if (res != FIND_FILES_OK) { @@ -2367,9 +2367,9 @@ int get_all_tables(THD *thd, TABLE_LIST res= open_normal_and_derived_tables(thd, show_table_list, MYSQL_LOCK_IGNORE_FLUSH); lex->sql_command= save_sql_command; - /* + /* They can drop table after table names list creation and - before table opening. We open non existing table and + before table opening. We open non existing table and get ER_NO_SUCH_TABLE error. In this case we do not store the record into I_S table and clear error. */ @@ -2381,10 +2381,10 @@ int get_all_tables(THD *thd, TABLE_LIST else { /* - We should use show_table_list->alias instead of + We should use show_table_list->alias instead of show_table_list->table_name because table_name could be changed during opening of I_S tables. It's safe - to use alias because alias contains original table name + to use alias because alias contains original table name in this case. */ res= schema_table->process_table(thd, show_table_list, table, @@ -2486,28 +2486,28 @@ 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"); restore_record(table, s->default_values); table->field[1]->store(base_name, (uint) strlen(base_name), cs); table->field[2]->store(file_name, (uint) strlen(file_name), cs); + if (res) { - /* - there was errors during opening tables - */ - const char *error= thd->net.last_error; + /* 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, (uint) 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); @@ -2518,8 +2518,15 @@ static int get_schema_tables_record(THD TABLE_SHARE *share= show_table->s; handler *file= show_table->file; - file->info(HA_STATUS_VARIABLE | HA_STATUS_TIME | HA_STATUS_AUTO | - HA_STATUS_NO_LOCK); + if (!file) + goto err; + + if ((info_error= file->info(HA_STATUS_VARIABLE | + HA_STATUS_TIME | + HA_STATUS_AUTO | + HA_STATUS_NO_LOCK)) != 0) + goto err; + if (share->tmp_table == SYSTEM_TMP_TABLE) table->field[3]->store(STRING_WITH_LEN("SYSTEM VIEW"), cs); else if (share->tmp_table) @@ -2636,7 +2643,7 @@ static int get_schema_tables_record(THD 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=", + ptr=strxmov(ptr, " row_format=", ha_row_type[(uint) share->row_type], NullS); if (file->raid_type) @@ -2649,7 +2656,7 @@ static int get_schema_tables_record(THD ptr=strmov(ptr,buff); } table->field[19]->store(option_buff+1, - (ptr == option_buff ? 0 : + (ptr == option_buff ? 0 : (uint) (ptr-option_buff)-1), cs); { char *comment; @@ -2658,13 +2665,32 @@ static int get_schema_tables_record(THD { table->field[20]->store(comment, (comment == share->comment.str ? - share->comment.length : + share->comment.length : (uint) strlen(comment)), cs); if (comment != share->comment.str) my_free(comment, MYF(0)); } } } + +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->net.last_error; + if (error) + { + table->field[20]->store(error, strlen(error), cs); + push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + thd->net.last_errno, thd->net.last_error); + thd->clear_error(); + } + } + DBUG_RETURN(schema_table_store_record(thd, table)); } @@ -2691,7 +2717,7 @@ static int get_schema_column_record(THD /* I.e. we are in SELECT FROM INFORMATION_SCHEMA.COLUMS rather than in SHOW COLUMNS - */ + */ push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, thd->net.last_errno, thd->net.last_error); thd->clear_error(); @@ -2732,7 +2758,7 @@ static int get_schema_column_record(THD uint col_access; check_access(thd,SELECT_ACL | EXTRA_ACL, base_name, &tables->grant.privilege, 0, 0, test(tables->schema_table)); - col_access= get_column_grant(thd, &tables->grant, + col_access= get_column_grant(thd, &tables->grant, base_name, file_name, field->field_name) & COL_ACLS; if (!tables->schema_table && !col_access) @@ -2755,9 +2781,9 @@ static int get_schema_column_record(THD cs); table->field[4]->store((longlong) count, TRUE); field->sql_type(type); - table->field[14]->store(type.ptr(), type.length(), cs); + table->field[14]->store(type.ptr(), type.length(), cs); tmp_buff= strchr(type.ptr(), '('); - table->field[7]->store(type.ptr(), (uint) + table->field[7]->store(type.ptr(), (uint) (tmp_buff ? tmp_buff - type.ptr() : type.length()), cs); @@ -2778,7 +2804,7 @@ static int get_schema_column_record(THD uint32 octet_max_length= field->max_display_length(); if (is_blob && octet_max_length != (uint32) 4294967295U) octet_max_length /= field->charset()->mbmaxlen; - longlong char_max_len= is_blob ? + longlong char_max_len= is_blob ? (longlong) octet_max_length / field->charset()->mbminlen : (longlong) octet_max_length / field->charset()->mbmaxlen; table->field[8]->store(char_max_len, TRUE); @@ -2811,7 +2837,7 @@ static int get_schema_column_record(THD field_length= field->max_display_length(); decimals= -1; // return NULL break; - case FIELD_TYPE_FLOAT: + case FIELD_TYPE_FLOAT: case FIELD_TYPE_DOUBLE: field_length= field->field_length; if (decimals == NOT_FIXED_DEC) @@ -2874,7 +2900,7 @@ int fill_schema_charsets(THD *thd, TABLE for (cs= all_charsets ; cs < all_charsets+255 ; cs++) { CHARSET_INFO *tmp_cs= cs[0]; - if (tmp_cs && (tmp_cs->state & MY_CS_PRIMARY) && + if (tmp_cs && (tmp_cs->state & MY_CS_PRIMARY) && (tmp_cs->state & MY_CS_AVAILABLE) && !(wild && wild[0] && wild_case_compare(scs, tmp_cs->csname,wild))) @@ -2904,13 +2930,13 @@ int fill_schema_collation(THD *thd, TABL { CHARSET_INFO **cl; CHARSET_INFO *tmp_cs= cs[0]; - if (!tmp_cs || !(tmp_cs->state & MY_CS_AVAILABLE) || + if (!tmp_cs || !(tmp_cs->state & MY_CS_AVAILABLE) || !(tmp_cs->state & MY_CS_PRIMARY)) continue; for (cl= all_charsets; cl < all_charsets+255 ;cl ++) { CHARSET_INFO *tmp_cl= cl[0]; - if (!tmp_cl || !(tmp_cl->state & MY_CS_AVAILABLE) || + if (!tmp_cl || !(tmp_cl->state & MY_CS_AVAILABLE) || !my_charset_same(tmp_cs, tmp_cl)) continue; if (!(wild && wild[0] && @@ -2944,13 +2970,13 @@ int fill_schema_coll_charset_app(THD *th { CHARSET_INFO **cl; CHARSET_INFO *tmp_cs= cs[0]; - if (!tmp_cs || !(tmp_cs->state & MY_CS_AVAILABLE) || + if (!tmp_cs || !(tmp_cs->state & MY_CS_AVAILABLE) || !(tmp_cs->state & MY_CS_PRIMARY)) continue; for (cl= all_charsets; cl < all_charsets+255 ;cl ++) { CHARSET_INFO *tmp_cl= cl[0]; - if (!tmp_cl || !(tmp_cl->state & MY_CS_AVAILABLE) || + if (!tmp_cl || !(tmp_cl->state & MY_CS_AVAILABLE) || !my_charset_same(tmp_cs,tmp_cl)) continue; restore_record(table, s->default_values); @@ -3014,7 +3040,7 @@ bool store_schema_proc(THD *thd, TABLE * table->field[10]->store(STRING_WITH_LEN("SQL"), cs); get_field(thd->mem_root, proc_table->field[6], &tmp_string); table->field[11]->store(tmp_string.ptr(), tmp_string.length(), cs); - table->field[12]->store(sp_data_access_name[enum_idx].str, + table->field[12]->store(sp_data_access_name[enum_idx].str, sp_data_access_name[enum_idx].length , cs); get_field(thd->mem_root, proc_table->field[7], &tmp_string); table->field[14]->store(tmp_string.ptr(), tmp_string.length(), cs); @@ -3290,10 +3316,10 @@ static int get_schema_views_record(THD * if (schema_table_store_record(thd, table)) DBUG_RETURN(1); if (res) - push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, thd->net.last_errno, thd->net.last_error); } - if (res) + if (res) thd->clear_error(); DBUG_RETURN(0); } @@ -3334,7 +3360,7 @@ static int get_schema_constraints_record TABLE *show_table= tables->table; KEY *key_info=show_table->key_info; uint primary_key= show_table->s->primary_key; - show_table->file->info(HA_STATUS_VARIABLE | + show_table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK | HA_STATUS_TIME); for (uint i=0 ; i < show_table->s->keys ; i++, key_info++) @@ -3363,7 +3389,7 @@ static int get_schema_constraints_record List_iterator_fast it(f_key_list); while ((f_key_info=it++)) { - if (store_constraints(thd, table, base_name, file_name, + if (store_constraints(thd, table, base_name, file_name, f_key_info->forein_id->str, (uint) strlen(f_key_info->forein_id->str), "FOREIGN KEY", 11)) @@ -3472,7 +3498,7 @@ ret: void store_key_column_usage(TABLE *table, const char*db, const char *tname, - const char *key_name, uint key_len, + const char *key_name, uint key_len, const char *con_type, uint con_len, longlong idx) { CHARSET_INFO *cs= system_charset_info; @@ -3506,7 +3532,7 @@ static int get_schema_key_column_usage_r TABLE *show_table= tables->table; KEY *key_info=show_table->key_info; uint primary_key= show_table->s->primary_key; - show_table->file->info(HA_STATUS_VARIABLE | + show_table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK | HA_STATUS_TIME); for (uint i=0 ; i < show_table->s->keys ; i++, key_info++) @@ -3523,8 +3549,8 @@ static int get_schema_key_column_usage_r restore_record(table, s->default_values); store_key_column_usage(table, base_name, file_name, key_info->name, - (uint) strlen(key_info->name), - key_part->field->field_name, + (uint) strlen(key_info->name), + key_part->field->field_name, (uint) strlen(key_part->field->field_name), (longlong) f_idx); if (schema_table_store_record(thd, table)) @@ -3560,7 +3586,7 @@ static int get_schema_key_column_usage_r system_charset_info); table->field[9]->set_notnull(); table->field[10]->store(f_key_info->referenced_table->str, - f_key_info->referenced_table->length, + f_key_info->referenced_table->length, system_charset_info); table->field[10]->set_notnull(); table->field[11]->store(r_info->str, r_info->length, @@ -3607,7 +3633,7 @@ int fill_variables(THD *thd, TABLE_LIST LEX *lex= thd->lex; const char *wild= lex->wild ? lex->wild->ptr() : NullS; pthread_mutex_lock(&LOCK_global_system_variables); - res= show_status_array(thd, wild, init_vars, + res= show_status_array(thd, wild, init_vars, lex->option_type, 0, "", tables->table); pthread_mutex_unlock(&LOCK_global_system_variables); DBUG_RETURN(res); @@ -3626,7 +3652,7 @@ int fill_status(THD *thd, TABLE_LIST *ta if (lex->option_type == OPT_GLOBAL) calc_sum_of_all_status(&tmp); res= show_status_array(thd, wild, status_vars, OPT_GLOBAL, - (lex->option_type == OPT_GLOBAL ? + (lex->option_type == OPT_GLOBAL ? &tmp: &thd->status_var), "",tables->table); pthread_mutex_unlock(&LOCK_status); DBUG_RETURN(res); @@ -3717,7 +3743,7 @@ TABLE *create_schema_table(THD *thd, TAB break; case MYSQL_TYPE_FLOAT: case MYSQL_TYPE_DOUBLE: - if ((item= new Item_float(fields_info->field_name, 0.0, NOT_FIXED_DEC, + if ((item= new Item_float(fields_info->field_name, 0.0, NOT_FIXED_DEC, fields_info->field_length)) == NULL) DBUG_RETURN(NULL); break; @@ -3761,7 +3787,7 @@ TABLE *create_schema_table(THD *thd, TAB tmp_table_param->schema_table= 1; SELECT_LEX *select_lex= thd->lex->current_select; if (!(table= create_tmp_table(thd, tmp_table_param, - field_list, (ORDER*) 0, 0, 0, + field_list, (ORDER*) 0, 0, 0, (select_lex->options | thd->options | TMP_TABLE_ALL_COLUMNS), HA_POS_ERROR, table_list->alias))) @@ -4102,7 +4128,7 @@ bool get_schema_tables_result(JOIN *join thd->no_warnings_for_error= 1; for (JOIN_TAB *tab= join->join_tab; tab < tmp_join_tab; tab++) - { + { if (!tab->table || !tab->table->pos_in_table_list) break; @@ -4454,13 +4480,13 @@ ST_FIELD_INFO variables_fields_info[]= ST_SCHEMA_TABLE schema_tables[]= { - {"CHARACTER_SETS", charsets_fields_info, create_schema_table, + {"CHARACTER_SETS", charsets_fields_info, create_schema_table, fill_schema_charsets, make_character_sets_old_format, 0, -1, -1, 0}, - {"COLLATIONS", collation_fields_info, create_schema_table, + {"COLLATIONS", collation_fields_info, create_schema_table, fill_schema_collation, make_old_format, 0, -1, -1, 0}, {"COLLATION_CHARACTER_SET_APPLICABILITY", coll_charset_app_fields_info, create_schema_table, fill_schema_coll_charset_app, 0, 0, -1, -1, 0}, - {"COLUMNS", columns_fields_info, create_schema_table, + {"COLUMNS", columns_fields_info, create_schema_table, get_all_tables, make_columns_old_format, get_schema_column_record, 1, 2, 0}, {"COLUMN_PRIVILEGES", column_privileges_fields_info, create_schema_table, fill_schema_column_privileges, 0, 0, -1, -1, 0}, @@ -4469,19 +4495,19 @@ ST_SCHEMA_TABLE schema_tables[]= {"OPEN_TABLES", open_tables_fields_info, create_schema_table, fill_open_tables, make_old_format, 0, -1, -1, 1}, {"PROFILING", query_profile_statistics_info, create_schema_table, - fill_query_profile_statistics_info, make_profile_table_for_show, + fill_query_profile_statistics_info, make_profile_table_for_show, NULL, -1, -1, false}, - {"ROUTINES", proc_fields_info, create_schema_table, + {"ROUTINES", proc_fields_info, create_schema_table, fill_schema_proc, make_proc_old_format, 0, -1, -1, 0}, {"SCHEMATA", schema_fields_info, create_schema_table, fill_schema_shemata, make_schemata_old_format, 0, 1, -1, 0}, {"SCHEMA_PRIVILEGES", schema_privileges_fields_info, create_schema_table, fill_schema_schema_privileges, 0, 0, -1, -1, 0}, - {"STATISTICS", stat_fields_info, create_schema_table, + {"STATISTICS", stat_fields_info, create_schema_table, get_all_tables, make_old_format, get_schema_stat_record, 1, 2, 0}, - {"STATUS", variables_fields_info, create_schema_table, fill_status, + {"STATUS", variables_fields_info, create_schema_table, fill_status, make_old_format, 0, -1, -1, 1}, - {"TABLES", tables_fields_info, create_schema_table, + {"TABLES", tables_fields_info, create_schema_table, get_all_tables, make_old_format, get_schema_tables_record, 1, 2, 0}, {"TABLE_CONSTRAINTS", table_constraints_fields_info, create_schema_table, get_all_tables, 0, get_schema_constraints_record, 3, 4, 0}, @@ -4491,11 +4517,11 @@ ST_SCHEMA_TABLE schema_tables[]= fill_schema_table_privileges, 0, 0, -1, -1, 0}, {"TRIGGERS", triggers_fields_info, create_schema_table, get_all_tables, make_old_format, get_schema_triggers_record, 5, 6, 0}, - {"USER_PRIVILEGES", user_privileges_fields_info, create_schema_table, + {"USER_PRIVILEGES", user_privileges_fields_info, create_schema_table, fill_schema_user_privileges, 0, 0, -1, -1, 0}, {"VARIABLES", variables_fields_info, create_schema_table, fill_variables, make_old_format, 0, -1, -1, 1}, - {"VIEWS", view_fields_info, create_schema_table, + {"VIEWS", view_fields_info, create_schema_table, get_all_tables, 0, get_schema_views_record, 1, 2, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0} }; --===============7202898494527875804== 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-5.0-bugteam/ # testament_sha1: f7d1f8318a228e04b6eb906a8af744789a9bcfed # timestamp: 2010-11-29 21:57:34 -0600 # base_revision_id: georgi.kodinov@stripped\ # c93bb7dfeglndun3 # # Begin bundle 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 --===============7202898494527875804==--