From: Dmitry Lenev Date: October 8 2010 4:37pm Subject: bzr push into mysql-5.5-runtime branch (Dmitry.Lenev:3159 to 3160) List-Archive: http://lists.mysql.com/commits/120405 Message-Id: <20101008163845.535CBE58DC@mockturtle> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1552169265==" --===============1552169265== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3160 Dmitry Lenev 2010-10-08 [merge] Merged recent changes from mysql-5.5-bugteam into mysql-5.5-runtime tree. added: mysql-test/r/plugin_load_option.result mysql-test/t/plugin_load_option-master.opt mysql-test/t/plugin_load_option.test modified: client/mysqlcheck.c cmake/build_configurations/mysql_release.cmake mysql-test/r/func_math.result mysql-test/r/mysqlcheck.result mysql-test/r/query_cache_debug.result mysql-test/r/type_datetime.result mysql-test/suite/funcs_1/r/is_columns_is.result mysql-test/suite/rpl/r/rpl_heartbeat.result mysql-test/suite/rpl/r/rpl_heartbeat_basic.result mysql-test/t/func_math.test mysql-test/t/mysqlcheck.test mysql-test/t/query_cache_debug.test mysql-test/t/type_datetime.test plugin/auth/dialog.c sql/item.cc sql/item_strfunc.cc sql/mysqld.cc sql/scheduler.h sql/share/errmsg-utf8.txt sql/sql_cache.cc sql/sql_plugin.cc sql/sql_plugin.h sql/sql_show.cc sql/sql_yacc.yy sql/sys_vars.cc sql/sys_vars.h storage/innobase/include/ibuf0ibuf.h storage/innobase/include/row0row.h strings/my_vsnprintf.c 3159 Dmitry Lenev 2010-10-07 Fix for bug#57061 "User without privilege on routine can discover its existence". The problem was that user without any privileges on routine was able to find out whether it existed or not. DROP FUNCTION and DROP PROCEDURE statements were checking if routine being dropped existed and reported ER_SP_DOES_NOT_EXIST error/warning before checking if user had enough privileges to drop it. This patch solves this problem by changing code not to check if routine exists before checking if user has enough privileges to drop it. Moreover we no longer perform this check using a separate call instead we rely on sp_drop_routine() returning SP_KEY_NOT_FOUND if routine doesn't exist. This change also simplifies one of upcoming patches refactoring global read lock implementation. @ mysql-test/r/grant.result Updated test case after fixing bug#57061 "User without privilege on routine can discover its existence". Removed DROP PROCEDURE/FUNCTION statements which have started to fail after this fix (correctly). There is no need in dropping routines in freshly created database anyway. @ mysql-test/r/sp-security.result Added new test case for bug#57061 "User without privilege on routine can discover its existence". Updated existing tests according to new behaviour. @ mysql-test/suite/funcs_1/r/innodb_storedproc_06.result Updated test case after fixing bug#57061 "User without privilege on routine can discover its existence". Now we drop routines under user which has enough privileges to do so. @ mysql-test/suite/funcs_1/r/memory_storedproc_06.result Updated test case after fixing bug#57061 "User without privilege on routine can discover its existence". Now we drop routines under user which has enough privileges to do so. @ mysql-test/suite/funcs_1/r/myisam_storedproc_06.result Updated test case after fixing bug#57061 "User without privilege on routine can discover its existence". Now we drop routines under user which has enough privileges to do so. @ mysql-test/suite/funcs_1/storedproc/storedproc_06.inc Updated test case after fixing bug#57061 "User without privilege on routine can discover its existence". Now we drop routines under user which has enough privileges to do so. @ mysql-test/t/grant.test Updated test case after fixing bug#57061 "User without privilege on routine can discover its existence". Removed DROP PROCEDURE/FUNCTION statements which have started to fail after this fix (correctly). There is no need in dropping routines in freshly created database anyway. @ mysql-test/t/sp-security.test Added new test case for bug#57061 "User without privilege on routine can discover its existence". Updated existing tests according to new behaviour. @ sql/sp.cc Removed sp_routine_exists_in_table() which is no longer used. @ sql/sp.h Removed sp_routine_exists_in_table() which is no longer used. @ sql/sql_parse.cc When dropping routine we no longer check if routine exists before checking if user has enough privileges to do so. Moreover we no longer perform this check using a separate call instead we rely on sp_drop_routine() returning SP_KEY_NOT_FOUND if routine doesn't exist. modified: mysql-test/r/grant.result mysql-test/r/sp-security.result mysql-test/suite/funcs_1/r/innodb_storedproc_06.result mysql-test/suite/funcs_1/r/memory_storedproc_06.result mysql-test/suite/funcs_1/r/myisam_storedproc_06.result mysql-test/suite/funcs_1/storedproc/storedproc_06.inc mysql-test/t/grant.test mysql-test/t/sp-security.test sql/sp.cc sql/sp.h sql/sql_parse.cc === modified file 'client/mysqlcheck.c' --- a/client/mysqlcheck.c 2010-10-06 15:06:13 +0000 +++ b/client/mysqlcheck.c 2010-10-08 07:09:47 +0000 @@ -47,7 +47,7 @@ static char *shared_memory_base_name=0; #endif static uint opt_protocol=0; -enum operations { DO_CHECK, DO_REPAIR, DO_ANALYZE, DO_OPTIMIZE, DO_UPGRADE }; +enum operations { DO_CHECK=1, DO_REPAIR, DO_ANALYZE, DO_OPTIMIZE, DO_UPGRADE }; static struct my_option my_long_options[] = { @@ -241,6 +241,8 @@ static my_bool get_one_option(int optid, const struct my_option *opt __attribute__((unused)), char *argument) { + int orig_what_to_do= what_to_do; + switch(optid) { case 'a': what_to_do = DO_ANALYZE; @@ -315,6 +317,13 @@ get_one_option(int optid, const struct m opt->name); break; } + + if (orig_what_to_do && (what_to_do != orig_what_to_do)) + { + fprintf(stderr, "Error: %s doesn't support multiple contradicting commands.\n", + my_progname); + return 1; + } return 0; } === modified file 'cmake/build_configurations/mysql_release.cmake' --- a/cmake/build_configurations/mysql_release.cmake 2010-07-19 14:23:02 +0000 +++ b/cmake/build_configurations/mysql_release.cmake 2010-10-08 13:30:58 +0000 @@ -131,16 +131,16 @@ IF(UNIX) # Default GCC flags IF(CMAKE_COMPILER_IS_GNUCC) - SET(COMMON_C_FLAGS "-g -static-libgcc -fno-omit-frame-pointer") + SET(COMMON_C_FLAGS "-g -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing") SET(CMAKE_C_FLAGS_DEBUG "-O ${COMMON_C_FLAGS}") SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O3 ${COMMON_C_FLAGS}") ENDIF() IF(CMAKE_COMPILER_IS_GNUCXX) - SET(COMMON_CXX_FLAGS "-g -static-libgcc -fno-omit-frame-pointer") + SET(COMMON_CXX_FLAGS "-g -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing") SET(CMAKE_CXX_FLAGS_DEBUG "-O ${COMMON_CXX_FLAGS}") SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 ${COMMON_CXX_FLAGS}") ENDIF() - + # HPUX flags IF(CMAKE_SYSTEM_NAME MATCHES "HP-UX") IF(CMAKE_C_COMPILER_ID MATCHES "HP") @@ -156,7 +156,7 @@ IF(UNIX) ENDIF() SET(WITH_SSL no) ENDIF() - + # Linux flags IF(CMAKE_SYSTEM_NAME MATCHES "Linux") IF(CMAKE_C_COMPILER_ID MATCHES "Intel") @@ -173,18 +173,18 @@ IF(UNIX) SET(WITH_SSL no) ENDIF() ENDIF() - + # OSX flags IF(APPLE) - SET(COMMON_C_FLAGS "-g -fno-common") + SET(COMMON_C_FLAGS "-g -fno-common -fno-strict-aliasing") # XXX: why are we using -felide-constructors on OSX? - SET(COMMON_CXX_FLAGS "-g -fno-common -felide-constructors") + SET(COMMON_CXX_FLAGS "-g -fno-common -felide-constructors -fno-strict-aliasing") SET(CMAKE_C_FLAGS_DEBUG "-O ${COMMON_C_FLAGS}") SET(CMAKE_CXX_FLAGS_DEBUG "-O ${COMMON_CXX_FLAGS}") SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-Os ${COMMON_C_FLAGS}") SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-Os ${COMMON_CXX_FLAGS}") ENDIF() - + # Solaris flags IF(CMAKE_SYSTEM_NAME MATCHES "SunOS") IF(CMAKE_SYSTEM_VERSION VERSION_GREATER "5.9") @@ -219,7 +219,7 @@ IF(UNIX) ENDIF() ENDIF() ENDIF() - + IF(CMAKE_C_FLAGS_DEBUG) SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" CACHE STRING "Debug C compile flags") === modified file 'mysql-test/r/func_math.result' --- a/mysql-test/r/func_math.result 2010-04-11 06:52:42 +0000 +++ b/mysql-test/r/func_math.result 2010-10-08 09:52:09 +0000 @@ -600,3 +600,10 @@ NULL SELECT -9223372036854775808 MOD -1; -9223372036854775808 MOD -1 0 +# +# Bug #57209 valgrind + Assertion failed: dst > buf +# +SELECT floor(log10(format(concat_ws(5445796E25, 5306463, 30837), -358821))) +as foo; +foo +2 === modified file 'mysql-test/r/mysqlcheck.result' --- a/mysql-test/r/mysqlcheck.result 2010-08-09 08:32:50 +0000 +++ b/mysql-test/r/mysqlcheck.result 2010-10-08 07:09:47 +0000 @@ -8,7 +8,7 @@ mysql.db mysql.event OK mysql.func OK mysql.general_log -note : The storage engine for the table doesn't support optimize +note : The storage engine for the table doesn't support analyze mysql.help_category OK mysql.help_keyword OK mysql.help_relation OK @@ -21,7 +21,7 @@ mysql.procs_priv mysql.proxy_priv OK mysql.servers OK mysql.slow_log -note : The storage engine for the table doesn't support optimize +note : The storage engine for the table doesn't support analyze mysql.tables_priv OK mysql.time_zone OK mysql.time_zone_leap_second OK @@ -29,6 +29,8 @@ mysql.time_zone_name mysql.time_zone_transition OK mysql.time_zone_transition_type OK mysql.user OK +mtr.global_suppressions Table is already up to date +mtr.test_suppressions Table is already up to date mysql.columns_priv OK mysql.db OK mysql.event OK @@ -55,10 +57,64 @@ mysql.time_zone_name mysql.time_zone_transition OK mysql.time_zone_transition_type OK mysql.user OK +mysql.columns_priv OK +mysql.db OK +mysql.event OK +mysql.func OK +mysql.general_log +note : The storage engine for the table doesn't support analyze +mysql.help_category OK +mysql.help_keyword OK +mysql.help_relation OK +mysql.help_topic OK +mysql.host OK +mysql.ndb_binlog_index OK +mysql.plugin OK +mysql.proc OK +mysql.procs_priv OK +mysql.proxy_priv OK +mysql.servers OK +mysql.slow_log +note : The storage engine for the table doesn't support analyze +mysql.tables_priv OK +mysql.time_zone OK +mysql.time_zone_leap_second OK +mysql.time_zone_name OK +mysql.time_zone_transition OK +mysql.time_zone_transition_type OK +mysql.user OK +mysql.columns_priv Table is already up to date +mysql.db Table is already up to date +mysql.event Table is already up to date +mysql.func Table is already up to date +mysql.general_log +note : The storage engine for the table doesn't support optimize +mysql.help_category Table is already up to date +mysql.help_keyword Table is already up to date +mysql.help_relation Table is already up to date +mysql.help_topic Table is already up to date +mysql.host Table is already up to date +mysql.ndb_binlog_index Table is already up to date +mysql.plugin Table is already up to date +mysql.proc Table is already up to date +mysql.procs_priv Table is already up to date +mysql.proxy_priv Table is already up to date +mysql.servers Table is already up to date +mysql.slow_log +note : The storage engine for the table doesn't support optimize +mysql.tables_priv Table is already up to date +mysql.time_zone Table is already up to date +mysql.time_zone_leap_second Table is already up to date +mysql.time_zone_name Table is already up to date +mysql.time_zone_transition Table is already up to date +mysql.time_zone_transition_type Table is already up to date +mysql.user Table is already up to date create table t1 (a int); create view v1 as select * from t1; test.t1 OK +test.t1 Table is already up to date test.t1 OK +test.t1 Table is already up to date drop view v1; drop table t1; create table `t``1`(a int); @@ -127,6 +183,7 @@ Tables_in_test t1 #mysql50#v-1 v1 +test.t1 OK show tables; Tables_in_test t1 @@ -200,3 +257,6 @@ Tables_in_test (t1-1) t1-1 drop table `t1-1`; End of 5.1 tests +# +# Bug #35269: mysqlcheck behaves different depending on order of parameters +# === added file 'mysql-test/r/plugin_load_option.result' --- a/mysql-test/r/plugin_load_option.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/r/plugin_load_option.result 2010-09-27 13:03:27 +0000 @@ -0,0 +1,7 @@ +UNINSTALL PLUGIN example; +ERROR HY000: Plugin 'example' is force_plus_permanent and can not be unloaded +SELECT PLUGIN_NAME, PLUGIN_STATUS, LOAD_OPTION FROM INFORMATION_SCHEMA.PLUGINS +WHERE PLUGIN_NAME IN ('MyISAM', 'EXAMPLE'); +PLUGIN_NAME PLUGIN_STATUS LOAD_OPTION +MyISAM ACTIVE FORCE +EXAMPLE ACTIVE FORCE_PLUS_PERMANENT === modified file 'mysql-test/r/query_cache_debug.result' --- a/mysql-test/r/query_cache_debug.result 2009-06-17 14:28:11 +0000 +++ b/mysql-test/r/query_cache_debug.result 2010-10-08 12:16:20 +0000 @@ -5,20 +5,24 @@ drop table if exists t1; create table t1 (a varchar(100)); insert into t1 values ('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'),('bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'); Activate debug hook and attempt to retrieve the statement from the cache. -set session debug='+d,wait_in_query_cache_insert'; +set debug_sync="wait_in_query_cache_insert SIGNAL parked WAIT_FOR go"; select SQL_CACHE * from t1;; +set debug_sync="now WAIT_FOR parked"; On a second connection; clear the query cache. show status like 'Qcache_queries_in_cache'; Variable_name Value Qcache_queries_in_cache 1 set global query_cache_size= 0; Signal the debug hook to release the lock. -select id from information_schema.processlist where state='wait_in_query_cache_insert' into @thread_id; -kill query @thread_id; +set debug_sync="now SIGNAL go"; Show query cache status. show status like 'Qcache_queries_in_cache'; Variable_name Value Qcache_queries_in_cache 0 +a +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +set debug_sync= 'RESET'; set global query_cache_size= 0; use test; drop table t1; @@ -32,11 +36,12 @@ SET GLOBAL concurrent_insert= 1; SET GLOBAL query_cache_size= 1024*512; SET GLOBAL query_cache_type= ON; # Switch to connection con1 -SET SESSION debug='+d,wait_after_query_cache_invalidate'; +SET DEBUG_SYNC = "wait_after_query_cache_invalidate SIGNAL parked WAIT_FOR go"; # Send concurrent insert, will wait in the query cache table invalidate INSERT INTO t1 VALUES (4); # Switch to connection default # Wait for concurrent insert to reach the debug point +SET DEBUG_SYNC = "now WAIT_FOR parked"; # Switch to connection con2 # Send SELECT that shouldn't be cached SELECT * FROM t1; @@ -46,9 +51,7 @@ a 3 # Switch to connection default # Notify the concurrent insert to proceed -SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST -WHERE STATE = 'wait_after_query_cache_invalidate' INTO @thread_id; -KILL QUERY @thread_id; +SET DEBUG_SYNC = "now SIGNAL go"; # Switch to connection con1 # Gather insert result SHOW STATUS LIKE "Qcache_queries_in_cache"; @@ -66,6 +69,7 @@ Variable_name Value Qcache_queries_in_cache 1 # Disconnect # Restore defaults +SET DEBUG_SYNC= 'RESET'; RESET QUERY CACHE; DROP TABLE t1,t2; SET GLOBAL concurrent_insert= DEFAULT; @@ -108,43 +112,48 @@ bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ** before the mutex lock in invalidate_table_internal. ** This will allow new result sets to be written into the QC. ** -SET SESSION debug='+d,wait_in_query_cache_invalidate1'; -SET SESSION debug='+d,wait_in_query_cache_invalidate2'; +SET DEBUG_SYNC="wait_in_query_cache_invalidate1 SIGNAL parked1_1 WAIT_FOR go1_1"; +SET DEBUG_SYNC="wait_in_query_cache_invalidate2 SIGNAL parked1_2 WAIT_FOR go1_2"; DELETE FROM t1 WHERE a like '%a%';; =================================== Connection default ** Assert that the expect process status is obtained. +SET DEBUG_SYNC="now WAIT_FOR parked1_1"; ** =================================== Connection thd2 ** On THD2: Insert a result into the cache. This attempt will be blocked ** because of a debug hook placed just before the mutex lock after which ** the first part of the result set is written. -SET SESSION debug='+d,wait_in_query_cache_insert'; +SET DEBUG_SYNC="wait_in_query_cache_insert SIGNAL parked2 WAIT_FOR go2 EXECUTE 1"; SELECT SQL_CACHE * FROM t2 UNION SELECT * FROM t3; +=================================== Connection default +** Assert that the SELECT-stmt thread reaches the sync point. +SET DEBUG_SYNC="now WAIT_FOR parked2"; +** +** =================================== Connection thd3 ** On THD3: Insert another result into the cache and block on the same ** debug hook. -SET SESSION debug='+d,wait_in_query_cache_insert'; -SELECT SQL_CACHE * FROM t4 UNION SELECT * FROM t5;; +SET DEBUG_SYNC="wait_in_query_cache_insert SIGNAL parked3 WAIT_FOR go3 EXECUTE 1"; +SELECT SQL_CACHE * FROM t4 UNION SELECT * FROM t5; =================================== Connection default -** Assert that the two SELECT-stmt threads to reach the hook. +** Assert that the SELECT-stmt thread reaches the sync point. +SET DEBUG_SYNC="now WAIT_FOR parked3"; ** ** ** Signal the DELETE thread, THD1, to continue. It will enter the mutex ** lock and set query cache status to TABLE_FLUSH_IN_PROGRESS and then ** unlock the mutex before stopping on the next debug hook. -SELECT SQL_NO_CACHE id FROM information_schema.processlist WHERE state='wait_in_query_cache_invalidate1' LIMIT 1 INTO @flush_thread_id; -KILL QUERY @flush_thread_id; +SET DEBUG_SYNC="now SIGNAL go1_1"; ** Assert that we reach the next debug hook. +SET DEBUG_SYNC="now WAIT_FOR parked1_2"; ** ** Signal the remaining debug hooks blocking THD2 and THD3. ** The threads will grab the guard mutex enter the wait condition and ** and finally release the mutex. The threads will continue to wait ** until a broadcast signal reaches them causing both threads to ** come alive and check the condition. -SELECT SQL_NO_CACHE id FROM information_schema.processlist WHERE state='wait_in_query_cache_insert' ORDER BY id ASC LIMIT 1 INTO @thread_id; -KILL QUERY @thread_id; -SELECT SQL_NO_CACHE id FROM information_schema.processlist WHERE state='wait_in_query_cache_insert' ORDER BY id DESC LIMIT 1 INTO @thread_id; -KILL QUERY @thread_id; +SET DEBUG_SYNC="now SIGNAL go2"; +SET DEBUG_SYNC="now SIGNAL go3"; ** ** Finally signal the DELETE statement on THD1 one last time. ** The stmt will complete the query cache invalidation and return @@ -152,8 +161,7 @@ KILL QUERY @thread_id; ** One signal will be sent to the thread group waiting for executing ** invalidations and a broadcast signal will be sent to the thread ** group holding result set writers. -SELECT SQL_NO_CACHE id FROM information_schema.processlist WHERE state='wait_in_query_cache_invalidate2' LIMIT 1 INTO @flush_thread_id; -KILL QUERY @flush_thread_id; +SET DEBUG_SYNC="now SIGNAL go1_2"; ** ************************************************************************* ** No tables should be locked @@ -172,6 +180,7 @@ DELETE FROM t4; DELETE FROM t5; =================================== Connection thd1 ** Done. +SET DEBUG_SYNC= 'RESET'; SET GLOBAL query_cache_size= 0; # Restore defaults RESET QUERY CACHE; @@ -179,3 +188,35 @@ FLUSH STATUS; DROP TABLE t1,t2,t3,t4,t5; SET GLOBAL query_cache_size= DEFAULT; SET GLOBAL query_cache_type= DEFAULT; +# +# Bug#56822: Add a thread state for sessions waiting on the query cache lock +# +SET @old_query_cache_size= @@GLOBAL.query_cache_size; +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2),(3); +SET GLOBAL concurrent_insert= 1; +SET GLOBAL query_cache_size= 1024*512; +SET GLOBAL query_cache_type= ON; +# Switch to connection con1 +SET DEBUG_SYNC = "wait_in_query_cache_invalidate2 SIGNAL parked WAIT_FOR go"; +# Send INSERT, will wait in the query cache table invalidation +INSERT INTO t1 VALUES (4);; +# Switch to connection default +# Wait for insert to reach the debug point +SET DEBUG_SYNC = "now WAIT_FOR parked"; +# Switch to connection con2 +# Send a query that should wait on the query cache lock +RESET QUERY CACHE; +# Switch to connection default +# Wait for the state to be reflected in the processlist +# Signal that the query cache can be unlocked +SET DEBUG_SYNC="now SIGNAL go"; +# Reap con1 and disconnect +# Reap con2 and disconnect +# Restore defaults +SET DEBUG_SYNC= 'RESET'; +RESET QUERY CACHE; +DROP TABLE t1; +SET GLOBAL query_cache_size= DEFAULT; +SET GLOBAL query_cache_type= DEFAULT; === modified file 'mysql-test/r/type_datetime.result' --- a/mysql-test/r/type_datetime.result 2010-09-07 06:45:00 +0000 +++ b/mysql-test/r/type_datetime.result 2010-10-07 16:16:30 +0000 @@ -680,5 +680,17 @@ id select_type table type possible_keys 1 SIMPLE t2 const PRIMARY PRIMARY 8 const 1 Using index DROP TABLE t1,t2; # +# Bug#57095: Wrongly chosen expression cache type led to a wrong +# result. +# +CREATE TABLE t1 (`b` datetime ); +INSERT INTO t1 VALUES ('2010-01-01 00:00:00'), ('2010-01-01 00:00:00'); +SELECT * FROM t1 WHERE b <= coalesce(NULL, now()); +b +2010-01-01 00:00:00 +2010-01-01 00:00:00 +DROP TABLE t1; +# +# # End of 5.5 tests # === modified file 'mysql-test/suite/funcs_1/r/is_columns_is.result' --- a/mysql-test/suite/funcs_1/r/is_columns_is.result 2010-07-16 15:04:39 +0000 +++ b/mysql-test/suite/funcs_1/r/is_columns_is.result 2010-09-27 13:03:27 +0000 @@ -165,6 +165,7 @@ def information_schema PARTITIONS TABLE_ def information_schema PARTITIONS TABLE_ROWS 13 0 NO bigint NULL NULL 20 0 NULL NULL bigint(21) unsigned select def information_schema PARTITIONS TABLE_SCHEMA 2 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select def information_schema PARTITIONS UPDATE_TIME 20 NULL YES datetime NULL NULL NULL NULL NULL NULL datetime select +def information_schema PLUGINS LOAD_OPTION 11 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select def information_schema PLUGINS PLUGIN_AUTHOR 8 NULL YES varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select def information_schema PLUGINS PLUGIN_DESCRIPTION 9 NULL YES longtext 4294967295 4294967295 NULL NULL utf8 utf8_general_ci longtext select def information_schema PLUGINS PLUGIN_LIBRARY 6 NULL YES varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select @@ -562,6 +563,7 @@ NULL information_schema PARTITIONS CHECK 3.0000 information_schema PLUGINS PLUGIN_AUTHOR varchar 64 192 utf8 utf8_general_ci varchar(64) 1.0000 information_schema PLUGINS PLUGIN_DESCRIPTION longtext 4294967295 4294967295 utf8 utf8_general_ci longtext 3.0000 information_schema PLUGINS PLUGIN_LICENSE varchar 80 240 utf8 utf8_general_ci varchar(80) +3.0000 information_schema PLUGINS LOAD_OPTION varchar 64 192 utf8 utf8_general_ci varchar(64) NULL information_schema PROCESSLIST ID bigint NULL NULL NULL NULL bigint(4) 3.0000 information_schema PROCESSLIST USER varchar 16 48 utf8 utf8_general_ci varchar(16) 3.0000 information_schema PROCESSLIST HOST varchar 64 192 utf8 utf8_general_ci varchar(64) === modified file 'mysql-test/suite/rpl/r/rpl_heartbeat.result' --- a/mysql-test/suite/rpl/r/rpl_heartbeat.result 2010-05-26 14:34:25 +0000 +++ b/mysql-test/suite/rpl/r/rpl_heartbeat.result 2010-10-07 23:34:59 +0000 @@ -6,19 +6,19 @@ show status like 'Slave_heartbeat_period Variable_name Slave_heartbeat_period Value 5.000 change master to master_host='127.0.0.1',master_port=MASTER_PORT, master_user='root', master_heartbeat_period= 4294968; -ERROR HY000: The requested value for the heartbeat period is negative or exceeds the maximum 4294967 seconds +ERROR HY000: The requested value for the heartbeat period is either negative or exceeds the maximum allowed (4294967 seconds). show status like 'Slave_heartbeat_period';; Variable_name Slave_heartbeat_period Value 5.000 change master to master_host='127.0.0.1',master_port=MASTER_PORT, master_user='root', master_heartbeat_period= 0.0009999; Warnings: -Warning 1624 The requested value for the heartbeat period is less than 1 msec. The period is reset to zero which means no heartbeats will be sending +Warning 1703 The requested value for the heartbeat period is less than 1 millisecond. The value is reset to 0, meaning that heartbeating will effectively be disabled. show status like 'Slave_heartbeat_period';; Variable_name Slave_heartbeat_period Value 0.000 change master to master_host='127.0.0.1',master_port=MASTER_PORT, master_user='root', master_heartbeat_period= 4294967; Warnings: -Warning 1624 The requested value for the heartbeat period exceeds the value of `slave_net_timeout' sec. A sensible value for the period should be less than the timeout. +Warning 1704 The requested value for the heartbeat period exceeds the value of `slave_net_timeout' seconds. A sensible value for the period should be less than the timeout. show status like 'Slave_heartbeat_period';; Variable_name Slave_heartbeat_period Value 4294967.000 @@ -30,7 +30,7 @@ reset slave; set @@global.slave_net_timeout= 5; change master to master_host='127.0.0.1',master_port=MASTER_PORT, master_user='root', master_heartbeat_period= 5.001; Warnings: -Warning 1624 The requested value for the heartbeat period exceeds the value of `slave_net_timeout' sec. A sensible value for the period should be less than the timeout. +Warning 1704 The requested value for the heartbeat period exceeds the value of `slave_net_timeout' seconds. A sensible value for the period should be less than the timeout. show status like 'Slave_heartbeat_period';; Variable_name Slave_heartbeat_period Value 5.001 @@ -42,7 +42,7 @@ Variable_name Slave_heartbeat_period Value 4.000 set @@global.slave_net_timeout= 3 /* must be a warning */; Warnings: -Warning 1624 The current value for master_heartbeat_period exceeds the new value of `slave_net_timeout' sec. A sensible value for the period should be less than the timeout. +Warning 1704 The requested value for the heartbeat period exceeds the value of `slave_net_timeout' seconds. A sensible value for the period should be less than the timeout. reset slave; drop table if exists t1; set @@global.slave_net_timeout= 10; === modified file 'mysql-test/suite/rpl/r/rpl_heartbeat_basic.result' --- a/mysql-test/suite/rpl/r/rpl_heartbeat_basic.result 2010-03-16 19:23:55 +0000 +++ b/mysql-test/suite/rpl/r/rpl_heartbeat_basic.result 2010-10-07 23:34:59 +0000 @@ -38,14 +38,14 @@ RESET SLAVE; *** Warning if updated slave_net_timeout < slave_heartbeat_timeout *** SET @@global.slave_net_timeout=FLOOR(SLAVE_HEARTBEAT_TIMEOUT)-1; Warnings: -Warning 1624 The current value for master_heartbeat_period exceeds the new value of `slave_net_timeout' sec. A sensible value for the period should be less than the timeout. +Warning 1704 The requested value for the heartbeat period exceeds the value of `slave_net_timeout' seconds. A sensible value for the period should be less than the timeout. SET @@global.slave_net_timeout=@restore_slave_net_timeout; RESET SLAVE; *** Warning if updated slave_heartbeat_timeout > slave_net_timeout *** CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=MASTER_PORT, MASTER_USER='root', MASTER_HEARTBEAT_PERIOD=SLAVE_NET_TIMEOUT; Warnings: -Warning 1624 The requested value for the heartbeat period exceeds the value of `slave_net_timeout' sec. A sensible value for the period should be less than the timeout. +Warning 1704 The requested value for the heartbeat period exceeds the value of `slave_net_timeout' seconds. A sensible value for the period should be less than the timeout. RESET SLAVE; *** CHANGE MASTER statement only updates slave_heartbeat_period *** @@ -140,7 +140,7 @@ Slave_heartbeat_period 0.001 RESET SLAVE; CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=MASTER_PORT, MASTER_USER='root', MASTER_HEARTBEAT_PERIOD=0.0009; Warnings: -Warning 1624 The requested value for the heartbeat period is less than 1 msec. The period is reset to zero which means no heartbeats will be sending +Warning 1703 The requested value for the heartbeat period is less than 1 millisecond. The value is reset to 0, meaning that heartbeating will effectively be disabled. SHOW GLOBAL STATUS LIKE 'slave_heartbeat_period'; Variable_name Value Slave_heartbeat_period 0.000 @@ -149,19 +149,19 @@ RESET SLAVE; *** Max slave_heartbeat_timeout *** CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=MASTER_PORT, MASTER_USER='root', MASTER_HEARTBEAT_PERIOD=4294967; Warnings: -Warning 1624 The requested value for the heartbeat period exceeds the value of `slave_net_timeout' sec. A sensible value for the period should be less than the timeout. +Warning 1704 The requested value for the heartbeat period exceeds the value of `slave_net_timeout' seconds. A sensible value for the period should be less than the timeout. SHOW GLOBAL STATUS LIKE 'slave_heartbeat_period'; Variable_name Value Slave_heartbeat_period 4294967.000 RESET SLAVE; CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=MASTER_PORT, MASTER_USER='root', MASTER_HEARTBEAT_PERIOD=4294968; -ERROR HY000: The requested value for the heartbeat period is negative or exceeds the maximum 4294967 seconds +ERROR HY000: The requested value for the heartbeat period is either negative or exceeds the maximum allowed (4294967 seconds). RESET SLAVE; CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=MASTER_PORT, MASTER_USER='root', MASTER_HEARTBEAT_PERIOD=8589935; -ERROR HY000: The requested value for the heartbeat period is negative or exceeds the maximum 4294967 seconds +ERROR HY000: The requested value for the heartbeat period is either negative or exceeds the maximum allowed (4294967 seconds). RESET SLAVE; CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=MASTER_PORT, MASTER_USER='root', MASTER_HEARTBEAT_PERIOD=4294967296; -ERROR HY000: The requested value for the heartbeat period is negative or exceeds the maximum 4294967 seconds +ERROR HY000: The requested value for the heartbeat period is either negative or exceeds the maximum allowed (4294967 seconds). RESET SLAVE; *** Misc incorrect values *** === modified file 'mysql-test/t/func_math.test' --- a/mysql-test/t/func_math.test 2010-03-18 10:38:29 +0000 +++ b/mysql-test/t/func_math.test 2010-10-08 09:52:09 +0000 @@ -458,3 +458,9 @@ SELECT 2 DIV -2; SELECT -(1 DIV 0); # Crashed the server with SIGFPE before the bugfix SELECT -9223372036854775808 MOD -1; + +--echo # +--echo # Bug #57209 valgrind + Assertion failed: dst > buf +--echo # +SELECT floor(log10(format(concat_ws(5445796E25, 5306463, 30837), -358821))) +as foo; === modified file 'mysql-test/t/mysqlcheck.test' --- a/mysql-test/t/mysqlcheck.test 2009-10-21 12:59:47 +0000 +++ b/mysql-test/t/mysqlcheck.test 2010-10-08 07:09:47 +0000 @@ -23,10 +23,13 @@ drop database if exists client_test_db; # Bug #13783 mysqlcheck tries to optimize and analyze information_schema # --replace_result 'Table is already up to date' OK ---exec $MYSQL_CHECK --all-databases --analyze --optimize +--exec $MYSQL_CHECK --all-databases --analyze +--exec $MYSQL_CHECK --all-databases --optimize --replace_result 'Table is already up to date' OK ---exec $MYSQL_CHECK --analyze --optimize --databases test information_schema mysql ---exec $MYSQL_CHECK --analyze --optimize information_schema schemata +--exec $MYSQL_CHECK --analyze --databases test information_schema mysql +--exec $MYSQL_CHECK --optimize --databases test information_schema mysql +--exec $MYSQL_CHECK --analyze information_schema schemata +--exec $MYSQL_CHECK --optimize information_schema schemata # # Bug #16502: mysqlcheck tries to check views @@ -34,9 +37,11 @@ drop database if exists client_test_db; create table t1 (a int); create view v1 as select * from t1; --replace_result 'Table is already up to date' OK ---exec $MYSQL_CHECK --analyze --optimize --databases test +--exec $MYSQL_CHECK --analyze --databases test +--exec $MYSQL_CHECK --optimize --databases test --replace_result 'Table is already up to date' OK ---exec $MYSQL_CHECK --all-in-1 --analyze --optimize --databases test +--exec $MYSQL_CHECK --all-in-1 --analyze --databases test +--exec $MYSQL_CHECK --all-in-1 --optimize --databases test drop view v1; drop table t1; @@ -113,7 +118,8 @@ show tables; let $MYSQLD_DATADIR= `select @@datadir`; --copy_file $MYSQLD_DATADIR/test/v1.frm $MYSQLD_DATADIR/test/v-1.frm show tables; ---exec $MYSQL_CHECK --check-upgrade --fix-table-names --databases test +--exec $MYSQL_CHECK --check-upgrade --databases test +--exec $MYSQL_CHECK --fix-table-names --databases test show tables; drop view v1, `v-1`; drop table t1; @@ -212,3 +218,14 @@ show tables like 't1-1'; drop table `t1-1`; --echo End of 5.1 tests + + +--echo # +--echo # Bug #35269: mysqlcheck behaves different depending on order of parameters +--echo # + +--error 13 +--exec $MYSQL_CHECK -a --fix-table-names test "#mysql50#t1-1" +--error 1 +--exec $MYSQL_CHECK -aoc test "#mysql50#t1-1" + === added file 'mysql-test/t/plugin_load_option-master.opt' --- a/mysql-test/t/plugin_load_option-master.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/t/plugin_load_option-master.opt 2010-10-08 09:20:42 +0000 @@ -0,0 +1,3 @@ +$EXAMPLE_PLUGIN_OPT +$EXAMPLE_PLUGIN_LOAD +--loose-plugin-example=FORCE_PLUS_PERMANENT === added file 'mysql-test/t/plugin_load_option.test' --- a/mysql-test/t/plugin_load_option.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/t/plugin_load_option.test 2010-09-27 13:03:27 +0000 @@ -0,0 +1,8 @@ +--source include/not_windows_embedded.inc +--source include/have_example_plugin.inc + +--error ER_PLUGIN_IS_PERMANENT +UNINSTALL PLUGIN example; + +SELECT PLUGIN_NAME, PLUGIN_STATUS, LOAD_OPTION FROM INFORMATION_SCHEMA.PLUGINS +WHERE PLUGIN_NAME IN ('MyISAM', 'EXAMPLE'); === modified file 'mysql-test/t/query_cache_debug.test' --- a/mysql-test/t/query_cache_debug.test 2010-04-30 12:12:41 +0000 +++ b/mysql-test/t/query_cache_debug.test 2010-10-08 12:16:20 +0000 @@ -1,6 +1,6 @@ --source include/not_embedded.inc --source include/have_query_cache.inc ---source include/have_debug.inc +--source include/have_debug_sync.inc # # Bug #30887 Server crashes on SET GLOBAL query_cache_size=0 @@ -18,12 +18,11 @@ connect (bug30887con2, localhost, root, connection bug30887con1; --echo Activate debug hook and attempt to retrieve the statement from the cache. -set session debug='+d,wait_in_query_cache_insert'; +set debug_sync="wait_in_query_cache_insert SIGNAL parked WAIT_FOR go"; --send select SQL_CACHE * from t1; connection default; -let $wait_condition= select count(*)= 1 from information_schema.processlist where state= 'wait_in_query_cache_insert'; ---source include/wait_condition.inc +set debug_sync="now WAIT_FOR parked"; connection bug30887con2; --echo On a second connection; clear the query cache. @@ -32,14 +31,18 @@ set global query_cache_size= 0; connection default; --echo Signal the debug hook to release the lock. -select id from information_schema.processlist where state='wait_in_query_cache_insert' into @thread_id; -kill query @thread_id; +set debug_sync="now SIGNAL go"; --echo Show query cache status. show status like 'Qcache_queries_in_cache'; +connection bug30887con1; +--reap + disconnect bug30887con1; disconnect bug30887con2; +connection default; +set debug_sync= 'RESET'; set global query_cache_size= 0; use test; drop table t1; @@ -67,18 +70,14 @@ connect(con2,localhost,root,,test,,); connection con1; --echo # Switch to connection con1 -SET SESSION debug='+d,wait_after_query_cache_invalidate'; +SET DEBUG_SYNC = "wait_after_query_cache_invalidate SIGNAL parked WAIT_FOR go"; --echo # Send concurrent insert, will wait in the query cache table invalidate --send INSERT INTO t1 VALUES (4) connection default; --echo # Switch to connection default --echo # Wait for concurrent insert to reach the debug point -let $wait_condition= - SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST - WHERE STATE = "wait_after_query_cache_invalidate" AND - INFO = "INSERT INTO t1 VALUES (4)"; ---source include/wait_condition.inc +SET DEBUG_SYNC = "now WAIT_FOR parked"; connection con2; --echo # Switch to connection con2 @@ -88,9 +87,7 @@ SELECT * FROM t1; connection default; --echo # Switch to connection default --echo # Notify the concurrent insert to proceed -SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST - WHERE STATE = 'wait_after_query_cache_invalidate' INTO @thread_id; -KILL QUERY @thread_id; +SET DEBUG_SYNC = "now SIGNAL go"; connection con1; --echo # Switch to connection con1 @@ -107,6 +104,7 @@ disconnect con2; connection default; --echo # Restore defaults +SET DEBUG_SYNC= 'RESET'; RESET QUERY CACHE; DROP TABLE t1,t2; SET GLOBAL concurrent_insert= DEFAULT; @@ -157,15 +155,14 @@ SELECT SQL_CACHE * FROM t1; --echo ** before the mutex lock in invalidate_table_internal. --echo ** This will allow new result sets to be written into the QC. --echo ** -SET SESSION debug='+d,wait_in_query_cache_invalidate1'; -SET SESSION debug='+d,wait_in_query_cache_invalidate2'; +SET DEBUG_SYNC="wait_in_query_cache_invalidate1 SIGNAL parked1_1 WAIT_FOR go1_1"; +SET DEBUG_SYNC="wait_in_query_cache_invalidate2 SIGNAL parked1_2 WAIT_FOR go1_2"; --send DELETE FROM t1 WHERE a like '%a%'; connection default; --echo =================================== Connection default --echo ** Assert that the expect process status is obtained. -LET $wait_condition= SELECT SQL_NO_CACHE COUNT(*)= 1 FROM information_schema.processlist WHERE state= 'wait_in_query_cache_invalidate1'; ---source include/wait_condition.inc +SET DEBUG_SYNC="now WAIT_FOR parked1_1"; -- echo ** connection thd2; @@ -173,32 +170,36 @@ connection thd2; --echo ** On THD2: Insert a result into the cache. This attempt will be blocked --echo ** because of a debug hook placed just before the mutex lock after which --echo ** the first part of the result set is written. -SET SESSION debug='+d,wait_in_query_cache_insert'; +SET DEBUG_SYNC="wait_in_query_cache_insert SIGNAL parked2 WAIT_FOR go2 EXECUTE 1"; --send SELECT SQL_CACHE * FROM t2 UNION SELECT * FROM t3 +connection default; +--echo =================================== Connection default +--echo ** Assert that the SELECT-stmt thread reaches the sync point. +SET DEBUG_SYNC="now WAIT_FOR parked2"; +--echo ** +--echo ** + connection thd3; --echo =================================== Connection thd3 --echo ** On THD3: Insert another result into the cache and block on the same --echo ** debug hook. -SET SESSION debug='+d,wait_in_query_cache_insert'; ---send SELECT SQL_CACHE * FROM t4 UNION SELECT * FROM t5; +SET DEBUG_SYNC="wait_in_query_cache_insert SIGNAL parked3 WAIT_FOR go3 EXECUTE 1"; +--send SELECT SQL_CACHE * FROM t4 UNION SELECT * FROM t5 connection default; --echo =================================== Connection default ---echo ** Assert that the two SELECT-stmt threads to reach the hook. -LET $wait_condition= SELECT SQL_NO_CACHE COUNT(*)= 2 FROM information_schema.processlist WHERE state='wait_in_query_cache_insert'; ---source include/wait_condition.inc +--echo ** Assert that the SELECT-stmt thread reaches the sync point. +SET DEBUG_SYNC="now WAIT_FOR parked3"; --echo ** --echo ** --echo ** Signal the DELETE thread, THD1, to continue. It will enter the mutex --echo ** lock and set query cache status to TABLE_FLUSH_IN_PROGRESS and then --echo ** unlock the mutex before stopping on the next debug hook. -SELECT SQL_NO_CACHE id FROM information_schema.processlist WHERE state='wait_in_query_cache_invalidate1' LIMIT 1 INTO @flush_thread_id; -KILL QUERY @flush_thread_id; +SET DEBUG_SYNC="now SIGNAL go1_1"; --echo ** Assert that we reach the next debug hook. -LET $wait_condition= SELECT SQL_NO_CACHE COUNT(*)= 1 FROM information_schema.processlist WHERE state='wait_in_query_cache_invalidate2'; ---source include/wait_condition.inc +SET DEBUG_SYNC="now WAIT_FOR parked1_2"; --echo ** --echo ** Signal the remaining debug hooks blocking THD2 and THD3. @@ -206,10 +207,8 @@ LET $wait_condition= SELECT SQL_NO_CACHE --echo ** and finally release the mutex. The threads will continue to wait --echo ** until a broadcast signal reaches them causing both threads to --echo ** come alive and check the condition. -SELECT SQL_NO_CACHE id FROM information_schema.processlist WHERE state='wait_in_query_cache_insert' ORDER BY id ASC LIMIT 1 INTO @thread_id; -KILL QUERY @thread_id; -SELECT SQL_NO_CACHE id FROM information_schema.processlist WHERE state='wait_in_query_cache_insert' ORDER BY id DESC LIMIT 1 INTO @thread_id; -KILL QUERY @thread_id; +SET DEBUG_SYNC="now SIGNAL go2"; +SET DEBUG_SYNC="now SIGNAL go3"; --echo ** --echo ** Finally signal the DELETE statement on THD1 one last time. @@ -218,11 +217,7 @@ KILL QUERY @thread_id; --echo ** One signal will be sent to the thread group waiting for executing --echo ** invalidations and a broadcast signal will be sent to the thread --echo ** group holding result set writers. -SELECT SQL_NO_CACHE id FROM information_schema.processlist WHERE state='wait_in_query_cache_invalidate2' LIMIT 1 INTO @flush_thread_id; -KILL QUERY @flush_thread_id; - -LET $wait_condition= SELECT SQL_NO_CACHE COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE Id = @flush_thread_id AND Command = 'Sleep'; ---source include/wait_condition.inc +SET DEBUG_SYNC="now SIGNAL go1_2"; --echo ** --echo ************************************************************************* @@ -250,6 +245,7 @@ connection default; disconnect thd1; disconnect thd2; disconnect thd3; +SET DEBUG_SYNC= 'RESET'; SET GLOBAL query_cache_size= 0; connection default; @@ -259,4 +255,66 @@ FLUSH STATUS; DROP TABLE t1,t2,t3,t4,t5; SET GLOBAL query_cache_size= DEFAULT; SET GLOBAL query_cache_type= DEFAULT; -exit; + +--echo # +--echo # Bug#56822: Add a thread state for sessions waiting on the query cache lock +--echo # + +SET @old_query_cache_size= @@GLOBAL.query_cache_size; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2),(3); + +SET GLOBAL concurrent_insert= 1; +SET GLOBAL query_cache_size= 1024*512; +SET GLOBAL query_cache_type= ON; + +connect(con1,localhost,root,,test,,); +connect(con2,localhost,root,,test,,); + +connection con1; +--echo # Switch to connection con1 +SET DEBUG_SYNC = "wait_in_query_cache_invalidate2 SIGNAL parked WAIT_FOR go"; +--echo # Send INSERT, will wait in the query cache table invalidation +--send INSERT INTO t1 VALUES (4); + +connection default; +--echo # Switch to connection default +--echo # Wait for insert to reach the debug point +SET DEBUG_SYNC = "now WAIT_FOR parked"; + +connection con2; +--echo # Switch to connection con2 +--echo # Send a query that should wait on the query cache lock +--send RESET QUERY CACHE + +connection default; +--echo # Switch to connection default +--echo # Wait for the state to be reflected in the processlist +let $wait_condition= + SELECT COUNT(*) = 1 FROM information_schema.processlist + WHERE state = "Waiting for query cache lock" AND info = "RESET QUERY CACHE"; +--source include/wait_condition.inc +--echo # Signal that the query cache can be unlocked +SET DEBUG_SYNC="now SIGNAL go"; + +connection con1; +--echo # Reap con1 and disconnect +--reap +disconnect con1; + +connection con2; +--echo # Reap con2 and disconnect +--reap +disconnect con2; + +connection default; +--echo # Restore defaults +SET DEBUG_SYNC= 'RESET'; +RESET QUERY CACHE; +DROP TABLE t1; +SET GLOBAL query_cache_size= DEFAULT; +SET GLOBAL query_cache_type= DEFAULT; === modified file 'mysql-test/t/type_datetime.test' --- a/mysql-test/t/type_datetime.test 2010-09-07 06:45:00 +0000 +++ b/mysql-test/t/type_datetime.test 2010-10-07 16:16:30 +0000 @@ -485,5 +485,15 @@ explain select * from t2 where f1=STR_TO DROP TABLE t1,t2; --echo # +--echo # Bug#57095: Wrongly chosen expression cache type led to a wrong +--echo # result. +--echo # +CREATE TABLE t1 (`b` datetime ); +INSERT INTO t1 VALUES ('2010-01-01 00:00:00'), ('2010-01-01 00:00:00'); +SELECT * FROM t1 WHERE b <= coalesce(NULL, now()); +DROP TABLE t1; +--echo # + +--echo # --echo # End of 5.5 tests --echo # === modified file 'plugin/auth/dialog.c' --- a/plugin/auth/dialog.c 2010-10-04 12:54:41 +0000 +++ b/plugin/auth/dialog.c 2010-10-08 00:53:00 +0000 @@ -1,15 +1,15 @@ /* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -181,7 +181,7 @@ mysql_declare_plugin_end; To support all this variety, the dialog plugin has a callback function "authentication_dialog_ask". If the client has a function of this name dialog plugin will use it for communication with the user. Otherwise - a default gets() based implementation will be used. + a default fgets() based implementation will be used. */ /** @@ -208,12 +208,15 @@ static mysql_authentication_dialog_ask_t static char *builtin_ask(MYSQL *mysql __attribute__((unused)), int type __attribute__((unused)), const char *prompt, - char *buf, int buf_len __attribute__((unused))) + char *buf, int buf_len) { + char *ptr; fputs(prompt, stdout); fputc(' ', stdout); - if (gets(buf) == 0) - return 0; + if (fgets(buf, buf_len, stdin) == NULL) + return NULL; + if ((ptr= strchr(buf, '\n'))) + *ptr= 0; return buf; } === modified file 'sql/item.cc' --- a/sql/item.cc 2010-09-24 13:18:45 +0000 +++ b/sql/item.cc 2010-10-08 14:06:31 +0000 @@ -1783,8 +1783,7 @@ bool agg_item_set_converter(DTCollation In case we're in statement prepare, create conversion item in its memory: it will be reused on each execute. */ - arena= thd->is_stmt_prepare() ? thd->activate_stmt_arena_if_needed(&backup) - : NULL; + arena= thd->activate_stmt_arena_if_needed(&backup); for (i= 0, arg= args; i < nargs; i++, arg+= item_sep) { @@ -7356,9 +7355,11 @@ Item_cache* Item_cache::get_cache(const case DECIMAL_RESULT: return new Item_cache_decimal(); case STRING_RESULT: - if (item->field_type() == MYSQL_TYPE_DATE || - item->field_type() == MYSQL_TYPE_DATETIME || - item->field_type() == MYSQL_TYPE_TIME) + /* Not all functions that return DATE/TIME are actually DATE/TIME funcs. */ + if ((item->field_type() == MYSQL_TYPE_DATE || + item->field_type() == MYSQL_TYPE_DATETIME || + item->field_type() == MYSQL_TYPE_TIME) && + (const_cast(item))->result_as_longlong()) return new Item_cache_datetime(item->field_type()); return new Item_cache_str(item); case ROW_RESULT: === modified file 'sql/item_strfunc.cc' --- a/sql/item_strfunc.cc 2010-08-20 11:14:11 +0000 +++ b/sql/item_strfunc.cc 2010-10-08 09:52:09 +0000 @@ -2299,7 +2299,8 @@ String *Item_func_format::val_str_ascii( if (lc->grouping[0] > 0 && str_length >= dec_length + 1 + lc->grouping[0]) { - char buf[DECIMAL_MAX_STR_LENGTH * 2]; /* 2 - in the worst case when grouping=1 */ + /* We need space for ',' between each group of digits as well. */ + char buf[2 * FLOATING_POINT_BUFFER]; int count; const char *grouping= lc->grouping; char sign_length= *str->ptr() == '-' ? 1 : 0; @@ -2323,7 +2324,7 @@ String *Item_func_format::val_str_ascii( count will be initialized to -1 and we'll never get into this "if" anymore. */ - if (!count) + if (count == 0) { *--dst= lc->thousand_sep; if (grouping[1]) === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2010-10-06 15:06:13 +0000 +++ b/sql/mysqld.cc 2010-10-08 14:52:39 +0000 @@ -3202,6 +3202,11 @@ static int init_common_variables() return 1; set_server_version(); +#ifndef EMBEDDED_LIBRARY + if (opt_help && !opt_verbose) + unireg_abort(0); +#endif /*!EMBEDDED_LIBRARY*/ + DBUG_PRINT("info",("%s Ver %s for %s on %s\n",my_progname, server_version, SYSTEM_TYPE,MACHINE_TYPE)); @@ -3239,12 +3244,11 @@ static int init_common_variables() desired page sizes. */ int nelem; - int max_desired_page_size; - int max_page_size; + size_t max_desired_page_size; if (opt_super_large_pages) - max_page_size= SUPER_LARGE_PAGESIZE; + max_desired_page_size= SUPER_LARGE_PAGESIZE; else - max_page_size= LARGE_PAGESIZE; + max_desired_page_size= LARGE_PAGESIZE; nelem = getpagesizes(NULL, 0); if (nelem > 0) { === modified file 'sql/scheduler.h' --- a/sql/scheduler.h 2010-06-07 14:01:39 +0000 +++ b/sql/scheduler.h 2010-10-08 12:44:57 +0000 @@ -57,6 +57,13 @@ struct scheduler_functions */ enum scheduler_types { + /* + The default of --thread-handling is the first one in the + thread_handling_names array, this array has to be consistent with + the order in this array, so to change default one has to change + the first entry in this enum and the first entry in the + thread_handling_names array. + */ SCHEDULER_ONE_THREAD_PER_CONNECTION=0, SCHEDULER_NO_THREADS, SCHEDULER_TYPES_COUNT === modified file 'sql/share/errmsg-utf8.txt' --- a/sql/share/errmsg-utf8.txt 2010-10-06 14:34:28 +0000 +++ b/sql/share/errmsg-utf8.txt 2010-10-07 23:34:59 +0000 @@ -6152,7 +6152,7 @@ ER_WARN_ENGINE_TRANSACTION_ROLLBACK ER_SLAVE_HEARTBEAT_FAILURE eng "Unexpected master's heartbeat data: %s" ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE - eng "The requested value for the heartbeat period %s %s" + eng "The requested value for the heartbeat period is either negative or exceeds the maximum allowed (%s seconds)." ER_NDB_REPLICATION_SCHEMA_ERROR eng "Bad schema for mysql.ndb_replication table. Message: %-.64s" @@ -6382,3 +6382,13 @@ ER_GRANT_PLUGIN_USER_EXISTS ER_TRUNCATE_ILLEGAL_FK 42000 eng "Cannot truncate a table referenced in a foreign key constraint (%.192s)" + +ER_PLUGIN_IS_PERMANENT + eng "Plugin '%s' is force_plus_permanent and can not be unloaded" + +ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN + eng "The requested value for the heartbeat period is less than 1 millisecond. The value is reset to 0, meaning that heartbeating will effectively be disabled." + +ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX + eng "The requested value for the heartbeat period exceeds the value of `slave_net_timeout' seconds. A sensible value for the period should be less than the timeout." + === modified file 'sql/sql_cache.cc' --- a/sql/sql_cache.cc 2010-10-06 09:01:24 +0000 +++ b/sql/sql_cache.cc 2010-10-08 12:16:20 +0000 @@ -334,6 +334,7 @@ TODO list: #include "tztime.h" // struct Time_zone #include "sql_acl.h" // SELECT_ACL #include "sql_base.h" // TMP_TABLE_KEY_EXTRA +#include "debug_sync.h" // DEBUG_SYNC #ifdef HAVE_QUERY_CACHE #include #include @@ -371,32 +372,6 @@ TODO list: __LINE__,(ulong)(B)));B->query()->unlock_reading();} #define DUMP(C) DBUG_EXECUTE("qcache", {\ (C)->cache_dump(); (C)->queries_dump();(C)->tables_dump();}) - - -/** - Causes the thread to wait in a spin lock for a query kill signal. - This function is used by the test frame work to identify race conditions. - - The signal is caught and ignored and the thread is not killed. -*/ - -static void debug_wait_for_kill(const char *info) -{ - DBUG_ENTER("debug_wait_for_kill"); - const char *prev_info; - THD *thd; - thd= current_thd; - prev_info= thd->proc_info; - thd->proc_info= info; - sql_print_information("%s", info); - while(!thd->killed) - my_sleep(1000); - thd->killed= THD::NOT_KILLED; - sql_print_information("Exit debug_wait_for_kill"); - thd->proc_info= prev_info; - DBUG_VOID_RETURN; -} - #else #define RW_WLOCK(M) mysql_rwlock_wrlock(M) #define RW_RLOCK(M) mysql_rwlock_rdlock(M) @@ -408,6 +383,51 @@ static void debug_wait_for_kill(const ch #define DUMP(C) #endif + +/** + Macro that executes the requested action at a synchronization point + only if the thread has a associated THD session. +*/ +#if defined(ENABLED_DEBUG_SYNC) +#define QC_DEBUG_SYNC(name) \ + do { \ + THD *thd= current_thd; \ + if (thd) \ + DEBUG_SYNC(thd, name); \ + } while (0) +#else +#define QC_DEBUG_SYNC(name) +#endif + + +/** + Thread state to be used when the query cache lock needs to be acquired. + Sets the thread state name in the constructor, resets on destructor. +*/ + +struct Query_cache_wait_state +{ + THD *m_thd; + const char *m_proc_info; + + Query_cache_wait_state(THD *thd, const char *func, + const char *file, unsigned int line) + : m_thd(thd) + { + if (m_thd) + m_proc_info= set_thd_proc_info(m_thd, + "Waiting for query cache lock", + func, file, line); + } + + ~Query_cache_wait_state() + { + if (m_thd) + set_thd_proc_info(m_thd, m_proc_info, NULL, NULL, 0); + } +}; + + /** Serialize access to the query cache. If the lock cannot be granted the thread hangs in a conditional wait which @@ -429,6 +449,8 @@ static void debug_wait_for_kill(const ch bool Query_cache::try_lock(bool use_timeout) { bool interrupt= FALSE; + THD *thd= current_thd; + Query_cache_wait_state wait_state(thd, __func__, __FILE__, __LINE__); DBUG_ENTER("Query_cache::try_lock"); mysql_mutex_lock(&structure_guard_mutex); @@ -438,7 +460,6 @@ bool Query_cache::try_lock(bool use_time { m_cache_lock_status= Query_cache::LOCKED; #ifndef DBUG_OFF - THD *thd= current_thd; if (thd) m_cache_lock_thread_id= thd->thread_id; #endif @@ -497,6 +518,8 @@ bool Query_cache::try_lock(bool use_time void Query_cache::lock_and_suspend(void) { + THD *thd= current_thd; + Query_cache_wait_state wait_state(thd, __func__, __FILE__, __LINE__); DBUG_ENTER("Query_cache::lock_and_suspend"); mysql_mutex_lock(&structure_guard_mutex); @@ -504,7 +527,6 @@ void Query_cache::lock_and_suspend(void) mysql_cond_wait(&COND_cache_status_changed, &structure_guard_mutex); m_cache_lock_status= Query_cache::LOCKED_NO_WAIT; #ifndef DBUG_OFF - THD *thd= current_thd; if (thd) m_cache_lock_thread_id= thd->thread_id; #endif @@ -525,6 +547,8 @@ void Query_cache::lock_and_suspend(void) void Query_cache::lock(void) { + THD *thd= current_thd; + Query_cache_wait_state wait_state(thd, __func__, __FILE__, __LINE__); DBUG_ENTER("Query_cache::lock"); mysql_mutex_lock(&structure_guard_mutex); @@ -532,7 +556,6 @@ void Query_cache::lock(void) mysql_cond_wait(&COND_cache_status_changed, &structure_guard_mutex); m_cache_lock_status= Query_cache::LOCKED; #ifndef DBUG_OFF - THD *thd= current_thd; if (thd) m_cache_lock_thread_id= thd->thread_id; #endif @@ -872,9 +895,7 @@ Query_cache::insert(Query_cache_tls *que if (is_disabled() || query_cache_tls->first_query_block == NULL) DBUG_VOID_RETURN; - DBUG_EXECUTE_IF("wait_in_query_cache_insert", - debug_wait_for_kill("wait_in_query_cache_insert"); ); - + QC_DEBUG_SYNC("wait_in_query_cache_insert"); if (try_lock()) DBUG_VOID_RETURN; @@ -1779,8 +1800,7 @@ void Query_cache::invalidate(THD *thd, T invalidate_table(thd, tables_used); } - DBUG_EXECUTE_IF("wait_after_query_cache_invalidate", - debug_wait_for_kill("wait_after_query_cache_invalidate");); + DEBUG_SYNC(thd, "wait_after_query_cache_invalidate"); DBUG_VOID_RETURN; } @@ -1971,8 +1991,7 @@ void Query_cache::flush() if (is_disabled()) DBUG_VOID_RETURN; - DBUG_EXECUTE_IF("wait_in_query_cache_flush1", - debug_wait_for_kill("wait_in_query_cache_flush1");); + QC_DEBUG_SYNC("wait_in_query_cache_flush1"); lock_and_suspend(); if (query_cache_size > 0) @@ -2312,9 +2331,7 @@ void Query_cache::free_cache() void Query_cache::flush_cache() { - - DBUG_EXECUTE_IF("wait_in_query_cache_flush2", - debug_wait_for_kill("wait_in_query_cache_flush2");); + QC_DEBUG_SYNC("wait_in_query_cache_flush2"); my_hash_reset(&queries); while (queries_blocks != 0) @@ -2760,8 +2777,7 @@ void Query_cache::invalidate_table(THD * void Query_cache::invalidate_table(THD *thd, uchar * key, uint32 key_length) { - DBUG_EXECUTE_IF("wait_in_query_cache_invalidate1", - debug_wait_for_kill("wait_in_query_cache_invalidate1"); ); + DEBUG_SYNC(thd, "wait_in_query_cache_invalidate1"); /* Lock the query cache and queue all invalidation attempts to avoid @@ -2769,9 +2785,7 @@ void Query_cache::invalidate_table(THD * */ lock(); - DBUG_EXECUTE_IF("wait_in_query_cache_invalidate2", - debug_wait_for_kill("wait_in_query_cache_invalidate2"); ); - + DEBUG_SYNC(thd, "wait_in_query_cache_invalidate2"); if (query_cache_size > 0) invalidate_table_internal(thd, key, key_length); @@ -2821,7 +2835,6 @@ Query_cache::invalidate_query_block_list Query_cache_block *query_block= list_root->next->block(); BLOCK_LOCK_WR(query_block); free_query(query_block); - DBUG_EXECUTE_IF("debug_cache_locks", sleep(10);); } } === modified file 'sql/sql_plugin.cc' --- a/sql/sql_plugin.cc 2010-10-04 12:42:16 +0000 +++ b/sql/sql_plugin.cc 2010-10-07 15:52:34 +0000 @@ -42,9 +42,8 @@ extern struct st_mysql_plugin *mysql_man @note The order of the enumeration is critical. @see construct_options */ -static const char *global_plugin_typelib_names[]= - { "OFF", "ON", "FORCE", NULL }; -enum enum_plugin_load_policy {PLUGIN_OFF, PLUGIN_ON, PLUGIN_FORCE}; +const char *global_plugin_typelib_names[]= + { "OFF", "ON", "FORCE", "FORCE_PLUS_PERMANENT", NULL }; static TYPELIB global_plugin_typelib= { array_elements(global_plugin_typelib_names)-1, "", global_plugin_typelib_names, NULL }; @@ -800,6 +799,7 @@ static bool plugin_add(MEM_ROOT *tmp_roo tmp.name.length= name_len; tmp.ref_count= 0; tmp.state= PLUGIN_IS_UNINITIALIZED; + tmp.load_option= PLUGIN_ON; if (test_plugin_options(tmp_root, &tmp, argc, argv)) tmp.state= PLUGIN_IS_DISABLED; @@ -1241,7 +1241,7 @@ int plugin_init(int *argc, char **argv, tmp.name.str= (char *)plugin->name; tmp.name.length= strlen(plugin->name); tmp.state= 0; - tmp.is_mandatory= mandatory; + tmp.load_option= mandatory ? PLUGIN_FORCE : PLUGIN_ON; /* If the performance schema is compiled in, @@ -1260,7 +1260,7 @@ int plugin_init(int *argc, char **argv, to work, by using '--skip-performance-schema' (the plugin) */ if (!my_strcasecmp(&my_charset_latin1, plugin->name, "PERFORMANCE_SCHEMA")) - tmp.is_mandatory= true; + tmp.load_option= PLUGIN_FORCE; free_root(&tmp_root, MYF(MY_MARK_BLOCKS_FREE)); if (test_plugin_options(&tmp_root, &tmp, argc, argv)) @@ -1338,7 +1338,8 @@ int plugin_init(int *argc, char **argv, while ((plugin_ptr= *(--reap))) { mysql_mutex_unlock(&LOCK_plugin); - if (plugin_ptr->is_mandatory) + if (plugin_ptr->load_option == PLUGIN_FORCE || + plugin_ptr->load_option == PLUGIN_FORCE_PLUS_PERMANENT) reaped_mandatory_plugin= TRUE; plugin_deinitialize(plugin_ptr, true); mysql_mutex_lock(&LOCK_plugin); @@ -1848,6 +1849,11 @@ bool mysql_uninstall_plugin(THD *thd, co my_error(ER_SP_DOES_NOT_EXIST, MYF(0), "PLUGIN", name->str); goto err; } + if (plugin->load_option == PLUGIN_FORCE_PLUS_PERMANENT) + { + my_error(ER_PLUGIN_IS_PERMANENT, MYF(0), name->str); + goto err; + } plugin->state= PLUGIN_IS_DELETED; if (plugin->ref_count) @@ -3058,7 +3064,8 @@ static int construct_options(MEM_ROOT *m plugin_dash.length + 1); strxmov(plugin_name_with_prefix_ptr, plugin_dash.str, plugin_name_ptr, NullS); - if (!tmp->is_mandatory) + if (tmp->load_option != PLUGIN_FORCE && + tmp->load_option != PLUGIN_FORCE_PLUS_PERMANENT) { /* support --skip-plugin-foo syntax */ options[0].name= plugin_name_ptr; @@ -3318,7 +3325,7 @@ static int test_plugin_options(MEM_ROOT { struct sys_var_chain chain= { NULL, NULL }; bool disable_plugin; - enum_plugin_load_policy plugin_load_policy= tmp->is_mandatory ? PLUGIN_FORCE : PLUGIN_ON; + enum_plugin_load_option plugin_load_option= tmp->load_option; MEM_ROOT *mem_root= alloc_root_inited(&tmp->mem_root) ? &tmp->mem_root : &plugin_mem_root; @@ -3339,7 +3346,7 @@ static int test_plugin_options(MEM_ROOT */ if (!(my_strcasecmp(&my_charset_latin1, tmp->name.str, "federated") && my_strcasecmp(&my_charset_latin1, tmp->name.str, "ndbcluster"))) - plugin_load_policy= PLUGIN_OFF; + plugin_load_option= PLUGIN_OFF; for (opt= tmp->plugin->system_vars; opt && *opt; opt++) count+= 2; /* --{plugin}-{optname} and --plugin-{plugin}-{optname} */ @@ -3363,8 +3370,9 @@ static int test_plugin_options(MEM_ROOT We adjust the default value to account for the hardcoded exceptions we have set for the federated and ndbcluster storage engines. */ - if (!tmp->is_mandatory) - opts[0].def_value= opts[1].def_value= plugin_load_policy; + if (tmp->load_option != PLUGIN_FORCE && + tmp->load_option != PLUGIN_FORCE_PLUS_PERMANENT) + opts[0].def_value= opts[1].def_value= plugin_load_option; error= handle_options(argc, &argv, opts, NULL); (*argc)++; /* add back one for the program name */ @@ -3379,12 +3387,13 @@ static int test_plugin_options(MEM_ROOT Set plugin loading policy from option value. First element in the option list is always the option value. */ - if (!tmp->is_mandatory) - plugin_load_policy= (enum_plugin_load_policy)*(ulong*)opts[0].value; + if (tmp->load_option != PLUGIN_FORCE && + tmp->load_option != PLUGIN_FORCE_PLUS_PERMANENT) + plugin_load_option= (enum_plugin_load_option) *(ulong*) opts[0].value; } - disable_plugin= (plugin_load_policy == PLUGIN_OFF); - tmp->is_mandatory= (plugin_load_policy == PLUGIN_FORCE); + disable_plugin= (plugin_load_option == PLUGIN_OFF); + tmp->load_option= plugin_load_option; /* If the plugin is disabled it should not be initialized. === modified file 'sql/sql_plugin.h' --- a/sql/sql_plugin.h 2010-07-08 21:20:08 +0000 +++ b/sql/sql_plugin.h 2010-09-27 12:55:09 +0000 @@ -32,6 +32,9 @@ class sys_var; enum SHOW_COMP_OPTION { SHOW_OPTION_YES, SHOW_OPTION_NO, SHOW_OPTION_DISABLED}; +enum enum_plugin_load_option { PLUGIN_OFF, PLUGIN_ON, PLUGIN_FORCE, + PLUGIN_FORCE_PLUS_PERMANENT }; +extern const char *global_plugin_typelib_names[]; #include @@ -95,7 +98,7 @@ struct st_plugin_int void *data; /* plugin type specific, e.g. handlerton */ MEM_ROOT mem_root; /* memory for dynamic plugin structures */ sys_var *system_vars; /* server variables for this plugin */ - bool is_mandatory; /* If true then plugin must not fail to load */ + enum enum_plugin_load_option load_option; /* OFF, ON, FORCE, F+PERMANENT */ }; @@ -110,6 +113,7 @@ typedef struct st_plugin_int *plugin_ref #define plugin_data(pi,cast) ((cast)((pi)->data)) #define plugin_name(pi) (&((pi)->name)) #define plugin_state(pi) ((pi)->state) +#define plugin_load_option(pi) ((pi)->load_option) #define plugin_equals(p1,p2) ((p1) == (p2)) #else typedef struct st_plugin_int **plugin_ref; @@ -118,6 +122,7 @@ typedef struct st_plugin_int **plugin_re #define plugin_data(pi,cast) ((cast)((pi)[0]->data)) #define plugin_name(pi) (&((pi)[0]->name)) #define plugin_state(pi) ((pi)[0]->state) +#define plugin_load_option(pi) ((pi)[0]->load_option) #define plugin_equals(p1,p2) ((p1) && (p2) && (p1)[0] == (p2)[0]) #endif === modified file 'sql/sql_show.cc' --- a/sql/sql_show.cc 2010-10-06 14:34:28 +0000 +++ b/sql/sql_show.cc 2010-10-07 15:52:34 +0000 @@ -211,6 +211,11 @@ static my_bool show_plugins(THD *thd, pl } table->field[9]->set_notnull(); + table->field[10]->store( + global_plugin_typelib_names[plugin_load_option(plugin)], + strlen(global_plugin_typelib_names[plugin_load_option(plugin)]), + cs); + return schema_table_store_record(thd, table); } @@ -7214,6 +7219,7 @@ ST_FIELD_INFO plugin_fields_info[]= {"PLUGIN_AUTHOR", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 1, 0, SKIP_OPEN_TABLE}, {"PLUGIN_DESCRIPTION", 65535, MYSQL_TYPE_STRING, 0, 1, 0, SKIP_OPEN_TABLE}, {"PLUGIN_LICENSE", 80, MYSQL_TYPE_STRING, 0, 1, "License", SKIP_OPEN_TABLE}, + {"LOAD_OPTION", 64, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}, {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE} }; === modified file 'sql/sql_yacc.yy' --- a/sql/sql_yacc.yy 2010-10-06 14:34:28 +0000 +++ b/sql/sql_yacc.yy 2010-10-07 23:34:59 +0000 @@ -1933,35 +1933,28 @@ master_def: | MASTER_HEARTBEAT_PERIOD_SYM EQ NUM_literal { Lex->mi.heartbeat_period= (float) $3->val_real(); - if (Lex->mi.heartbeat_period > SLAVE_MAX_HEARTBEAT_PERIOD || - Lex->mi.heartbeat_period < 0.0) - { - const char format[]= "%d seconds"; - char buf[4*sizeof(SLAVE_MAX_HEARTBEAT_PERIOD) + sizeof(format)]; - sprintf(buf, format, SLAVE_MAX_HEARTBEAT_PERIOD); - my_error(ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE, - MYF(0), " is negative or exceeds the maximum ", buf); - MYSQL_YYABORT; + if (Lex->mi.heartbeat_period > SLAVE_MAX_HEARTBEAT_PERIOD || + Lex->mi.heartbeat_period < 0.0) + { + const char format[]= "%d"; + char buf[4*sizeof(SLAVE_MAX_HEARTBEAT_PERIOD) + sizeof(format)]; + sprintf(buf, format, SLAVE_MAX_HEARTBEAT_PERIOD); + my_error(ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE, MYF(0), buf); + MYSQL_YYABORT; } if (Lex->mi.heartbeat_period > slave_net_timeout) { push_warning_printf(YYTHD, MYSQL_ERROR::WARN_LEVEL_WARN, - ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE, - ER(ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE), - " exceeds the value of `slave_net_timeout' sec.", - " A sensible value for the period should be" - " less than the timeout."); + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX, + ER(ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX)); } if (Lex->mi.heartbeat_period < 0.001) { if (Lex->mi.heartbeat_period != 0.0) { push_warning_printf(YYTHD, MYSQL_ERROR::WARN_LEVEL_WARN, - ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE, - ER(ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE), - " is less than 1 msec.", - " The period is reset to zero which means" - " no heartbeats will be sending"); + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN, + ER(ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN)); Lex->mi.heartbeat_period= 0.0; } Lex->mi.heartbeat_opt= LEX_MASTER_INFO::LEX_MI_DISABLE; === modified file 'sql/sys_vars.cc' --- a/sql/sys_vars.cc 2010-09-20 14:17:32 +0000 +++ b/sql/sys_vars.cc 2010-10-08 12:22:22 +0000 @@ -2014,15 +2014,6 @@ static Sys_var_ulong Sys_thread_cache_si GLOBAL_VAR(thread_cache_size), CMD_LINE(REQUIRED_ARG), VALID_RANGE(0, 16384), DEFAULT(0), BLOCK_SIZE(1)); -#if HAVE_POOL_OF_THREADS == 1 -static Sys_var_ulong Sys_thread_pool_size( - "thread_pool_size", - "How many threads we should create to handle query requests in " - "case of 'thread_handling=pool-of-threads'", - GLOBAL_VAR(thread_pool_size), CMD_LINE(REQUIRED_ARG), - VALID_RANGE(1, 16384), DEFAULT(20), BLOCK_SIZE(0)); -#endif - /** Can't change the 'next' tx_isolation if we are already in a transaction. @@ -2943,11 +2934,8 @@ static bool fix_slave_net_timeout(sys_va (active_mi? active_mi->heartbeat_period : 0.0))); if (active_mi && slave_net_timeout < active_mi->heartbeat_period) push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, - ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE, - "The current value for master_heartbeat_period" - " exceeds the new value of `slave_net_timeout' sec." - " A sensible value for the period should be" - " less than the timeout."); + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX, + ER(ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX)); mysql_mutex_unlock(&LOCK_active_mi); return false; } === modified file 'sql/sys_vars.h' --- a/sql/sys_vars.h 2010-10-04 12:42:16 +0000 +++ b/sql/sys_vars.h 2010-10-08 00:53:00 +0000 @@ -458,12 +458,10 @@ class Sys_var_proxy_user: public sys_var public: Sys_var_proxy_user(const char *name_arg, const char *comment, enum charset_enum is_os_charset_arg) - : sys_var(&all_sys_vars, name_arg, comment, + : sys_var(&all_sys_vars, name_arg, comment, sys_var::READONLY+sys_var::ONLY_SESSION, 0, -1, - NO_ARG, SHOW_CHAR, (intptr)NULL, - 0, VARIABLE_NOT_IN_BINLOG, - 0, 0, - 0, 0, PARSE_NORMAL) + NO_ARG, SHOW_CHAR, 0, NULL, VARIABLE_NOT_IN_BINLOG, + NULL, NULL, 0, NULL, PARSE_NORMAL) { is_os_charset= is_os_charset_arg == IN_FS_CHARSET; option.var_type= GET_STR; === modified file 'storage/innobase/include/ibuf0ibuf.h' --- a/storage/innobase/include/ibuf0ibuf.h 2010-06-22 15:58:28 +0000 +++ b/storage/innobase/include/ibuf0ibuf.h 2010-10-08 14:52:39 +0000 @@ -43,7 +43,7 @@ typedef enum { IBUF_OP_DELETE = 2, /* Number of different operation types. */ - IBUF_OP_COUNT = 3, + IBUF_OP_COUNT = 3 } ibuf_op_t; /** Combinations of operations that can be buffered. Because the enum === modified file 'storage/innobase/include/row0row.h' --- a/storage/innobase/include/row0row.h 2010-06-22 15:58:28 +0000 +++ b/storage/innobase/include/row0row.h 2010-10-08 14:52:39 +0000 @@ -267,7 +267,7 @@ enum row_search_result { secondary index leaf page was not in the buffer pool, and the operation was enqueued in the insert/delete buffer */ - ROW_NOT_DELETED_REF, /*!< BTR_DELETE was specified, and + ROW_NOT_DELETED_REF /*!< BTR_DELETE was specified, and row_purge_poss_sec() failed */ }; === modified file 'strings/my_vsnprintf.c' --- a/strings/my_vsnprintf.c 2010-09-15 11:33:22 +0000 +++ b/strings/my_vsnprintf.c 2010-10-08 14:52:39 +0000 @@ -513,7 +513,7 @@ start: arg_count= max(arg_count, arg_index); goto start; } - DBUG_ASSERT(0); + return 0; } --===============1552169265== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/dmitry.lenev@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: dmitry.lenev@stripped # target_branch: file:///home/dlenev/src/bzr/mysql-5.5-rt-mrg/ # testament_sha1: 54a159192049e413fc1e8ce956e2279cd2d76084 # timestamp: 2010-10-08 20:38:45 +0400 # source_branch: bzr+ssh://dlenev@stripped/bzrroot\ # /server/mysql-5.5-bugteam/ # base_revision_id: dmitry.lenev@stripped\ # 3tmmh2kayc229act # # Begin bundle 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 --===============1552169265==--