From: Jon Olav Hauglid Date: October 7 2010 1:33pm Subject: bzr commit into mysql-5.5-runtime branch (jon.hauglid:3158) List-Archive: http://lists.mysql.com/commits/120257 Message-Id: <201010071334.o9784sHP015553@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7788952306198851444==" --===============7788952306198851444== 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:dmitry.shulga@stripped 3158 Jon Olav Hauglid 2010-10-07 [merge] Merge from mysql-5.5-bugteam to mysql-5.5-runtime No conflicts added: include/welcome_copyright_notice.h renamed: config/ac-macros/ha_ndbcluster.m4 => storage/ndb/ndb_configure.m4 modified: client/mysql.cc client/mysql_upgrade.c client/mysqladmin.cc client/mysqlbinlog.cc client/mysqlcheck.c client/mysqldump.c client/mysqlimport.c client/mysqlshow.c client/mysqlslap.c client/mysqltest.cc configure.in mysql-test/collections/default.experimental mysql-test/include/ctype_numconv.inc mysql-test/include/index_merge2.inc mysql-test/r/ctype_ucs.result mysql-test/r/func_time.result mysql-test/r/index_merge_myisam.result mysql-test/suite/innodb/r/innodb-index.result mysql-test/suite/innodb/r/innodb-zip.result mysql-test/suite/innodb/r/innodb_bug52745.result mysql-test/suite/innodb/r/innodb_bug53591.result mysql-test/suite/innodb/r/innodb_file_format.result mysql-test/suite/sys_vars/r/innodb_file_format_basic.result mysql-test/t/func_time.test mysys/my_winfile.c sql/item_cmpfunc.cc sql/item_timefunc.cc sql/item_timefunc.h sql/mysqld.cc sql/sql_insert.cc sql/sql_update.cc sql/sql_update.h storage/innobase/handler/ha_innodb.cc storage/innobase/row/row0sel.c storage/ndb/plug.in storage/ndb/ndb_configure.m4 === modified file 'client/mysql.cc' --- a/client/mysql.cc 2010-09-20 14:17:32 +0000 +++ b/client/mysql.cc 2010-10-06 15:06:13 +0000 @@ -13,11 +13,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#define COPYRIGHT_NOTICE "\ -Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.\n\ -This software comes with ABSOLUTELY NO WARRANTY. This is free software,\n\ -and you are welcome to modify and redistribute it under the GPL v2 license\n" - /* mysql command tool * Commands compatible with mSQL by David J. Hughes * @@ -110,6 +105,7 @@ extern "C" { #endif #include "completion_hash.h" +#include // ORACLE_WELCOME_COPYRIGHT_NOTICE #define PROMPT_CHAR '\\' #define DEFAULT_DELIMITER ";" @@ -1177,7 +1173,7 @@ int main(int argc,char *argv[]) mysql_thread_id(&mysql), server_version_string(&mysql)); put_info((char*) glob_buffer.ptr(),INFO_INFO); - put_info(COPYRIGHT_NOTICE, INFO_INFO); + put_info(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2010"), INFO_INFO); #ifdef HAVE_READLINE initialize_readline((char*) my_progname); @@ -1595,7 +1591,7 @@ static void usage(int version) if (version) return; - printf("%s", COPYRIGHT_NOTICE); + puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2010")); printf("Usage: %s [OPTIONS] [database]\n", my_progname); my_print_help(my_long_options); print_defaults("my", load_default_groups); === modified file 'client/mysql_upgrade.c' --- a/client/mysql_upgrade.c 2010-08-11 17:56:56 +0000 +++ b/client/mysql_upgrade.c 2010-10-06 15:06:13 +0000 @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 MySQL AB +/* Copyright (c) 2000, 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 @@ -17,6 +17,8 @@ #include #include "../scripts/mysql_fix_privilege_tables_sql.c" +#include /* ORACLE_WELCOME_COPYRIGHT_NOTICE */ + #define VER "1.1" #ifdef HAVE_SYS_WAIT_H @@ -232,6 +234,7 @@ get_one_option(int optid, const struct m case '?': printf("%s Ver %s Distrib %s, for %s (%s)\n", my_progname, VER, MYSQL_SERVER_VERSION, SYSTEM_TYPE, MACHINE_TYPE); + puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2010")); puts("MySQL utility for upgrading databases to new MySQL versions.\n"); my_print_help(my_long_options); exit(0); === modified file 'client/mysqladmin.cc' --- a/client/mysqladmin.cc 2010-07-15 11:13:30 +0000 +++ b/client/mysqladmin.cc 2010-10-06 15:06:13 +0000 @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2006 MySQL AB +/* Copyright (c) 2000, 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 @@ -23,6 +23,7 @@ #include #include #include +#include /* ORACLE_WELCOME_COPYRIGHT_NOTICE */ #define ADMIN_VERSION "8.42" #define MAX_MYSQL_VAR 512 @@ -671,8 +672,7 @@ static int execute_commands(MYSQL *mysql case ADMIN_VER: new_line=1; print_version(); - puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc."); - puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n"); + puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2010")); printf("Server version\t\t%s\n", mysql_get_server_info(mysql)); printf("Protocol version\t%d\n", mysql_get_proto_info(mysql)); printf("Connection\t\t%s\n",mysql_get_host_info(mysql)); @@ -1070,8 +1070,7 @@ static void print_version(void) static void usage(void) { print_version(); - puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc."); - puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n"); + puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2010")); puts("Administration program for the mysqld daemon."); printf("Usage: %s [OPTIONS] command command....\n", my_progname); my_print_help(my_long_options); === modified file 'client/mysqlbinlog.cc' --- a/client/mysqlbinlog.cc 2010-07-15 13:47:50 +0000 +++ b/client/mysqlbinlog.cc 2010-10-06 15:06:13 +0000 @@ -1,4 +1,4 @@ -/* Copyright (C) 2001-2004 MySQL AB +/* Copyright (c) 2001, 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 @@ -34,6 +34,7 @@ #include "sql_priv.h" #include "log_event.h" #include "sql_common.h" +#include // ORACLE_WELCOME_COPYRIGHT_NOTICE #define BIN_LOG_HEADER_SIZE 4 #define PROBE_HEADER_LEN (EVENT_LEN_OFFSET+4) @@ -1239,10 +1240,7 @@ static void print_version() static void usage() { print_version(); - puts("By Monty and Sasha, for your professional use\n\ -This software comes with NO WARRANTY: This is free software,\n\ -and you are welcome to modify and redistribute it under the GPL license.\n"); - + puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2001, 2010")); printf("\ Dumps a MySQL binary log in a format usable for viewing or for piping to\n\ the mysql command line client.\n\n"); === modified file 'client/mysqlcheck.c' --- a/client/mysqlcheck.c 2010-07-15 13:47:50 +0000 +++ b/client/mysqlcheck.c 2010-10-06 15:06:13 +0000 @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 MySQL AB, 2009 Sun Microsystems, Inc +/* Copyright (c) 2000, 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 @@ -13,8 +13,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* By Jani Tolonen, 2001-04-20, MySQL Development Team */ - #define CHECK_VERSION "2.5.0" #include "client_priv.h" @@ -22,6 +20,7 @@ #include #include #include +#include /* ORACLE_WELCOME_COPYRIGHT_NOTICE */ /* Exit codes */ @@ -215,9 +214,7 @@ static void print_version(void) static void usage(void) { print_version(); - puts("By Jani Tolonen, 2001-04-20, MySQL Development Team.\n"); - puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\n"); - puts("and you are welcome to modify and redistribute it under the GPL license.\n"); + puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2010")); puts("This program can be used to CHECK (-c, -m, -C), REPAIR (-r), ANALYZE (-a),"); puts("or OPTIMIZE (-o) tables. Some of the options (like -e or -q) can be"); puts("used at the same time. Not all options are supported by all storage engines."); === modified file 'client/mysqldump.c' --- a/client/mysqldump.c 2010-08-30 12:06:32 +0000 +++ b/client/mysqldump.c 2010-10-06 15:06:13 +0000 @@ -1,4 +1,4 @@ -/* Copyright 2000-2008 MySQL AB, 2008, 2009 Sun Microsystems, Inc. +/* Copyright (c) 2000, 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 @@ -51,6 +51,8 @@ #include "mysql_version.h" #include "mysqld_error.h" +#include /* ORACLE_WELCOME_COPYRIGHT_NOTICE */ + /* Exit codes */ #define EX_USAGE 1 @@ -584,8 +586,7 @@ static void short_usage_sub(void) static void usage(void) { print_version(); - puts("By Igor Romanenko, Monty, Jani & Sinisa."); - puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license.\n"); + puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2010")); puts("Dumping structure and contents of MySQL databases and tables."); short_usage_sub(); print_defaults("my",load_default_groups); === modified file 'client/mysqlimport.c' --- a/client/mysqlimport.c 2010-07-15 11:13:30 +0000 +++ b/client/mysqlimport.c 2010-10-06 15:06:13 +0000 @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2006 MySQL AB, 2009 Sun Microsystems, Inc. +/* Copyright (c) 2000, 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 @@ -32,6 +32,8 @@ #include #endif +#include /* ORACLE_WELCOME_COPYRIGHT_NOTICE */ + /* Global Thread counter */ uint counter; @@ -191,8 +193,7 @@ static void print_version(void) static void usage(void) { print_version(); - puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc."); - puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license.\n"); + puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2010")); printf("\ Loads tables from text files in various formats. The base name of the\n\ text file must be the name of the table that should be used.\n\ === modified file 'client/mysqlshow.c' --- a/client/mysqlshow.c 2010-07-15 13:47:50 +0000 +++ b/client/mysqlshow.c 2010-10-06 15:06:13 +0000 @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2006 MySQL AB +/* Copyright (c) 2000, 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 @@ -25,6 +25,7 @@ #include #include #include +#include /* ORACLE_WELCOME_COPYRIGHT_NOTICE */ static char * host=0, *opt_password=0, *user=0; static my_bool opt_show_keys= 0, opt_compress= 0, opt_count=0, opt_status= 0; @@ -247,8 +248,7 @@ static void print_version(void) static void usage(void) { print_version(); - puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc."); - puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license.\n"); + puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2010)")); puts("Shows the structure of a MySQL database (databases, tables, and columns).\n"); printf("Usage: %s [OPTIONS] [database [table [column]]]\n",my_progname); puts("\n\ === modified file 'client/mysqlslap.c' --- a/client/mysqlslap.c 2010-07-15 11:13:30 +0000 +++ b/client/mysqlslap.c 2010-10-06 15:06:13 +0000 @@ -1,4 +1,4 @@ -/* Copyright (C) 2005 MySQL AB, 2009 Sun Microsystems, Inc. +/* Copyright (c) 2005, 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 @@ -11,12 +11,7 @@ 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 - - original idea: Brian Aker via playing with ab for too many years - coded by: Patrick Galbraith -*/ - + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* MySQL Slap @@ -94,6 +89,7 @@ TODO: #include #endif #include +#include /* ORACLE_WELCOME_COPYRIGHT_NOTICE */ #ifdef __WIN__ #define srandom srand @@ -686,8 +682,7 @@ static void print_version(void) static void usage(void) { print_version(); - puts("Copyright (C) 2005 MySQL AB"); - puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license.\n"); + puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2005, 2010")); puts("Run a query multiple times against the server.\n"); printf("Usage: %s [OPTIONS]\n",my_progname); print_defaults("my",load_default_groups); === modified file 'client/mysqltest.cc' --- a/client/mysqltest.cc 2010-10-04 12:42:16 +0000 +++ b/client/mysqltest.cc 2010-10-06 15:06:13 +0000 @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 MySQL AB +/* Copyright (c) 2000, 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 @@ -52,6 +52,8 @@ #include #include +#include // ORACLE_WELCOME_COPYRIGHT_NOTICE + #ifdef __WIN__ #include #define SIGNAL_FMT "exception 0x%x" @@ -6260,8 +6262,7 @@ void print_version(void) void usage() { print_version(); - printf("MySQL AB, by Sasha, Matt, Monty & Jani\n"); - printf("This software comes with ABSOLUTELY NO WARRANTY\n\n"); + puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2010")); printf("Runs a test against the mysql server and compares output with a results file.\n\n"); printf("Usage: %s [OPTIONS] [database] < test_file\n", my_progname); my_print_help(my_long_options); === modified file 'configure.in' --- a/configure.in 2010-10-05 11:33:54 +0000 +++ b/configure.in 2010-10-07 09:02:16 +0000 @@ -87,7 +87,6 @@ sinclude(config/ac-macros/character_sets sinclude(config/ac-macros/compiler_flag.m4) sinclude(config/ac-macros/plugins.m4) sinclude(config/ac-macros/dtrace.m4) -sinclude(config/ac-macros/ha_ndbcluster.m4) sinclude(config/ac-macros/large_file.m4) sinclude(config/ac-macros/misc.m4) sinclude(config/ac-macros/readline.m4) === added file 'include/welcome_copyright_notice.h' --- a/include/welcome_copyright_notice.h 1970-01-01 00:00:00 +0000 +++ b/include/welcome_copyright_notice.h 2010-10-06 15:06:13 +0000 @@ -0,0 +1,31 @@ +/* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _welcome_copyright_notice_h_ +#define _welcome_copyright_notice_h_ + +/* + This define specifies copyright notice which is displayed by every MySQL + program on start, or on help screen. +*/ + +#define ORACLE_WELCOME_COPYRIGHT_NOTICE(years) \ + "Copyright (c) " years ", Oracle and/or its affiliates. All rights reserved.\n" \ + "\n" \ + "Oracle is a registered trademark of Oracle Corporation and/or its\n" \ + "affiliates. Other names may be trademarks of their respective\n" \ + "owners.\n" + +#endif /* _welcome_copyright_notice_h_ */ === modified file 'mysql-test/collections/default.experimental' --- a/mysql-test/collections/default.experimental 2010-10-07 11:57:12 +0000 +++ b/mysql-test/collections/default.experimental 2010-10-07 12:12:33 +0000 @@ -15,9 +15,6 @@ main.lock_multi_bug38499 main.lock_multi_bug38691 @solaris # Bug#47792 2009-10-02 alik main.lock_multi_bug38691 times out sporadically on Solaris 10 main.log_tables # Bug#47924 2009-10-08 alik main.log_tables times out sporadically main.lowercase_table2 @darwin # Bug#55509 2010-07-26 alik main.lowercase_table2 fails on Mac OSX (again) -main.mysqlbinlog_row @solaris # Bug#52202 2010-03-22 alik mysqlbinlog_row* fail in daily-trunk on Sol10 x86_64 debug_max -main.mysqlbinlog_row_innodb @solaris # Bug#52202 2010-03-22 alik mysqlbinlog_row* fail in daily-trunk on Sol10 x86_64 debug_max -main.mysqlbinlog_row_myisam @solaris # Bug#52202 2010-03-22 alik mysqlbinlog_row* fail in daily-trunk on Sol10 x86_64 debug_max main.outfile_loaddata @solaris # Bug#46895 2010-01-20 alik Test "outfile_loaddata" fails (reproducible) main.signal_demo3 @solaris # Bug#47791 2010-01-20 alik Several test cases fail on Solaris with error Thread stack overrun main.sp @solaris # Bug#47791 2010-01-20 alik Several test cases fail on Solaris with error Thread stack overrun === modified file 'mysql-test/include/ctype_numconv.inc' --- a/mysql-test/include/ctype_numconv.inc 2010-08-19 11:55:35 +0000 +++ b/mysql-test/include/ctype_numconv.inc 2010-10-06 12:15:59 +0000 @@ -1635,12 +1635,7 @@ CREATE TABLE t1 (a MEDIUMINT NULL) ENGIN INSERT INTO t1 VALUES (1234567); SELECT GROUP_CONCAT(IFNULL(a,'')) FROM t1; SELECT GROUP_CONCAT(IF(a,a,'')) FROM t1; -if (`SELECT @@character_set_connection != 'ucs2'`) -{ - # Temporarily disable for ucs2 - # For details, see Bug#55744 GROUP_CONCAT + CASE + ucs return garbage - SELECT GROUP_CONCAT(CASE WHEN a THEN a ELSE '' END) FROM t1; -} +SELECT GROUP_CONCAT(CASE WHEN a THEN a ELSE '' END) FROM t1; --enable_metadata SELECT COALESCE(a,'') FROM t1 GROUP BY 1; --disable_metadata === modified file 'mysql-test/include/index_merge2.inc' --- a/mysql-test/include/index_merge2.inc 2009-08-25 15:53:43 +0000 +++ b/mysql-test/include/index_merge2.inc 2010-10-07 10:01:51 +0000 @@ -351,3 +351,115 @@ explain select * from t1 where (key3 > 3 select * from t1 where (key3 > 30 and key3<35) or (key2 >32 and key2 < 40); drop table t1; +--echo # +--echo # Bug#56423: Different count with SELECT and CREATE SELECT queries +--echo # + +CREATE TABLE t1 ( + a INT, + b INT, + c INT, + d INT, + PRIMARY KEY (a), + KEY (c), + KEY bd (b,d) +); + +INSERT INTO t1 VALUES +(1, 0, 1, 0), +(2, 1, 1, 1), +(3, 1, 1, 1), +(4, 0, 1, 1); + +EXPLAIN +SELECT a +FROM t1 +WHERE c = 1 AND b = 1 AND d = 1; + +CREATE TABLE t2 ( a INT ) +SELECT a +FROM t1 +WHERE c = 1 AND b = 1 AND d = 1; + +SELECT * FROM t2; + +DROP TABLE t1, t2; + +CREATE TABLE t1( a INT, b INT, KEY(a), KEY(b) ); +INSERT INTO t1 VALUES (1, 2), (1, 2), (1, 2), (1, 2); +SELECT * FROM t1 FORCE INDEX(a, b) WHERE a = 1 AND b = 2; + +DROP TABLE t1; + +--echo # Code coverage of fix. +CREATE TABLE t1 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT); +INSERT INTO t1 (b) VALUES (1); +UPDATE t1 SET b = 2 WHERE a = 1; +SELECT * FROM t1; + +CREATE TABLE t2 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b VARCHAR(1) ); +INSERT INTO t2 (b) VALUES ('a'); +UPDATE t2 SET b = 'b' WHERE a = 1; +SELECT * FROM t2; + +DROP TABLE t1, t2; + +# The test was inactive for InnoDB at the time of pushing. The following is +# expected result for the Bug#56423 test. It can be uncommented and pasted +# into result file when reactivating the test. + +## +## Bug#56423: Different count with SELECT and CREATE SELECT queries +## +#CREATE TABLE t1 ( +#a INT, +#b INT, +#c INT, +#d INT, +#PRIMARY KEY (a), +#KEY (c), +#KEY bd (b,d) +#); +#INSERT INTO t1 VALUES +#(1, 0, 1, 0), +#(2, 1, 1, 1), +#(3, 1, 1, 1), +#(4, 0, 1, 1); +#EXPLAIN +#SELECT a +#FROM t1 +#WHERE c = 1 AND b = 1 AND d = 1; +#id select_type table type possible_keys key key_len ref rows Extra +#1 SIMPLE t1 ref c,bd bd 10 const,const 2 Using where +#CREATE TABLE t2 ( a INT ) +#SELECT a +#FROM t1 +#WHERE c = 1 AND b = 1 AND d = 1; +#SELECT * FROM t2; +#a +#2 +#3 +#DROP TABLE t1, t2; +#CREATE TABLE t1( a INT, b INT, KEY(a), KEY(b) ); +#INSERT INTO t1 VALUES (1, 2), (1, 2), (1, 2), (1, 2); +#SELECT * FROM t1 FORCE INDEX(a, b) WHERE a = 1 AND b = 2; +#a b +#1 2 +#1 2 +#1 2 +#1 2 +#DROP TABLE t1; +## Code coverage of fix. +#CREATE TABLE t1 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT); +#INSERT INTO t1 (b) VALUES (1); +#UPDATE t1 SET b = 2 WHERE a = 1; +#SELECT * FROM t1; +#a b +#1 2 +#CREATE TABLE t2 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b VARCHAR(1) ); +#INSERT INTO t2 (b) VALUES ('a'); +#UPDATE t2 SET b = 'b' WHERE a = 1; +#SELECT * FROM t2; +#a b +#1 b +#DROP TABLE t1, t2; === modified file 'mysql-test/r/ctype_ucs.result' --- a/mysql-test/r/ctype_ucs.result 2010-08-19 11:55:35 +0000 +++ b/mysql-test/r/ctype_ucs.result 2010-10-06 12:15:59 +0000 @@ -3853,6 +3853,9 @@ GROUP_CONCAT(IFNULL(a,'')) SELECT GROUP_CONCAT(IF(a,a,'')) FROM t1; GROUP_CONCAT(IF(a,a,'')) 1234567 +SELECT GROUP_CONCAT(CASE WHEN a THEN a ELSE '' END) FROM t1; +GROUP_CONCAT(CASE WHEN a THEN a ELSE '' END) +1234567 SELECT COALESCE(a,'') FROM t1 GROUP BY 1; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def COALESCE(a,'') 253 9 7 Y 0 31 8 === modified file 'mysql-test/r/func_time.result' --- a/mysql-test/r/func_time.result 2010-09-09 12:02:02 +0000 +++ b/mysql-test/r/func_time.result 2010-10-07 07:07:56 +0000 @@ -1316,3 +1316,14 @@ SELECT 1 FROM t1 ORDER BY @x:=makedate(a 1 DROP TABLE t1; End of 5.1 tests +# +# Bug#57039: constant subtime expression returns incorrect result. +# +CREATE TABLE t1 (`date_date` datetime NOT NULL); +INSERT INTO t1 VALUES ('2008-01-03 00:00:00'), ('2008-01-03 00:00:00'); +SELECT * FROM t1 WHERE date_date >= subtime(now(), "00:30:00"); +date_date +SELECT * FROM t1 WHERE date_date <= addtime(date_add("2000-1-1", INTERVAL "1:1:1" HOUR_SECOND), "00:20:00"); +date_date +DROP TABLE t1; +# === modified file 'mysql-test/r/index_merge_myisam.result' --- a/mysql-test/r/index_merge_myisam.result 2010-09-16 12:20:35 +0000 +++ b/mysql-test/r/index_merge_myisam.result 2010-10-07 10:01:51 +0000 @@ -1156,6 +1156,61 @@ key1 key2 key3 38 38 38 39 39 39 drop table t1; +# +# Bug#56423: Different count with SELECT and CREATE SELECT queries +# +CREATE TABLE t1 ( +a INT, +b INT, +c INT, +d INT, +PRIMARY KEY (a), +KEY (c), +KEY bd (b,d) +); +INSERT INTO t1 VALUES +(1, 0, 1, 0), +(2, 1, 1, 1), +(3, 1, 1, 1), +(4, 0, 1, 1); +EXPLAIN +SELECT a +FROM t1 +WHERE c = 1 AND b = 1 AND d = 1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref c,bd bd 10 const,const 2 Using where +CREATE TABLE t2 ( a INT ) +SELECT a +FROM t1 +WHERE c = 1 AND b = 1 AND d = 1; +SELECT * FROM t2; +a +2 +3 +DROP TABLE t1, t2; +CREATE TABLE t1( a INT, b INT, KEY(a), KEY(b) ); +INSERT INTO t1 VALUES (1, 2), (1, 2), (1, 2), (1, 2); +SELECT * FROM t1 FORCE INDEX(a, b) WHERE a = 1 AND b = 2; +a b +1 2 +1 2 +1 2 +1 2 +DROP TABLE t1; +# Code coverage of fix. +CREATE TABLE t1 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT); +INSERT INTO t1 (b) VALUES (1); +UPDATE t1 SET b = 2 WHERE a = 1; +SELECT * FROM t1; +a b +1 2 +CREATE TABLE t2 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b VARCHAR(1) ); +INSERT INTO t2 (b) VALUES ('a'); +UPDATE t2 SET b = 'b' WHERE a = 1; +SELECT * FROM t2; +a b +1 b +DROP TABLE t1, t2; #---------------- 2-sweeps read Index merge test 2 ------------------------------- SET SESSION STORAGE_ENGINE = MyISAM; drop table if exists t1; === modified file 'mysql-test/suite/innodb/r/innodb-index.result' --- a/mysql-test/suite/innodb/r/innodb-index.result 2010-06-22 15:58:28 +0000 +++ b/mysql-test/suite/innodb/r/innodb-index.result 2010-10-07 11:00:22 +0000 @@ -918,9 +918,9 @@ ERROR HY000: Too big row alter table t1 row_format=compact; create index t1u on t1 (u(1)); drop table t1; -set global innodb_file_per_table=1; -set global innodb_file_format=Barracuda; -set global innodb_file_format_max=Barracuda; +set global innodb_file_per_table=0; +set global innodb_file_format=Antelope; +set global innodb_file_format_max=Antelope; SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; CREATE TABLE t1( === modified file 'mysql-test/suite/innodb/r/innodb-zip.result' --- a/mysql-test/suite/innodb/r/innodb-zip.result 2010-06-22 15:58:28 +0000 +++ b/mysql-test/suite/innodb/r/innodb-zip.result 2010-10-07 11:00:22 +0000 @@ -394,8 +394,8 @@ table_schema table_name row_format test t8 Compact test t9 Redundant drop table t8, t9; -set global innodb_file_per_table=1; -set global innodb_file_format=Barracuda; +set global innodb_file_per_table=0; +set global innodb_file_format=Antelope; set global innodb_file_per_table=on; set global innodb_file_format=`Barracuda`; set global innodb_file_format_max=`Antelope`; === modified file 'mysql-test/suite/innodb/r/innodb_bug52745.result' --- a/mysql-test/suite/innodb/r/innodb_bug52745.result 2010-06-17 20:51:35 +0000 +++ b/mysql-test/suite/innodb/r/innodb_bug52745.result 2010-10-07 11:00:22 +0000 @@ -125,6 +125,6 @@ Warning 1264 Out of range value for colu Warning 1265 Data truncated for column 'col79' at row 1 Warning 1264 Out of range value for column 'col84' at row 1 DROP TABLE bug52745; -SET GLOBAL innodb_file_format=Barracuda; +SET GLOBAL innodb_file_format=Antelope; SET GLOBAL innodb_file_format_max=Antelope; -SET GLOBAL innodb_file_per_table=1; +SET GLOBAL innodb_file_per_table=0; === modified file 'mysql-test/suite/innodb/r/innodb_bug53591.result' --- a/mysql-test/suite/innodb/r/innodb_bug53591.result 2010-06-17 20:51:35 +0000 +++ b/mysql-test/suite/innodb/r/innodb_bug53591.result 2010-10-07 11:00:22 +0000 @@ -11,6 +11,6 @@ Error 139 Too big row Error 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs Error 1030 Got error 139 from storage engine DROP TABLE bug53591; -SET GLOBAL innodb_file_format=Barracuda; +SET GLOBAL innodb_file_format=Antelope; SET GLOBAL innodb_file_format_max=Antelope; -SET GLOBAL innodb_file_per_table=1; +SET GLOBAL innodb_file_per_table=0; === modified file 'mysql-test/suite/innodb/r/innodb_file_format.result' --- a/mysql-test/suite/innodb/r/innodb_file_format.result 2010-06-17 20:51:35 +0000 +++ b/mysql-test/suite/innodb/r/innodb_file_format.result 2010-10-07 11:00:22 +0000 @@ -1,6 +1,6 @@ select @@innodb_file_format; @@innodb_file_format -Barracuda +Antelope select @@innodb_file_format_check; @@innodb_file_format_check 1 @@ -17,14 +17,14 @@ Barracuda set global innodb_file_format=default; select @@innodb_file_format; @@innodb_file_format -Barracuda +Antelope set global innodb_file_format=on; ERROR 42000: Variable 'innodb_file_format' can't be set to the value of 'ON' set global innodb_file_format=off; ERROR 42000: Variable 'innodb_file_format' can't be set to the value of 'off' select @@innodb_file_format; @@innodb_file_format -Barracuda +Antelope set global innodb_file_format_max=antelope; set global innodb_file_format_max=barracuda; set global innodb_file_format_max=cheetah; @@ -46,5 +46,5 @@ Antelope set global innodb_file_format_max=antelope; set global innodb_file_format_check=off; ERROR HY000: Variable 'innodb_file_format_check' is a read only variable -SET GLOBAL innodb_file_format=Barracuda; +SET GLOBAL innodb_file_format=Antelope; SET GLOBAL innodb_file_format_max=Antelope; === modified file 'mysql-test/suite/sys_vars/r/innodb_file_format_basic.result' --- a/mysql-test/suite/sys_vars/r/innodb_file_format_basic.result 2010-06-20 20:43:34 +0000 +++ b/mysql-test/suite/sys_vars/r/innodb_file_format_basic.result 2010-10-05 18:38:30 +0000 @@ -1,28 +1,28 @@ SET @start_global_value = @@global.innodb_file_format; SELECT @start_global_value; @start_global_value -Barracuda +Antelope Valid values are 'Antelope' and 'Barracuda' select @@global.innodb_file_format in ('Antelope', 'Barracuda'); @@global.innodb_file_format in ('Antelope', 'Barracuda') 1 select @@global.innodb_file_format; @@global.innodb_file_format -Barracuda +Antelope select @@session.innodb_file_format; ERROR HY000: Variable 'innodb_file_format' is a GLOBAL variable show global variables like 'innodb_file_format'; Variable_name Value -innodb_file_format Barracuda +innodb_file_format Antelope show session variables like 'innodb_file_format'; Variable_name Value -innodb_file_format Barracuda +innodb_file_format Antelope select * from information_schema.global_variables where variable_name='innodb_file_format'; VARIABLE_NAME VARIABLE_VALUE -INNODB_FILE_FORMAT Barracuda +INNODB_FILE_FORMAT Antelope select * from information_schema.session_variables where variable_name='innodb_file_format'; VARIABLE_NAME VARIABLE_VALUE -INNODB_FILE_FORMAT Barracuda +INNODB_FILE_FORMAT Antelope set global innodb_file_format='Antelope'; select @@global.innodb_file_format; @@global.innodb_file_format @@ -56,4 +56,4 @@ ERROR 42000: Variable 'innodb_file_forma SET @@global.innodb_file_format = @start_global_value; SELECT @@global.innodb_file_format; @@global.innodb_file_format -Barracuda +Antelope === modified file 'mysql-test/t/func_time.test' --- a/mysql-test/t/func_time.test 2010-08-16 07:11:57 +0000 +++ b/mysql-test/t/func_time.test 2010-10-07 07:07:56 +0000 @@ -833,3 +833,14 @@ SELECT 1 FROM t1 ORDER BY @x:=makedate(a DROP TABLE t1; --echo End of 5.1 tests + +--echo # +--echo # Bug#57039: constant subtime expression returns incorrect result. +--echo # +CREATE TABLE t1 (`date_date` datetime NOT NULL); +INSERT INTO t1 VALUES ('2008-01-03 00:00:00'), ('2008-01-03 00:00:00'); +SELECT * FROM t1 WHERE date_date >= subtime(now(), "00:30:00"); +SELECT * FROM t1 WHERE date_date <= addtime(date_add("2000-1-1", INTERVAL "1:1:1" HOUR_SECOND), "00:20:00"); +DROP TABLE t1; +--echo # + === modified file 'mysys/my_winfile.c' --- a/mysys/my_winfile.c 2009-12-10 03:19:51 +0000 +++ b/mysys/my_winfile.c 2010-10-05 12:18:16 +0000 @@ -97,7 +97,7 @@ HANDLE my_get_osfhandle(File fd) static int my_get_open_flags(File fd) { - DBUG_ENTER("my_get_osfhandle"); + DBUG_ENTER("my_get_open_flags"); DBUG_ASSERT(fd >= MY_FILE_MIN && fd < (int)my_file_limit); DBUG_RETURN(my_file_info[fd].oflag); } @@ -321,7 +321,7 @@ size_t my_win_pread(File Filedes, uchar if(lastError == ERROR_HANDLE_EOF || lastError == ERROR_BROKEN_PIPE) DBUG_RETURN(0); /*return 0 at EOF*/ my_osmaperr(lastError); - DBUG_RETURN(-1); + DBUG_RETURN((size_t)-1); } DBUG_RETURN(nBytesRead); } @@ -352,7 +352,7 @@ size_t my_win_read(File Filedes, uchar * if(lastError == ERROR_HANDLE_EOF || lastError == ERROR_BROKEN_PIPE) DBUG_RETURN(0); /*return 0 at EOF*/ my_osmaperr(lastError); - DBUG_RETURN(-1); + DBUG_RETURN((size_t)-1); } DBUG_RETURN(nBytesRead); } @@ -386,7 +386,7 @@ size_t my_win_pwrite(File Filedes, const if(!WriteFile(hFile, Buffer, (DWORD)Count, &nBytesWritten, &ov)) { my_osmaperr(GetLastError()); - DBUG_RETURN(-1); + DBUG_RETURN((size_t)-1); } else DBUG_RETURN(nBytesWritten); @@ -427,6 +427,15 @@ size_t my_win_write(File fd, const uchar DBUG_ENTER("my_win_write"); DBUG_PRINT("my",("Filedes: %d, Buffer: %p, Count %llu", fd, Buffer, (ulonglong)Count)); + + if(!Count) + DBUG_RETURN(0); + +#ifdef _WIN64 + if(Count > UINT_MAX) + Count= UINT_MAX; +#endif + if(my_get_open_flags(fd) & _O_APPEND) { /* @@ -442,10 +451,10 @@ size_t my_win_write(File fd, const uchar hFile= my_get_osfhandle(fd); if(!WriteFile(hFile, Buffer, (DWORD)Count, &nWritten, pov)) { - nWritten= (size_t)-1; my_osmaperr(GetLastError()); + DBUG_RETURN((size_t)-1); } - DBUG_RETURN((size_t)nWritten); + DBUG_RETURN(nWritten); } === modified file 'sql/item_cmpfunc.cc' --- a/sql/item_cmpfunc.cc 2010-09-24 13:18:45 +0000 +++ b/sql/item_cmpfunc.cc 2010-10-06 12:15:59 +0000 @@ -3029,6 +3029,14 @@ void Item_func_case::fix_length_and_dec( { if (agg_arg_charsets_for_string_result(collation, agg, nagg)) return; + /* + Copy all THEN and ELSE items back to args[] array. + Some of the items might have been changed to Item_func_conv_charset. + */ + for (nagg= 0 ; nagg < ncases / 2 ; nagg++) + args[nagg * 2 + 1]= agg[nagg]; + if (else_expr_num != -1) + args[else_expr_num]= agg[nagg++]; } else collation.set_numeric(); === modified file 'sql/item_timefunc.cc' --- a/sql/item_timefunc.cc 2010-10-01 20:12:27 +0000 +++ b/sql/item_timefunc.cc 2010-10-07 08:17:08 +0000 @@ -2857,10 +2857,11 @@ void Item_func_add_time::fix_length_and_ Result: Time value or datetime value */ -String *Item_func_add_time::val_str(String *str) +MYSQL_TIME *Item_func_add_time::val_datetime(MYSQL_TIME *time, + date_time_format_types *format) { DBUG_ASSERT(fixed == 1); - MYSQL_TIME l_time1, l_time2, l_time3; + MYSQL_TIME l_time1, l_time2; bool is_time= 0; long days, microseconds; longlong seconds; @@ -2886,41 +2887,38 @@ String *Item_func_add_time::val_str(Stri if (l_time1.neg != l_time2.neg) l_sign= -l_sign; - bzero((char *)&l_time3, sizeof(l_time3)); + bzero((char *)time, sizeof(MYSQL_TIME)); - l_time3.neg= calc_time_diff(&l_time1, &l_time2, -l_sign, - &seconds, µseconds); + time->neg= calc_time_diff(&l_time1, &l_time2, -l_sign, + &seconds, µseconds); /* If first argument was negative and diff between arguments is non-zero we need to swap sign to get proper result. */ if (l_time1.neg && (seconds || microseconds)) - l_time3.neg= 1-l_time3.neg; // Swap sign of result + time->neg= 1 - time->neg; // Swap sign of result - if (!is_time && l_time3.neg) + if (!is_time && time->neg) goto null_date; days= (long)(seconds/86400L); - calc_time_from_sec(&l_time3, (long)(seconds%86400L), microseconds); + calc_time_from_sec(time, (long)(seconds%86400L), microseconds); if (!is_time) { - get_date_from_daynr(days,&l_time3.year,&l_time3.month,&l_time3.day); - if (l_time3.day && - !make_datetime(l_time1.second_part || l_time2.second_part ? - DATE_TIME_MICROSECOND : DATE_TIME, - &l_time3, str)) - return str; + get_date_from_daynr(days, &time->year, &time->month, &time->day); + *format= l_time1.second_part || l_time2.second_part ? + DATE_TIME_MICROSECOND : DATE_TIME; + if (time->day) + return time; goto null_date; } - - l_time3.hour+= days*24; - if (!make_datetime_with_warn(l_time1.second_part || l_time2.second_part ? - TIME_MICROSECOND : TIME_ONLY, - &l_time3, str)) - return str; + *format= l_time1.second_part || l_time2.second_part ? + TIME_MICROSECOND : TIME_ONLY; + time->hour+= days*24; + return time; null_date: null_value=1; @@ -2928,6 +2926,38 @@ null_date: } +String *Item_func_add_time::val_str(String *str) +{ + MYSQL_TIME ltime; + date_time_format_types format; + + val_datetime(<ime, &format); + + if (null_value) + return 0; + + if (!make_datetime_with_warn(format, <ime, str)) + return str; + + null_value= 1; + return 0; +} + + +longlong Item_func_add_time::val_int() +{ + MYSQL_TIME ltime; + date_time_format_types format; + + val_datetime(<ime, &format); + + if (null_value) + return 0; + + return TIME_to_ulonglong_datetime(<ime); +} + + void Item_func_add_time::print(String *str, enum_query_type query_type) { if (is_date) === modified file 'sql/item_timefunc.h' --- a/sql/item_timefunc.h 2010-10-01 20:12:27 +0000 +++ b/sql/item_timefunc.h 2010-10-07 08:17:08 +0000 @@ -948,6 +948,8 @@ public: return save_date_in_field(field); return Item_str_func::save_in_field(field, no_conversions); } + longlong val_int(); + MYSQL_TIME *val_datetime(MYSQL_TIME *time, date_time_format_types *format); }; class Item_func_timediff :public Item_str_timefunc === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2010-10-04 12:42:16 +0000 +++ b/sql/mysqld.cc 2010-10-06 15:06:13 +0000 @@ -265,6 +265,8 @@ extern "C" sig_handler handle_segfault(i /* Constants */ +#include // ORACLE_WELCOME_COPYRIGHT_NOTICE + const char *show_comp_option_name[]= {"YES", "NO", "DISABLED"}; static const char *tc_heuristic_recover_names[]= @@ -6593,13 +6595,8 @@ static void usage(void) if (!default_collation_name) default_collation_name= (char*) default_charset_info->name; print_version(); - puts("\ -Copyright (C) 2000-2008 MySQL AB, by Monty and others.\n\ -Copyright (C) 2008,2009 Sun Microsystems, Inc.\n\ -This software comes with ABSOLUTELY NO WARRANTY. This is free software,\n\ -and you are welcome to modify and redistribute it under the GPL license\n\n\ -Starts the MySQL database server.\n"); - + puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2010")); + puts("Starts the MySQL database server.\n"); printf("Usage: %s [OPTIONS]\n", my_progname); if (!opt_verbose) puts("\nFor more help options (several pages), use mysqld --verbose --help."); === modified file 'sql/sql_insert.cc' --- a/sql/sql_insert.cc 2010-10-04 12:42:16 +0000 +++ b/sql/sql_insert.cc 2010-10-07 10:01:51 +0000 @@ -1620,9 +1620,7 @@ int write_record(THD *thd, TABLE *table, table->file->adjust_next_insert_id_after_explicit_value( table->next_number_field->val_int()); info->touched++; - if ((table->file->ha_table_flags() & HA_PARTIAL_COLUMN_READ && - !bitmap_is_subset(table->write_set, table->read_set)) || - compare_record(table)) + if (!records_are_comparable(table) || compare_records(table)) { if ((error=table->file->ha_update_row(table->record[1], table->record[0])) && === modified file 'sql/sql_update.cc' --- a/sql/sql_update.cc 2010-08-09 12:11:29 +0000 +++ b/sql/sql_update.cc 2010-10-07 10:01:51 +0000 @@ -42,11 +42,68 @@ // mysql_handle_derived, // mysql_derived_filling -/* Return 0 if row hasn't changed */ -bool compare_record(TABLE *table) +/** + True if the table's input and output record buffers are comparable using + compare_records(TABLE*). + */ +bool records_are_comparable(const TABLE *table) { + return ((table->file->ha_table_flags() & HA_PARTIAL_COLUMN_READ) == 0) || + bitmap_is_subset(table->write_set, table->read_set); +} + + +/** + Compares the input and outbut record buffers of the table to see if a row + has changed. The algorithm iterates over updated columns and if they are + nullable compares NULL bits in the buffer before comparing actual + data. Special care must be taken to compare only the relevant NULL bits and + mask out all others as they may be undefined. The storage engine will not + and should not touch them. + + @param table The table to evaluate. + + @return true if row has changed. + @return false otherwise. +*/ +bool compare_records(const TABLE *table) { + DBUG_ASSERT(records_are_comparable(table)); + + if ((table->file->ha_table_flags() & HA_PARTIAL_COLUMN_READ) != 0) + { + /* + Storage engine may not have read all columns of the record. Fields + (including NULL bits) not in the write_set may not have been read and + can therefore not be compared. + */ + for (Field **ptr= table->field ; *ptr != NULL; ptr++) + { + Field *field= *ptr; + if (bitmap_is_set(table->write_set, field->field_index)) + { + if (field->real_maybe_null()) + { + uchar null_byte_index= field->null_ptr - table->record[0]; + + if (((table->record[0][null_byte_index]) & field->null_bit) != + ((table->record[1][null_byte_index]) & field->null_bit)) + return TRUE; + } + if (field->cmp_binary_offset(table->s->rec_buff_length)) + return TRUE; + } + } + return FALSE; + } + + /* + The storage engine has read all columns, so it's safe to compare all bits + including those not in the write_set. This is cheaper than the field-by-field + comparison done above. + */ if (table->s->blob_fields + table->s->varchar_fields == 0) + // Fixed-size record: do bitwise comparison of the records return cmp_record(table,record[1]); /* Compare null bits */ if (memcmp(table->null_flags, @@ -204,7 +261,6 @@ int mysql_update(THD *thd, bool using_limit= limit != HA_POS_ERROR; bool safe_update= test(thd->variables.option_bits & OPTION_SAFE_UPDATES); bool used_key_is_modified= FALSE, transactional_table, will_batch; - bool can_compare_record; int res; int error, loc_error; uint used_index, dup_key_found; @@ -579,15 +635,6 @@ int mysql_update(THD *thd, if (table->file->ha_table_flags() & HA_PARTIAL_COLUMN_READ) table->prepare_for_position(); - /* - We can use compare_record() to optimize away updates if - the table handler is returning all columns OR if - if all updated columns are read - */ - can_compare_record= (!(table->file->ha_table_flags() & - HA_PARTIAL_COLUMN_READ) || - bitmap_is_subset(table->write_set, table->read_set)); - while (!(error=info.read_record(&info)) && !thd->killed) { thd->examined_row_count++; @@ -605,7 +652,7 @@ int mysql_update(THD *thd, found++; - if (!can_compare_record || compare_record(table)) + if (!records_are_comparable(table) || compare_records(table)) { if ((res= table_list->view_check_option(thd, ignore)) != VIEW_CHECK_OK) @@ -1645,18 +1692,8 @@ bool multi_update::send_data(List if (table->status & (STATUS_NULL_ROW | STATUS_UPDATED)) continue; - /* - We can use compare_record() to optimize away updates if - the table handler is returning all columns OR if - if all updated columns are read - */ if (table == table_to_update) { - bool can_compare_record; - can_compare_record= (!(table->file->ha_table_flags() & - HA_PARTIAL_COLUMN_READ) || - bitmap_is_subset(table->write_set, - table->read_set)); table->status|= STATUS_UPDATED; store_record(table,record[1]); if (fill_record_n_invoke_before_triggers(thd, *fields_for_table[offset], @@ -1671,7 +1708,7 @@ bool multi_update::send_data(List */ table->auto_increment_field_not_null= FALSE; found++; - if (!can_compare_record || compare_record(table)) + if (!records_are_comparable(table) || compare_records(table)) { int error; if ((error= cur_table->view_check_option(thd, ignore)) != @@ -1860,7 +1897,6 @@ int multi_update::do_updates() DBUG_RETURN(0); for (cur_table= update_tables; cur_table; cur_table= cur_table->next_local) { - bool can_compare_record; uint offset= cur_table->shared; table = cur_table->table; @@ -1897,11 +1933,6 @@ int multi_update::do_updates() if ((local_error = tmp_table->file->ha_rnd_init(1))) goto err; - can_compare_record= (!(table->file->ha_table_flags() & - HA_PARTIAL_COLUMN_READ) || - bitmap_is_subset(table->write_set, - table->read_set)); - for (;;) { if (thd->killed && trans_safe) @@ -1942,7 +1973,7 @@ int multi_update::do_updates() TRG_ACTION_BEFORE, TRUE)) goto err2; - if (!can_compare_record || compare_record(table)) + if (!records_are_comparable(table) || compare_records(table)) { int error; if ((error= cur_table->view_check_option(thd, ignore)) != === modified file 'sql/sql_update.h' --- a/sql/sql_update.h 2010-04-12 13:17:37 +0000 +++ b/sql/sql_update.h 2010-10-07 10:01:51 +0000 @@ -38,6 +38,7 @@ bool mysql_multi_update(THD *thd, TABLE_ enum enum_duplicates handle_duplicates, bool ignore, SELECT_LEX_UNIT *unit, SELECT_LEX *select_lex, multi_update **result); -bool compare_record(TABLE *table); +bool records_are_comparable(const TABLE *table); +bool compare_records(const TABLE *table); #endif /* SQL_UPDATE_INCLUDED */ === modified file 'storage/innobase/handler/ha_innodb.cc' --- a/storage/innobase/handler/ha_innodb.cc 2010-10-06 14:34:28 +0000 +++ b/storage/innobase/handler/ha_innodb.cc 2010-10-07 12:12:33 +0000 @@ -10892,13 +10892,13 @@ static MYSQL_SYSVAR_ULONG(fast_shutdown, static MYSQL_SYSVAR_BOOL(file_per_table, srv_file_per_table, PLUGIN_VAR_NOCMDARG, "Stores each InnoDB table to an .ibd file in the database dir.", - NULL, NULL, TRUE); + NULL, NULL, FALSE); static MYSQL_SYSVAR_STR(file_format, innobase_file_format_name, PLUGIN_VAR_RQCMDARG, "File format to use for new tables in .ibd files.", innodb_file_format_name_validate, - innodb_file_format_name_update, "Barracuda"); + innodb_file_format_name_update, "Antelope"); /* "innobase_file_format_check" decides whether we would continue booting the server if the file format stamped on the system === modified file 'storage/innobase/row/row0sel.c' --- a/storage/innobase/row/row0sel.c 2010-10-04 11:53:20 +0000 +++ b/storage/innobase/row/row0sel.c 2010-10-07 10:01:51 +0000 @@ -2688,12 +2688,6 @@ row_sel_store_mysql_rec( prebuilt->blob_heap = NULL; } - /* init null bytes with default values as they might be - left uninitialized in some cases and these uninited bytes - might be copied into mysql record buffer that leads to - valgrind warnings */ - memcpy(mysql_rec, prebuilt->default_rec, prebuilt->null_bitmap_len); - for (i = 0; i < prebuilt->n_template; i++) { templ = prebuilt->mysql_template + i; === renamed file 'config/ac-macros/ha_ndbcluster.m4' => 'storage/ndb/ndb_configure.m4' --- a/config/ac-macros/ha_ndbcluster.m4 2010-08-06 12:59:38 +0000 +++ b/storage/ndb/ndb_configure.m4 2010-10-07 09:13:30 +0000 @@ -2,10 +2,16 @@ dnl ------------------------------------ dnl Macro: MYSQL_CHECK_NDBCLUSTER dnl --------------------------------------------------------------------------- -NDB_VERSION_MAJOR=`echo $MYSQL_NUMERIC_VERSION | cut -d. -f1` -NDB_VERSION_MINOR=`echo $MYSQL_NUMERIC_VERSION | cut -d. -f2` -NDB_VERSION_BUILD=`echo $MYSQL_NUMERIC_VERSION | cut -d. -f3` -NDB_VERSION_STATUS=`echo $VERSION | sed 's/^[[-.0-9]]*//'` +# The version of NDB in this version of MySQL is currently fixed +# and not supposed to be changed unless major changes happen in +# storage/ndb directory. +# NOTE! To avoid mixup with MySQL Cluster's version numbers +# this version of NDB is set to 5.5.7 although it's basically +# a copy of MySQL Cluster 6.2.18 +NDB_VERSION_MAJOR=5 +NDB_VERSION_MINOR=5 +NDB_VERSION_BUILD=7 +NDB_VERSION_STATUS="" TEST_NDBCLUSTER="" dnl for build ndb docs === modified file 'storage/ndb/plug.in' --- a/storage/ndb/plug.in 2006-08-19 04:19:19 +0000 +++ b/storage/ndb/plug.in 2010-10-07 09:02:16 +0000 @@ -1,3 +1,5 @@ +sinclude(storage/ndb/ndb_configure.m4) + MYSQL_STORAGE_ENGINE(ndbcluster, ndbcluster, [Cluster Storage Engine], [High Availability Clustered tables], [max]) MYSQL_PLUGIN_DIRECTORY(ndbcluster,[storage/ndb]) --===============7788952306198851444== 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: 94113aff866140f6bdfd3361fbd2d855d33a9ca2 # timestamp: 2010-10-07 15:33:42 +0200 # source_branch: file:///export/home/x/mysql-5.5-bugfixing/ # base_revision_id: dmitry.shulga@stripped\ # 6a2bdjopva0s65jl # # Begin bundle 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 --===============7788952306198851444==--