From: Dmitry Lenev Date: October 8 2010 4:35pm Subject: bzr commit into mysql-5.5-runtime branch (Dmitry.Lenev:3160) List-Archive: http://lists.mysql.com/commits/120404 Message-Id: <20101008163635.7023AE58DC@mockturtle> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1939413964==" --===============1939413964== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/dlenev/src/bzr/mysql-5.5-rt-mrg/ based on revid:dmitry.lenev@stripped 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 === 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; } --===============1939413964== 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:36:35 +0400 # source_branch: bzr+ssh://dlenev@stripped/bzrroot\ # /server/mysql-5.5-bugteam/ # base_revision_id: dmitry.lenev@stripped\ # 3tmmh2kayc229act # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWSL2130ASXb/gHZ+Rn////// /+///v////9gal6c9Mr0e7deZwZ3mfcYV98AAPngcofPt2t3Wu1slvr3Fp9jTSfDRqX3N6+nc9Ud 9GvlCLZh9u+efXyvsC1qaPrU+XlxmwCTbnc5atAHx53Uk9BLPXk56NrK0JxtUCjved6r0B77urt8 +PAA7dwAcj2977avX33wPAj5d3QlLWipTt0U67aL7vg+es2+DXlneoVNXWcJFx3u7Hd4l7euh15c c9s4GXO1V109F6itGzwDuKe9zbd2bMzoGodTddattptdYLW67Lul3A5zVtWW001VDJ1GwbmbqMax 9fXPT52yittb75h0T22g+hdNQGybW9ZICSQQACaZAJiaAEmaCp6PSZGSnqemITTaQ9TTT09UD9TJ G1MCUEABCCJoEmNNKMmamoHqAAyAAAAaAADQNMgEolMmjU3pMSek0yZDQ0aAAAAAAAAAAAk0ohBA U9MgwSp+VPZT1NJ4Eh6j1M1Gg0Bp6hp6Q0aAADICKQgRpoE0yNNA0BqZNE9KntCn6mj0QTJp6po2 ieieoaaYIDT9KCKIIBAE00JoozCT0gym0mKG1B6npqND1A9TQAAPUDQ3drfQkSUP7RgTghAEoQTf wyf6/b+j+AB7j/Q/V9qy/YqLf0/uJJJ4jMzMzM1nyZv78qKJfmfrv/eUKf2Dl8WX2M3zj/8gEPs/ 0d8cfy4v/fDl+VOJbW/wb9sznGTrppbP/x/6g1lEz65A/t5EOvmer18I83skesbAifpUXiUQnFRk uPRRlzs7H1mZh3Sfcn3Pgd2HoH8FKB5aCpw8Q4DuFCDuPbowmVTQ5br4OmJFomiYVC2nZt34L7b4 7Z3JbQR9whu5EdO5EiZCBGALt+p0keOWsxz0iPJwSRZAt1pbCGAclhp1x3vO89xoIpm9b+v8a/l5 PQcFjV7BuX4Zn8KSfWdpV/DyfaTfyJ7f87RuvVCovJaK/83t/9OwvOZRob+RQWjewmHGm0j7pp4O PSJMWEmuW+Zc5yTk7T3/d+KIJXrvVGTtYcu5kQ9VIqva2Kqs2cp9jg9OWmdH8fHu7///7e+DyaW8 fPJTPw3MPic7aHwD+xw0D3jfNuP8KwIkqxPTNuW2cKSeFGGVVGx7UcT1iyUT9P+intYO2Vfumhp/ F/CT5sScv42cqCwrrhNgF1Lwto+3Z8o8c7bZff1TKM14znOBi1HFk1o5mIc8IarekkJ7cIYXPCF9 967Jgw9zgpK3VvcfzVEuLRbZ4ue5vPRQffTE+OL425vs+Hw0S5kCfVGeBWIlCrdFo6Ks27xLJ4rS qk7aTIlX391uYnMDVj4DAfkRHOQg6Wxx4QSnUuB9vyXZQ15ibThizWspGuC159LGiIZv7eJF5HWw OudWPW4aFA0fnGDRMYLDjjgwooxRUCMf3lgg65HfWTAElmeXVy56b8ZB99liEBiyAzZCKmJlnoYE 9CENUO5Cr30gaMBTLJN2bFJs172TNLBSYQ3IZd6GUUga7ppKs5zIR71VbSJE545hmjIk8nUyCIgJ f9R+v3fow0lmpdYDUbG+ssvQqcKcxWJQeVWbqjEqCrJXRXIRRJZ97/iqulPh6QiDx3nkQHddLE4L zzS725WwVmTGjDaw4+2MyMgOaoKN1UckkESNOERTjB3WAZbovgjmcUoW6eI4Dhm7L2a4ZkTMSZrV WzI2IiLjaiQTsZl5WKLjLzAnqpWZxPJkwhU6+8t7mtqeKBzp6cxJFcGPpv34ON3Y22zg0eXnPp+j HPAmTj9N9paxRRRgxYsWLFixYsWLGDFixYsWTD/FLmPkJnfNq6mNOBe/DRg8sdM+WWDyLT/kzgLQ wcn0z9fkaLtv29qK+pCKlXMSFAHYAFgELxhCjwIc3iy7oSc6wmcweGkJmXMEXWBua4v0G+LuKHwx IpTUPnpvDYOydU3FjK1+SeeeQAm5CT9JJeKBRYkiiyQWSOQ++f0Znfzd9mffWkuFM4HhBdIIqI2S 4bxWU7AHrpY9JbNFBKUgM6GnWPPU4VDXxCQHzLIHUNbhB6IN4sHkZUnf6mkYtxCx/oaRfBmRgoSz eV/5voDF7gdaitn+sB7N4joEjY27B5t4HAowlI0SFft4+0ITgSQ7TmSALBSWSCMgsBSIkgsFIpBS MRQFBYLBSKKRVkUFBQUEYKqgIgqrFWCiqisigKAshFIezv6BbEf32TCj9gArmSElR5HrIzevFvd7 oDNHfVQI7MEcgGyQWCVFgiKxGCiqwYKqLqSHzD89J7bMx4bXCxkX/WqrqKToyMQk7rtW2+7hlgoQ yVRHlvkxy1JJBOgjRqCzpsA3jtrJ8icQotjIS4NK7CMqXKwo5DIQOmiYwin48Wm4WMcd7Q4sIURh pTEAORDqjdoSReoScNnC9cTkjlrSFSc6RPc7BrMBnLcBuYM4QeOT183icaVQQBBARcishxHZdPAk 9CL5D1YW0HqaqgpZw4FMoK2H2pcWXNa7zU3GUssKy3TqQII3pkcbnN8RHUv2CnpDjyew9YQ6Supb DzFtBNBot1eHGvWy8iiCY2U40g0oLwgiNPG5V5kbMRJ3G2Am4DWlBycRgU9Tr4MQeAjgK0wSQHKS 0jQWc1q4zRR0Y8ngQ77YhBaOKDRXEYGP1Eocy368XKqYHXpmmxO37IcDTuK0F1Lnj9edZJQkPVyS ydSQ8a6BZzIxdSjHAL66nu3tZWwOXybQUyXFhIrFhqXcBNgQmYFw5JA4YFGiDjQyOkxJD0cdOU6d 5eTBsrCHc1bueJbgMvXFp46WcdzJ2ysE3I3VFUZWylp25vaeibB1EjoODvCmvr9RO/wxSCsK76PV uLDgjv6kkc4/UH8HIGUO3svPgHrATNB8kuy/vKW+3HyNP1TCLeAnCQZh4yfJykunmdqZ3M8T/ebZ J9jXfI8ICxwEen4I7w1fpKFrJRMdfddn+ceHRbtBRVc8gM2r4Ue0ofJIyJqsSdQiQHT/Igv3tBpG RiaB3U0djnH8X/4aNBQqyhHNzwi5dwuBCEA2VaxKaA3I6hhwEfuaovrDT9FjzaYOA/AzBgiGA2vI EyTObmYCteZhKKBoF0DIAeTx7Alzcc3wuDhaqwsVDIH4IJ+a3jD++M9SJ5GoSnABSKEkHpCcIiuk lP2CREE/di0Au9f2RiL14VZQq0/XexqhFVF0fNZv/L2byW6asoGr91Qa0VoTiJSOp+4Vi+/M6K3A oc6zHJlSESCUsyaTSogUDNSJdEGkMJ2X40CsJH3ClE+hhPEIK6vpveR3lT+kMwMMx9DgCdIZfpJs QY0ExBMf/BZCRAVZCO6cugxqIjD65EhGpiaEgXrUHCih80Wxb1QnJD5r/IqFAJkH8YjbMvEF4oUO fY3ykI3L2CIStNYqguvH5GxXG/rSYQgrB3aJSBQzipAGJU8t2tUHbk5dtzaPh4YB8nDn1Np2/EIj ERiqCMVWvekqRZMXsqIhtBW14EvKTTuK53tZ2GmzRIEsXwR+aI49tcpXqsnsnU9WrJ5RByQspkch 2c8ERBEKbtOUzNLeZujTu7+vBvTkgwl6Nj50yKBaypZVMyoJd9BJxfPTOlJKjXyqI9ESVtdPYab8 j5JwXTZ2BBFZO3g4E0PhWVU7DSV1GmLxuQ6DOUPLMal6mSdVJIIMoIqb+NQoWh4dcko8pMa3gZ4j 1E6QhO8ngREREEEE69/HJOpQByV91iTY29Y4H6kmL3NLlDSt6YUHxgQ5RQY2B6zUmEVUmpSMauR0 SASsKKh5WVoKlyuXvOaKF3S2JE5n6gp6o7f80cCpH33iLG5CuKyQqG2/TspxjjuyfVIrLynicpEW MTDBU4RzZvybpAfHTAtWPjcP7gn0GP3hRgiIcXE+a14NaHDzeAhWOQzIVhmb3ImhkYBkP0zFs/SN NbYhR7U9xbzjLbLFUvW1Kphuxz0uj9F2pjKmNmw3wgisYcLDgKkXnSiCYgImaPa1Z/it7FD6YQcO 6DISfDYiZkgnPpOiFI/g3Z/nICoOkWvyBsI7rZaYZxJSZMjPxrbSzjHnAe6A+qvXyEcMpvpbUs1I 67/7DbBUuKzsWoQRjuMzzK4lJdFyes63L/1KHekY+07e5dn6ktuzH9JY/vw2g5mcDUbRWNN5ky3g 5ozuvXc5G5/k89WSZjjorYdz5ev5/T5SfN/NmiYPhVGhMyq+HU5M4ouFVQ8v7GO9hTPTweoOnQDr bZHI7N9Lvqu/YUi6FCcSjt6cQiEVdRKenFsEIZPQ+wrVQwDznN5cU63Djjd51aaZ6y445EzVYUZ2 VYDNypByD+qAmPC/26rXwfvd3s3t2sR/Gd5/e8f329VxzjUj8967lVqD1hHxGUvLvbK+nxY/QeVr 8fniliXtDGcGLt76Ler6pKL1pjmNMbl+ZPxCGDkVe58vX+T+H9Fvb+H60+KSEnDivWNqXubgtxi+ jAsRERrmhSzgY698cevlzx3y5ct+bo3y8+nSvpfNwX2shffrBA5AARkEUSCwCAh9S0hbSxGfvIwQ ViqqqqoqoqjEfURIfQD/MgZIzIISgJ9Z3EiYhreMCGSqLUfZ/QJ4nnyk+WpCj41HQY+ohOHgA4cM hSzzCG+1Q297hENAMq07cbwqk8ypxeDCmKT6ftZv0ThZEgpdS+pXD/c5xMwS0xrD+2OhMsyOl5+j OgeewmKamglldum6TmjZ9xnz7jo8T/xMc+fVr94vHk0HXGj7It1MrHEsr/pkmITcvmV78K0/8Acr FDk+nJjs+R9f9f1NKa5D8RmTH4zCUpY9etGwaj48PsmHCb+SceXLp1dOHm/Eo7TeZXLS+y/i6jw6 X8IG9ZJGz0l76RKIiP6YCWI65gf83uSMaf0X89nx6fW3b5x83cXpwtxxpD2U8Xe913E/OUxr8WLf 5x3TVLUelZqfO6YtjbJmu4WkOzHTK/lGx+yRzNClDW+N5Hs2+3vsk3JdrN2MPEzh580iZ1n7YUO4 QYWIWFIKhxDpA6vnTf9/z++f3QRGmJ0q4ywqChQqMCph/L9gw4XwmZvf2AZhCPiEAb3Ig6C0ICE8 0wQo/hqFWgftCEK+t2Qbt5B9RuP6xoignmhpX9I9zwk+YWUKB+d8mdA7gWPeQJiwmkxi+B+0DRlz oBfC6FB+nnwfzjYa+vwgOOB8wdCZxpyF0QOr8NAjn1Z7DBgWbJdDTrmUDfj2Lge3uBgUADx7iTgE O5TuSLzuSc6CdDcPkfjCNECqHvDohz6Dom9NyDgg5J06ECW2UxkLPMOSjCHFH7xADfsTIF+qoNBU uXAXMiZj96HWg3kwzFriVoGhZOFeJSzvI77IYGYt3mc3o1DNwLv0oMBnUJgEBCGw4BmGnSaNYubB cWbS3jCYAwP5t417Q0ulcgpyo3BqOXGG5cqElcbX31cQDNq0TASD1M+Pf3VrSPAIKsym6BeB4p8X pY/jKOSXIZ0y5nggM0qor0xLDt8FUI73e86eF3ENebSSv1LVrfTCV8dbTV6vXThPgPqqNLoszRi+ KSLYlNT4LY+6Nt0U7rVuv9acWQSQhr9TcAYctW3NOmLnX+0R3uBdKpRulkoETatbUwylPFxghLFl olY2EggKApIRJGWEEiMKkgyKsoQiyTBASMPwPJWTD0xj31Z9e+sVqgLjW2ZVpCQKOEHBOBnjCYIb GcY0si4iBzQ9XD1DINRyiQKQB+MqPQOEGE0Pdrz3kUbtyzUIva0/tzAsqGVRwag9EwxK6JMD08qg 9oxkBGtJMGdQvyC+rv+bN/0vy/k9ZgIT5znPP0ltlttpbZbbaHZ05yuZbftenw2855fPtv321bLb LaTPYZzmFtC2222uhuzYtD3HWQk489IeiQK6+UTiGx2ty/G/mewxj2fZH4r1Y6Ot43o595zwevf0 EtoW2W3OQLnNnTm/ZbueTnu4hoT99AzL+v3PXEukvXt9vbE2XqR7PoBmZmwk2dmSG9hFDbSgGlsm XLNEIcGAOtJlhFMMA4JDLJDCGmboyapohwYErBZskA1ZOF0rAno+DeZDJryfTKpCaDr4hN1KI7xc aOuOsbpq7r/utFMjLKoSpcixvrFuU/MkFyITL1hrBkEyAsIQiWQ/EQvt6c95kDkpfMHoYmxVuhCw QIAVmVSAYRANJkhBgEDBN48R3a8dNWWE0JzCAyKhoVxNP4hitbYXrcahYS6xggkRigQFhBYSAwSQ IkEUwRCJRCSiELSHFyA4ZVB30xxz67ZrhqRKREsjIFx7Aj0Ho4Xml/siVHRM1aqrWtQiESMQoQiY qdxnQOw1BKRvQrAsVksys2pOhfZuiGKErYkDvgAXLVLs/m6UOR/+7fpAKia1codZTZPuwEInMwSH Yeh2556n8whDmFC52N5jk38oUWhIsoIwHIrAJyOdN0jRcpyBFAmNOjX6InkuxE+4MqNB3QGglxRE spdiCA3ApHVJEWPoiJ0SH4LnYyMQKFzAa5YXjfQ3G40kKxZGZGVJkATJgCcUIlVpJkTG1dCbXThk SaZxYrNMLYgMIQDosIqUYQwgF5nHdS0a7ZUyTMNxsZGWpjc0NNdKya65rrW0REpuDWWSayipDLII wCLHUrENoIcySbkNQwXITEtBISUEOAUK6mCORWQwFqWRCgVsak7izXDAtcMzebW1QNwiZQAGukpu IQcEJ3aoOECI/t/9dSBamapIYzfBkrIhWrm+L72SEdh6D2MB0PIY0F5tR64g3To5Po4NlC+CxMnx ErkjYgUmSNPOMyeyA08yiP9qBQpmU0BGQEmatMEblrUlNyZOYxgkQwfACh9USSFUD+EPxYO0SLuA aXJ6OHrKlgXoIosMzjgChDgsMzeOZT0M/DTO9TvmrhgXriAGEICbWK1montIIBc06uShc0RN2d+T TQ3AzRhhuhSHskMdAmkNVZ0umYN2AulfEwgglnNBPVNh6C2mlE9jjk4zwlBF5xccUJYQRwksiBAL DGZJCh7GRP5opsghbZfQ+tRAI4f3mMWUVVFJH1P7WcidbNuDt+HSBtFSCY5kEhcw4k2lr9EB5i8e KFtaXhchQkQKKlpAoCb7KIfzLA1yZNjbIIE7d/Qi8TJd8gKLaKApUXkTfLWmZNPSSVPHV0JUhBlC 627oIF07dBUVmA4a1Aut57q72mYHFuqfFRtQEHpPwcaMAgDlIBEr5+hB+2c1mScuC1oSIm2C6RtM J0CEEBMUC6pQMdVL2K84ncTnRCqtukVyePuMYBAfYPA1qcdeTw0OotBLkoRFQaDxgHHRixmYE1I4 CIA47zARyVGEaDX5QEvaBCRakcVN3gL34evoZne/Iq8LS/nJiNrPjOaVliveE5reOqy1iuMzg7W3 azPXFo5pid5xQEYqMPky5xqfLXY0lKEYKpgA60PRFJ3LiDjMMvKJFArAgqKrDMXXCigEx4JowMBJ OmZani50PYo1xT2xCFtKkJS0HKBmrRQNbEQEieJtaLADc1UxJL2bDFloZBKFcLM9wMNmomSt6lB9 ZlMVWkxbMER7GRIr+xAtaBZVVaulhS2kcLYerjIPLhmXJhOfjQueAp1OWle96YRgLqVghaYJYYDI pJUE+b9dFj3Fb2Kqp1BWkr1hJmmYGtntLKvbd2rcXXPgLi8whDyOWJEDSAUj706SZUp/4AWZ0aPV GLjqoKvTww6WEJfEVRNMMBQYFi0or7hyPowQsyQ7zfIqeZeSWSeRGllcezeBkBlIYVmA82W0kWwf FtFiTxGiTTq+RkGCCWjl3EO+n7DMQXaIt1MqHuX4EEzHHPZP08fFIW7MVGc9ZQOX8e80k8pULGtp GUgaxOZeCJBVU9UEBSqxqDeSw3b6yPd4OjcCpkankZQ54EwE6kxiBNH3+X3yitE7AhPX4zwWIqoq /S+ywG/XaikSH2ESvI/Zu1pwFodj5/O0pY9iUpnMC0nRkSGwY+kBSIOsSRdOp6ysYaey7hiRxzUq RgIn4dDkiQw5NJnI+Puv+bwW4Wz45RJBpdF2gYpa144sKC0oOPOTrkEfRKhcdnJztwhlrjigm0Cb 3xkHkLr7hmjNojLzQo01jxbGemGYMOdd2BlsAWGlB/aEGHkQCaLluwoBGxRN+jGdAImk0Dcrs4mT 1N9Etg5Gbx61MhnAXnaSiL5+R1ByMwvNZLRoWgvyKKKWTMUjhjxKqEG4jnzDmlUk4tgaBUOlOMV3 1L2jmL7zmAdWAcEILQKEhXDsfqCyqqZ55XMJCciRAwF5WRBNJIzo9fKuUutrJoqAkxEbfqtLIcDt wbVDBj31IqaMvM8SmQgTYH38cyS3v7vQs0zJF6ayoUES/BonAQWMglmwwyNgdkCKo06GqAoPbZgu XK2QMEaIFj4DQgAVZ8SkODWB9rZJ6HSBTY4Y7abt+7bhG0YKSKUpsPhOk0GluJLxOVqGUs5q0V2d iLaZ2j4dDA6mBjKktBPeTTaOiRoI+gUg+wwK0oBm6zBoBXLCyCBpB4s8ETA/ZrD0VeDpByvuls8n oc0AjiOraYrDiCzlKR/ENxibajzqAKgyFy5GCgIvqtfUGiLE6F16N7mMeTJ92LRol5QFHV/RlrEg 8HJKnCnf0Tx9Gv9veZM4s+BbE3e4eVPLci+px1SibgdWVsqARKZKCCI8iRK/kOiWVTCo640fLXn0 GK19s89/eBQQhLI52CaBykY9AlZBFEIBcmdh6C8MiI6gQ79I53Jec1ibZaibrDovsPSugJHAOXfe ROTHB3glHiUIIfKzypmUQjBxzUkkCfyTjUfJtTnO/yEqJRIaclMiys1ai+m2DUl2iohUdwR1VMSW zMxWZlBEqInvD3QQY3aJiUcbbdcFSCKGu4xKoyEh1n25JkSZIuQOOT7EToPvQmeEwXONPz1xvJ4q dV94WOTxe0l7ZHxKXpcF4psHuChLvQ4nB92CEDgA+zev2o/Y6O/7gxViQfBagugbxHaHML+KSeRD ebDj10cHah+vZHxmgDHeU7Dqp7qNjuFYUY6XDnmhNToXO09HQhjgcoYUK3IN3UTakYOVpfNOi8Ja 8dx50mTn7HyBqbQNBLz6Uooqx/OVMpIVBRUunInA3oyqcfnypv1DLIpGgudQf8xneuMYc6DnAlYh A1fZXHQqhpSDcWaB8+OpR0siEt9LaDRpM7i+U6ylBC4hRdegmVh1yKdK4oCBWfRNXffYgsrKryws hc7E8KcITxETLrDVaSGjsuPhrzUlsb9VOcTO9O0NDpjO3sOfVKzsUoHUzJrB2CplYgt1dRgB+uIF E8Uxx6eO0hDOJIqqHYdHRORFQ2LTqE1ItMyrIdijyMMKBiVpva8omAjtUzFRvohaVKYVrXd1YokR EkOiZLsXCBFHrBBEdgySiMHuETmkwvpvqxxMC0wuYwlrVAx6RPkJ26OyTyficXL+s3L1dmy2/iYI LzklyUja1pRO8ySLwe4Q4RzzvNv1hn3BnUcu225ZZzOySAFlIWMlFMHIEQcIHoo3ad7dCjnro4FL JUloUmfBU7RzUkUhGdeSwb0IhzHNfE2VWv1GAsZ0sKQ5DwPg2bNbcSiKGEWC8oiMMQ5NIj1G+Hpz buizMdyNtlhyBkkP0R1slRotxwdpQotFimWCYC5FwKLxruYikh1sLoeAIcpR3ciXFFKGEkUYcu/B qLEibnEy564MVpuxhaEz9pCCIfpT5B6SDtZndKbId06JmDslYk4j17RlR7GSUa9VRiKys0GTu0tS hqPEXpdYbSbu3q99ipam9DwDBvLl4gu2ryvajnRvDQj3I9A6zM1PkhuTYvklHemIM7U4si0ecGy2 QZshIei8T+YF2Hve1Ptx7aCmnSUTJy6uzWBWKC7r6XKOxlNzloKeVFce6pUuKKO5adCIkZGmhsQM bieNBwN4XxpPEsPV8wREyLFWMJOCQB8eCCkCLLjW1AhKteD7vu+c/rKlTTIFwuM/M3QEHHrchLhJ yBxXNSapXYO0XFzEWHwfi9D7osiGprUupKSsWtwW5XBEVoQgSZi46SO/eZIyvB3MdsohvbCK2ooD MCR1toArRnDCubePJ+1BJohqCQyXaWmONExsQUDhwdyNLZKE7aWFhse8nTYQyWUkUDiOBOQQnyyD 8y+99Pjqrn1lfhiietpmleyncYDpvBA7R0IZ4TjiZZAoS2y3MXPtE3+2wczdRn+KMwi8HxSnyXao ivdxyKpDbR9fB4PXkjvnqr19Tvp9SZbjCQl0J4cEPODy5cCysqdU67ED37NEOyiMbaqexuoRgZUU 7Ls8xRFLUYY+uqk4tc9Ha1+8Yys1d/Lts8GTsdj1PB5I+RBdVWEwVRUEZlOaaNnx4PHo+KmOUbrj R3OtFMoyURzpe42GFagvosu3HcUJFzMbREgxfRUjZn4W6lCtSvUl/ZUF7yUc65QHmEc+S73vaiyO S8iRFBlM+GpZgQLIMKH1+CxDcg/khiBqPFFDbDhko2NXl47Bqd8+JkYeERxPdo3hI0CM2kVN5mUX 6gqgat7IEgPB+CcSyt0nDlkuUjglPEAiRMBhp8XGJaQj5CW5WVpSVvL3GNZpidB7pMvBQkbGYtL0 nEB6nLsHlEhbhNRDBMlkkHmAeVjZV1LnStGxNWUkXBmSoPM4g1IVoF2j2N5Imxcs537cXw8W7WgW 6egoVPg6ieEI7ZXszQkFBiLgldI2pYkCUhnbCsCjYg5w7aaRAmRcB5eJPLqxYiHutMmLBh3ImX6K i+0IxuD2yQUii4KOVfo6UYe3Nk5kB23TwtaV7uY6Sw5qWaxia546gZb6IyQjaAo1LmwNUUwn517C WGJ5guOF79aM8QiQzJOOQ4dAYAg2i1rPar+n8opCgBYVxSqsxaI/3onV+6IyouGkxsgdiGhyEH29 nh2IwiQubqi0yJO+WuOCm80FiqsYwX5RO08CPKaVaGoDGD15PJFD8kCfFiiR/JAU40CcbF2oUFdf 0olzv6RwEXgSpQRCCntY48yx4UOe1MYG9EQN1wTOvinrx2ZoOqF6Dz9juQoLavSfkQTgbEwjhZbG So+pgxSNLA17k5x3Jz03JM4W3b2vexFZYWCDnvfTec6hv9eYDzbHTvgLW0mHjBPTwoeQW2kYtuTM DMmZM82LgPDv6kE5hbSthc6IJ1qg5xSMU0ZOULDnAbz4N3+N07nMAql+JbyrVsgXNmxOTFiwpqKH 5OlEf8opc0vp68bYsSmanuGaaQwA1nFs7k0EzChfKTVlNKhVpE5AZZTVmxMZgYoeRz25UgWOsx3M jxA9CtOHquUy7wRcFYArwqVK6TbtGhnUMTfJYy76lTSQ8GxogYCksDkA/cMcPWdxKhJUE6ZIx+X4 odIVSZ8EKGzozQPA6fYiS7l59JhzsSIy6MFiB6DFSBArI5LULlTaFLAtiUKwoMQLMTYBbn7Z9ku5 O3gdWMp33K+KkKHBITZccU3gxUq+ORalSYIq705ifN+bmB7PBamYcT6yArrMBjKH2C8aI9x7IfN1 F9Bfb07b856UJPHv40MYJjGEV59eCOO7wiLchsNXlEh6BF96jEYNvA8yHAtCbU4MelRUTNyuWjMu QDMRVuHsT0QHhMMIA6jbYSB0mCTL1grgdpi+0GvSPjHjGIX9SPwSWCRc5wMdZs/uKY3pJuto9iDs Q7CpBNO2nBSbS5QZsi13FaYVXnFKcDh0FrvjQgXDMZiBY7i0YLfZvM+aHYiQOBbLjAoiclEDe8bb uxWQg91XUh5mcu1UMF47G6NKkweh/GTSDXFr0/aMPrErV5SdiyKKEhTanVj4ei1VbH2IcaW7Lh5Q 8vrMXjH7IhP0YjBhKCiVGOjnfQ6Z6TJH4fdYlPj2Z8XbwMWOcvskNChEvyfek/vZUBtedMisHvmu yAfBuAMFdqMZO3bqkz6Sa+xT17MgpzHwsCCIoaUFHcckZ4yS6NEziy/cgkbelZcLRQfgX1zHuTGT VPWsEhUuSNeTo1FETmnAJlvzIDlOUoobNzTTKrWidTeSYlTD4oWJLlaZWKilVOyTifggnhImJ8Ek gVTV+5iZ2JAQijdJGH3p+KZTgieMnbiLGsvs0QtMcq8bOi/ByaXCkpFCTFi7jqgfJERqczl10ssK zHxhhIimTfJp+UrYjVlTyg0EQ3pdZOHjYKAbEFuIipbQ0JDHidDgHg3A5APapp7zxK0kheOMMidJ ZPyx5UAjwdveDwH7fOfITOpmwZEJeeOJr3c2C+QiZGwH0W9Wgtmtl3S8wPTrgeZcVHOaUAlOFWhS 4NakYxgOipdAYQoAXAIAFbFFoEl6ERp9GVEQ9hVmjnPWiGJBpqSN/v2ZKLIaZGESIE/gbHNPAkX4 xPMWHSFvfJksVHhBGoiab8NrZaYAHJmsQKslZBaGbgZBVTRInUgZJ7tOLQiWtJUD8AgiaeIKAdKi JXZOTlZaxcdOq6QCYu344aIkacwlXFIIx0aRxTodoQYWB+saCG1CQTZMGvQfoUoKJORMiSRfAdQI +DJyiSTd8RliKloSkokBxbDiE3i6IZxYoP8AHn+AUYw0mXzzX3ckckFdQLnlg1Im6WFThUDBH6oY 7m7XAg9KJVbNNcYNBu3b0PamyynMfGvhzzK9u8WFmY3wXJEuRTRGF720dhSopWVj32oOmuTJC3c4 nfkxFyA63Phe2FYUgKOSHs3PU+ixjq42Rl8WIx2jEiQ9PDG1I2C/LGNtL7tOUqwYjSo4ImDA8hr9 3NPPDLvkTSC2zGPSj6buZ6+PNhZt7SqFAzngSBL5jPk7TBZkYQdIiYiZZR2GcpmpSgolMkaiL4Na S66RolKo+MD7Ep7ytzuHuS9Stipwx3PB4OHx75Fid1GSpXLLbnA012mRedVZVqHlddMw3bIjQQvs zoY1DpJMiXaI/kXg6CR0ZiP2GaXEyCeDA/0DKH1T9V5IGpJ3vacYZA2hoDSMw3bXnTlTOGtWsTpS 9FjYJMATd5uDku9WnBdYQYLDdr13b+EOyHVGTfNM6npdsEXhQcVEEDe7k2rBjlpnIs25nEsy7Dh0 IepJKqccI5c8L5Anw85QboHatgAQALLKECZXpqrWxWdbyYKQQDiYyhaoSh3xBkTPzpwA3asakXwV I+PxxDAu3QNAgX31qZQR3Bnnwti8ONLV5GJOuqpx5kgHPPpbxvIEin3zHEMCoiTRQiWEFN4s9jc0 hBaTiUpBIQxGFGXJAuP8ihdRKCIQN1hRTbmBDBQYxWgvFZ8zagssHZg/QmhsUGDg/EGOwpwYkxL7 kv3kstKu8Bsclgl0jaEepyG0Ur4JnhJokdJpUwWD6qaHmuxcHWRRi5Me50WJisQyckNrndWtBHdk fzi+eSUMohvAwJyvI5jJBzuSy9qzoM7XhYtYta5Ioafjy9Cky5s4OxqBbkxEigdZXranXHUyfMGU l5IRO5sfqpY0cZG8pkYm1YoxNKVIeqzxU62ZfomX5WE6HjwcSulyjBCFkXSAnEJSFl80BPJU3knK BYVyxPubM8vlBIjaKE5VRd6FHSGBezZ2OWzkK4KlZVyo2RjJu+SUZtmxoofUI6PXRyVtm5EciLxA 8aR9ZaYKrAqH2EQpSN3agdeJDlvy7+9B3+AeC4odTv25dbB1LX7nWvfHL0pmFsZkwlymhcwzm1Wb A26vj5yM5AL5O4ovj0HoiZziHIgGxE6QrOdazkj2mWVoWh38wvcDwBlEvFBAgDIiMwDKAFRVeF55 ZldIeiz988lz1lYmMIn2KGMrPEYCkpLmzgwog0g5fq/DE9pgl8pGiVIomORZR7HuEGNKqxXhaHLI ygoJocjA2RRngiOhyPAx2iIgDwMHdA8vGknCaze95pGAeJfJh+wpHwNNSfIG4FjzLxo7XhHDo8Sb TtMwZHpdBIGKRCURiK04O0dIKEakhluOzQETk4MQKkS87kamEahcTFUECF0YJWM4yKVOL14JmDcn IyeCqhh2WnPweAX5OTip1nJum2tZlj0qphBA85ovXF5bGLRhFUimjZqBhTjUej3BzwsV6KccOLCX TdHOaGIC6CR60JWkZybOCSRRoEBzRd/ONre4YjonH3XZ2sVKvIsp75534HWtdzcEC7OrY4t8KINj bTRHeq5akCmHEbbcojNtkGnxNOZWqysT29L65KZcieSDkzjip3mcXwcposXJ6LJAmaUlskWDYpQw KXOFyQSZIk9jmC/Q40SlUU4MV3EVxeKawrKpzzIdRQyKVJHJ80Esn1RKD3gNvASXaviA6kpAco+I touZWsO4aUFYB1TnFrkas+WtH5gNp5GwL1JNmTnnQkFLFkGFK85QLwuRJoUFbpPtL1gxIPdhTGwk swIRU2G2H1WHoO1CmfIucEgbs5LuMIboJY7yMNoE2obrAlhqQDNN2oVophLcTFRxQaoMok1QxQaM DWtVKzHjIO4wZPoa2DagGDFgzAHLCZnZ8F6lixfC1DJBuKDkozAwg5BdBmtUMwEKo19jRpx9GqJF lUjYAYNIGOzBrYGSDUlAKHr3HXL5znKf19r+j7JOEAUiogrkEmc9veXzJEum5o999EubpvqZiJdO uwhwQivaLvuAyz9wfsc3NlkUX/TuLxLfN3dx1cYXcZDMhkUik0QwJh5bjQ+2927+thRZB+QEJhkC YRHH7RwE+2fIrNDTs06jeWyZBOEurYlMfjOUMY0bzb/kxjqnGBNYFZBBiybgssVIixVEVVBEYoyV 0tBcCYmFRYqg4TBiUwCGCmMCsVsLCoKqUWHKcpBEhTAiIjIgxIEEhklQWK2WWmTIT6uU5oCdF1Ou SH3gCQQEw/N5fUgwKz2AQfnPk6s8QfYwicSpMSRIrPsraRrjUwlbQCbMR9BSGgBJWFSgsC1oMANA gYoTaEz4Yor+MrpAJWGnFMVxo/Yn4B1id3/yX6ty/ec37/whD+o8wj+4QPzl4AQBkgvP/yBT8GE/ 4J+FmmFcin/2mQuyeotZoJB+4DPicrQX6QxC0Q14JA8UpJ/ZKWCkWS/gCh3AGZAUjGLIDFQEQSRB RZGQIpBjIKE4hOJJuOn+aE2DmvaYzeJzySTKnFDBRRlYgxOz+aBOUC7+ZYoKEZkJP76icIUpbZYA O4bK3YgDIKmWwWVwICp/QkFLEdxzhy0E11Iu42oTEYjP7rSQPeEKJOJHWawGvE9vpzcDSatpnbpB jHUD5CJgQBw4bJ0AHs6VRPPO2spP8SLJlh95SosQLg6BcSq81ADRX2hYmxnhIbKwYBz/T6eavux/ o/hhillDwTQD8U30pXjgiUFt050sHEjrNWNFDOZ0u+Z+JiHA5VMSQw3XXqTJGMGs0M37NziJ9Hca vEiqGgR2pk7FqgQPGExxOP5Sk50hNeDRCy1T4qazMSaFK7LJPeQBMqQSgnxM4AaZ2BZWqub8nr5o Qu8WAT607macd/idKlgA8HND5VPIkwaONtfpwXQLxBxIA8L2ADFxS5C/LitP2t/eYm2sQLTDMXB7 NUnKqupQqgCY/vdj8UEaCJEvYWkoQTPgG/DIXy7CQe5WYIk9Gbpb0NCEaebkboPbr5g+fjx2M6ST JoF6BlBGNABXCX5P/Pd0FmtCCY6gygmCEiC0gMPTpA2BbFFR2CTB97VC5HcP/uZUFLMQMEMEDk1g BjwTvVWqaBWsKRgEQx53daIGQ2hiEkiFsZraDkRXIIRYYbzwis2dQ86pqhS13YWwjTbk/g/icZsJ n4tGH/Vm/7P97JmOR9HB9z+L/g/7PEhwDUJdFupgpvCjWNSMJ4qjyQHhIsKVKfAl9NUJiN3P9D1D hiOqysUA/hCH0/AIwSx7z5pKNw1kSaySDGSlkcWqgntAYE/jFSoehleFvsxqchMsRJladwky13vx AvoHzlwyJVh/B7EPIfROHXBM4AxkXcxRIjSFaB5kHodocgsNypU3HNgLs5cwRDAVASBW1H/kGFQg TIsUj2RyfBk9ihfXQxCS0qrs0IAigcAgiBbB1jxCOEZFIEXcMkpAUZAiAxlNobFg/CVN5Dk1hkk5 A4BwYsNednQ9L/FqocOfcwFyGA5NsFGsKcecQIyqVC+OY/H+Ppz+6v3Uj2z93ulM6e3X7fb7fbw6 m5t8pnd4KkeDgc8eCZhgZNF3xR2IHSEIJCq86u0OFpYdL0HVKXi4lN4TUssGtSN5iFkNUCBUQ4QM EDW0O9mGZrQJAWD3KYj4k2xfVOHvM6q5wkoYZ6s7+39h/ub/2X+bPP1OcN8/T55/T9H9FZ/T/d9f 7l/a218jGaCIFwwHUdm3lPyQLQ+sqDeb07sLr3sqiJiBYjNsUpSjXYWM/uLMcCTSL4k2qQ44vuQ+ 2tGt7BdWiP8llNTDHT6DDRyUhnJVZnYL5GOqlKFKn+th6UP9/WH64X+gJPOj9wK0/vCZtSZ4lYn8 8ZJ/mH9ENd5mG3dL+Q3nAJpmQiI/hUlZAQJAsgDCrKfvoA7w5JYGhCmiZQ75qI+hcKmL/AggsLhK wxGkLZi3LkVXlAbGRojc5hISWKicmIkszuEMmAKmAe/Jf53iFUz/6ahRyWwYAjRGsQDIqxqkpSOA k1ohUIYhiBSwUAuGjISC/HlL21YSMEsQvZ1sF40BMx9BsRylfrHYP2B/Yr9BwfwZCyzaDRZAswG+ Hr+/rGWAO+Acfj2893CHf+JSQ0gfMf4h4jsJ23Tn0DwJAnArEcEEufNA9Spo0pMocKSFh/GHMyIE pk6EH3cCOu0C6Nfdz2R41odZZLn/NLIGFF4nWjTr80DuXNFLn8COcESx2p+YCISDPOyYq3O4u0W/ BQru9IyNcxunvNa4PApcsTKmbFSMSMilzReSPQzwSlc2liJzf+Bp2hUVTfze3xiSF4U436R6TR04 UlYw8bEsETFh905lEBmPMQnGsYetg/SzMhnhN3cXouUCjFjSQHGwx+67AnO0VspRXvLO+Chg0VBg KaN/Xy5GYCLifniZzf/GCEjGh5IYA6+OeRzH8HdWJlPasCclIFSSSYpGkMixpOfwOCVSnvJMIicG 8QXZTk++MZa6nXzzAZPtGoXwUvC7naxuEpd60z8Gycp2OYypLyp8Y6LnzT4bPFZAQwQCMKg7h5eU 1gBFXaa2wg6Sr2HoDISGTJbDrCAuDM4/BgtKEMi0NvEMgtXE5/OPqmSAqjZ+JWof+OFBx3m+cEqI 5Ir42Q2EgO0DxIRGgEASPgg/NT5DoZkEizM/i/gBxsEBigyDziIiDMOJm5MrsEPcKGMBuGQJGK45 2Ut+MIQOJHH30odwZWe625VCpnXjRL19sqCnkgk3KuA87iB/N9yonQAcSFgWJnUSzSOquvCTlIkQ TnJJQmd3iZEIcglIRmB/4GpXzUjbGIHDYPRyUcxgOoEsCuAwRIRAsNDB6iG0O6xGSCmb2oHm5NMA LBgXk8qbFNtLUqF9O11dBNFGkoNi90uaZBYz+yhQxWZOhEVDWejWi5d7ZmHsBJrgip3/wrsLCQsD 8hxqiSM7v63LgppbkM84anp8U1q6znsVw9fR7ez0kjEMAHLjrj56GLD2FKeEsNxGDqyX2liIllWe pXgO5Mun5JoYx+QxxIUvYX9VaUIHGdElp3rUSh2oIFOGFZZbZEqhNaMQH0jQAPTrWWMW7/FKxNki pPucehD6ctzOlk5InZM0LrM6++X6ynU6jH1wETRwY8+xAp27vI7RyRRAbuinapIuh2KWOQaNxpkp ETFZo5jZNJii0NOVHLEqtYjAYgY8JBw+Qf+iRc4O6lZrdpGMn6mGPmfu37p8ppazwNozg++4IlFQ j2Cu1Dy4vMthsVwcDOgkiv3+nyM/HJUOdHta+SSqBcYr2JEyJyc/iARZb1UR1Zs1cpEshSZCS59h msJSu/EhzSEUHfPJSgdqsfQXTGBhfwc6SkYsNBmaSxx7+Z0XkJUag1iNCGwJdAavAnsJK636NiiY Iwr0JCW9AeU/BFBTkFnaHEBYgTaBvfvQL0MgKOAYBcsA+l/z1CTTlYgIdJIWUpCQCdXChhDle8L+ 7qet14PRJoHkdzMk9/s5BQ1YjkLY+oRBKjSsoLHwW4ui/oyzpcWgWsCEEIQ3jNYHihFS6zsiBAnP A3EYjypxdDwohKqCWciY9viPljrlJpyiTxHqcm6K6NLiViUmLCPvjcN3N9GB5l+JYOcpTKzidGvk HqXscYMDbY7hgwa0UF19C1Tzgq53YickTY5YkRH3thwJETPZSgo+2hMgeiYJ0OKHKXoRL6LkHREY zkJlypqcnIaRD66AmUmZMmjnj7mk5L1lDwiHyQUQ5JEy3RjAnJDQsZTkl5DAhhCDQWwI2knBheDC JryOkeEmhagGqGppsNenj0GQCgJ4F5gP0lCnHQPBiRcWkJxJzY8HJhEwQHPtQLw9Ijk8kb8G5jlU Cnv7eWeDA4yLCJgobb7euDT6Isx4ODRLsuDvXVu8SAp8kQFR3hnsUhBe3kCVBfVKDjmLjKYsp24G 28GLanDxwzkGpAnbV2mR/Y8X/H9TqkZKg/SuEI9kaBodVW6Ya9EPccAHsllcE4fA7AH1hcCy7SkR EDMTITCF1C8DRZayFJYqSAi8NtlbH4n0D6Yq0A7mtfEgM6VqADIGxBuJIecPb6SCcMCcxDcJAT3G weYnGaiIiDB7kr277NWIMa3DlD3rkHauzNOTcuWrqQMbQxRHanEGQ4cGSJpNASUmIJT5JZKIUg6D fxjA3vANj4/ZD7E5YGdreKGIesLCzqdDBY6UoCozMGuPfhLhgjqJYaklJpElIYccmdjTJgYNS7Fo OMGsJjJB0NChFkhoQFXV36KJ++H0GIQiGI1Y4RSamJIMSENqj5d8NdIWnk8klcb6pNaBeZPTfMdf bylnLQJpd5UQXn9CZOIgWNVMu5WxToyQLlbTuQOhicbKJtylT7sVJm1uewkBakWUliZ+460Nm+Cp S7EDt1WCIlSLB5BQpwVJjdFdE4roUOFNCoegkgdQUSmjAr0rkiCtKchkxoJRi0wvGTDMMwzJMwxu 1iQKotuNJeUBfXmAYAtBdQKUa3UzugIpcp5mZP3ERpF7ejpKI8OO8SIspK53HAW75odlQDCzdACw QWKJvDDd2MziMTFl4WVFpQUgBsEchCvOTOYBzjvQnkTrnxngDLIlGkSxKRKDKCUaCVDA4PUTeap3 63YmgtlMtOBtcad5UVSkkheEmch6EiH2LeUB/b2KIiNI54AgWtLBf2D+8I4p2IyKyywYZ2FvU1eg 9yS6ycrCyS7TA6lTJ1pmca2E7hB4mMCOBhfG8tgWZECY4pcRLizgKGKLZgdoc9s9vXv6icQcD9wJ 12bgJO5JiyzsvCQiG4C7F3HWZlhjx2yk/cG7YXkuBWJbisuDzEPRcg61w7W984Z+xWW6KHYCh352 HywPcAmD6wh7SLmHvDph6cEpAq2zLBYGh3kAdy5lqZVJyD2qq5aAiG3pO98Hcp3AHvOMMZ1okc0D ZAspSM5Yg5mfkJgmWhcGxLExpwFwcTkEZBmrG1eu44huLbi8i6SCdINU4UQZIYGFLpjJO6IHMPzh UK/LzAdHUzQpMHXMHcwqOETCtH8E03rnD3yWqQFHUgsgqwyiillmthSKG5AbkBGdaXhMEEUP5ecZ LCoWQUgCBTQFSV6TI2AeE2sGdS2KLFycwtUzxxpsG9HEoruhbxjua0MxduCUN8C03EEoH5cpL6kq hqQAsAddHmpmBlhN/DMTccvRqHAFN0JYITTLMPnjSkl/b/ROEBJ7eHSOMHNtIq0136uVW54uiSG9 rnnxoDYNksbqXtPXShu5I5JQBFuPDMSmsIFdpNCAjA3lFKFpFtDT69TmMaHniapB5FeZtPMkJ04p VY45A7TSOUlL67+Vm2zjz1UvktjJpm4zz7tFe+f4SHMxLWKcXacjIeu7u0klyNkxKi5LwleEdrhq ZJtJcptwUk78VEfcwVPKiLXreSQMXKxipzpb9afO28HSjZFdrYVbLDlM2W6Jvsjo3Q376eF7HXTN fHdVhRJLXrz5Vs0ZoPs11VxbOyvPS257uRztqqplwc63ZmuWxLq2zFpDQb2dltKOBHiNTPumsKim o5T8jKN8gSs/YoYPt7RIrS/Tuc8F78OpPZMoHr0pzP3hkgdzO0DJsvYpZRTo+QR5uUHnYbjwWMaU JMArtbhsbozmDoMmGeMCFrBCgaMOTAMKJysFWlBaSSpFEFVWKsFiJQVECsVdA3EPAk8RDTdJIFin NUH3AWFqdC4WLxCwTrgBVS5kCSnJA1wxuNm7brkWwY1wMZ+3IVjWsGAwBFg3VkV0PLrgIchs/rDM MVEhdK8hQiE9XCnacDbu3meiOQ8yKw0kuchvgkl4CUID5ZlMWlZuNa+mB+FV2TwRNDmC+GA4sEkA mKYcDA7DYdESwHkBMOGo39xwOcxIPGUkjh0HOGoK5e29SIoQRgEmpjIi2pmiE9SjQZoxvDzYD3KB nk4WZq1yRMbEmzcM5y0Wq4NxEntfJqoHIRQDJunpy+u8+NDY24nw9/w0GKCLFEvMegOd1SBidLQT wWDY38UCuyw4Zzd+6jNq46ndlJZbVDwsquQLLtVPB1z3jsYA+gOqexGowyKht5pSDTmbFaYFxrIh uMYpUdqSRyB18EZG4doeDlGaCymFsQXF5Y3bUlYLejgpklNhbhG6nffLPRdbN1dWztjTvg+eVAtu 5sXbuLsuy+Tg7OJKTtCBNQgXbFS4uqlmqnhZ1V10wJmnpypqkmzR+RArkhG0CoV4OS5Z7w7unRyV KnuOVLzwg6ElAHWJAFa5IPbdyg0sS4L8yjNHPhloQSEJEVZVuabjv/it+0gg4OkbfFPuxrF5jB8j yDIBdejmfYUvGuo0SYqkd7IP0TKK3Kt3FRDQoFhQZNCH83A9T9gyIHJHdko+Ababxj7D8p/EEMpB Mh+YsWOhAjgHMrzk3T96vZYGbX4TesNOxMtywWlpmg1Q1aEqsqLgtGz3un80fyLEo3BK3DEAnD1k Myzt5+niHdIDv5Nh95FjHJYDaJlEnRBOAtYGvASPV+DbBxKLZ1T7HyikYp1g1L2JMjRUMAoBmg0U yI6h4oWULgL6WDNghJdFUKoMaAMJu+kzxETLLjCB3g9BYWt9BzV7KWx3hz0E/DAaIR9zJ+zvVVWo ovmGAdpWH4Q4G7QzUJiwSCEzoADcd5eDFR4IyDSG/46kCjwN3BhySczD2EDm/S5yQyZvd7W+Xf8v jLpZqUbQIpJA9D0dh4eHyuoPhstk7n8f7ShuJpCx1sv05LH3TYmOSN3Il6lxCMjAsMEqPQiZ2TOe f4vZEzs2ITNcz4NpwaDnsDoge5D86T6KBW5gpzxlJimhTvs71IGIXMUKwOPKUF3sqe9B3TZB6kjR HuaFsVPQobpIu8UufsEoReMRTmzkSjpbEyK44+SEA9UAkSLFyMGUski2Sym8jZXBTvC4zkSEGMFO 0zjZ3MDHqHtY46N3MHBE+tiY7H2oVBCRXZo0YsSlXmhQ5JkU6YoVsZJxNyAqmIEyROYpM1wiwuWB JcqGkakkHIoURQ5uDKcNT6aHDZIaXkNDoYDSYzAmZTDW25jjRQuTWSXmDiZaPX2KHW00w/EI7ANZ 6gjd+XeJLwBGSjIEcHMjJggsI8CnFEMER70NodiWZltz4iT5h1Xons8qKHR66CflNEqgdND9CDCB 3gH90AjTCQUYUdaDYvcjxh9uQrQxnBOtzHsxoPH6vP/j5pofTB+MpMssUkBwDnsAOZ4BwD4IcDzy BZEPdDAUlYERFIgrJBgEwpXHtFlIh4osByAIhAonSI+maD1RT4vvD4B6nmju4MTsEmInseXhN1rU AsG4wA5cvc7w3pht0YiYUkmRE4UWQLBAAtmWeY75uPADtO4bBLQpRoa7bk7esch1EWzeAj3XKAgR MIg4zkU8mTe2YlFE4nTr0SI5oexl2Hy4zyUJ9dQA9X1DXe/F5o+mB9fgzfNDKDiZiGxtNjmA50KK Hp51PfrQzIeZ7n2j2nR4nAPEFkVRGBk0HRhoa665AtgPhKlsV3lEOMkpkH0u5SiEBAeR8HtJIvd3 HD4pAleGoih5ZonP4FkrkMVGisvZYkksRPklg95zjzAHEBy9AWivASAyIRPvtFjbFBQI2VARBAqC wikCjZIMWCxAZJRJBBoIsQSL7PTwJ/JSoK+38HIB8AeRKWRJICC+PT0mmvYyylxAMkPAT+TBZiIo Hqp9S1fBIqTSMRBh11Iej0j7zGcnixCLsekLTaEDzIyu3Nyr0HtCHcEEiJJ9B7dJWnIHUT6Vd0Ac jomuSmx2TADMkdSISBtXL2LENQiRBl2h5hYnwWon4IiuYepnlUOAeI66mtUTuJCBRrQYEiUjNoO3 r6kJ6uJCbYGHo5wHBdpcOEWpmUrBIGpHSn85vjfqDEVjfiv0VSDzcLe1BzV+hUhdPF0+XSkEBEAQ MAQIIaQTJ+q1WoV8h7ebE5oC4i9BtPfZ/H/SUyGCIKfObvjNQETfzpX3Gpvr2h9pGUD3HgG5OQDi ahmAYB28jsegZaCgNWpBy9RwglPk2disxeDoRFywJoNmzdB4D7G0Z5iGUQQr5FszAoEq5DAXUepI A+gDAcujgG/z94Gx74iNdHVUH+8wi7B+AL99hN4kG/qeBTwwyeYkH85RPkgY9Pn24UqTzSfKw0W1 oLlMEvf797QWlONAksc/PQixgPhDH4TdgH6HuZgJiOp4dRDcIJ7orBgoPGRPjxg8QOg1kNT5ID9q D5INMPKAE7HgA7whBIhGEGARBYQYEQjCQEgIwYIe7FnsmQ8t753ezBxkJRFhyWlGVgsYICIwuVKK haemDst2K6RwTKqrJtpnyZHWhAwxW3EpgAjkBEWs/1Ly9F7nJ0gjkLKcRYZgzEBGCHPukg6egJsH gaC5XWWQpXaVJaKeEv3L5nwgiCCH5nmmwepzz3coAiIRAm1r+giSQSDGML9e/4LmQvALS4LwgB9v cpAaaZ47XWqmLNQgZ3QHZ96poRpW0NRuO/wQfAMAuDr8RICaUTKJZHJurdz0VIdaGZD6jKFIHtSt DQE5o/EJHUFJrFtWPTAPpKFxSN1CeZyqRMx94CQSad1xRqLpD6ikHonqZ/SHcjRKt8HULiF5iEMl YaBrDOPKyXGHI3LIyDaLSNKOZmVAgHvOCQXJ2y30DUi+9B0bI6XzPZCDSioP2ou6keXUOgnfihvE 7+SYJoCXalSCDsq1GfWImNCLgZbMn61zCmanEAnSWynQtSO1Bz5LSpN2CDsOrKU3Wj07MrAZEFdO few2ghKpJCxWSAQtIABwQ0Ag+55JuGnJR3uBKhjwJQWzAhJ0ElvQdIdQ9oca2i8UKaAhMsIPTCD8 CEhWCw/6a+WEnSSdh3BGWEQoUIecx0YHkdR7stnfzFC8CsqOiNYvIhsfBx5AS9GCAhDeHuE1XU0J fc6tXbkSR8CgFAR8pVahCBFCJkSCIOQCLII7GDYKKoRZ5fENAOBvqlhwYMEh9cT3r8kfHDYMIgMw 10EPya/y2IIJTDyaPyZJO0KZBsdRojToSzqbnqyTwTq7oFMDwDQB9t08A03pmOMMBnppQZlEqTTN a0GCIKO5hyp+VDYIjAilfMpiyeo7JP+zo2CcyGnR2Y9Hp4622pQxrlT1KBkz1biw1wcgZh1ql94j qClhqKzwKOqi+1Eugy84DP0V0RX0D/Gwih6nvEyOKBhyGBwfE6xF5IaQf2IKTcFTbJFtxKdU8glL 6fRQu4pog5JVzQ0c0MNCuB1SIltQxMpZIEgzMVAfmAlIazWaV0OKOxFHuPE0KpVoFUrA4/Z84If0 CDxYi8B0TceD35i7HdsqWKfMLsB4ATEghwAQ5HMaglGgloeqbj7Qye7f48sgdgeUPLatbJAlXVAM 0RmqWjIDSFNhpIkMq1HDTbGIEhQEaoNBhB+D9odnAPgGT4IfkPmfdqwS+vSfkMFxIPFWJ1slDSo9 Yd7odBwTWmQHxYUeUAme+APpUMppzGASi5TlQdqKGOgUUwSeqhh929dU/KHMpZwshgr5vFsCdvHY ewSbBWoPQMj5LIAoVBpSXgvj+v6/HNeVp3CigdLKwUln+xABAkPun17tnW7T5QZc7y2lxjBilhWE P0TvnU9x4WB5wSIj+cTNM5CmEbkYZQMCEpg+ekwTN0wFEouhYSiohUxgBpcQlKuua5s7FHcan/pp 4wNtSLpKwLJJskoFJCFKQSI6IQrAn0MDvYCHxB8AB6yHBgKeKGChUxi6wuHHAiwiwORWBWQCEKQF AJpaHAaqIfANn0lUlR10IgOQZZ5eCKkv50gLP1jCwfnIAlG7WMNkG1VezdmFuWICjN0iCkqwlFQZ CAAT7YdlmIGkDQ1zMoYgsIkYUgJC7/KgB4Iu6xaOIcIAug4uY1FhSF5jIHxzaBCmgUKhIxkkRFNZ FmBJE0uZFIQ9DgHAC5NSFR7hkg2gFo75Q430/IFAPUNglbB6XD94UZGjg/jQvUFiojidZgQBkJmk IR4fp7pAVXAJ3itVb6GS+xNX0UNQMh6qHBngUJrSYR9gEgGITbPlJGTIgzMylQFFjFZJGCSSYGGc YEPvoGmk7ZgshA0tFEQIPeQMPuE+dgNrHYIQU3A+r7AqWuS+Rn9qeq6vymNzF/jHQIygJAVykDuI EH9GefxofstrgKTtQ7lZnkno5idYR5jR224goGhM6kYPsDyAZjPGjBqXvJGtXoUMpcnnVp/lElnj WRLOnAUDqD9JqVDPRdR85prDukHRCVsOCSgEh95DXgAkGq/sH3CB3DD0XpHZjtbkMqgbzaFpxjmE M4E97638wvqqB3+8P3BvahOkNXIeP2G0TNwQc6EwABmcRIJDybg7Ek98YSVIIxIgMBCQ9Q7I8owK lghAAE1oEkQpQqIACPtBGBCgcCec3NhoGxNJA+tFhQBgHdfBp/PBclxRBjgBGfHJBtD0Pq/ZI+Gq wID6glExaEYwgfrU/Qh7jmJyCfNaQ0g7sFIIAiARnDJ5zBQ7idNyILRQXwZncFq7KjojwATVUVlg AFjXieQTZG6HEjvCtFDXXVymgnElNVOo9YQ3ENZEIMUAf6yQHQTQaT2oZMQucgjPnHp0RqZKNzmY dZAgdD93SpmQYlg3gUOhiK7oCAMBPwL8V8BPPqFgwPf+SmWBQiAj7IgRjatq7AWh84QceNFXUGt8 A88b7cyOd80plxu6XrsRoAZweIIDNyeKRnCB0HmgyBGBQYESFHeg4YMjWW6jEOS1oSD4JCwtR9UN 3qlIFwp/IjpM4oe2R9dEG2mZQ4Jzh36XP7AuCXNoC56l1h1AHgooDFE1oaCpbTES3M+A5MfYOyPm DEgw4GHDDiJ7vuc8gRJvqmCTa4vD1DzRFBYDbBDSGAjhAdxx1gKKBbw2IVIdvRHUhflP1exQ0TM4 OkEmwbi3t0S5xVgfUJSJICeRBsJhgvSmTqO1gpAgk7T9Ruo6Oyx5ThtS8TO8rcmo1msmejoUuD7E fcnMGpc/k4KHUnAQ88Zcl6NVYHyqQyNakFaN43pl7Fcm7ibvRZaPR28bvVAT15EqQz4sahsfcA85 c8qQ9ieMCH6A6g8iEg8+5R7yskQPKAxyMvTJX9hYBivQ4Ay9Q1BxMzuCsGekzhhmSGRKPClxI2yo 2lhLQKKMhFCRUHJiU9Kev2XyE8gZHcMmSBcJB64b3HPsJboTeJABaQGdKPGpsbBc9l+WDODipJZB 4FIigqj82Fq4qVBRQWRWnmVjvQW+IE0JGbmUhQQ7QpXAJTOYUCQKPoSTweMB34mNasE0KYHkFgsU GbZQEe/5B7OQwg6DHkIWahj7AwH6VX70pzG23gicnJaYvCwGGQ1YPloZ8xlFDZCBQc7sQgygkhIE D0n4Soz+sh+qiSfbEQnyDXogwg0RQ12RNZSIU+TMh5gJEvkzD9YerUa9MUMHsENbM4kLLAEy9pRW foNQgSLpR6CW8wW7ksawAN6ErlDar1pOD6BvVElUyQdChM8OxHMKZfIl4IZh/aGf9Zs++xB0K7JH Ej9R6t7oBmt8SAwwwUBvD0R1SmsNy1oHiF/ZCswiiZdrmocHUFkxIQhCPOKTLVEmWaZ1lBgay+iM i+g/T2hkDOn4gwU5v6QOSHsAJ5IaJngKSIySbQFEGgEIMgrOj78X7+w5FzKOViwUyYLTSCn5YYuW uTJDBjUuKEu4gGZDffdmcUEDDuB6sMmA83lUfusSfGulyCwz6Ejh8ZNc5M3JTcIa0ytCWoXYFdBG gMQG07DqQkhB4Y4hG9U4Fghm/E62m+tILeGNRd8EZGWEmKLuBSrn8lebfpIfILj6rj1R3XBzwLnM bB8TQhoz6cioSYChenFoTXPUTawrCz6gLkLEMm5Do2gLB79jPwVrQSIKwl7ZR3NJikXxFIgXsNqv NZw/DPUPZIgkQQRIIhco+5wDIOAhZXAy/p7LkhXO0RzB9FiesbhNiQMNacgXqSQsAtQl+T0POLx0 94OmHeTzB7LA6A2DpVFUBVIpBjBUSIxQFgKMRYosesBdK7K0A/Qc0eI1CZTjzlSp+EaB7uCDLAoM LoDsLkMdsCAR+SM79CHQhZCQQCxYsWCxSLIpFFFFFgoLFFFikFFFD8UJp7picZ8xIdwafKHwRe8A 9rnQ4Nqd9sXKhiTuAo7JrSJm4OsAngIvjbbbSlttttVUS0oiW1jKUpbbSlpRbbc/dQ4+mnxcwfgT hICEkhuNECzfMgcClhbZcAUMDDFKEwR5XM9YGjPCiHqEoYkgQnQPVL9tHrEH7IU9MSGxHYRYGRIT bNJDRgT1+8xCkMEJG8p2pc8KoumSTOeIZUxE6II1nyJ1JDWtXy777Yduy5KCJ+kUS0MQkUJZQxqe eRJYCWCFglBlglGyfUHzQrWwSOBDKxsz8YfDB1nwJZ6EuYYZEpTJFc82ypoPPxrYbWaGOAl6MYVZ qFytEnTASYHLAWCwBdBrUilV+pds0ME0uLFsmme5zekaCLJ3lagSnIBGF/YoqBAGBVJ1b5grod4k 71GvUg6q4JdCaqug2nFhmqglYcGUvFmqYFNjYZGCCF1Q+kb5DocUKIOueNDUiBJSSK3rXUdHlSBl N++CUKbPQH9xA/xhyk+eLPJjr8UPn2eO7n0SZOaD1QbKiT1c8KDhVx6gjIDBUqvYBGokq1XiAWSF vnMKoEwU6TUHxS4rFGA7syiXANMuIMgEVPwLYoi0AhXjABol5DyhNp8I5INktkfMQkN9DcUexFYa qkHTpSOpLnMwU0uEa6/GFIYSvFR7556rtegWQfBtuwmRrzw7DxQDEEL9pAHa8avEDOEPnJLFbAEa IONa1uUON3Jm0iUuEiFG4EiETpfEVjD5bcWGASwhzoe5CSsCpJJVUA0MhlV1sSP3KGaD43kn/BiI 7vAxPfHKaPECZRaI8BB6BLhu5sHlhctUJIgpEgQ1IYhDMocnZnGkXJiYMAwlTVAjCzWSSGROIgNj 7UmTGExauDeh7hd73BkdaF+JLXmfj0GoiRgnWdYdTfYoBf0khZwXT18qYu1NllAzPOeQQ7k86XCi xtMFEOY8A6EZc71KcC1C7McCHZovg0AVypJOkAgGqBzgdcyAK+gmQRoaGEzJJJURYvc+cmKC5xmQ KVuKD30FvVIIyBrbJV8zsSWkIoZLbrW2UmU0yDq0/D61fHYjzC8b2L1KGm4DvDKkPK/EWnMXXswN 8F+rAdyXg49Cv53qkqOL5xJ4rVrQE/5rRkA6BDtE+Qkk/YMIQrBCwC9EHssBEwHY5qhDrD2nJkoE B/UXKg7EXcYI2o+IlyuQHcag2Q394he3IVZFnAySxBCQPtZCBuB0fBOQnTerqGQimqAQ9YAcTt/G OW1utNpk26wfAQubF2stQtKU+1QMScWI4VQjNBjFZSFYLxBhwYWbf5g1XiocyLXNUS8/KaUzIRIo Y/lUoYhT3odL6IYHp6Hoakl24ChBmQ1jOBm1B9k4bg2hmrEXd4NnBCoMioYAQdLlNzkRgUfh0dhN gTaEikM09TjfMOxlfCQ7NkQOQAy0ClPYkpVjU5VEI2RCdOS7YxQMtd428G8Odyp2hxv3m9TSkz3i 9a3oqaQ8zNn0BogCsgoc1FVe9Pv2FjQxNQnEGhUCa1pyhqV0JQU5E69aGwPEU29/tCZ5Ga841AoT mFKIaAgIYJuYU5gvonZ5cNCNFtEyuY/kcOgc44i1d6EB7F+5+7/rSgD3WRN4SSgbPYyfgD73UDZp DTwRpyG1aBPf6bn3enboHsyRtYOuZwEPxgOES8F36yk4IO9UfRausNqDmngi5d2AVXSIh02rVg9X AfcAXaHf1DVPVsu9T1DeGv1aJ7nl1AMeh2NDwCAk+8NChT6gzVs/IXyarm/ZAYO9cy8OYym/QFSG lmulLkNAvNn6HEUULGsAcAYjmcHFEUa8lfUKUyWQ9bOzQMiryYNxuSrQbFcQtaABEG4LTSh1vIrC GCEJwODmSnfIMNU/IVzDnGxJO8oFSqVFICZYVATLMfawQVzIgkXH8kshYgEZKLIHQGYyIUbQmnsC 4d03fQ5pPkhshU3n8w6ArtLwgd49JtCx8w0ukzBpTOg6C443M6aD0xQz+aFqYJWHRa8BCZ2JI6Qf 6IUO0rAOSWA6vqHiio+RArgnQ5+pxemgQmX2joHsN49umSGx8ByGHEKIS92Peuwd1OkJ9A8ju0tu wbeNrUzO8sNbBERAQwRDbhBVMADQz3pNrM4dwX3qdg3IXdLmTLvBLUHLV0vIAeHEroOvX4Aa4mGC ucO8Xg+GDghvXLRLE3BwD9cJ/EIQ8vWQf/xdyRThQkCL2130 --===============1939413964==--