List:Commits« Previous MessageNext Message »
From:Alexey Kopytov Date:March 7 2010 4:42pm
Subject:bzr push into mysql-trunk branch (Alexey.Kopytov:2985 to 2986)
View as plain text  
 2986 Alexey Kopytov	2010-03-07 [merge]
      Manual merge of mysql-5.1-bugteam into mysql-trunk-merge.
      
      Conflicts:
      
      Text conflict in .bzr-mysql/default.conf
      Text conflict in mysql-test/r/explain.result
      Text conflict in mysql-test/r/having.result
      Text conflict in mysql-test/suite/rpl/t/disabled.def
      Text conflict in mysql-test/suite/rpl/t/rpl_slave_skip.test
      Text conflict in storage/federated/ha_federated.cc

    added:
      mysql-test/r/log_tables_upgrade.result
      mysql-test/std_data/bug49823.CSM
      mysql-test/std_data/bug49823.CSV
      mysql-test/std_data/bug49823.frm
      mysql-test/suite/rpl/r/rpl_show_slave_running.result
      mysql-test/suite/rpl/t/rpl_show_slave_running.test
      mysql-test/t/log_tables_upgrade.test
    modified:
      include/my_sys.h
      libmysql/libmysql.c
      mysql-test/collections/default.daily
      mysql-test/collections/default.push
      mysql-test/r/explain.result
      mysql-test/r/func_str.result
      mysql-test/r/having.result
      mysql-test/r/innodb_mysql.result
      mysql-test/r/myisam.result
      mysql-test/r/select.result
      mysql-test/r/subselect.result
      mysql-test/r/union.result
      mysql-test/suite/federated/federated.result
      mysql-test/suite/federated/federated.test
      mysql-test/suite/rpl/r/rpl_row_create_table.result
      mysql-test/suite/rpl/t/disabled.def
      mysql-test/suite/rpl/t/rpl_row_create_table.test
      mysql-test/suite/rpl/t/rpl_slave_skip.test
      mysql-test/t/explain.test
      mysql-test/t/innodb_mysql.test
      mysql-test/t/myisam.test
      mysql-test/t/mysql_upgrade.test
      mysys/charset.c
      mysys/my_init.c
      scripts/mysql_system_tables_fix.sql
      sql/item.cc
      sql/mysqld.cc
      sql/slave.cc
      sql/sql_select.cc
      sql/sql_table.cc
      storage/federated/ha_federated.cc
      storage/federated/ha_federated.h
 2985 Alexander Nozdrin	2010-03-02
      Remove test from experimental because Bug 45578 and 46010 are fixed.

    modified:
      mysql-test/collections/default.experimental
=== modified file 'include/my_sys.h'
--- a/include/my_sys.h	2009-12-16 13:47:07 +0000
+++ b/include/my_sys.h	2010-03-07 16:40:59 +0000
@@ -977,7 +977,7 @@ extern my_bool resolve_charset(const cha
 extern my_bool resolve_collation(const char *cl_name,
                                  CHARSET_INFO *default_cl,
                                  CHARSET_INFO **cl);
-
+extern void free_charsets(void);
 extern char *get_charsets_dir(char *buf);
 extern my_bool my_charset_same(CHARSET_INFO *cs1, CHARSET_INFO *cs2);
 extern my_bool init_compiled_charsets(myf flags);

=== modified file 'libmysql/libmysql.c'
--- a/libmysql/libmysql.c	2009-12-23 13:42:05 +0000
+++ b/libmysql/libmysql.c	2010-03-07 16:40:59 +0000
@@ -211,6 +211,7 @@ void STDCALL mysql_server_end()
   }
   else
   {
+    free_charsets();
     mysql_thread_end();
   }
 

=== modified file 'mysql-test/collections/default.daily'
--- a/mysql-test/collections/default.daily	2009-08-12 15:10:15 +0000
+++ b/mysql-test/collections/default.daily	2010-03-02 12:43:21 +0000
@@ -1 +1,7 @@
 perl mysql-test-run.pl --timer --force --comment=rpl_ndb_row --vardir=var-rpl_ndb_row --suite=rpl_ndb,ndb --mysqld=--binlog-format=row --experimental=collections/default.experimental
+
+perl mysql-test-run.pl --timer --force --parallel=auto --comment=n_mix --vardir=var-n_mix --mysqld=--binlog-format=mixed --experimental=collections/default.experimental
+perl mysql-test-run.pl --timer --force --parallel=auto --comment=ps_row --vardir=var-ps_row --ps-protocol --mysqld=--binlog-format=row --experimental=collections/default.experimental
+perl mysql-test-run.pl --timer --force --parallel=auto --comment=embedded --vardir=var-emebbed  --embedded --experimental=collections/default.experimental
+perl mysql-test-run.pl --timer --force --parallel=auto --comment=rpl_binlog_row --vardir=var-rpl_binlog_row  --suite=rpl,binlog --mysqld=--binlog-format=row --experimental=collections/default.experimental
+perl mysql-test-run.pl --timer --force --parallel=auto --comment=funcs_1 --vardir=var-funcs_1 --suite=funcs_1 --experimental=collections/default.experimental

=== modified file 'mysql-test/collections/default.push'
--- a/mysql-test/collections/default.push	2009-08-12 15:10:15 +0000
+++ b/mysql-test/collections/default.push	2010-03-02 12:43:21 +0000
@@ -1,5 +1,5 @@
-perl mysql-test-run.pl --timer --force --parallel=auto --comment=n_mix --vardir=var-n_mix --mysqld=--binlog-format=mixed --experimental=collections/default.experimental
-perl mysql-test-run.pl --timer --force --parallel=auto --comment=ps_row --vardir=var-ps_row --ps-protocol --mysqld=--binlog-format=row --experimental=collections/default.experimental
-perl mysql-test-run.pl --timer --force --parallel=auto --comment=embedded --vardir=var-emebbed  --embedded --experimental=collections/default.experimental
-perl mysql-test-run.pl --timer --force --parallel=auto --comment=rpl_binlog_row --vardir=var-rpl_binlog_row  --suite=rpl,binlog --mysqld=--binlog-format=row --experimental=collections/default.experimental
-perl mysql-test-run.pl --timer --force --parallel=auto --comment=funcs_1 --vardir=var-funcs_1 --suite=funcs_1 --experimental=collections/default.experimental
+perl mysql-test-run.pl --timer --force --parallel=auto --comment=n_mix --vardir=var-n_mix --mysqld=--binlog-format=mixed --experimental=collections/default.experimental --skip-ndb
+perl mysql-test-run.pl --timer --force --parallel=auto --comment=ps_row --vardir=var-ps_row --ps-protocol --mysqld=--binlog-format=row --experimental=collections/default.experimental --skip-ndb
+perl mysql-test-run.pl --timer --force --parallel=auto --comment=embedded --vardir=var-emebbed  --embedded --experimental=collections/default.experimental --skip-ndb
+perl mysql-test-run.pl --timer --force --parallel=auto --comment=rpl_binlog_row --vardir=var-rpl_binlog_row  --suite=rpl,binlog --mysqld=--binlog-format=row --experimental=collections/default.experimental --skip-ndb
+perl mysql-test-run.pl --timer --force --parallel=auto --comment=funcs_1 --vardir=var-funcs_1 --suite=funcs_1 --experimental=collections/default.experimental --skip-ndb

=== modified file 'mysql-test/r/explain.result'
--- a/mysql-test/r/explain.result	2009-12-11 09:39:38 +0000
+++ b/mysql-test/r/explain.result	2010-03-07 16:40:59 +0000
@@ -168,6 +168,23 @@ WHERE t1.a = d1.a;
 ERROR 42S22: Unknown column 'd1.a' in 'where clause'
 DROP TABLE t1;
 #
+# Bug#48295:
+# explain extended crash with subquery and ONLY_FULL_GROUP_BY sql_mode
+#
+CREATE TABLE t1 (f1 INT);
+SELECT @@session.sql_mode INTO @old_sql_mode;
+SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
+EXPLAIN EXTENDED SELECT 1 FROM t1
+WHERE f1 > ALL( SELECT t.f1 FROM t1,t1 AS t );
+ERROR 42000: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
+SHOW WARNINGS;
+Level	Code	Message
+Error	1140	Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
+Note	1003	select 1 AS `1` from `test`.`t1` where <not>(<exists>(...))
+SET SESSION sql_mode=@old_sql_mode;
+DROP TABLE t1;
+End of 5.0 tests.
+#
 # Bug#37870: Usage of uninitialized value caused failed assertion.
 #
 create table t1 (dt datetime not null, t time not null);
@@ -195,21 +212,20 @@ dt
 2001-01-01 01:01:01
 drop tables t1, t2;
 #
-# Bug#48295:
-# explain extended crash with subquery and ONLY_FULL_GROUP_BY sql_mode
+# Bug#47669: Query showed by EXPLAIN EXTENDED gives different result from original query
 #
