List:Commits« Previous MessageNext Message »
From:Mattias Jonsson Date:December 28 2008 11:34am
Subject:bzr commit into mysql-5.1-bugteam branch (mattias.jonsson:2754)
Bug#40972
View as plain text  
#At file:///Users/mattiasj/clones/bzrroot/b40972-51-bugteam/ based on revid:sergey.glukhov@stripped

 2754 Mattias Jonsson	2008-12-28
      Bug#40972: some sql execution lead the whole databse crashing
      
      Problem was an errornous date that lead to end partition
      was before the start, leading to a crash.
      
      Solution was to check greater or equal instead of only
      equal between start and end partition.
      
      NOTE: partitioning pruning handles incorrect dates
      differently than index lookup, which can give different
      results in a partitioned table versus a non partitioned
      table for queries having 'bad' dates in the where clause.
modified:
  mysql-test/r/partition_pruning.result
  mysql-test/t/partition_pruning.test
  sql/sql_partition.cc

per-file messages:
  mysql-test/r/partition_pruning.result
    Bug#40972: some sql execution lead the whole databse crashing
    
    Updated result file
  mysql-test/t/partition_pruning.test
    Bug#40972: some sql execution lead the whole databse crashing
    
    Added test.
  sql/sql_partition.cc
    Bug#40972: some sql execution lead the whole databse crashing
    
    There can be cases where the start/cur partition is greater
    than the end partition, so it must not continue, since that
    can lead to a crash.
=== modified file 'mysql-test/r/partition_pruning.result'
--- a/mysql-test/r/partition_pruning.result	2008-07-07 20:42:19 +0000
+++ b/mysql-test/r/partition_pruning.result	2008-12-28 11:33:49 +0000
@@ -1,4 +1,16 @@
 drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+CREATE TABLE t1
+(a INT NOT NULL AUTO_INCREMENT,
+b DATETIME,
+PRIMARY KEY (a,b),
+KEY (b))
+PARTITION BY RANGE (to_days(b))
+(PARTITION p0 VALUES LESS THAN (733681) COMMENT = 'LESS THAN 2008-10-01',
+PARTITION p1 VALUES LESS THAN (733712) COMMENT = 'LESS THAN 2008-11-01',
+PARTITION pX VALUES LESS THAN MAXVALUE);
+SELECT a,b FROM t1 WHERE b >= '2008-12-01' AND b < '2009-12-00';
+a	b
+DROP TABLE t1;
 create table t1 ( a int not null) partition by hash(a) partitions 2;
 insert into t1 values (1),(2),(3);
 explain select * from t1 where a=5 and a=6;

=== modified file 'mysql-test/t/partition_pruning.test'
--- a/mysql-test/t/partition_pruning.test	2007-09-14 10:18:42 +0000
+++ b/mysql-test/t/partition_pruning.test	2008-12-28 11:33:49 +0000
@@ -8,6 +8,22 @@
 drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
 --enable_warnings
 
+#
+# Bug#40972: some sql execution lead the whole database crashing
+#
+# Setup so the start is at partition pX and end is at p1
+# Pruning does handle 'bad' dates differently.
+CREATE TABLE t1
+(a INT NOT NULL AUTO_INCREMENT,
+ b DATETIME,
+ PRIMARY KEY (a,b),
+ KEY (b))
+PARTITION BY RANGE (to_days(b))
+(PARTITION p0 VALUES LESS THAN (733681) COMMENT = 'LESS THAN 2008-10-01',
+ PARTITION p1 VALUES LESS THAN (733712) COMMENT = 'LESS THAN 2008-11-01',
+ PARTITION pX VALUES LESS THAN MAXVALUE);
+SELECT a,b FROM t1 WHERE b >= '2008-12-01' AND b < '2009-12-00';
+DROP TABLE t1;
 
 # Check if we can infer from condition on partition fields that 
 # no records will match.

=== modified file 'sql/sql_partition.cc'
--- a/sql/sql_partition.cc	2008-12-10 08:06:58 +0000
+++ b/sql/sql_partition.cc	2008-12-28 11:33:49 +0000
@@ -6760,7 +6760,7 @@ int get_part_iter_for_interval_via_mappi
     store_key_image_to_rec(field, max_value, field_len);
     bool include_endp= !test(flags & NEAR_MAX);
     part_iter->part_nums.end= get_endpoint(part_info, 0, include_endp);
-    if (part_iter->part_nums.start == part_iter->part_nums.end &&
+    if (part_iter->part_nums.start >= part_iter->part_nums.end &&
         !part_iter->ret_null_part)
       return 0; /* No partitions */
   }
@@ -6938,7 +6938,7 @@ int get_part_iter_for_interval_via_walki
 
 uint32 get_next_partition_id_range(PARTITION_ITERATOR* part_iter)
 {
-  if (part_iter->part_nums.cur == part_iter->part_nums.end)
+  if (part_iter->part_nums.cur >= part_iter->part_nums.end)
   {
     part_iter->part_nums.cur= part_iter->part_nums.start;
     return NOT_A_PARTITION_ID;

Thread
bzr commit into mysql-5.1-bugteam branch (mattias.jonsson:2754)Bug#40972Mattias Jonsson28 Dec