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<typename type> 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).
| Thread |
|---|
| • bzr push into mysql-5.5-runtime branch (jon.hauglid:3187 to 3188) | Jon Olav Hauglid | 17 Nov |