-CREATE TABLE t1 (f1 INT);
-SELECT @@session.sql_mode INTO @old_sql_mode;
-SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
-EXPLAIN EXTENDED SELECT 1 FROM t1
-WHERE f1 > ALL( SELECT t.f1 FROM t1,t1 AS t );
-ERROR 42000: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
-SHOW WARNINGS;
-Level	Code	Message
-Error	1140	Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
-Note	1003	select 1 AS `1` from `test`.`t1` where <not>(<exists>(...))
-SET SESSION sql_mode=@old_sql_mode;
-DROP TABLE t1;
+CREATE TABLE t1 (c int);
+INSERT INTO t1 VALUES (NULL);
+CREATE TABLE t2 (d int);
+INSERT INTO t2 VALUES (NULL), (0);
+EXPLAIN EXTENDED SELECT (SELECT 1 FROM t2 WHERE d = c) FROM t1;
+id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
+1	PRIMARY	t1	system	NULL	NULL	NULL	NULL	1	100.00	
+2	DEPENDENT SUBQUERY	t2	ALL	NULL	NULL	NULL	NULL	2	100.00	Using where
+Warnings:
+Note	1276	Field or reference 'test.t1.c' of SELECT #2 was resolved in SELECT #1
+Note	1003	select (select 1 AS `1` from `test`.`t2` where (`test`.`t2`.`d` = NULL)) AS `(SELECT 1 FROM t2 WHERE d = c)` from dual
+DROP TABLE t1, t2;
 #
 # Bug#30302: Tables that were optimized away are printed in the
 #            EXPLAIN EXTENDED warning.

=== modified file 'mysql-test/r/func_str.result'
--- a/mysql-test/r/func_str.result	2009-12-11 16:40:58 +0000
+++ b/mysql-test/r/func_str.result	2010-03-07 16:40:59 +0000
@@ -1310,12 +1310,12 @@ explain extended select encode(f1,'zxcv'
 id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 1	SIMPLE	t1	system	NULL	NULL	NULL	NULL	0	0.00	const row not found
 Warnings:
-Note	1003	select encode('','zxcv') AS `enc` from `test`.`t1`
+Note	1003	select encode(NULL,'zxcv') AS `enc` from `test`.`t1`
 explain extended select decode(f1,'zxcv') as 'enc' from t1;
 id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 1	SIMPLE	t1	system	NULL	NULL	NULL	NULL	0	0.00	const row not found
 Warnings:
-Note	1003	select decode('','zxcv') AS `enc` from `test`.`t1`
+Note	1003	select decode(NULL,'zxcv') AS `enc` from `test`.`t1`
 drop table t1;
 create table t1 (a bigint not null)engine=myisam;
 insert into t1 set a = 1024*1024*1024*4;

=== modified file 'mysql-test/r/having.result'
--- a/mysql-test/r/having.result	2010-02-26 13:06:31 +0000
+++ b/mysql-test/r/having.result	2010-03-07 16:40:59 +0000
@@ -12,7 +12,7 @@ explain extended select count(a) as b fr
 id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 1	SIMPLE	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	Impossible WHERE noticed after reading const tables
 Warnings:
-Note	1003	select count('0') AS `b` from dual where 0 having (`b` >= 0)
+Note	1003	select count(NULL) AS `b` from dual where 0 having (`b` >= 0)
 drop table t1;
 CREATE TABLE t1 (
 raw_id int(10) NOT NULL default '0',

=== modified file 'mysql-test/r/innodb_mysql.result'
--- a/mysql-test/r/innodb_mysql.result	2010-02-26 13:06:31 +0000
+++ b/mysql-test/r/innodb_mysql.result	2010-03-07 16:40:59 +0000
@@ -2295,6 +2295,28 @@ id	select_type	table	type	possible_keys	
 1	SIMPLE	t2	ref	f1	f1	4	test.t1.f1	1	Using index
 drop table t1,t2;
 #
+#
+# Bug #39653: find_shortest_key in sql_select.cc does not consider
+#             clustered primary keys
+#
+CREATE TABLE t1 (a INT PRIMARY KEY, b INT, c INT, d INT, e INT, f INT,
+KEY (b,c)) ENGINE=INNODB;
+INSERT INTO t1 VALUES (1,1,1,1,1,1), (2,2,2,2,2,2), (3,3,3,3,3,3),
+(4,4,4,4,4,4), (5,5,5,5,5,5), (6,6,6,6,6,6),
+(7,7,7,7,7,7), (8,8,8,8,8,8), (9,9,9,9,9,9),
+(11,11,11,11,11,11);
+EXPLAIN SELECT COUNT(*) FROM t1;
+id	1
+select_type	SIMPLE
+table	t1
+type	index
+possible_keys	NULL
+key	b
+key_len	10
+ref	NULL
+rows	10
+Extra	Using index
+DROP TABLE t1;
 End of 5.1 tests
 #
 # Test for bug #39932 "create table fails if column for FK is in different

=== added file 'mysql-test/r/log_tables_upgrade.result'
--- a/mysql-test/r/log_tables_upgrade.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/r/log_tables_upgrade.result	2010-02-26 12:22:48 +0000
@@ -0,0 +1,47 @@
+#
+# Bug#49823: mysql_upgrade fatal error due to general_log / slow_low CSV NULL
+#
+USE test;
+SET @saved_general_log = @@GLOBAL.general_log;
+SET GLOBAL general_log = OFF;
+USE mysql;
+FLUSH TABLES;
+REPAIR TABLE test.bug49823;
+Table	Op	Msg_type	Msg_text
+test.bug49823	repair	status	OK
+RENAME TABLE general_log TO renamed_general_log;
+RENAME TABLE test.bug49823 TO general_log;
+mtr.global_suppressions                            OK
+mtr.test_suppressions                              OK
+mysql.columns_priv                                 OK
+mysql.db                                           OK
+mysql.event                                        OK
+mysql.func                                         OK
+mysql.general_log
+Error    : You can't use locks with log tables.
+status   : OK
+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.renamed_general_log                          OK
+mysql.servers                                      OK
+mysql.slow_log
+Error    : You can't use locks with log tables.
+status   : OK
+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
+DROP TABLE general_log;
+RENAME TABLE renamed_general_log TO general_log;
+SET GLOBAL general_log = @saved_general_log;
+USE test;

=== modified file 'mysql-test/r/myisam.result'
--- a/mysql-test/r/myisam.result	2010-02-12 12:47:43 +0000
+++ b/mysql-test/r/myisam.result	2010-02-28 17:29:19 +0000
@@ -2339,4 +2339,21 @@ CHECK TABLE t1;
 Table	Op	Msg_type	Msg_text
 test.t1	check	status	OK
 DROP TABLE t1;
+#
+# Bug#51304: checksum table gives different results
+# for same data when using bit fields
+#
+CREATE TABLE t1(a INT, b BIT(1));
+INSERT INTO t1 VALUES(1, 0), (2, 1);
+CREATE TABLE t2 SELECT * FROM t1;
+CHECKSUM TABLE t1 EXTENDED;
+Table	Checksum
+test.t1	3775188275
+CHECKSUM TABLE t2 EXTENDED;
+Table	Checksum
+test.t2	3775188275
+CHECKSUM TABLE t3 EXTENDED;
+Table	Checksum
+test.t3	3775188275
+DROP TABLE t1, t2, t3;
 End of 5.1 tests

=== modified file 'mysql-test/r/select.result'
--- a/mysql-test/r/select.result	2010-03-01 09:02:15 +0000
+++ b/mysql-test/r/select.result	2010-03-07 16:40:59 +0000
@@ -4050,10 +4050,10 @@ join_0.c1;
 id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 1	SIMPLE	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	Impossible WHERE noticed after reading const tables
 Warnings:
-Note	1003	select '0' AS `c1` from `test`.`t1` `join_0` join `test`.`t1` `join_1` join `test`.`t1` `join_2` join `test`.`t1` `join_3` join `test`.`t1` `join_4` join `test`.`t1` `join_5` join `test`.`t1` `join_6` join `test`.`t1` `join_7` where 0 group by '0','0','0','0','0'
+Note	1003	select NULL AS `c1` from `test`.`t1` `join_0` join `test`.`t1` `join_1` join `test`.`t1` `join_2` join `test`.`t1` `join_3` join `test`.`t1` `join_4` join `test`.`t1` `join_5` join `test`.`t1` `join_6` join `test`.`t1` `join_7` where 0 group by NULL,NULL,NULL,NULL,NULL
 SHOW WARNINGS;
 Level	Code	Message
-Note	1003	select '0' AS `c1` from `test`.`t1` `join_0` join `test`.`t1` `join_1` join `test`.`t1` `join_2` join `test`.`t1` `join_3` join `test`.`t1` `join_4` join `test`.`t1` `join_5` join `test`.`t1` `join_6` join `test`.`t1` `join_7` where 0 group by '0','0','0','0','0'
+Note	1003	select NULL AS `c1` from `test`.`t1` `join_0` join `test`.`t1` `join_1` join `test`.`t1` `join_2` join `test`.`t1` `join_3` join `test`.`t1` `join_4` join `test`.`t1` `join_5` join `test`.`t1` `join_6` join `test`.`t1` `join_7` where 0 group by NULL,NULL,NULL,NULL,NULL
 DROP TABLE t1;
 SELECT 1 AS ` `;
 
@@ -4648,17 +4648,17 @@ EXPLAIN EXTENDED SELECT * FROM t1 WHERE 
 id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 1	SIMPLE	t1	system	NULL	NULL	NULL	NULL	0	0.00	const row not found
 Warnings:
-Note	1003	select '0' AS `a`,'0' AS `b`,'0' AS `c` from `test`.`t1` where 1
+Note	1003	select NULL AS `a`,NULL AS `b`,NULL AS `c` from `test`.`t1` where 1
 EXPLAIN EXTENDED SELECT * FROM t1 WHERE (a=a AND a=a AND b=b) OR b > 20;
 id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 1	SIMPLE	t1	system	NULL	NULL	NULL	NULL	0	0.00	const row not found
 Warnings:
-Note	1003	select '0' AS `a`,'0' AS `b`,'0' AS `c` from `test`.`t1` where 1
+Note	1003	select NULL AS `a`,NULL AS `b`,NULL AS `c` from `test`.`t1` where 1
 EXPLAIN EXTENDED SELECT * FROM t1 WHERE (a=a AND b=b AND a=a) OR b > 20;
 id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 1	SIMPLE	t1	system	NULL	NULL	NULL	NULL	0	0.00	const row not found
 Warnings:
-Note	1003	select '0' AS `a`,'0' AS `b`,'0' AS `c` from `test`.`t1` where 1
+Note	1003	select NULL AS `a`,NULL AS `b`,NULL AS `c` from `test`.`t1` where 1
 DROP TABLE t1;
 #
 # Bug#45266: Uninitialized variable lead to an empty result.

=== modified file 'mysql-test/r/subselect.result'
--- a/mysql-test/r/subselect.result	2010-03-01 09:02:15 +0000
+++ b/mysql-test/r/subselect.result	2010-03-07 16:40:59 +0000
@@ -1496,7 +1496,7 @@ id	select_type	table	type	possible_keys	
 1	PRIMARY	t3	ALL	NULL	NULL	NULL	NULL	3	100.00	Using where
 2	SUBQUERY	t2	system	NULL	NULL	NULL	NULL	0	0.00	const row not found
 Warnings:
-Note	1003	select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` < (select max('0') from `test`.`t2`)))
+Note	1003	select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` < (select max(NULL) from `test`.`t2`)))
 select * from t3 where a >= some (select b from t2);
 a
 explain extended select * from t3 where a >= some (select b from t2);
