From 47906997c778edc506aa1ca16a113afef1650c54 Mon Sep 17 00:00:00 2001 From: Mattias Jonsson Date: Tue, 30 Mar 2010 22:52:45 +0200 Subject: Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table Problem was that the ha_data structure was introduced in 5.1 and only used for partitioning first, but with the intention of be of use for others engines as well, and when used by other engines it would clash if it also was partitioned. Solution is to move the partitioning specific data to a separate structure, with its own mutex (which is used for auto_increment). Also did rename PARTITION_INFO to PARTITION_STATS since there already exist a class named partition_info, also cleaned up some related variables. mysql-test/r/partition_binlog_stmt.result: Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table New result file mysql-test/t/partition_binlog_stmt.test: Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table New result file sql/ha_ndbcluster.cc: Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table Rename of PARTITION_INFO to PARTITION_STATS to better match the use (and there is also a class named partition_info...) sql/ha_ndbcluster.h: Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table Rename of PARTITION_INFO to PARTITION_STATS to better match the use (and there is also a class named partition_info...) sql/ha_partition.cc: Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table Removed the partitioning engines use of ha_data in TABLE_SHARE and added ha_part_data instead, since they collide if used in the same time. Rename of PARTITION_INFO to PARTITION_STATS to better match the use (and there is also a class named partition_info...) Removed some dead code. sql/ha_partition.h: Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table Removed some dead code. Rename of PARTITION_INFO to PARTITION_STATS to better match the use (and there is also a class named partition_info...) Removed the partitioning engines use of ha_data in TABLE_SHARE and added ha_part_data instead, since they collide if used in the same time. sql/handler.cc: Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table Rename of PARTITION_INFO to PARTITION_STATS to better match the use (and there is also a class named partition_info...) sql/handler.h: Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table Rename of PARTITION_INFO to PARTITION_STATS to better match the use (and there is also a class named partition_info...) sql/mysql_priv.h: Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table Removed the partitioning engines use of ha_data in TABLE_SHARE and added ha_part_data instead, since they collide if used in the same time. Added key_PARTITION_LOCK_auto_inc for instrumentation. sql/mysqld.cc: Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table Removed the partitioning engines use of ha_data in TABLE_SHARE and added ha_part_data instead, since they collide if used in the same time. Added key_PARTITION_LOCK_auto_inc for instrumentation. sql/partition_info.h: Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table Removed part_state* since it was not in use. sql/sql_partition.cc: Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table Removed part_state* since it was not in use. sql/sql_partition.h: Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table Cleaned up old commented out code. Removed part_state* since it was not in use. sql/sql_show.cc: Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table Rename of PARTITION_INFO to PARTITION_STATS to better match the use (and there is also a class named partition_info...) Renamed partition_info to partition_info_str, since partition_info is a name of a class. sql/sql_table.cc: Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table Renamed partition_info to partition_info_str, since partition_info is a name of a class. sql/table.cc: Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table Removed the partitioning engines use of ha_data in TABLE_SHARE and added ha_part_data instead, since they collide if used in the same time. Renamed partition_info to partition_info_str, since partition_info is a name of a class. removed part_state* since it was not in use. sql/table.h: Bug#51851: Server with SBR locks mutex twice on LOAD DATA into partitioned MyISAM table Removed the partitioning engines use of ha_data in TABLE_SHARE and added ha_part_data instead, since they collide if used in the same time. Renamed partition_info to partition_info_str, since partition_info is a name of a class. removed part_state* since it was not in use. --- sql/sql_table.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'sql/sql_table.cc') diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 2a9e01daf18..266687f5829 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -1725,11 +1725,12 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) error= 1; goto err; } - share->partition_info= tmp_part_syntax_str; + share->partition_info_str= tmp_part_syntax_str; } else - memcpy((char*) share->partition_info, part_syntax_buf, syntax_len + 1); - share->partition_info_len= part_info->part_info_len= syntax_len; + memcpy((char*) share->partition_info_str, part_syntax_buf, + syntax_len + 1); + share->partition_info_str_len= part_info->part_info_len= syntax_len; part_info->part_info_string= part_syntax_buf; } #endif -- cgit v1.2.1 From 6595861f5802dad8997fcaa6466d0ca1130d4df7 Mon Sep 17 00:00:00 2001 From: Ramil Kalimullin Date: Sun, 25 Apr 2010 15:06:40 +0400 Subject: Fix for bug#50946: fast index creation still seems to copy the table Problem: ALTER TABLE ADD INDEX may lead to table copying if there's numeric field(s) with non-default display width modificator specified. Fix: compare numeric field's storage lenghts when we decide whether they can be considered 'equal' for table alteration purposes. mysql-test/r/error_simulation.result: Fix for bug#50946: fast index creation still seems to copy the table - test result. mysql-test/t/error_simulation.test: Fix for bug#50946: fast index creation still seems to copy the table - test case. sql/field.cc: Fix for bug#50946: fast index creation still seems to copy the table - check numeric field's pack lengths instead of it's display lenghts comparing fields equality for table alteration purposes. sql/sql_table.cc: Fix for bug#50946: fast index creation still seems to copy the table - check compare_tables() result for testing purposes. --- sql/sql_table.cc | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'sql/sql_table.cc') diff --git a/sql/sql_table.cc b/sql/sql_table.cc index ad72cab664e..1101be67d5e 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -6922,6 +6922,13 @@ view_err: &candidate_key_count)) goto err; + DBUG_EXECUTE_IF("alter_table_only_metadata_change", { + if (need_copy_table_res != ALTER_TABLE_METADATA_ONLY) + goto err; }); + DBUG_EXECUTE_IF("alter_table_only_index_change", { + if (need_copy_table_res != ALTER_TABLE_INDEX_CHANGED) + goto err; }); + if (need_copy_table == ALTER_TABLE_METADATA_ONLY) need_copy_table= need_copy_table_res; } -- cgit v1.2.1 From d72a4710aaad2f1e76ac20d50793f13f941ef899 Mon Sep 17 00:00:00 2001 From: Gleb Shchepa Date: Fri, 21 May 2010 22:47:32 +0400 Subject: Bug #53804: serious flaws in the alter database .. upgrade data directory name command The check_db_name function has been modified to validate tails of #mysql50#-prefixed database names for compliance with MySQL 5.0 database name encoding rules (the check_table_name function call has been reused). mysql-test/r/renamedb.result: Updated test case. mysql-test/r/upgrade.result: Test case for bug #53804. mysql-test/t/renamedb.test: Updated test case. mysql-test/t/upgrade.test: Test case for bug #53804. sql/mysql_priv.h: Bug #53804: serious flaws in the alter database .. upgrade data directory name command The check_mysql50_prefix has been added. sql/sql_table.cc: Bug #53804: serious flaws in the alter database .. upgrade data directory name command - The check_mysql50_prefix has been added. - The check_n_cut_mysql50_prefix function has been refactored to share code with new check_mysql50_prefix function. sql/table.cc: Bug #53804: serious flaws in the alter database .. upgrade data directory name command The check_db_name function has been modified to validate tails of #mysql50#-prefixed database names for compliance with MySQL 5.0 database name encoding rules. --- sql/sql_table.cc | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'sql/sql_table.cc') diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 2a2daacf724..9727ec43084 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -391,6 +391,25 @@ uint filename_to_tablename(const char *from, char *to, uint to_length) } +/** + Check if given string begins with "#mysql50#" prefix + + @param name string to check cut + + @retval + FALSE no prefix found + @retval + TRUE prefix found +*/ + +bool check_mysql50_prefix(const char *name) +{ + return (name[0] == '#' && + !strncmp(name, MYSQL50_TABLE_NAME_PREFIX, + MYSQL50_TABLE_NAME_PREFIX_LENGTH)); +} + + /** Check if given string begins with "#mysql50#" prefix, cut it if so. @@ -406,9 +425,7 @@ uint filename_to_tablename(const char *from, char *to, uint to_length) uint check_n_cut_mysql50_prefix(const char *from, char *to, uint to_length) { - if (from[0] == '#' && - !strncmp(from, MYSQL50_TABLE_NAME_PREFIX, - MYSQL50_TABLE_NAME_PREFIX_LENGTH)) + if (check_mysql50_prefix(from)) return (uint) (strmake(to, from + MYSQL50_TABLE_NAME_PREFIX_LENGTH, to_length - 1) - to); return 0; -- cgit v1.2.1 From 85da8956e62cf5a1e3ed78cb18110e3888822d09 Mon Sep 17 00:00:00 2001 From: Tor Didriksen Date: Wed, 26 May 2010 16:12:23 +0200 Subject: Bug #53445 Build with -Wall and fix warnings that it generates Add -Wall to gcc/g++ Fix most warnings reported in dbg and opt mode. cmd-line-utils/libedit/filecomplete.c: Remove unused auto variables. configure.cmake: Add -Wall to gcc. extra/comp_err.c: Cast to correct type. extra/perror.c: Fix segfault (but warnings about deprecated features remain) extra/yassl/taocrypt/include/runtime.hpp: Comparing two literals was reported as undefined behaviour. include/my_global.h: Add a template for aligning character buffers. mysys/lf_alloc-pin.c: Initialize pointer. sql/mysqld.cc: Use UNINIT_VAR rather than LINT_INIT. sql/partition_info.cc: Use UNINIT_VAR rather than LINT_INIT. sql/rpl_handler.cc: Use char[] rather than unsigned long[] array for placement buffer. sql/spatial.cc: Use char[] rather than unsigned void*[] array for placement buffer. sql/spatial.h: Use char[] rather than unsigned void*[] array for placement buffer. sql/sql_partition.cc: Initialize auto variable. sql/sql_table.cc: Initialize auto variables. Add parens around assignment within if() sql/sys_vars.cc: Use UNINIT_VAR. storage/innobase/os/os0file.c: Init first slot in auto variable. storage/myisam/mi_create.c: Use UNINIT_VAR rather than LINT_INIT. storage/myisam/mi_open.c: Remove (wrong) casting. storage/myisam/mi_page.c: Remove (wrong) casting. storage/myisam/mi_search.c: Cast to uchar* rather than char*. strings/ctype-ucs2.c: Use UNINIT_VAR rather than LINT_INIT. Add (uchar*) casting. --- sql/sql_table.cc | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'sql/sql_table.cc') diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 19281dbbf37..f8d99d87228 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -1899,8 +1899,8 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists, bool dont_log_query) { TABLE_LIST *table; - char path[FN_REFLEN + 1], *alias; - uint path_length; + char path[FN_REFLEN + 1], *alias= NULL; + uint path_length= 0; String wrong_tables; int error= 0; int non_temp_tables_count= 0; @@ -1909,9 +1909,6 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists, String built_tmp_query; DBUG_ENTER("mysql_rm_table_part2"); - LINT_INIT(alias); - LINT_INIT(path_length); - if (thd->is_current_stmt_binlog_format_row() && !dont_log_query) { built_query.set_charset(system_charset_info); -- cgit v1.2.1