From: Jon Olav Hauglid Date: September 24 2010 6:46am Subject: bzr commit into mysql-5.5-runtime branch (jon.hauglid:3143) List-Archive: http://lists.mysql.com/commits/119017 Message-Id: <201009240647.o8O5pK1A012638@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7998243421890934737==" --===============7998243421890934737== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/x/mysql-5.5-runtime-test/ based on revid:jon.hauglid@stripped 3143 Jon Olav Hauglid 2010-09-24 [merge] Merge from mysql-5.5-bugfixing to mysql-5.5-runtime. modified: mysql-test/r/type_newdecimal.result mysql-test/suite/perfschema/r/server_init.result mysql-test/suite/perfschema/t/server_init.test mysql-test/t/type_newdecimal.test sql/field.cc sql/log.cc sql/log.h sql/sql_plugin.cc sql/sql_repl.cc storage/perfschema/pfs_engine_table.cc === modified file 'mysql-test/r/type_newdecimal.result' --- a/mysql-test/r/type_newdecimal.result 2010-04-11 06:52:42 +0000 +++ b/mysql-test/r/type_newdecimal.result 2010-09-23 12:38:24 +0000 @@ -1908,4 +1908,16 @@ group by PAY.id + 1; mult v_net_with_discount v_total 1.0000 27.18 27.180000 DROP TABLE currencies, payments, sub_tasks; +# +# BUG#52171: distinct aggregates on unsigned decimal fields trigger assertions +# +CREATE TABLE t1 (a DECIMAL(4,4) UNSIGNED); +INSERT INTO t1 VALUES (0); +SELECT AVG(DISTINCT a) FROM t1; +AVG(DISTINCT a) +0.00000000 +SELECT SUM(DISTINCT a) FROM t1; +SUM(DISTINCT a) +0.0000 +DROP TABLE t1; End of 5.1 tests === modified file 'mysql-test/suite/perfschema/r/server_init.result' --- a/mysql-test/suite/perfschema/r/server_init.result 2010-08-12 13:50:23 +0000 +++ b/mysql-test/suite/perfschema/r/server_init.result 2010-09-17 01:04:34 +0000 @@ -116,18 +116,10 @@ where name like "wait/synch/mutex/sql/LO count(name) 1 select count(name) from MUTEX_INSTANCES -where name like "wait/synch/mutex/sql/LOG_INFO::lock"; -count(name) -1 -select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/Query_cache::structure_guard_mutex"; count(name) 1 select count(name) from MUTEX_INSTANCES -where name like "wait/synch/mutex/sql/Event_scheduler::LOCK_scheduler_state"; -count(name) -1 -select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/LOCK_event_metadata"; count(name) 1 @@ -144,15 +136,15 @@ where name like "wait/synch/mutex/sql/Cv count(name) 1 select count(name) from MUTEX_INSTANCES -where name like "wait/synch/mutex/sql/LOCK_xid_cache"; +where name like "wait/synch/mutex/sql/LOCK_audit_mask"; count(name) 1 select count(name) from MUTEX_INSTANCES -where name like "wait/synch/mutex/sql/LOCK_plugin"; +where name like "wait/synch/mutex/sql/LOCK_xid_cache"; count(name) 1 select count(name) from MUTEX_INSTANCES -where name like "wait/synch/mutex/sql/LOCK_gdl"; +where name like "wait/synch/mutex/sql/LOCK_plugin"; count(name) 1 select count(name) from MUTEX_INSTANCES @@ -212,10 +204,6 @@ where name like "wait/synch/cond/sql/Que count(name) 1 select count(name) from COND_INSTANCES -where name like "wait/synch/cond/sql/Event_scheduler::COND_state"; -count(name) -1 -select count(name) from COND_INSTANCES where name like "wait/synch/cond/sql/COND_queue_state"; count(name) 1 === modified file 'mysql-test/suite/perfschema/t/server_init.test' --- a/mysql-test/suite/perfschema/t/server_init.test 2010-08-12 13:50:23 +0000 +++ b/mysql-test/suite/perfschema/t/server_init.test 2010-09-17 01:04:34 +0000 @@ -1,4 +1,4 @@ -# Copyright (C) 2009 Sun Microsystems, Inc +# Copyright (c) 2009, 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 @@ -10,8 +10,8 @@ # 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# along with this program; if not, write to the Free Software Foundation, +# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA # Tests for PERFORMANCE_SCHEMA @@ -43,10 +43,6 @@ select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/mysys/THR_LOCK_myisam"; -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from MUTEX_INSTANCES -# where name like "wait/synch/mutex/mysys/THR_LOCK_myisam_log"; - select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/mysys/THR_LOCK_heap"; @@ -83,11 +79,6 @@ select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/LOCK_delayed_insert"; -# Named LOCK_uuid_short in 6.0 only -# select count(name) from MUTEX_INSTANCES -# where name like "wait/synch/mutex/sql/LOCK_uuid_short"; - -# Named LOCK_uuid_generator in 5.5, LOCK_uuid_short in 6.0 select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/LOCK_uuid_generator"; @@ -130,14 +121,16 @@ select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/LOCK_rpl_status"; -select count(name) from MUTEX_INSTANCES - where name like "wait/synch/mutex/sql/LOG_INFO::lock"; +# LOG_INFO object are created on demand, and are not global. +# select count(name) from MUTEX_INSTANCES +# where name like "wait/synch/mutex/sql/LOG_INFO::lock"; select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/Query_cache::structure_guard_mutex"; -select count(name) from MUTEX_INSTANCES - where name like "wait/synch/mutex/sql/Event_scheduler::LOCK_scheduler_state"; +# The event scheduler may be disabled +# select count(name) from MUTEX_INSTANCES +# where name like "wait/synch/mutex/sql/Event_scheduler::LOCK_scheduler_state"; select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/LOCK_event_metadata"; @@ -148,16 +141,11 @@ select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/LOCK_user_locks"; -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from MUTEX_INSTANCES -# where name like "wait/synch/mutex/sql/LOCK_mdl"; - select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/Cversion_lock"; -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from MUTEX_INSTANCES -# where name like "wait/synch/mutex/sql/LOCK_audit_mask"; +select count(name) from MUTEX_INSTANCES + where name like "wait/synch/mutex/sql/LOCK_audit_mask"; select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/LOCK_xid_cache"; @@ -165,28 +153,13 @@ select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/LOCK_plugin"; -select count(name) from MUTEX_INSTANCES - where name like "wait/synch/mutex/sql/LOCK_gdl"; +# Not a global variable, may be destroyed already. +# select count(name) from MUTEX_INSTANCES +# where name like "wait/synch/mutex/sql/LOCK_gdl"; select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/tz_LOCK"; -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from MUTEX_INSTANCES -# where name like "wait/synch/mutex/sql/slave_start"; - -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from MUTEX_INSTANCES -# where name like "wait/synch/mutex/sql/BML_class::THR_LOCK_BML"; - -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from MUTEX_INSTANCES -# where name like "wait/synch/mutex/sql/BML_class::THR_LOCK_BML_active"; - -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from MUTEX_INSTANCES -# where name like "wait/synch/mutex/sql/BML_class::THR_LOCK_BML_get"; - # Verify that these global rwlocks have been properly initilized in sql select count(name) from RWLOCK_INSTANCES @@ -230,25 +203,10 @@ select count(name) from COND_INSTANCES select count(name) from COND_INSTANCES where name like "wait/synch/cond/sql/Query_cache::COND_cache_status_changed"; -select count(name) from COND_INSTANCES - where name like "wait/synch/cond/sql/Event_scheduler::COND_state"; +# The event scheduler may be disabled +# select count(name) from COND_INSTANCES +# where name like "wait/synch/cond/sql/Event_scheduler::COND_state"; select count(name) from COND_INSTANCES where name like "wait/synch/cond/sql/COND_queue_state"; -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from COND_INSTANCES -# where name like "wait/synch/cond/sql/COND_mdl"; - -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from COND_INSTANCES -# where name like "wait/synch/cond/sql/BML_class::COND_BML"; - -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from COND_INSTANCES -# where name like "wait/synch/cond/sql/BML_class::COND_BML_registered"; - -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from COND_INSTANCES -# where name like "wait/synch/cond/sql/BML_class::COND_BML_release"; - === modified file 'mysql-test/t/type_newdecimal.test' --- a/mysql-test/t/type_newdecimal.test 2010-04-11 06:52:42 +0000 +++ b/mysql-test/t/type_newdecimal.test 2010-09-23 12:38:24 +0000 @@ -1509,5 +1509,14 @@ group by PAY.id + 1; DROP TABLE currencies, payments, sub_tasks; +--echo # +--echo # BUG#52171: distinct aggregates on unsigned decimal fields trigger assertions +--echo # + +CREATE TABLE t1 (a DECIMAL(4,4) UNSIGNED); +INSERT INTO t1 VALUES (0); +SELECT AVG(DISTINCT a) FROM t1; +SELECT SUM(DISTINCT a) FROM t1; +DROP TABLE t1; --echo End of 5.1 tests === modified file 'sql/field.cc' --- a/sql/field.cc 2010-08-23 09:56:21 +0000 +++ b/sql/field.cc 2010-09-23 12:38:24 +0000 @@ -9104,7 +9104,7 @@ void Create_field::init_for_tmp_table(en case MYSQL_TYPE_NEWDECIMAL: case MYSQL_TYPE_FLOAT: case MYSQL_TYPE_DOUBLE: - pack_flag= FIELDFLAG_DECIMAL | FIELDFLAG_NUMBER | + pack_flag= FIELDFLAG_NUMBER | (decimals_arg & FIELDFLAG_MAX_DEC) << FIELDFLAG_DEC_SHIFT; break; @@ -9153,12 +9153,13 @@ void Create_field::init_for_tmp_table(en (maybe_null ? FIELDFLAG_MAYBE_NULL : 0) | (is_unsigned ? 0 : FIELDFLAG_DECIMAL); - DBUG_PRINT("debug", ("pack_flag: %s%s%s%s%s, pack_type: %d", + DBUG_PRINT("debug", ("pack_flag: %s%s%s%s%s%s, pack_type: %d", FLAGSTR(pack_flag, FIELDFLAG_BINARY), FLAGSTR(pack_flag, FIELDFLAG_NUMBER), FLAGSTR(pack_flag, FIELDFLAG_INTERVAL), FLAGSTR(pack_flag, FIELDFLAG_GEOM), FLAGSTR(pack_flag, FIELDFLAG_BLOB), + FLAGSTR(pack_flag, FIELDFLAG_DECIMAL), f_packtype(pack_flag))); DBUG_VOID_RETURN; } === modified file 'sql/log.cc' --- a/sql/log.cc 2010-08-30 08:36:02 +0000 +++ b/sql/log.cc 2010-09-06 17:18:44 +0000 @@ -5284,11 +5284,8 @@ int MYSQL_BIN_LOG::wait_for_update_bin_l const struct timespec *timeout) { int ret= 0; - const char* old_msg = thd->proc_info; DBUG_ENTER("wait_for_update_bin_log"); - old_msg= thd->enter_cond(&update_cond, &LOCK_log, - "Master has sent all binlog to slave; " - "waiting for binlog to be updated"); + if (!timeout) mysql_cond_wait(&update_cond, &LOCK_log); else === modified file 'sql/log.h' --- a/sql/log.h 2010-08-20 11:22:46 +0000 +++ b/sql/log.h 2010-09-06 17:18:44 +0000 @@ -460,6 +460,7 @@ public: inline char* get_log_fname() { return log_file_name; } inline char* get_name() { return name; } inline mysql_mutex_t* get_log_lock() { return &LOCK_log; } + inline mysql_cond_t* get_log_cond() { return &update_cond; } inline IO_CACHE* get_log_file() { return &log_file; } inline void lock_index() { mysql_mutex_lock(&LOCK_index);} === modified file 'sql/sql_plugin.cc' --- a/sql/sql_plugin.cc 2010-08-23 09:38:10 +0000 +++ b/sql/sql_plugin.cc 2010-09-21 21:24:29 +0000 @@ -519,7 +519,7 @@ static st_plugin_dl *plugin_dl_add(const /* no op */; cur= (struct st_mysql_plugin*) - my_malloc(i*sizeof(struct st_mysql_plugin), MYF(MY_ZEROFILL|MY_WME)); + my_malloc((i+1)*sizeof(struct st_mysql_plugin), MYF(MY_ZEROFILL|MY_WME)); if (!cur) { free_plugin_mem(&plugin_dl); === modified file 'sql/sql_repl.cc' --- a/sql/sql_repl.cc 2010-07-26 10:52:59 +0000 +++ b/sql/sql_repl.cc 2010-09-06 17:18:44 +0000 @@ -448,6 +448,8 @@ void mysql_binlog_send(THD* thd, char* l const char *errmsg = "Unknown error"; NET* net = &thd->net; mysql_mutex_t *log_lock; + mysql_cond_t *log_cond; + bool binlog_can_be_corrupted= FALSE; #ifndef DBUG_OFF int left_events = max_binlog_dump_events; @@ -591,7 +593,8 @@ impossible position"; mysql_bin_log, and it's already inited, and it will be destroyed only at shutdown). */ - log_lock = mysql_bin_log.get_log_lock(); + log_lock= mysql_bin_log.get_log_lock(); + log_cond= mysql_bin_log.get_log_cond(); if (pos > BIN_LOG_HEADER_SIZE) { /* reset transmit packet for the event read from binary log @@ -826,6 +829,7 @@ impossible position"; #ifndef DBUG_OFF ulong hb_info_counter= 0; #endif + const char* old_msg= thd->proc_info; signal_cnt= mysql_bin_log.signal_cnt; do { @@ -834,6 +838,9 @@ impossible position"; DBUG_ASSERT(heartbeat_ts && heartbeat_period != 0); set_timespec_nsec(*heartbeat_ts, heartbeat_period); } + thd->enter_cond(log_cond, log_lock, + "Master has sent all binlog to slave; " + "waiting for binlog to be updated"); ret= mysql_bin_log.wait_for_update_bin_log(thd, heartbeat_ts); DBUG_ASSERT(ret == 0 || (heartbeat_period != 0 && coord != NULL)); if (ret == ETIMEDOUT || ret == ETIME) @@ -849,12 +856,15 @@ impossible position"; #endif /* reset transmit packet for the heartbeat event */ if (reset_transmit_packet(thd, flags, &ev_offset, &errmsg)) + { + thd->exit_cond(old_msg); goto err; + } if (send_heartbeat_event(net, packet, coord)) { errmsg = "Failed on my_net_write()"; my_errno= ER_UNKNOWN_ERROR; - mysql_mutex_unlock(log_lock); + thd->exit_cond(old_msg); goto err; } } @@ -863,7 +873,7 @@ impossible position"; DBUG_PRINT("wait",("binary log received update or a broadcast signal caught")); } } while (signal_cnt == mysql_bin_log.signal_cnt && !thd->killed); - mysql_mutex_unlock(log_lock); + thd->exit_cond(old_msg); } break; === modified file 'storage/perfschema/pfs_engine_table.cc' --- a/storage/perfschema/pfs_engine_table.cc 2010-08-12 14:08:52 +0000 +++ b/storage/perfschema/pfs_engine_table.cc 2010-09-17 19:03:09 +0000 @@ -223,6 +223,8 @@ int PFS_engine_table::read_row(TABLE *ta Field **fields) { my_bitmap_map *org_bitmap; + Field *f; + Field **fields_reset; /* Make sure the table structure is as expected before mapping @@ -240,6 +242,16 @@ int PFS_engine_table::read_row(TABLE *ta /* We internally write to Fields to support the read interface */ org_bitmap= dbug_tmp_use_all_columns(table, table->write_set); + + /* + Some callers of the storage engine interface do not honor the + f->is_null() flag, and will attempt to read the data itself. + A known offender is mysql_checksum_table(). + For robustness, reset every field. + */ + for (fields_reset= fields; (f= *fields_reset) ; fields_reset++) + f->reset(); + int result= read_row_values(table, buf, fields, read_all); dbug_tmp_restore_column_map(table->write_set, org_bitmap); --===============7998243421890934737== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/jon.hauglid@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jon.hauglid@stripped # target_branch: file:///export/home/x/mysql-5.5-runtime-test/ # testament_sha1: 9c108bc91f7044a79500b49e768e8b883fb8e49e # timestamp: 2010-09-24 08:46:56 +0200 # source_branch: file:///export/home/x/mysql-5.5-bugfixing/ # base_revision_id: jon.hauglid@stripped\ # 3enqzccpv7sp95ie # # Begin bundle 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 SCq1ZjiA --===============7998243421890934737==--