@@ -1504,7 +1504,7 @@ id	select_type	table	type	possible_keys	
 1	PRIMARY	t3	ALL	NULL	NULL	NULL	NULL	3	100.00	Using where
 2	SUBQUERY	t2	system	NULL	NULL	NULL	NULL	0	0.00	const row not found
 Warnings:
-Note	1003	select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= (select min('0') from `test`.`t2`)))
+Note	1003	select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= (select min(NULL) from `test`.`t2`)))
 select * from t3 where a >= all (select b from t2 group by 1);
 a
 6
@@ -1515,7 +1515,7 @@ id	select_type	table	type	possible_keys	
 1	PRIMARY	t3	ALL	NULL	NULL	NULL	NULL	3	100.00	Using where
 2	SUBQUERY	t2	system	NULL	NULL	NULL	NULL	0	0.00	const row not found
 Warnings:
-Note	1003	select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` < <max>(select '0' AS `b` from `test`.`t2` group by 1)))
+Note	1003	select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` < <max>(select NULL AS `b` from `test`.`t2` group by 1)))
 select * from t3 where a >= some (select b from t2 group by 1);
 a
 explain extended select * from t3 where a >= some (select b from t2 group by 1);
@@ -1523,7 +1523,7 @@ id	select_type	table	type	possible_keys	
 1	PRIMARY	t3	ALL	NULL	NULL	NULL	NULL	3	100.00	Using where
 2	SUBQUERY	t2	system	NULL	NULL	NULL	NULL	0	0.00	const row not found
 Warnings:
-Note	1003	select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= <min>(select '0' AS `b` from `test`.`t2` group by 1)))
+Note	1003	select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= <min>(select NULL AS `b` from `test`.`t2` group by 1)))
 select * from t3 where NULL >= any (select b from t2);
 a
 explain extended select * from t3 where NULL >= any (select b from t2);

=== modified file 'mysql-test/r/union.result'
--- a/mysql-test/r/union.result	2010-01-06 10:24:51 +0000
+++ b/mysql-test/r/union.result	2010-02-26 13:40:01 +0000
@@ -1585,7 +1585,7 @@ id	select_type	table	type	possible_keys	
 2	UNION	t1	system	NULL	NULL	NULL	NULL	0	0.00	const row not found
 NULL	UNION RESULT	<union1,2>	ALL	NULL	NULL	NULL	NULL	NULL	NULL	Using filesort
 Warnings:
-Note	1003	select '0' AS `a` from `test`.`t1` union select '0' AS `a` from `test`.`t1` order by `a`
+Note	1003	select NULL AS `a` from `test`.`t1` union select NULL AS `a` from `test`.`t1` order by `a`
 DROP TABLE t1;
 End of 5.0 tests
 # 

=== added file 'mysql-test/std_data/bug49823.CSM'
Binary files a/mysql-test/std_data/bug49823.CSM	1970-01-01 00:00:00 +0000 and b/mysql-test/std_data/bug49823.CSM	2010-02-26 12:22:48 +0000 differ

=== added file 'mysql-test/std_data/bug49823.CSV'
--- a/mysql-test/std_data/bug49823.CSV	1970-01-01 00:00:00 +0000
+++ b/mysql-test/std_data/bug49823.CSV	2010-02-26 12:22:48 +0000
@@ -0,0 +1 @@
+"2010-02-26 13:32:26","root[root] @ localhost []",2,1,"Query","SELECT 1"

=== added file 'mysql-test/std_data/bug49823.frm'
Binary files a/mysql-test/std_data/bug49823.frm	1970-01-01 00:00:00 +0000 and b/mysql-test/std_data/bug49823.frm	2010-02-26 12:22:48 +0000 differ

=== modified file 'mysql-test/suite/federated/federated.result'
--- a/mysql-test/suite/federated/federated.result	2009-03-19 08:49:51 +0000
+++ b/mysql-test/suite/federated/federated.result	2010-03-05 10:51:37 +0000
@@ -2153,6 +2153,29 @@ DROP TABLE t1;
 End of 5.0 tests
 create server 's1' foreign data wrapper 'mysql' options (port 3306);
 drop server 's1';
+#
+# Bug #32426: FEDERATED query returns corrupt results for ORDER BY on a TEXT
+#
+CREATE TABLE federated.t1(a TEXT);
+INSERT INTO federated.t1 VALUES('abc'), ('gh'), ('f'), ('ijk'), ('de');
+CREATE TABLE federated.t1(a TEXT) ENGINE=FEDERATED
+CONNECTION='mysql://root@stripped:SLAVE_PORT/federated/t1';
+SELECT * FROM federated.t1 ORDER BY A;
+a
+abc
+de
+f
+gh
+ijk
+SELECT * FROM federated.t1 ORDER BY A DESC;
+a
+ijk
+gh
+f
+de
+abc
+DROP TABLE federated.t1;
+DROP TABLE federated.t1;
 End of 5.1 tests
 SET @@GLOBAL.CONCURRENT_INSERT= @OLD_MASTER_CONCURRENT_INSERT;
 SET @@GLOBAL.CONCURRENT_INSERT= @OLD_SLAVE_CONCURRENT_INSERT;

=== modified file 'mysql-test/suite/federated/federated.test'
--- a/mysql-test/suite/federated/federated.test	2009-03-19 08:49:51 +0000
+++ b/mysql-test/suite/federated/federated.test	2010-03-05 10:51:37 +0000
@@ -1971,6 +1971,28 @@ connection default;
 create server 's1' foreign data wrapper 'mysql' options (port 3306);
 drop server 's1';
 
+
+--echo #
+--echo # Bug #32426: FEDERATED query returns corrupt results for ORDER BY on a TEXT
+--echo #
+connection slave;
+CREATE TABLE federated.t1(a TEXT);
+INSERT INTO federated.t1 VALUES('abc'), ('gh'), ('f'), ('ijk'), ('de');
+
+connection master;
+--replace_result $SLAVE_MYPORT SLAVE_PORT
+eval CREATE TABLE federated.t1(a TEXT) ENGINE=FEDERATED
+  CONNECTION='mysql://root@stripped:$SLAVE_MYPORT/federated/t1';
+SELECT * FROM federated.t1 ORDER BY A;
+SELECT * FROM federated.t1 ORDER BY A DESC;
+DROP TABLE federated.t1;
+
+connection slave;
+DROP TABLE federated.t1;
+
+connection default;
+
+
 --echo End of 5.1 tests
 SET @@GLOBAL.CONCURRENT_INSERT= @OLD_MASTER_CONCURRENT_INSERT;
 connection slave;

