From e262e74419002711770b09f64db9136f08eb3f15 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 6 Jan 2006 18:52:49 -0600 Subject: [PATCH] Bug# 15968 - Partitions: crash when insert with f1 = -1 into partition by hash(f1) fixed mysql-test/r/partition_hash.result: results for newly added test. mysql-test/t/partition_hash.test: test case for inserting a value into a hash that would generate a negative value sql/sql_partition.cc: fields that generate a negative value would also generate a negative part_id which doesn't index into the m_file array to well. --- mysql-test/r/partition_hash.result | 6 ++++++ mysql-test/t/partition_hash.test | 9 +++++++++ sql/sql_partition.cc | 3 ++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/partition_hash.result b/mysql-test/r/partition_hash.result index 2165630e4fb..b72d47d3748 100644 --- a/mysql-test/r/partition_hash.result +++ b/mysql-test/r/partition_hash.result @@ -64,3 +64,9 @@ primary key(a,b)) partition by key (a) (partition x1); drop table t1; +CREATE TABLE t1 (f1 INTEGER, f2 char(20)) ENGINE = 'MYISAM' PARTITION BY HASH(f1) PARTITIONS 2; +INSERT INTO t1 SET f1 = 0 - 1, f2 = '#######'; +select * from t1; +f1 f2 +-1 ####### +drop table t1; diff --git a/mysql-test/t/partition_hash.test b/mysql-test/t/partition_hash.test index aa1acfe891f..6e3f0f67d47 100644 --- a/mysql-test/t/partition_hash.test +++ b/mysql-test/t/partition_hash.test @@ -75,3 +75,12 @@ partition by key (a) (partition x1); drop table t1; + +# +# Bug# 15968 - crash when INSERT with f1 = -1 into partition by hash(f1) +# +CREATE TABLE t1 (f1 INTEGER, f2 char(20)) ENGINE = 'MYISAM' PARTITION BY HASH(f1) PARTITIONS 2; +INSERT INTO t1 SET f1 = 0 - 1, f2 = '#######'; +select * from t1; +drop table t1; + diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 5d071c5591c..f1b77cd0240 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -2327,7 +2327,8 @@ static uint32 get_part_id_hash(uint no_parts, Item *part_expr) { DBUG_ENTER("get_part_id_hash"); - DBUG_RETURN((uint32)(part_expr->val_int() % no_parts)); + longlong int_hash_id= part_expr->val_int() % no_parts; + DBUG_RETURN(int_hash_id < 0 ? -int_hash_id : int_hash_id); }