List:Commits« Previous MessageNext Message »
From:Mattias Jonsson Date:December 14 2010 12:56pm
Subject:bzr push into mysql-5.1-bugteam branch (mattias.jonsson:3520 to 3521)
View as plain text  
 3521 Mattias Jonsson	2010-12-14 [merge]
      merge

    modified:
      mysql-test/collections/default.weekly
      mysql-test/suite/parts/inc/part_supported_sql_funcs_main.inc
      mysql-test/suite/parts/inc/partition_decimal.inc
      mysql-test/suite/parts/inc/partition_double.inc
      mysql-test/suite/parts/inc/partition_float.inc
      mysql-test/suite/parts/r/partition_decimal_innodb.result
      mysql-test/suite/parts/r/partition_decimal_myisam.result
 3520 Sergey Glukhov	2010-12-14
      Fixed following problems:
      --Bug#52157 various crashes and assertions with multi-table update, stored function
      --Bug#54475 improper error handling causes cascading crashing failures in innodb/ndb
      --Bug#57703 create view cause Assertion failed: 0, file .\item_subselect.cc, line 846
      --Bug#57352 valgrind warnings when creating view
      --Recently discovered problem when a nested materialized derived table is used
        before being populated and it leads to incorrect result
      
      We have several modes when we should disable subquery evaluation.
      The reasons for disabling are different. It could be
      uselessness of the evaluation as in case of 'CREATE VIEW'
      or 'PREPARE stmt', or we should disable subquery evaluation
      if tables are not locked yet as it happens in bug#54475, or
      too early evaluation of subqueries can lead to wrong result
      as it happened in Bug#19077.
      Main problem is that if subquery items are treated as const
      they are evaluated in ::fix_fields(), ::fix_length_and_dec()
      of the parental items as a lot of these methods have
      Item::val_...() calls inside.
      We have to make subqueries non-const to prevent unnecessary
      subquery evaluation. At the moment we have different methods
      for this. Here is a list of these modes:
      
      1. PREPARE stmt;
      We use UNCACHEABLE_PREPARE flag.
      It is set during parsing in sql_parse.cc, mysql_new_select() for
      each SELECT_LEX object and cleared at the end of PREPARE in
      sql_prepare.cc, init_stmt_after_parse(). If this flag is set
      subquery becomes non-const and evaluation does not happen.
      
      2. CREATE|ALTER VIEW, SHOW CREATE VIEW, I_S tables which
         process FRM files
      We use LEX::view_prepare_mode field. We set it before
      view preparation and check this flag in
      ::fix_fields(), ::fix_length_and_dec().
      Some bugs are fixed using this approach,
      some are not(Bug#57352, Bug#57703). The problem here is
      that we have a lot of ::fix_fields(), ::fix_length_and_dec()
      where we use Item::val_...() calls for const items.
      
      3. Derived tables with subquery = wrong result(Bug19077)
      The reason of this bug is too early subquery evaluation.
      It was fixed by adding Item::with_subselect field
      The check of this field in appropriate places prevents
      const item evaluation if the item have subquery.
      The fix for Bug19077 fixes only the problem with
      convert_constant_item() function and does not cover
      other places(::fix_fields(), ::fix_length_and_dec() again)
      where subqueries could be evaluated.
      
      Example:
      CREATE TABLE t1 (i INT, j BIGINT);
      INSERT INTO t1 VALUES (1, 2), (2, 2), (3, 2);
      SELECT * FROM (SELECT MIN(i) FROM t1
      WHERE j = SUBSTRING('12', (SELECT * FROM (SELECT MIN(j) FROM t1) t2))) t3;
      DROP TABLE t1;
      
      4. Derived tables with subquery where subquery
         is evaluated before table locking(Bug#54475, Bug#52157)
      
      Suggested solution is following:
      
      -Introduce new field LEX::context_analysis_only with the following
       possible flags:
       #define CONTEXT_ANALYSIS_ONLY_PREPARE 1
       #define CONTEXT_ANALYSIS_ONLY_VIEW    2
       #define CONTEXT_ANALYSIS_ONLY_DERIVED 4
      -Set/clean these flags when we perform
       context analysis operation
      -Item_subselect::const_item() returns
       result depending on LEX::context_analysis_only.
       If context_analysis_only is set then we return
       FALSE that means that subquery is non-const.
       As all subquery types are wrapped by Item_subselect
       it allow as to make subquery non-const when
       it's necessary.
     @ mysql-test/r/derived.result
        test case
     @ mysql-test/r/multi_update.result
        test case
     @ mysql-test/r/view.result
        test case
     @ mysql-test/suite/innodb/r/innodb_multi_update.result
        test case
     @ mysql-test/suite/innodb/t/innodb_multi_update.test
        test case
     @ mysql-test/suite/innodb_plugin/r/innodb_multi_update.result
        test case
     @ mysql-test/suite/innodb_plugin/t/innodb_multi_update.test
        test case
     @ mysql-test/t/derived.test
        test case
     @ mysql-test/t/multi_update.test
        test case
     @ mysql-test/t/view.test
        test case
     @ sql/item.cc
        --removed unnecessary code
     @ sql/item_cmpfunc.cc
        --removed unnecessary checks
        --THD::is_context_analysis_only() is replaced with LEX::is_ps_or_view_context_analysis()
     @ sql/item_func.cc
        --refactored context analysis checks
     @ sql/item_row.cc
        --removed unnecessary checks
     @ sql/item_subselect.cc
        --removed unnecessary code
        --added DBUG_ASSERT into Item_subselect::exec()
          which asserts that subquery execution can not happen
          if LEX::context_analysis_only is set, i.e. at context
          analysis stage.
        --Item_subselect::const_item()
          Return FALSE if LEX::context_analysis_only is set.
          It prevents subquery evaluation in ::fix_fields &
          ::fix_length_and_dec at context analysis stage.
     @ sql/item_subselect.h
        --removed unnecessary code
     @ sql/mysql_priv.h
        --Added new set of flags.
     @ sql/sql_class.h
        --removed unnecessary code
     @ sql/sql_derived.cc
        --added LEX::context_analysis_only analysis intialization/cleanup
     @ sql/sql_lex.cc
        --init LEX::context_analysis_only field
     @ sql/sql_lex.h
        --New LEX::context_analysis_only field
     @ sql/sql_parse.cc
        --removed unnecessary code
     @ sql/sql_prepare.cc
        --removed unnecessary code
        --added LEX::context_analysis_only analysis intialization/cleanup
     @ sql/sql_select.cc
        --refactored context analysis checks
     @ sql/sql_show.cc
        --added LEX::context_analysis_only analysis intialization/cleanup
     @ sql/sql_view.cc
        --added LEX::context_analysis_only analysis intialization/cleanup

    modified:
      mysql-test/r/derived.result
      mysql-test/r/multi_update.result
      mysql-test/r/view.result
      mysql-test/suite/innodb/r/innodb_multi_update.result
      mysql-test/suite/innodb/t/innodb_multi_update.test
      mysql-test/suite/innodb_plugin/r/innodb_multi_update.result
      mysql-test/suite/innodb_plugin/t/innodb_multi_update.test
      mysql-test/t/derived.test
      mysql-test/t/multi_update.test
      mysql-test/t/view.test
      sql/item.cc
      sql/item_cmpfunc.cc
      sql/item_func.cc
      sql/item_row.cc
      sql/item_subselect.cc
      sql/item_subselect.h
      sql/mysql_priv.h
      sql/sql_class.h
      sql/sql_derived.cc
      sql/sql_lex.cc
      sql/sql_lex.h
      sql/sql_parse.cc
      sql/sql_prepare.cc
      sql/sql_select.cc
      sql/sql_show.cc
      sql/sql_view.cc
=== modified file 'mysql-test/collections/default.weekly'
--- a/mysql-test/collections/default.weekly	2010-11-15 15:17:38 +0000
+++ b/mysql-test/collections/default.weekly	2010-12-09 14:04:58 +0000
@@ -1,2 +1,2 @@
 perl mysql-test-run.pl --timer --force --comment=1st       --experimental=collections/default.experimental 1st
-perl mysql-test-run.pl --timer --force --comment=big-tests --experimental=collections/default.experimental --vardir=var-big-tests --big-test --testcase-timeout=60 --suite-timeout=600 parts.partition_alter1_2_ndb parts.part_supported_sql_func_innodb parts.partition_alter1_2_innodb parts.partition_alter4_innodb parts.partition_alter1_1_2_ndb parts.partition_alter1_1_2_innodb parts.partition_alter1_1_ndb large_tests.alter_table rpl_ndb.rpl_truncate_7ndb_2 main.archive-big main.sum_distinct-big main.mysqlbinlog_row_big main.alter_table-big main.variables-big main.type_newdecimal-big main.read_many_rows_innodb main.log_tables-big main.count_distinct3 main.events_time_zone main.merge-big main.create-big main.events_stress main.ssl-big
+perl mysql-test-run.pl --timer --force --comment=big-tests --experimental=collections/default.experimental --vardir=var-big-tests --big-test --testcase-timeout=60 --suite-timeout=600 parts.partition_alter1_2_ndb parts.part_supported_sql_func_innodb parts.partition_alter1_2_innodb parts.partition_alter4_innodb parts.partition_alter1_1_2_ndb parts.partition_alter1_1_2_innodb parts.partition_alter1_1_ndb rpl_ndb.rpl_truncate_7ndb_2 main.archive-big main.sum_distinct-big main.mysqlbinlog_row_big main.alter_table-big main.variables-big main.type_newdecimal-big main.read_many_rows_innodb main.log_tables-big main.count_distinct3 main.events_time_zone main.merge-big main.create-big main.events_stress main.ssl-big

=== modified file 'mysql-test/suite/parts/inc/part_supported_sql_funcs_main.inc'
--- a/mysql-test/suite/parts/inc/part_supported_sql_funcs_main.inc	2007-11-20 15:04:07 +0000
+++ b/mysql-test/suite/parts/inc/part_supported_sql_funcs_main.inc	2010-12-14 11:13:35 +0000
@@ -39,29 +39,6 @@ let $val3 = 17 ;
 let $val4 = 15 ;
 --source suite/parts/inc/partition_supported_sql_funcs.inc
 
-
-let $sqlfunc = ceiling(col1);
-let $valsqlfunc = ceiling(15);
-let $coltype = float(7,4);
-let $infile = part_supported_sql_funcs_int_float.inc;
-let $val1 =  5.1230;
-let $val2 = 13.345;
-let $val3 = 17.987;
-let $val4 = 15.654 ;
-# DISABLED due to bug 30577
-#--source suite/parts/inc/partition_supported_sql_funcs.inc
-
-let $sqlfunc = floor(col1);
-let $valsqlfunc = floor(15.123);
-let $coltype = float(7,4);
-let $infile = part_supported_sql_funcs_int_float.inc;
-let $val1 =  5.1230;
-let $val2 = 13.345;
-let $val3 = 17.987;
-let $val4 = 15.654 ;
-# DISABLED due to bug 30577
-#--source suite/parts/inc/partition_supported_sql_funcs.inc
-
 let $sqlfunc = mod(col1,10);
 let $valsqlfunc = mod(15,10);
 let $coltype = int;

=== modified file 'mysql-test/suite/parts/inc/partition_decimal.inc'
--- a/mysql-test/suite/parts/inc/partition_decimal.inc	2008-02-06 14:13:56 +0000
+++ b/mysql-test/suite/parts/inc/partition_decimal.inc	2010-12-14 11:13:35 +0000
@@ -37,10 +37,8 @@ drop table t2;
 
 # Bug 30577: FLOOR() and CEILING() not usable as partition functions
 # Partition functions are required to return INT_RESULT; FLOOR() and
-# CEILING() do not, unless they have an INT argument.  Disable this
-# portion of the test until bug 30577 is fixed.
+# CEILING() do not, unless they have an INT or DECIMAL argument.
 
---disable_parsing
 
 eval create table t3 (a decimal(18,9) not null, primary key(a)) engine=$engine 
 partition by range (floor(a)) subpartition by key (a) subpartitions 2 (
@@ -65,7 +63,7 @@ select count(*) from t3;
 drop table t3;
 
 eval create table t4 (a decimal(18,9) not null, primary key(a)) engine=$engine 
-partition by list (floor(a)) subpartition by key (a) subpartitions 2 (
+partition by list (ceiling(a)) subpartition by key (a) subpartitions 2 (
 partition pa2 values in (1,2),
 partition pa4 values in (3,4),
 partition pa6 values in (5,6),
@@ -85,6 +83,3 @@ dec $count;
 --enable_query_log
 select count(*) from t4;
 drop table t4;
-
-# Disabled due to Bug 30577
---enable_parsing

=== modified file 'mysql-test/suite/parts/inc/partition_double.inc'
--- a/mysql-test/suite/parts/inc/partition_double.inc	2008-02-06 14:13:56 +0000
+++ b/mysql-test/suite/parts/inc/partition_double.inc	2010-12-14 11:13:35 +0000
@@ -34,54 +34,3 @@ dec $count;
 --enable_query_log
 select count(*) from t2;
 drop table t2;
-
-
-# Bug 30577: FLOOR() and CEILING() not usable as partition functions
-# Partition functions are required to return INT_RESULT; FLOOR() and
-# CEILING() do not, unless they have an INT argument.  Disable this
-# portion of the test until bug 30577 is fixed.
-
---disable_parsing
-
-eval create table t3 (a double not null, primary key(a)) engine=$engine 
-partition by range (floor(a)) subpartition by key (a) subpartitions 3 (
-partition pa1 values less than (3),
-partition pa3 values less than (6),
-partition pa10 values less than (10)
-);
-show create table t3;
-let $count=9;
---echo $count*3 inserts;
-while ($count)
-{
-eval insert into t3 values ($count);
-eval insert into t3 values ($count+0.33);
-eval insert into t3 values ($count+0.75);
-dec $count;
-}
-select count(*) from t3;
-select * from t3;
-drop table t3;
-
-eval create table t4 (a double not null, primary key(a)) engine=$engine 
-partition by list (floor(a)) subpartition by key (a) subpartitions 3 (
-partition pa1 values in (1,2,3),
-partition pa3 values in (4,5,6),
-partition pa10 values in (7,8,9,10)
-);
-show create table t4;
-let $count=9;
---echo $count*3 inserts;
-while ($count)
-{
-eval insert into t4 values ($count);
-eval insert into t4 values ($count+0.33);
-eval insert into t4 values ($count+0.75);
-dec $count;
-}
-select count(*) from t4;
-select * from t4;
-drop table t4;
-
-# Disabled due to Bug 30577
---enable_parsing

=== modified file 'mysql-test/suite/parts/inc/partition_float.inc'
--- a/mysql-test/suite/parts/inc/partition_float.inc	2008-02-06 14:13:56 +0000
+++ b/mysql-test/suite/parts/inc/partition_float.inc	2010-12-14 11:13:35 +0000
@@ -38,53 +38,3 @@ dec $count;
 --enable_query_log
 select count(*) from t2;
 drop table t2;
-
-# Bug 30577: FLOOR() and CEILING() not usable as partition functions
-# Partition functions are required to return INT_RESULT; FLOOR() and
-# CEILING() do not, unless they have an INT argument.  Disable this
-# portion of the test until bug 30577 is fixed.
-
---disable_parsing
-
-eval create table t3 (a float not null, primary key(a)) engine=$engine 
-partition by range (floor(a)) subpartition by key (a) subpartitions 3 (
-partition pa1 values less than (3),
-partition pa3 values less than (6),
-partition pa10 values less than (10)
-);
-show create table t3;
-let $count=9;
---echo $count*3 inserts;
-while ($count)
-{
-eval insert into t3 values ($count);
-eval insert into t3 values ($count+0.33);
-eval insert into t3 values ($count+0.75);
-dec $count;
-}
-select count(*) from t3;
-select * from t3;
-drop table t3;
-
-eval create table t4 (a float not null, primary key(a)) engine=$engine 
-partition by list (floor(a)) subpartition by key (a) subpartitions 3 (
-partition pa1 values in (1,2,3),
-partition pa3 values in (4,5,6),
-partition pa10 values in (7,8,9,10)
-);
-show create table t4;
-let $count=9;
---echo $count*3 inserts;
-while ($count)
-{
-eval insert into t4 values ($count);
-eval insert into t4 values ($count+0.33);
-eval insert into t4 values ($count+0.75);
-dec $count;
-}
-select count(*) from t4;
-select * from t4;
-drop table t4;
-
-# Disabled due to Bug 30577
---enable_parsing

=== modified file 'mysql-test/suite/parts/r/partition_decimal_innodb.result'
--- a/mysql-test/suite/parts/r/partition_decimal_innodb.result	2008-11-04 07:43:21 +0000
+++ b/mysql-test/suite/parts/r/partition_decimal_innodb.result	2010-12-14 11:13:35 +0000
@@ -86,3 +86,111 @@ select count(*) from t2;
 count(*)
 3072
 drop table t2;
+create table t3 (a decimal(18,9) not null, primary key(a)) engine='InnoDB' 
+partition by range (floor(a)) subpartition by key (a) subpartitions 2 (
+partition pa2 values less than (2),
+partition pa4 values less than (4),
+partition pa6 values less than (6),
+partition pa8 values less than (8),
+partition pa10 values less than (10)
+);
+show create table t3;
+Table	Create Table
+t3	CREATE TABLE `t3` (
+  `a` decimal(18,9) NOT NULL,
+  PRIMARY KEY (`a`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+/*!50100 PARTITION BY RANGE (floor(a))
+SUBPARTITION BY KEY (a)
+SUBPARTITIONS 2
+(PARTITION pa2 VALUES LESS THAN (2) ENGINE = InnoDB,
+ PARTITION pa4 VALUES LESS THAN (4) ENGINE = InnoDB,
+ PARTITION pa6 VALUES LESS THAN (6) ENGINE = InnoDB,
+ PARTITION pa8 VALUES LESS THAN (8) ENGINE = InnoDB,
+ PARTITION pa10 VALUES LESS THAN (10) ENGINE = InnoDB) */
+9*3 inserts;
+insert into t3 values (9);
+insert into t3 values (9+0.333333333);
+insert into t3 values (9+0.755555555);
+insert into t3 values (8);
+insert into t3 values (8+0.333333333);
+insert into t3 values (8+0.755555555);
+insert into t3 values (7);
+insert into t3 values (7+0.333333333);
+insert into t3 values (7+0.755555555);
+insert into t3 values (6);
+insert into t3 values (6+0.333333333);
+insert into t3 values (6+0.755555555);
+insert into t3 values (5);
+insert into t3 values (5+0.333333333);
+insert into t3 values (5+0.755555555);
+insert into t3 values (4);
+insert into t3 values (4+0.333333333);
+insert into t3 values (4+0.755555555);
+insert into t3 values (3);
+insert into t3 values (3+0.333333333);
+insert into t3 values (3+0.755555555);
+insert into t3 values (2);
+insert into t3 values (2+0.333333333);
+insert into t3 values (2+0.755555555);
+insert into t3 values (1);
+insert into t3 values (1+0.333333333);
+insert into t3 values (1+0.755555555);
+select count(*) from t3;
+count(*)
+27
+drop table t3;
+create table t4 (a decimal(18,9) not null, primary key(a)) engine='InnoDB' 
+partition by list (ceiling(a)) subpartition by key (a) subpartitions 2 (
+partition pa2 values in (1,2),
+partition pa4 values in (3,4),
+partition pa6 values in (5,6),
+partition pa8 values in (7,8),
+partition pa10 values in (9,10)
+);
+show create table t4;
+Table	Create Table
+t4	CREATE TABLE `t4` (
+  `a` decimal(18,9) NOT NULL,
+  PRIMARY KEY (`a`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+/*!50100 PARTITION BY LIST (ceiling(a))
+SUBPARTITION BY KEY (a)
+SUBPARTITIONS 2
+(PARTITION pa2 VALUES IN (1,2) ENGINE = InnoDB,
+ PARTITION pa4 VALUES IN (3,4) ENGINE = InnoDB,
+ PARTITION pa6 VALUES IN (5,6) ENGINE = InnoDB,
+ PARTITION pa8 VALUES IN (7,8) ENGINE = InnoDB,
+ PARTITION pa10 VALUES IN (9,10) ENGINE = InnoDB) */
+9*3 inserts;
+insert into t4 values (9);
+insert into t4 values (9+0.333333333);
+insert into t4 values (9+0.755555555);
+insert into t4 values (8);
+insert into t4 values (8+0.333333333);
+insert into t4 values (8+0.755555555);
+insert into t4 values (7);
+insert into t4 values (7+0.333333333);
+insert into t4 values (7+0.755555555);
+insert into t4 values (6);
+insert into t4 values (6+0.333333333);
+insert into t4 values (6+0.755555555);
+insert into t4 values (5);
+insert into t4 values (5+0.333333333);
+insert into t4 values (5+0.755555555);
+insert into t4 values (4);
+insert into t4 values (4+0.333333333);
+insert into t4 values (4+0.755555555);
+insert into t4 values (3);
+insert into t4 values (3+0.333333333);
+insert into t4 values (3+0.755555555);
+insert into t4 values (2);
+insert into t4 values (2+0.333333333);
+insert into t4 values (2+0.755555555);
+insert into t4 values (1);
+insert into t4 values (1+0.333333333);
+insert into t4 values (1+0.755555555);
+select count(*) from t4;
+count(*)
+27
+drop table t4;

=== modified file 'mysql-test/suite/parts/r/partition_decimal_myisam.result'
--- a/mysql-test/suite/parts/r/partition_decimal_myisam.result	2008-11-04 07:43:21 +0000
+++ b/mysql-test/suite/parts/r/partition_decimal_myisam.result	2010-12-14 11:13:35 +0000
@@ -86,3 +86,111 @@ select count(*) from t2;
 count(*)
 196605
 drop table t2;
+create table t3 (a decimal(18,9) not null, primary key(a)) engine='MYISAM' 
+partition by range (floor(a)) subpartition by key (a) subpartitions 2 (
+partition pa2 values less than (2),
+partition pa4 values less than (4),
+partition pa6 values less than (6),
+partition pa8 values less than (8),
+partition pa10 values less than (10)
+);
+show create table t3;
+Table	Create Table
+t3	CREATE TABLE `t3` (
+  `a` decimal(18,9) NOT NULL,
+  PRIMARY KEY (`a`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+/*!50100 PARTITION BY RANGE (floor(a))
+SUBPARTITION BY KEY (a)
+SUBPARTITIONS 2
+(PARTITION pa2 VALUES LESS THAN (2) ENGINE = MyISAM,
+ PARTITION pa4 VALUES LESS THAN (4) ENGINE = MyISAM,
+ PARTITION pa6 VALUES LESS THAN (6) ENGINE = MyISAM,
+ PARTITION pa8 VALUES LESS THAN (8) ENGINE = MyISAM,
+ PARTITION pa10 VALUES LESS THAN (10) ENGINE = MyISAM) */
+9*3 inserts;
+insert into t3 values (9);
+insert into t3 values (9+0.333333333);
+insert into t3 values (9+0.755555555);
+insert into t3 values (8);
+insert into t3 values (8+0.333333333);
+insert into t3 values (8+0.755555555);
+insert into t3 values (7);
+insert into t3 values (7+0.333333333);
+insert into t3 values (7+0.755555555);
+insert into t3 values (6);
+insert into t3 values (6+0.333333333);
+insert into t3 values (6+0.755555555);
+insert into t3 values (5);
+insert into t3 values (5+0.333333333);
+insert into t3 values (5+0.755555555);
+insert into t3 values (4);
+insert into t3 values (4+0.333333333);
+insert into t3 values (4+0.755555555);
+insert into t3 values (3);
+insert into t3 values (3+0.333333333);
+insert into t3 values (3+0.755555555);
+insert into t3 values (2);
+insert into t3 values (2+0.333333333);
+insert into t3 values (2+0.755555555);
+insert into t3 values (1);
+insert into t3 values (1+0.333333333);
+insert into t3 values (1+0.755555555);
+select count(*) from t3;
+count(*)
+27
+drop table t3;
+create table t4 (a decimal(18,9) not null, primary key(a)) engine='MYISAM' 
+partition by list (ceiling(a)) subpartition by key (a) subpartitions 2 (
+partition pa2 values in (1,2),
+partition pa4 values in (3,4),
+partition pa6 values in (5,6),
+partition pa8 values in (7,8),
+partition pa10 values in (9,10)
+);
+show create table t4;
+Table	Create Table
+t4	CREATE TABLE `t4` (
+  `a` decimal(18,9) NOT NULL,
+  PRIMARY KEY (`a`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+/*!50100 PARTITION BY LIST (ceiling(a))
+SUBPARTITION BY KEY (a)
+SUBPARTITIONS 2
+(PARTITION pa2 VALUES IN (1,2) ENGINE = MyISAM,
+ PARTITION pa4 VALUES IN (3,4) ENGINE = MyISAM,
+ PARTITION pa6 VALUES IN (5,6) ENGINE = MyISAM,
+ PARTITION pa8 VALUES IN (7,8) ENGINE = MyISAM,
+ PARTITION pa10 VALUES IN (9,10) ENGINE = MyISAM) */
+9*3 inserts;
+insert into t4 values (9);
+insert into t4 values (9+0.333333333);
+insert into t4 values (9+0.755555555);
+insert into t4 values (8);
+insert into t4 values (8+0.333333333);
+insert into t4 values (8+0.755555555);
+insert into t4 values (7);
+insert into t4 values (7+0.333333333);
+insert into t4 values (7+0.755555555);
+insert into t4 values (6);
+insert into t4 values (6+0.333333333);
+insert into t4 values (6+0.755555555);
+insert into t4 values (5);
+insert into t4 values (5+0.333333333);
+insert into t4 values (5+0.755555555);
+insert into t4 values (4);
+insert into t4 values (4+0.333333333);
+insert into t4 values (4+0.755555555);
+insert into t4 values (3);
+insert into t4 values (3+0.333333333);
+insert into t4 values (3+0.755555555);
+insert into t4 values (2);
+insert into t4 values (2+0.333333333);
+insert into t4 values (2+0.755555555);
+insert into t4 values (1);
+insert into t4 values (1+0.333333333);
+insert into t4 values (1+0.755555555);
+select count(*) from t4;
+count(*)
+27
+drop table t4;

No bundle (reason: useless for push emails).
Thread
bzr push into mysql-5.1-bugteam branch (mattias.jonsson:3520 to 3521) Mattias Jonsson14 Dec