=== modified file 'mysql-test/suite/rpl/r/rpl_row_create_table.result'
--- a/mysql-test/suite/rpl/r/rpl_row_create_table.result	2009-12-11 09:39:38 +0000
+++ b/mysql-test/suite/rpl/r/rpl_row_create_table.result	2010-03-07 16:40:59 +0000
@@ -241,10 +241,12 @@ STOP SLAVE;
 SET GLOBAL storage_engine=@storage_engine;
 START SLAVE;
 ================ BUG#22864 ================
-STOP SLAVE;
-RESET SLAVE;
-RESET MASTER;
-START SLAVE;
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
 SET AUTOCOMMIT=0;
 CREATE TABLE t1 (a INT);
 INSERT INTO t1 VALUES (1),(2),(3);
@@ -264,15 +266,6 @@ t1
 t2
 t3
 t4
-SELECT   TABLE_NAME,ENGINE
-FROM   INFORMATION_SCHEMA.TABLES
-WHERE   TABLE_NAME LIKE 't_'
-ORDER BY TABLE_NAME;
-TABLE_NAME	ENGINE
-t1	MyISAM
-t2	InnoDB
-t3	InnoDB
-t4	InnoDB
 SELECT * FROM t1 ORDER BY a;
 a
 1
@@ -334,15 +327,6 @@ t1
 t2
 t3
 t4
-SELECT   TABLE_NAME,ENGINE
-FROM   INFORMATION_SCHEMA.TABLES
-WHERE   TABLE_NAME LIKE 't_'
-ORDER BY TABLE_NAME;
-TABLE_NAME	ENGINE
-t1	MyISAM
-t2	InnoDB
-t3	InnoDB
-t4	InnoDB
 SELECT * FROM t1 ORDER BY a;
 a
 1

=== added file 'mysql-test/suite/rpl/r/rpl_show_slave_running.result'
--- a/mysql-test/suite/rpl/r/rpl_show_slave_running.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl/r/rpl_show_slave_running.result	2010-02-26 12:09:26 +0000
@@ -0,0 +1,42 @@
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+include/stop_slave.inc
+SELECT GET_LOCK("debug_lock.before_get_running_status_yes", 1000);
+GET_LOCK("debug_lock.before_get_running_status_yes", 1000)
+1
+set global debug= 'd,debug_lock.before_get_running_status_yes';
+Slave_running, Slave_IO_Running, Slave_SQL_Running, must be OFF, NO, NO in three following queries
+SHOW STATUS LIKE 'Slave_running';
+Variable_name	Value
+Slave_running	OFF
+Slave_IO_Running= No
+Slave_SQL_Running= No
+start slave io_thread;
+Slave_running, Slave_IO_Running, Slave_SQL_Running must be OFF NO NO in three following queries
+SHOW STATUS LIKE 'Slave_running';
+Variable_name	Value
+Slave_running	OFF
+Slave_IO_Running= No
+Slave_SQL_Running= No
+SELECT RELEASE_LOCK("debug_lock.before_get_running_status_yes");
+RELEASE_LOCK("debug_lock.before_get_running_status_yes")
+1
+Slave_running, Slave_IO_Running, Slave_SQL_Running must be OFF YES NO in three following queries
+SHOW STATUS LIKE 'Slave_running';
+Variable_name	Value
+Slave_running	OFF
+Slave_IO_Running= Yes
+Slave_SQL_Running= No
+start slave sql_thread;
+Slave_running, Slave_IO_Running, Slave_SQL_Running must be ON, YES, YES in three following queries
+SHOW STATUS LIKE 'Slave_running';
+Variable_name	Value
+Slave_running	ON
+Slave_IO_Running= Yes
+Slave_SQL_Running= Yes
+set global debug= '';
+End of tests

=== modified file 'mysql-test/suite/rpl/t/disabled.def'
--- a/mysql-test/suite/rpl/t/disabled.def	2010-02-12 04:04:57 +0000
+++ b/mysql-test/suite/rpl/t/disabled.def	2010-03-07 16:40:59 +0000
@@ -12,4 +12,5 @@
 
 rpl_get_master_version_and_clock:  # Bug#46931 2009-10-17 joro rpl.rpl_get_master_version_and_clock fails
 rpl_row_create_table            : Bug#45576 2009-12-01 joro rpl_row_create_table fails on PB2
+rpl_row_create_table : Bug#51574 Feb 27 2010 andrei failed different way than earlier with bug#45576
 rpl_spec_variables		: BUG#47661 2009-10-27 jasonh rpl_spec_variables fails on PB2 hpux

=== modified file 'mysql-test/suite/rpl/t/rpl_row_create_table.test'
--- a/mysql-test/suite/rpl/t/rpl_row_create_table.test	2009-12-11 09:39:38 +0000
+++ b/mysql-test/suite/rpl/t/rpl_row_create_table.test	2010-03-07 16:40:59 +0000
@@ -136,13 +136,9 @@ START SLAVE;
 # BUG#22864 (Rollback following CREATE ... SELECT discards 'CREATE
 # table' from log):
 --echo ================ BUG#22864 ================
-connection slave;
-STOP SLAVE;
-RESET SLAVE;
-connection master;
-RESET MASTER;
-connection slave;
-START SLAVE;
+
+--source include/master-slave-reset.inc
+
 connection master;
 SET AUTOCOMMIT=0;
 CREATE TABLE t1 (a INT);
@@ -160,10 +156,6 @@ INSERT INTO t1 VALUES (4),(5),(6);
 ROLLBACK;
 
 SHOW TABLES;
-SELECT   TABLE_NAME,ENGINE
-  FROM   INFORMATION_SCHEMA.TABLES
- WHERE   TABLE_NAME LIKE 't_'
-ORDER BY TABLE_NAME;
 SELECT * FROM t1 ORDER BY a;
 SELECT * FROM t2 ORDER BY a;
 SELECT * FROM t3 ORDER BY a;
@@ -173,10 +165,6 @@ SELECT * FROM t4 ORDER BY a;
 SHOW BINLOG EVENTS FROM 107;
 sync_slave_with_master;
 SHOW TABLES;
-SELECT   TABLE_NAME,ENGINE
-  FROM   INFORMATION_SCHEMA.TABLES
- WHERE   TABLE_NAME LIKE 't_'
-ORDER BY TABLE_NAME;
 SELECT * FROM t1 ORDER BY a;
 SELECT * FROM t2 ORDER BY a;
 SELECT * FROM t3 ORDER BY a;

=== added file 'mysql-test/suite/rpl/t/rpl_show_slave_running.test'
--- a/mysql-test/suite/rpl/t/rpl_show_slave_running.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl/t/rpl_show_slave_running.test	2010-02-26 12:07:47 +0000
@@ -0,0 +1,76 @@
+#
+# Bug #30703  SHOW STATUS LIKE 'Slave_running' is not compatible with `SHOW SLAVE STATUS'
+# The test verifies that  SHOW STATUS LIKE 'Slave_running' displays ON
+# if and only if `SHOW SLAVE STATUS' displays YES for Slave_IO_Running and  Slave_SQL_Running
+#
+source include/master-slave.inc;
+source include/have_debug.inc;
+
+connection slave;
+
+source include/stop_slave.inc;
+let $debug_saved= `select @@global.debug`;
+let $debug_lock= "debug_lock.before_get_running_status_yes";
+eval SELECT GET_LOCK($debug_lock, 1000);
+set global debug= 'd,debug_lock.before_get_running_status_yes';
+
+# Test 1. Slave is stopped
+
+--echo Slave_running, Slave_IO_Running, Slave_SQL_Running, must be OFF, NO, NO in three following queries
+
+SHOW STATUS LIKE 'Slave_running';
+let $status= query_get_value("show slave status", Slave_IO_Running, 1);
+echo Slave_IO_Running= $status;
+let $status= query_get_value("show slave status", Slave_SQL_Running, 1);
+echo Slave_SQL_Running= $status;
+
+# Test 2. The slave IO thread is started but not yet got connected to master
+#         and SQL thread is not started
+
+start slave io_thread;
+
+--echo Slave_running, Slave_IO_Running, Slave_SQL_Running must be OFF NO NO in three following queries
+
+SHOW STATUS LIKE 'Slave_running';
+let $status= query_get_value("show slave status", Slave_IO_Running, 1);
+echo Slave_IO_Running= $status;
+let $status= query_get_value("show slave status", Slave_SQL_Running, 1);
+echo Slave_SQL_Running= $status;
+
+# Test 3. The slave IO thread is started and got connected to master
+#         and SQL thread is still not started
+
+eval SELECT RELEASE_LOCK($debug_lock);
+let $slave_param= Slave_IO_Running;
+let $slave_param_value= YES;
+source include/wait_for_slave_param.inc;
+
+--echo Slave_running, Slave_IO_Running, Slave_SQL_Running must be OFF YES NO in three following queries
+
+SHOW STATUS LIKE 'Slave_running';
+let $status= query_get_value("show slave status", Slave_IO_Running, 1);
+echo Slave_IO_Running= $status;
+let $status= query_get_value("show slave status", Slave_SQL_Running, 1);
+echo Slave_SQL_Running= $status;
+
+# Test 4. The slave IO thread is started and got connected to master
+#         and SQL thread is started
+
+start slave sql_thread;
+source include/wait_for_slave_sql_to_start.inc;
+
+--echo Slave_running, Slave_IO_Running, Slave_SQL_Running must be ON, YES, YES in three following queries
+
+SHOW STATUS LIKE 'Slave_running';
+let $status= query_get_value("show slave status", Slave_IO_Running, 1);
+echo Slave_IO_Running= $status;
+let $status= query_get_value("show slave status", Slave_SQL_Running, 1);
+echo Slave_SQL_Running= $status;
+
+# cleanup
+
+connection slave;
+
+eval set global debug= '$debug_saved';
+
+--echo End of tests

