From aa451a0e07254dfd1f7e1229018d05fc895e312d Mon Sep 17 00:00:00 2001
From: unknown <mikael@zim.(none)>
Date: Mon, 13 Mar 2006 02:36:02 -0800
Subject: [PATCH] BUG#15407: Crash if error in subpartition definition

mysql-test/r/partition.result:
  New test cases
mysql-test/t/partition.test:
  New test cases
sql/sql_yacc.yy:
  New error checks
---
 mysql-test/r/partition.result | 12 ++++++++++++
 mysql-test/t/partition.test   | 17 +++++++++++++++++
 sql/sql_yacc.yy               | 15 ++++++++++++++-
 3 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/mysql-test/r/partition.result b/mysql-test/r/partition.result
index 5a956379a4..33f4399d58 100644
--- a/mysql-test/r/partition.result
+++ b/mysql-test/r/partition.result
@@ -464,4 +464,16 @@ t1	CREATE TABLE `t1` (
   `a` int(11) DEFAULT NULL
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY KEY (a) (PARTITION p0  ENGINE = MyISAM, PARTITION p1  ENGINE = MyISAM)
 drop table t1;
+create table t1 (a int, b int)
+partition by range (a)
+subpartition by hash(a)
+(partition p0 values less than (0) (subpartition sp0),
+partition p1 values less than (1));
+ERROR 42000: Wrong number of subpartitions defined, mismatch with previous setting near ')' at line 5
+create table t1 (a int, b int)
+partition by range (a)
+subpartition by hash(a)
+(partition p0 values less than (0),
+partition p1 values less than (1) (subpartition sp0));
+ERROR 42000: Wrong number of subpartitions defined, mismatch with previous setting near '))' at line 5
 End of 5.1 tests
diff --git a/mysql-test/t/partition.test b/mysql-test/t/partition.test
index 764ef78899..bb551a46ca 100644
--- a/mysql-test/t/partition.test
+++ b/mysql-test/t/partition.test
@@ -588,4 +588,21 @@ show create table t1;
 
 drop table t1;
 
+#
+# BUG 15407 Crash with subpartition
+#
+--error 1064
+create table t1 (a int, b int)
+partition by range (a)
+subpartition by hash(a)
+(partition p0 values less than (0) (subpartition sp0),
+ partition p1 values less than (1));
+
+--error 1064
+create table t1 (a int, b int)
+partition by range (a)
+subpartition by hash(a)
+(partition p0 values less than (0),
+ partition p1 values less than (1) (subpartition sp0));
+
 --echo End of 5.1 tests
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 47852212b8..cae9bb168c 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -3793,7 +3793,15 @@ part_bit_expr:
         ;
 
 opt_sub_partition:
-        /* empty */ {}
+        /* empty */
+        {
+          if (Lex->part_info->no_subparts != 0 &&
+              !Lex->part_info->use_default_subpartitions)
+          {
+            yyerror(ER(ER_PARTITION_WRONG_NO_SUBPART_ERROR));
+            YYABORT;
+          }
+        }
         | '(' sub_part_list ')'
         {
           LEX *lex= Lex;
@@ -3809,6 +3817,11 @@ opt_sub_partition:
           }
           else if (part_info->count_curr_subparts > 0)
           {
+            if (part_info->partitions.elements > 1)
+            {
+              yyerror(ER(ER_PARTITION_WRONG_NO_SUBPART_ERROR));
+              YYABORT;
+            }
             part_info->no_subparts= part_info->count_curr_subparts;
           }
           part_info->count_curr_subparts= 0;
-- 
2.30.9