From: Jon Olav Hauglid Date: November 17 2010 4:43pm Subject: bzr push into mysql-5.5-runtime branch (jon.hauglid:3187 to 3188) List-Archive: http://lists.mysql.com/commits/124180 Message-Id: <201011171644.oAH8ThgI002814@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3188 Jon Olav Hauglid 2010-11-17 [merge] Merge from mysql-5.5-bugteam to mysql-5.5-runtime No conflicts modified: cmd-line-utils/readline/bind.c include/m_string.h include/my_compiler.h mysql-test/r/func_math.result mysql-test/t/func_math.test mysys/default.c mysys/mf_keycache.c regex/regexec.c sql/debug_sync.cc sql/field.cc sql/handler.cc sql/slave.cc sql/sql_partition.cc storage/myisam/ft_nlq_search.c storage/myisammrg/myrg_open.c tests/mysql_client_test.c 3187 Jon Olav Hauglid 2010-11-17 Bug #57663 Concurrent statement using stored function and DROP DATABASE breaks SBR The problem was that DROP DATABASE ignored any metadata locks on stored functions and procedures held by other connections. This made it possible for DROP DATABASE to drop functions/procedures that were in use by other connections and therefore break statement based replication. (DROP DATABASE could appear in the binlog before a statement using a dropped function/procedure.) This problem was an issue left unresolved by the patch for Bug#30977 where metadata locks for stored functions/procedures were introduced. This patch fixes the problem by making sure DROP DATABASE takes exclusive metadata locks on all stored functions/procedures to be dropped. Test case added to sp-lock.test. modified: mysql-test/r/sp-lock.result mysql-test/t/sp-lock.test sql/sp.cc sql/sp.h sql/sql_db.cc === modified file 'cmd-line-utils/readline/bind.c' --- a/cmd-line-utils/readline/bind.c 2009-08-28 16:21:54 +0000 +++ b/cmd-line-utils/readline/bind.c 2010-11-10 21:14:47 +0000 @@ -855,7 +855,7 @@ _rl_read_init_file (filename, include_le { register int i; char *buffer, *openname, *line, *end; - size_t file_size; + size_t file_size = 0; current_readline_init_file = filename; current_readline_init_include_level = include_level; === modified file 'include/m_string.h' --- a/include/m_string.h 2010-07-23 20:17:55 +0000 +++ b/include/m_string.h 2010-11-17 09:50:19 +0000 @@ -76,7 +76,9 @@ extern "C" { extern void *(*my_str_malloc)(size_t); extern void (*my_str_free)(void *); -#if defined(HAVE_STPCPY) +#if defined(HAVE_STPCPY) && MY_GNUC_PREREQ(3, 4) +#define strmov(A,B) __builtin_stpcpy((A),(B)) +#elif defined(HAVE_STPCPY) #define strmov(A,B) stpcpy((A),(B)) #ifndef stpcpy extern char *stpcpy(char *, const char *); /* For AIX with gcc 2.95.3 */ === modified file 'include/my_compiler.h' --- a/include/my_compiler.h 2010-10-20 18:21:40 +0000 +++ b/include/my_compiler.h 2010-11-10 21:14:47 +0000 @@ -76,6 +76,11 @@ /** Generic (compiler-independent) features. */ + +#ifndef MY_GNUC_PREREQ +# define MY_GNUC_PREREQ(maj, min) (0) +#endif + #ifndef MY_ALIGNOF # ifdef __cplusplus template struct my_alignof_helper { char m1; type m2; }; === modified file 'mysql-test/r/func_math.result' --- a/mysql-test/r/func_math.result 2010-10-08 09:52:09 +0000 +++ b/mysql-test/r/func_math.result 2010-11-17 15:39:35 +0000 @@ -607,3 +607,12 @@ SELECT floor(log10(format(concat_ws(5445 as foo; foo 2 +# +# Bug #58137 char(0) column cause: +# my_gcvt: Assertion `width > 0 && to != ((void *)0)' failed +# +CREATE TABLE t1(a char(0)); +INSERT INTO t1 (SELECT -pi()); +Warnings: +Warning 1265 Data truncated for column 'a' at row 1 +DROP TABLE t1; === modified file 'mysql-test/t/func_math.test' --- a/mysql-test/t/func_math.test 2010-10-08 09:52:09 +0000 +++ b/mysql-test/t/func_math.test 2010-11-17 15:39:35 +0000 @@ -464,3 +464,11 @@ SELECT -9223372036854775808 MOD -1; --echo # SELECT floor(log10(format(concat_ws(5445796E25, 5306463, 30837), -358821))) as foo; + +--echo # +--echo # Bug #58137 char(0) column cause: +--echo # my_gcvt: Assertion `width > 0 && to != ((void *)0)' failed +--echo # +CREATE TABLE t1(a char(0)); +INSERT INTO t1 (SELECT -pi()); +DROP TABLE t1; === modified file 'mysys/default.c' --- a/mysys/default.c 2010-11-04 10:00:59 +0000 +++ b/mysys/default.c 2010-11-16 10:58:39 +0000 @@ -68,6 +68,9 @@ const char *my_defaults_file=0; const char *my_defaults_group_suffix=0; const char *my_defaults_extra_file=0; +static char my_defaults_file_buffer[FN_REFLEN]; +static char my_defaults_extra_file_buffer[FN_REFLEN]; + static my_bool defaults_already_read= FALSE; /* Which directories are searched for options (and in which order) */ @@ -152,22 +155,19 @@ static char *remove_end_comment(char *pt */ static int -fn_expand(const char *filename, const char **filename_var) +fn_expand(const char *filename, char *result_buf) { - char dir[FN_REFLEN], buf[FN_REFLEN]; + char dir[FN_REFLEN]; const int flags= MY_UNPACK_FILENAME | MY_SAFE_PATH | MY_RELATIVE_PATH; - const char *result_path= NULL; DBUG_ENTER("fn_expand"); - DBUG_PRINT("enter", ("filename: %s, buf: 0x%lx", filename, (unsigned long) buf)); + DBUG_PRINT("enter", ("filename: %s, result_buf: 0x%lx", + filename, (unsigned long) result_buf)); if (my_getwd(dir, sizeof(dir), MYF(0))) DBUG_RETURN(3); DBUG_PRINT("debug", ("dir: %s", dir)); - if (fn_format(buf, filename, dir, NULL, flags) == NULL || - (result_path= my_strdup(buf, MYF(0))) == NULL) + if (fn_format(result_buf, filename, dir, NULL, flags) == NULL) DBUG_RETURN(2); - DBUG_PRINT("return", ("result: %s", result_path)); - DBUG_ASSERT(result_path != NULL); - *filename_var= result_path; + DBUG_PRINT("return", ("result: %s", result_buf)); DBUG_RETURN(0); } @@ -224,16 +224,18 @@ int my_search_option_files(const char *c if (forced_extra_defaults && !defaults_already_read) { - int error= fn_expand(forced_extra_defaults, &my_defaults_extra_file); + int error= fn_expand(forced_extra_defaults, my_defaults_extra_file_buffer); if (error) DBUG_RETURN(error); + my_defaults_extra_file= my_defaults_extra_file_buffer; } if (forced_default_file && !defaults_already_read) { - int error= fn_expand(forced_default_file, &my_defaults_file); + int error= fn_expand(forced_default_file, my_defaults_file_buffer); if (error) DBUG_RETURN(error); + my_defaults_file= my_defaults_file_buffer; } defaults_already_read= TRUE; === modified file 'mysys/mf_keycache.c' --- a/mysys/mf_keycache.c 2010-07-23 20:15:41 +0000 +++ b/mysys/mf_keycache.c 2010-11-16 09:45:07 +0000 @@ -3963,11 +3963,11 @@ restart: if (!(block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH | BLOCK_REASSIGNED))) { - struct st_hash_link *next_hash_link; - my_off_t next_diskpos; - File next_file; - uint next_status; - uint hash_requests; + struct st_hash_link *UNINIT_VAR(next_hash_link); + my_off_t UNINIT_VAR(next_diskpos); + File UNINIT_VAR(next_file); + uint UNINIT_VAR(next_status); + uint UNINIT_VAR(hash_requests); total_found++; found++; === modified file 'regex/regexec.c' --- a/regex/regexec.c 2007-03-28 17:46:42 +0000 +++ b/regex/regexec.c 2010-11-10 21:14:47 +0000 @@ -117,6 +117,7 @@ size_t nmatch; my_regmatch_t pmatch[]; int eflags; { + char *pstr = (char *) str; register struct re_guts *g = preg->re_g; #ifdef REDEBUG # define GOODFLAGS(f) (f) @@ -133,7 +134,7 @@ int eflags; if ((size_t) g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags®_LARGE)) - return(smatcher(preg->charset, g, (char *)str, nmatch, pmatch, eflags)); + return(smatcher(preg->charset, g, pstr, nmatch, pmatch, eflags)); else - return(lmatcher(preg->charset, g, (char *)str, nmatch, pmatch, eflags)); + return(lmatcher(preg->charset, g, pstr, nmatch, pmatch, eflags)); } === modified file 'sql/debug_sync.cc' --- a/sql/debug_sync.cc 2010-07-08 21:20:08 +0000 +++ b/sql/debug_sync.cc 2010-11-16 09:45:07 +0000 @@ -1691,7 +1691,7 @@ static void debug_sync_execute(THD *thd, if (action->execute) { - const char *old_proc_info; + const char *UNINIT_VAR(old_proc_info); action->execute--; === modified file 'sql/field.cc' --- a/sql/field.cc 2010-10-29 09:35:07 +0000 +++ b/sql/field.cc 2010-11-17 15:39:35 +0000 @@ -6327,10 +6327,13 @@ int Field_str::store(double nr) ASSERT_COLUMN_MARKED_FOR_WRITE; char buff[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE]; uint local_char_length= field_length / charset()->mbmaxlen; - size_t length; - my_bool error; + size_t length= 0; + my_bool error= (local_char_length == 0); + + // my_gcvt() requires width > 0, and we may have a CHAR(0) column. + if (!error) + length= my_gcvt(nr, MY_GCVT_ARG_DOUBLE, local_char_length, buff, &error); - length= my_gcvt(nr, MY_GCVT_ARG_DOUBLE, local_char_length, buff, &error); if (error) { if (table->in_use->abort_on_warning) === modified file 'sql/handler.cc' --- a/sql/handler.cc 2010-11-11 17:11:05 +0000 +++ b/sql/handler.cc 2010-11-17 16:42:28 +0000 @@ -4184,7 +4184,7 @@ int handler::read_multi_range_first(KEY_ */ int handler::read_multi_range_next(KEY_MULTI_RANGE **found_range_p) { - int result; + int UNINIT_VAR(result); DBUG_ENTER("handler::read_multi_range_next"); /* We should not be called after the last call returned EOF. */ === modified file 'sql/slave.cc' --- a/sql/slave.cc 2010-10-22 11:58:09 +0000 +++ b/sql/slave.cc 2010-11-17 16:42:28 +0000 @@ -2521,7 +2521,7 @@ static int exec_relay_log_event(THD* thd if (slave_trans_retries) { - int temp_err; + int UNINIT_VAR(temp_err); if (exec_res && (temp_err= has_temporary_error(thd))) { const char *errmsg; === modified file 'sql/sql_partition.cc' --- a/sql/sql_partition.cc 2010-11-05 13:16:27 +0000 +++ b/sql/sql_partition.cc 2010-11-16 09:45:07 +0000 @@ -7484,8 +7484,8 @@ int get_part_iter_for_interval_via_mappi PARTITION_ITERATOR *part_iter) { Field *field= part_info->part_field_array[0]; - uint32 max_endpoint_val; - get_endpoint_func get_endpoint; + uint32 UNINIT_VAR(max_endpoint_val); + get_endpoint_func UNINIT_VAR(get_endpoint); bool can_match_multiple_values; /* is not '=' */ uint field_len= field->pack_length_in_rec(); DBUG_ENTER("get_part_iter_for_interval_via_mapping"); === modified file 'storage/myisam/ft_nlq_search.c' --- a/storage/myisam/ft_nlq_search.c 2010-07-23 20:16:29 +0000 +++ b/storage/myisam/ft_nlq_search.c 2010-11-16 09:45:07 +0000 @@ -63,7 +63,7 @@ static int FT_SUPERDOC_cmp(void* cmp_arg static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio) { - int subkeys, r; + int UNINIT_VAR(subkeys), r; uint keylen, doc_cnt; FT_SUPERDOC sdoc, *sptr; TREE_ELEMENT *selem; === modified file 'storage/myisammrg/myrg_open.c' --- a/storage/myisammrg/myrg_open.c 2010-07-20 19:30:10 +0000 +++ b/storage/myisammrg/myrg_open.c 2010-11-16 09:45:07 +0000 @@ -220,7 +220,7 @@ MYRG_INFO *myrg_parent_open(const char * int (*callback)(void*, const char*), void *callback_param) { - MYRG_INFO *m_info; + MYRG_INFO *UNINIT_VAR(m_info); int rc; int errpos; int save_errno; === modified file 'tests/mysql_client_test.c' --- a/tests/mysql_client_test.c 2010-11-16 09:05:19 +0000 +++ b/tests/mysql_client_test.c 2010-11-17 16:42:28 +0000 @@ -1199,7 +1199,7 @@ my_bool fetch_n(const char **query_list, /* Separate thread query to test some cases */ -static my_bool thread_query(char *query) +static my_bool thread_query(const char *query) { MYSQL *l_mysql; my_bool error; @@ -1221,7 +1221,7 @@ static my_bool thread_query(char *query) goto end; } l_mysql->reconnect= 1; - if (mysql_query(l_mysql, (char *)query)) + if (mysql_query(l_mysql, query)) { fprintf(stderr, "Query failed (%s)\n", mysql_error(l_mysql)); error= 1; @@ -6447,7 +6447,7 @@ static void test_prepare_alter() rc= mysql_stmt_execute(stmt); check_execute(stmt, rc); - if (thread_query((char *)"ALTER TABLE test_prep_alter change id id_new varchar(20)")) + if (thread_query("ALTER TABLE test_prep_alter change id id_new varchar(20)")) exit(1); is_null= 1; No bundle (reason: useless for push emails).