=== modified file 'mysql-test/suite/rpl/t/rpl_slave_skip.test'
--- a/mysql-test/suite/rpl/t/rpl_slave_skip.test	2009-09-30 16:42:25 +0000
+++ b/mysql-test/suite/rpl/t/rpl_slave_skip.test	2010-03-07 16:40:59 +0000
@@ -27,7 +27,7 @@ connection slave;
 
 # Stop when reaching the the first table map event.
 START SLAVE UNTIL MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=762;
--- source include/wait_for_slave_sql_to_stop.inc
+source include/wait_for_slave_sql_to_stop.inc;
 --replace_result $MASTER_MYPORT MASTER_PORT
 --replace_column 1 # 8 # 9 # 23 # 33 # 35 # 36 #
 query_vertical SHOW SLAVE STATUS;
@@ -59,7 +59,7 @@ source include/show_binlog_events.inc;
 
 connection slave;
 START SLAVE UNTIL MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=106;
--- source include/wait_for_slave_sql_to_stop.inc
+source include/wait_for_slave_sql_to_stop.inc;
 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
 START SLAVE;
 sync_with_master;

=== modified file 'mysql-test/t/explain.test'
--- a/mysql-test/t/explain.test	2009-12-11 09:39:38 +0000
+++ b/mysql-test/t/explain.test	2010-03-07 16:40:59 +0000
@@ -147,7 +147,27 @@ EXPLAIN SELECT DISTINCT 1 FROM t1,
          WHERE t1.a = d1.a;
 DROP TABLE t1;
 
-# End of 5.0 tests.
+--echo #
+--echo # Bug#48295:
+--echo # explain extended crash with subquery and ONLY_FULL_GROUP_BY sql_mode
+--echo #
+
+CREATE TABLE t1 (f1 INT);
+
+SELECT @@session.sql_mode INTO @old_sql_mode;
+SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
+
+# EXPLAIN EXTENDED (with subselect). used to crash. should give NOTICE.
+--error ER_MIX_OF_GROUP_FUNC_AND_FIELDS
+EXPLAIN EXTENDED SELECT 1 FROM t1
+                          WHERE f1 > ALL( SELECT t.f1 FROM t1,t1 AS t );
+SHOW WARNINGS;
+
+SET SESSION sql_mode=@old_sql_mode;
+
+DROP TABLE t1;
+
+--echo End of 5.0 tests.
 
 --echo #
 --echo # Bug#37870: Usage of uninitialized value caused failed assertion.
@@ -168,24 +188,15 @@ SELECT OUTR.dt FROM t1 AS OUTR WHERE OUT
 drop tables t1, t2;
 
 --echo #
---echo # Bug#48295:
---echo # explain extended crash with subquery and ONLY_FULL_GROUP_BY sql_mode
+--echo # Bug#47669: Query showed by EXPLAIN EXTENDED gives different result from original query
 --echo #
 
-CREATE TABLE t1 (f1 INT);
-
-SELECT @@session.sql_mode INTO @old_sql_mode;
-SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
-
-# EXPLAIN EXTENDED (with subselect). used to crash. should give NOTICE.
---error ER_MIX_OF_GROUP_FUNC_AND_FIELDS
-EXPLAIN EXTENDED SELECT 1 FROM t1
-                          WHERE f1 > ALL( SELECT t.f1 FROM t1,t1 AS t );
-SHOW WARNINGS;
-
-SET SESSION sql_mode=@old_sql_mode;
-
-DROP TABLE t1;
+CREATE TABLE t1 (c int);
+INSERT INTO t1 VALUES (NULL);
+CREATE TABLE t2 (d int);
+INSERT INTO t2 VALUES (NULL), (0);
+EXPLAIN EXTENDED SELECT (SELECT 1 FROM t2 WHERE d = c) FROM t1;
+DROP TABLE t1, t2;
 
 --echo #
 --echo # Bug#30302: Tables that were optimized away are printed in the

=== modified file 'mysql-test/t/innodb_mysql.test'
--- a/mysql-test/t/innodb_mysql.test	2010-02-26 13:06:31 +0000
+++ b/mysql-test/t/innodb_mysql.test	2010-03-07 16:40:59 +0000
@@ -558,6 +558,24 @@ drop table t1,t2;
 --echo #
 
 
+--echo #
+--echo # Bug #39653: find_shortest_key in sql_select.cc does not consider
+--echo #             clustered primary keys
+--echo #
+
+CREATE TABLE t1 (a INT PRIMARY KEY, b INT, c INT, d INT, e INT, f INT,
+                 KEY (b,c)) ENGINE=INNODB;
+
+INSERT INTO t1 VALUES (1,1,1,1,1,1), (2,2,2,2,2,2), (3,3,3,3,3,3),
+                      (4,4,4,4,4,4), (5,5,5,5,5,5), (6,6,6,6,6,6),
+		      (7,7,7,7,7,7), (8,8,8,8,8,8), (9,9,9,9,9,9),
+		      (11,11,11,11,11,11);
+
+--query_vertical EXPLAIN SELECT COUNT(*) FROM t1
+
+DROP TABLE t1;
+
+
 --echo End of 5.1 tests
 
 

=== added file 'mysql-test/t/log_tables_upgrade.test'
--- a/mysql-test/t/log_tables_upgrade.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/t/log_tables_upgrade.test	2010-02-26 12:22:48 +0000
@@ -0,0 +1,32 @@
+--source include/not_embedded.inc
+--source include/have_csv.inc
+
+# Only run test if "mysql_upgrade" is found
+--require r/have_mysql_upgrade.result
+--disable_query_log
+select LENGTH("$MYSQL_UPGRADE")>0 as have_mysql_upgrade;
+--enable_query_log
+
+--echo #
+--echo # Bug#49823: mysql_upgrade fatal error due to general_log / slow_low CSV NULL
+--echo #
+
+USE test;
+
+let $MYSQLD_DATADIR= `SELECT @@datadir`;
+copy_file std_data/bug49823.frm $MYSQLD_DATADIR/test/bug49823.frm;
+copy_file std_data/bug49823.CSM $MYSQLD_DATADIR/test/bug49823.CSM;
+copy_file std_data/bug49823.CSV $MYSQLD_DATADIR/test/bug49823.CSV;
+
+SET @saved_general_log = @@GLOBAL.general_log;
+SET GLOBAL general_log = OFF;
+USE mysql;
+FLUSH TABLES;
+REPAIR TABLE test.bug49823;
+RENAME TABLE general_log TO renamed_general_log;
+RENAME TABLE test.bug49823 TO general_log;
+--exec $MYSQL_UPGRADE --skip-verbose --force 2>&1
+DROP TABLE general_log;
+RENAME TABLE renamed_general_log TO general_log;
+SET GLOBAL general_log = @saved_general_log;
+USE test;

=== modified file 'mysql-test/t/myisam.test'
--- a/mysql-test/t/myisam.test	2010-02-12 12:47:43 +0000
+++ b/mysql-test/t/myisam.test	2010-02-28 17:29:19 +0000
@@ -1587,5 +1587,20 @@ REPLACE INTO t1 VALUES
 CHECK TABLE t1;
 DROP TABLE t1;
 
---echo End of 5.1 tests
 
+--echo #
+--echo # Bug#51304: checksum table gives different results
+--echo # for same data when using bit fields
+--echo #
+CREATE TABLE t1(a INT, b BIT(1));
+INSERT INTO t1 VALUES(1, 0), (2, 1);
+CREATE TABLE t2 SELECT * FROM t1;
+--copy_file $MYSQLD_DATADIR/test/t1.frm $MYSQLD_DATADIR/test/t3.frm
+--copy_file $MYSQLD_DATADIR/test/t1.MYD $MYSQLD_DATADIR/test/t3.MYD
+--copy_file $MYSQLD_DATADIR/test/t1.MYI $MYSQLD_DATADIR/test/t3.MYI
+CHECKSUM TABLE t1 EXTENDED;
+CHECKSUM TABLE t2 EXTENDED;
+CHECKSUM TABLE t3 EXTENDED;
+DROP TABLE t1, t2, t3;
+
+--echo End of 5.1 tests

=== modified file 'mysql-test/t/mysql_upgrade.test'
--- a/mysql-test/t/mysql_upgrade.test	2009-12-11 16:40:58 +0000
+++ b/mysql-test/t/mysql_upgrade.test	2010-03-07 16:40:59 +0000
@@ -32,7 +32,7 @@ if (`SELECT $VALGRIND_TEST`)
 # expected binaries it uses.
 #
 --echo Run mysql_upgrade once
---exec $MYSQL_UPGRADE --skip-verbose 2>&1
+--exec $MYSQL_UPGRADE --skip-verbose --force 2>&1
 
 # It should have created a file in the MySQL Servers datadir
 let $MYSQLD_DATADIR= `select @@datadir`;

=== modified file 'mysys/charset.c'
--- a/mysys/charset.c	2009-12-19 08:33:33 +0000
+++ b/mysys/charset.c	2010-03-07 16:40:59 +0000
@@ -406,6 +406,7 @@ static void *cs_alloc(size_t size)
 
 
 static my_pthread_once_t charsets_initialized= MY_PTHREAD_ONCE_INIT;
+static my_pthread_once_t charsets_template= MY_PTHREAD_ONCE_INIT;
 
 static void init_available_charsets(void)
 {
@@ -433,6 +434,11 @@ static void init_available_charsets(void
 }
 
 
+void free_charsets(void)
+{
+  charsets_initialized= charsets_template;
+}
+
 uint get_collation_number(const char *name)
 {
   my_pthread_once(&charsets_initialized, init_available_charsets);

=== modified file 'mysys/my_init.c'
--- a/mysys/my_init.c	2009-12-16 13:47:07 +0000
+++ b/mysys/my_init.c	2010-03-07 16:40:59 +0000
@@ -167,6 +167,7 @@ void my_end(int infoflag)
       my_print_open_files();
     }
   }
+  free_charsets();
   my_error_unregister_all();
   my_once_free();
 

=== modified file 'scripts/mysql_system_tables_fix.sql'
--- a/scripts/mysql_system_tables_fix.sql	2009-12-11 16:40:58 +0000
+++ b/scripts/mysql_system_tables_fix.sql	2010-03-07 16:40:59 +0000
@@ -221,12 +221,29 @@ ALTER TABLE func
 
 SET @old_log_state = @@global.general_log;
 SET GLOBAL general_log = 'OFF';
-ALTER TABLE general_log MODIFY COLUMN server_id INTEGER UNSIGNED NOT NULL;
+ALTER TABLE general_log
+  MODIFY event_time TIMESTAMP NOT NULL,
+  MODIFY user_host MEDIUMTEXT NOT NULL,
+  MODIFY thread_id INTEGER NOT NULL,
+  MODIFY server_id INTEGER UNSIGNED NOT NULL,
+  MODIFY command_type VARCHAR(64) NOT NULL,
+  MODIFY argument MEDIUMTEXT NOT NULL;
 SET GLOBAL general_log = @old_log_state;
 
 SET @old_log_state = @@global.slow_query_log;
 SET GLOBAL slow_query_log = 'OFF';
-ALTER TABLE slow_log MODIFY COLUMN server_id INTEGER UNSIGNED NOT NULL;
+ALTER TABLE slow_log
+  MODIFY start_time TIMESTAMP NOT NULL,
+  MODIFY user_host MEDIUMTEXT NOT NULL,
+  MODIFY query_time TIME NOT NULL,
+  MODIFY lock_time TIME NOT NULL,
+  MODIFY rows_sent INTEGER NOT NULL,
+  MODIFY rows_examined INTEGER NOT NULL,
+  MODIFY db VARCHAR(512) NOT NULL,
+  MODIFY last_insert_id INTEGER NOT NULL,
+  MODIFY insert_id INTEGER NOT NULL,
+  MODIFY server_id INTEGER UNSIGNED NOT NULL,
+  MODIFY sql_text MEDIUMTEXT NOT NULL;
 SET GLOBAL slow_query_log = @old_log_state;
 
 ALTER TABLE plugin

=== modified file 'sql/item.cc'
--- a/sql/item.cc	2010-02-26 13:06:31 +0000
+++ b/sql/item.cc	2010-03-07 16:40:59 +0000
@@ -5854,9 +5854,14 @@ void Item_field::print(String *str, enum
     char buff[MAX_FIELD_WIDTH];
     String tmp(buff,sizeof(buff),str->charset());
     field->val_str(&tmp);
-    str->append('\'');
-    str->append(tmp);
-    str->append('\'');
+    if (field->is_null())
+      str->append("NULL");
+    else
+    {
+      str->append('\'');
+      str->append(tmp);
+      str->append('\'');
+    }
     return;
   }
   Item_ident::print(str, query_type);

=== modified file 'sql/mysqld.cc'
--- a/sql/mysqld.cc	2010-02-09 07:59:38 +0000
+++ b/sql/mysqld.cc	2010-03-07 16:40:59 +0000
@@ -1312,6 +1312,7 @@ void clean_up(bool print_message)
   lex_free();				/* Free some memory */
   item_create_cleanup();
   set_var_free();
+  free_charsets();
   if (!opt_noacl)
   {
 #ifdef HAVE_DLOPEN
@@ -6121,8 +6122,8 @@ each time the SQL thread starts.",
    TC_LOG_PAGE_SIZE, 0},
 #endif
   {"log-update", OPT_UPDATE_LOG,
-   "The update log is deprecated since version 5.0, is replaced by the binary \
-log and this option justs turns on --log-bin instead.",
+   "The update log is deprecated since version 5.0, is replaced by the binary "
+   "log and this option just turns on --log-bin instead.",
    (uchar**) &opt_update_logname, (uchar**) &opt_update_logname, 0, GET_STR,
    OPT_ARG, 0, 0, 0, 0, 0, 0},
   {"log-warnings", 'W', "Log some not critical warnings to the log file.",
@@ -6382,7 +6383,10 @@ thread is in the relay logs.",
    "Tells the slave thread to not replicate to the specified database. To specify more than one database to ignore, use the directive multiple times, once for each database. This option will not work if you use cross database updates. If you need cross database updates to work, make sure you have 3.23.28 or later, and use replicate-wild-ignore-table=db_name.%. ",
    0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
   {"replicate-ignore-table", OPT_REPLICATE_IGNORE_TABLE,
-   "Tells the slave thread to not replicate to the specified table. To specify more than one table to ignore, use the directive multiple times, once for each table. This will work for cross-datbase updates, in contrast to replicate-ignore-db.",
+   "Tells the slave thread to not replicate to the specified table. To specify "
+   "more than one table to ignore, use the directive multiple times, once for "
+   "each table. This will work for cross-database updates, in contrast to "
+   "replicate-ignore-db.",
    0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
   {"replicate-rewrite-db", OPT_REPLICATE_REWRITE_DB,
    "Updates to a database with a different name than the original. Example: replicate-rewrite-db=master_db_name->slave_db_name.",
@@ -6404,7 +6408,13 @@ Can't be set to 1 if --log-slave-updates
    0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
   // In replication, we may need to tell the other servers how to connect
   {"report-host", OPT_REPORT_HOST,
-   "Hostname or IP of the slave to be reported to to the master during slave registration. Will appear in the output of SHOW SLAVE HOSTS. Leave unset if you do not want the slave to register itself with the master. Note that it is not sufficient for the master to simply read the IP of the slave off the socket once the slave connects. Due to NAT and other routing issues, that IP may not be valid for connecting to the slave from the master or other hosts.",
+   "Hostname or IP of the slave to be reported to the master during slave "
+   "registration. Will appear in the output of SHOW SLAVE HOSTS. Leave unset "
+   "if you do not want the slave to register itself with the master. Note that "
+   "it is not sufficient for the master to simply read the IP of the slave "
+   "from the socket once the slave connects. Due to NAT and other routing "
+   "issues, that IP may not be valid for connecting to the slave from the "
+   "master or other hosts.",
    (uchar**) &report_host, (uchar**) &report_host, 0, GET_STR, REQUIRED_ARG, 0, 0,
    0, 0, 0, 0},
   {"report-password", OPT_REPORT_PASSWORD, "Undocumented.",
@@ -6709,7 +6719,10 @@ log and this option does nothing anymore
    (uchar**) &max_system_variables.keep_files_on_create,
    0, GET_BOOL, OPT_ARG, 0, 0, 0, 0, 0, 0},
   {"key_buffer_size", OPT_KEY_BUFFER_SIZE,
-   "The size of the buffer used for index blocks for MyISAM tables. Increase this to get better index handling (for all reads and multiple writes) to as much as you can afford; 64M on a 256M machine that mainly runs MySQL is quite common.",
+   "The size of the buffer used for index blocks for MyISAM tables. Increase "
+   "this to get better index handling (for all reads and multiple writes) to "
+   "as much as you can afford; 1GB on a 4GB machine that mainly runs MySQL is "
+   "quite common.",
    (uchar**) &dflt_key_cache_var.param_buff_size,
    (uchar**) 0,
    0, (GET_ULL | GET_ASK_ADDR),
@@ -6880,7 +6893,9 @@ The minimum value for this variable is 4
    (uchar**) &myisam_mmap_size, (uchar**) &myisam_mmap_size, 0,
    GET_ULL, REQUIRED_ARG, SIZE_T_MAX, MEMMAP_EXTRA_MARGIN, SIZE_T_MAX, 0, 1, 0},
   {"myisam_repair_threads", OPT_MYISAM_REPAIR_THREADS,
-   "Number of threads to use when repairing MyISAM tables. The value of 1 disables parallel repair.",
+   "Specifies whether several threads should be used when repairing MyISAM "
+   "tables. For values > 1, one thread is used per index. The value of 1 "
+   "disables parallel repair.",
    (uchar**) &global_system_variables.myisam_repair_threads,
    (uchar**) &max_system_variables.myisam_repair_threads, 0,
    GET_ULONG, REQUIRED_ARG, 1, 1, ULONG_MAX, 0, 1, 0},

=== modified file 'sql/slave.cc'
--- a/sql/slave.cc	2010-02-22 00:26:29 +0000
+++ b/sql/slave.cc	2010-03-07 16:40:59 +0000
@@ -2877,6 +2877,7 @@ pthread_handler_t handle_slave_io(void *
 
 connected:
 
+  DBUG_SYNC_POINT("debug_lock.before_get_running_status_yes", 10);
   // TODO: the assignment below should be under mutex (5.0)
   mi->slave_running= MYSQL_SLAVE_RUN_CONNECT;
   thd->slave_net = &mysql->net;

=== modified file 'sql/sql_select.cc'
--- a/sql/sql_select.cc	2010-03-01 09:02:15 +0000
+++ b/sql/sql_select.cc	2010-03-07 16:40:59 +0000
@@ -13032,12 +13032,35 @@ static int test_if_order_by_key(ORDER *o
 
 uint find_shortest_key(TABLE *table, const key_map *usable_keys)
 {
-  uint min_length= (uint) ~0;
   uint best= MAX_KEY;
+  uint usable_clustered_pk= (table->file->primary_key_is_clustered() &&
+                             table->s->primary_key != MAX_KEY &&
+                             usable_keys->is_set(table->s->primary_key)) ?
+                            table->s->primary_key : MAX_KEY;
   if (!usable_keys->is_clear_all())
   {
+    uint min_length= (uint) ~0;
     for (uint nr=0; nr < table->s->keys ; nr++)
     {
+      /*
+       As far as 
+       1) clustered primary key entry data set is a set of all record
+          fields (key fields and not key fields) and
+       2) secondary index entry data is a union of its key fields and
+          primary key fields (at least InnoDB and its derivatives don't
+          duplicate primary key fields there, even if the primary and
+          the secondary keys have a common subset of key fields),
+       then secondary index entry data is always a subset of primary key
+       entry, and the PK is always longer.
+       Unfortunately, key_info[nr].key_length doesn't show the length
+       of key/pointer pair but a sum of key field lengths only, thus
+       we can't estimate index IO volume comparing only this key_length
+       value of seconday keys and clustered PK.
+       So, try secondary keys first, and choose PK only if there are no
+       usable secondary covering keys:
+      */
+      if (nr == usable_clustered_pk)
+        continue;
       if (usable_keys->is_set(nr))
       {
         if (table->key_info[nr].key_length < min_length)
@@ -13048,7 +13071,7 @@ uint find_shortest_key(TABLE *table, con
       }
     }
   }
-  return best;
+  return best != MAX_KEY ? best : usable_clustered_pk;
 }
 
 /**

=== modified file 'sql/sql_table.cc'
--- a/sql/sql_table.cc	2010-02-23 14:06:06 +0000
+++ b/sql/sql_table.cc	2010-03-07 16:40:59 +0000
@@ -7994,22 +7994,28 @@ bool mysql_checksum_table(THD *thd, TABL
 	    for (uint i= 0; i < t->s->fields; i++ )
 	    {
 	      Field *f= t->field[i];
-        enum_field_types field_type= f->type();
-        /*
-          BLOB and VARCHAR have pointers in their field, we must convert
-          to string; GEOMETRY is implemented on top of BLOB.
-        */
-        if ((field_type == MYSQL_TYPE_BLOB) ||
-            (field_type == MYSQL_TYPE_VARCHAR) ||
-            (field_type == MYSQL_TYPE_GEOMETRY))
-	      {
-		String tmp;
-		f->val_str(&tmp);
-		row_crc= my_checksum(row_crc, (uchar*) tmp.ptr(), tmp.length());
+
+             /*
+               BLOB and VARCHAR have pointers in their field, we must convert
+               to string; GEOMETRY is implemented on top of BLOB.
+               BIT may store its data among NULL bits, convert as well.
+             */
+              switch (f->type()) {
+                case MYSQL_TYPE_BLOB:
+                case MYSQL_TYPE_VARCHAR:
+                case MYSQL_TYPE_GEOMETRY:
+                case MYSQL_TYPE_BIT:
+                {
+                  String tmp;
+                  f->val_str(&tmp);
+                  row_crc= my_checksum(row_crc, (uchar*) tmp.ptr(),
+                           tmp.length());
+                  break;
+                }
+                default:
+                  row_crc= my_checksum(row_crc, f->ptr, f->pack_length());
+                  break;
 	      }
-	      else
-		row_crc= my_checksum(row_crc, f->ptr,
-				     f->pack_length());
 	    }
 
 	    crc+= row_crc;

=== modified file 'storage/federated/ha_federated.cc'
--- a/storage/federated/ha_federated.cc	2009-10-15 20:56:17 +0000
+++ b/storage/federated/ha_federated.cc	2010-03-07 16:40:59 +0000
@@ -1622,11 +1622,10 @@ int ha_federated::open(const char *name,
 
   DBUG_ASSERT(mysql == NULL);
 
-  ref_length= (table->s->primary_key != MAX_KEY ?
-               table->key_info[table->s->primary_key].key_length :
-               table->s->reclength);
+  ref_length= sizeof(MYSQL_RES *) + sizeof(MYSQL_ROW_OFFSET);
   DBUG_PRINT("info", ("ref_length: %u", ref_length));
 
+  my_init_dynamic_array(&results, sizeof(MYSQL_RES *), 4, 4);
   reset();
 
   DBUG_RETURN(0);
@@ -1646,21 +1645,17 @@ int ha_federated::open(const char *name,
 
 int ha_federated::close(void)
 {
-  int retval;
   DBUG_ENTER("ha_federated::close");
 
-  /* free the result set */
-  if (stored_result)
-  {
-    mysql_free_result(stored_result);
-    stored_result= 0;
-  }
+  free_result();
+  
+  delete_dynamic(&results);
+  
   /* Disconnect from mysql */
   mysql_close(mysql);
   mysql= NULL;
-  retval= free_share(share);
-  DBUG_RETURN(retval);
 
+  DBUG_RETURN(free_share(share));
 }
 
 /*
@@ -2329,8 +2324,7 @@ int ha_federated::index_read(uchar *buf,
   DBUG_ENTER("ha_federated::index_read");
 
   MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
-  if (stored_result)
-    mysql_free_result(stored_result);
+  free_result();
   rc= index_read_idx_with_result_set(buf, active_index, key,
                                      key_len, find_flag,
                                      &stored_result);
@@ -2364,7 +2358,8 @@ int ha_federated::index_read_idx(uchar *
                                               &mysql_result)))
     DBUG_RETURN(retval);
   mysql_free_result(mysql_result);
-  DBUG_RETURN(retval);
+  results.elements--;
+  DBUG_RETURN(0);
 }
 
 
@@ -2420,18 +2415,20 @@ int ha_federated::index_read_idx_with_re
     retval= ER_QUERY_ON_FOREIGN_DATA_SOURCE;
     goto error;
   }
-  if (!(*result= mysql_store_result(mysql)))
+  if (!(*result= store_result(mysql)))
   {
     retval= HA_ERR_END_OF_FILE;
     goto error;
   }
-  if (!(retval= read_next(buf, *result)))
+  if ((retval= read_next(buf, *result)))
+  {
+    mysql_free_result(*result);
+    results.elements--;
+    *result= 0;
+    table->status= STATUS_NOT_FOUND;
     DBUG_RETURN(retval);
-
-  mysql_free_result(*result);
-  *result= 0;
-  table->status= STATUS_NOT_FOUND;
-  DBUG_RETURN(retval);
+  }
+  DBUG_RETURN(0);
 
 error:
   table->status= STATUS_NOT_FOUND;
@@ -2492,12 +2489,6 @@ int ha_federated::read_range_first(const
   create_where_from_key(&sql_query,
                         &table->key_info[active_index],
                         start_key, end_key, 0, eq_range_arg);
-
-  if (stored_result)
-  {
-    mysql_free_result(stored_result);
-    stored_result= 0;
-  }
   if (real_query(sql_query.ptr(), sql_query.length()))
   {
     retval= ER_QUERY_ON_FOREIGN_DATA_SOURCE;
@@ -2505,7 +2496,7 @@ int ha_federated::read_range_first(const
   }
   sql_query.length(0);
 
-  if (!(stored_result= mysql_store_result(mysql)))
+  if (!(stored_result= store_result(mysql)))
   {
     retval= HA_ERR_END_OF_FILE;
     goto error;
@@ -2599,23 +2590,11 @@ int ha_federated::rnd_init(bool scan)
 
   if (scan)
   {
-    if (stored_result)
-    {
-      mysql_free_result(stored_result);
-      stored_result= 0;
-    }
-
-    if (real_query(share->select_query, strlen(share->select_query)))
-      goto error;
-
-    stored_result= mysql_store_result(mysql);
-    if (!stored_result)
-      goto error;
+    if (real_query(share->select_query, strlen(share->select_query)) ||
+        !(stored_result= store_result(mysql)))
+      DBUG_RETURN(stash_remote_error());
   }
   DBUG_RETURN(0);
-
-error:
-  DBUG_RETURN(stash_remote_error());
 }
 
 
@@ -2629,11 +2608,7 @@ int ha_federated::rnd_end()
 int ha_federated::index_end(void)
 {
   DBUG_ENTER("ha_federated::index_end");
-  if (stored_result)
-  {
-    mysql_free_result(stored_result);
-    stored_result= 0;
-  }
+  free_result();
   active_index= MAX_KEY;
   DBUG_RETURN(0);
 }
@@ -2704,6 +2679,9 @@ int ha_federated::read_next(uchar *buf, 
   DBUG_ENTER("ha_federated::read_next");
 
   table->status= STATUS_NOT_FOUND;              // For easier return
+  
+  /* Save current data cursor position. */
+  current_position= result->data_cursor;
 
   /* Fetch a row, insert it back in a row format. */
   if (!(row= mysql_fetch_row(result)))
@@ -2716,24 +2694,38 @@ int ha_federated::read_next(uchar *buf, 
 }
 
 
-/*
-  store reference to current row so that we can later find it for
-  a re-read, update or delete.
-
-  In case of federated, a reference is either a primary key or
-  the whole record.
-
-  Called from filesort.cc, sql_select.cc, sql_delete.cc and sql_update.cc.
+/**
+  @brief      Store a reference to current row.
+  
+  @details    During a query execution we may have different result sets (RS),
+              e.g. for different ranges. All the RS's used are stored in 
+              memory and placed in @c results dynamic array. At the end of 
+              execution all stored RS's are freed at once in the
+              @c ha_federated::reset().
+              So, in case of federated, a reference to current row is a 
+              stored result address and current data cursor position.
+              As we keep all RS in memory during a query execution,
+              we can get any record using the reference any time until
+              @c ha_federated::reset() is called.
+              TODO: we don't have to store all RS's rows but only those
+              we call @c ha_federated::position() for, so we can free memory
+              where we store other rows in the @c ha_federated::index_end().
+ 
+  @param[in]  record  record data (unused)
 */
 
-void ha_federated::position(const uchar *record)
+void ha_federated::position(const uchar *record __attribute__ ((unused)))
 {
   DBUG_ENTER("ha_federated::position");
-  if (table->s->primary_key != MAX_KEY)
-    key_copy(ref, (uchar *)record, table->key_info + table->s->primary_key,
-             ref_length);
-  else
-    memcpy(ref, record, ref_length);
+  
+  DBUG_ASSERT(stored_result);
+
+  position_called= TRUE;
+  /* Store result set address. */
+  memcpy_fixed(ref, &stored_result, sizeof(MYSQL_RES *));
+  /* Store data cursor position. */
+  memcpy_fixed(ref + sizeof(MYSQL_RES *), &current_position,
+               sizeof(MYSQL_ROW_OFFSET));
   DBUG_VOID_RETURN;
 }
 
@@ -2749,26 +2741,24 @@ void ha_federated::position(const uchar 
 
 int ha_federated::rnd_pos(uchar *buf, uchar *pos)
 {
-  int result;
+  MYSQL_RES *result;
+  int ret_val;
   DBUG_ENTER("ha_federated::rnd_pos");
+
   MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str,
                        FALSE);
   ha_statistic_increment(&SSV::ha_read_rnd_count);
-  if (table->s->primary_key != MAX_KEY)
-  {
-    /* We have a primary key, so use index_read_idx to find row */
-    result= index_read_idx(buf, table->s->primary_key, pos,
-                           ref_length, HA_READ_KEY_EXACT);
-  }
-  else
-  {
-    /* otherwise, get the old record ref as obtained in ::position */
-    memcpy(buf, pos, ref_length);
-    result= 0;
-  }
-  table->status= result ? STATUS_NOT_FOUND : 0;
-  MYSQL_READ_ROW_DONE(result);
-  DBUG_RETURN(result);
+
+  /* Get stored result set. */
+  memcpy_fixed(&result, pos, sizeof(MYSQL_RES *));
+  DBUG_ASSERT(result);
+  /* Set data cursor position. */
+  memcpy_fixed(&result->data_cursor, pos + sizeof(MYSQL_RES *),
+               sizeof(MYSQL_ROW_OFFSET));
+  /* Read a row. */
+  ret_val= read_next(buf, result);
+  MYSQL_READ_ROW_DONE(ret_val);
+  DBUG_RETURN(ret_val);
 }
 
 
@@ -2971,6 +2961,16 @@ int ha_federated::reset(void)
   insert_dup_update= FALSE;
   ignore_duplicates= FALSE;
   replace_duplicates= FALSE;
+
+  /* Free stored result sets. */
+  for (uint i= 0; i < results.elements; i++)
+  {
+    MYSQL_RES *result;
+    get_dynamic(&results, (uchar *) &result, i);
+    mysql_free_result(result);
+  }
+  reset_dynamic(&results);
+
   return 0;
 }
 
@@ -3234,6 +3234,45 @@ bool ha_federated::get_error_message(int
   DBUG_RETURN(FALSE);
 }
 
+
+/**
+  @brief      Store a result set.
+
+  @details    Call @c mysql_store_result() to save a result set then
+              append it to the stored results array.
+
+  @param[in]  mysql  MySLQ connection structure.
+
+  @return     Stored result set (MYSQL_RES object).
+*/
+
+MYSQL_RES *ha_federated::store_result(MYSQL *mysql)
+{
+  MYSQL_RES *result= mysql_store_result(mysql);
+  DBUG_ENTER("ha_federated::store_result");
+  if (result)
+  {
+    (void) insert_dynamic(&results, (uchar*) &result);
+  }
+  position_called= FALSE;
+  DBUG_RETURN(result);
+}
+
+
+void ha_federated::free_result()
+{
+  DBUG_ENTER("ha_federated::free_result");
+  if (stored_result && !position_called)
+  {
+    mysql_free_result(stored_result);
+    stored_result= 0;
+    if (results.elements > 0)
+      results.elements--;
+  }
+  DBUG_VOID_RETURN;
+}
+
+ 
 int ha_federated::external_lock(THD *thd, int lock_type)
 {
   int error= 0;

=== modified file 'storage/federated/ha_federated.h'
--- a/storage/federated/ha_federated.h	2009-06-11 10:07:59 +0000
+++ b/storage/federated/ha_federated.h	2010-03-07 16:40:59 +0000
@@ -84,6 +84,11 @@ class ha_federated: public handler
   FEDERATED_SHARE *share;    /* Shared lock info */
   MYSQL *mysql; /* MySQL connection */
   MYSQL_RES *stored_result;
+  /**
+    Array of all stored results we get during a query execution.
+  */
+  DYNAMIC_ARRAY results;
+  bool position_called;
   uint fetch_num; // stores the fetch num
   MYSQL_ROW_OFFSET current_position;  // Current position used by ::position()
   int remote_error_number;
@@ -252,6 +257,10 @@ public:
   THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to,
                              enum thr_lock_type lock_type);     //required
   bool get_error_message(int error, String *buf);
+  
+  MYSQL_RES *store_result(MYSQL *mysql);
+  void free_result();
+  
   int external_lock(THD *thd, int lock_type);
   int connection_commit();
   int connection_rollback();


Attachment: [text/bzr-bundle] bzr/alexey.kopytov@sun.com-20100307164059-cri8typa32cypq0l.bundle
Thread
bzr push into mysql-trunk branch (Alexey.Kopytov:2985 to 2986)Alexey Kopytov7 Mar