From eb13e2b40d6a2fb847cf413fa29cf089e53e64d1 Mon Sep 17 00:00:00 2001 From: Rich Prohaska Date: Fri, 21 Nov 2014 07:13:07 -0500 Subject: [PATCH] DB-771 fix incorrect assert in update callback for varchar expansion --- mysql-test/suite/tokudb.bugs/r/db771.result | 11 +++++++++++ mysql-test/suite/tokudb.bugs/t/db771.test | 13 +++++++++++++ .../suite/tokudb/r/change_column_varchar.result | 1 + .../suite/tokudb/t/change_column_varchar.test | 1 + storage/tokudb/tokudb_update_fun.cc | 2 +- 5 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 mysql-test/suite/tokudb.bugs/r/db771.result create mode 100644 mysql-test/suite/tokudb.bugs/t/db771.test diff --git a/mysql-test/suite/tokudb.bugs/r/db771.result b/mysql-test/suite/tokudb.bugs/r/db771.result new file mode 100644 index 00000000000..3fc012a732f --- /dev/null +++ b/mysql-test/suite/tokudb.bugs/r/db771.result @@ -0,0 +1,11 @@ +set default_storage_engine=tokudb; +drop table if exists t1; +CREATE TABLE t1 (a int key, b varchar(32), c varchar(32)); +REPLACE t1 SET a = 4; +ALTER TABLE t1 CHANGE COLUMN c c VARCHAR(500); +update t1 set b='hi'; +update t1 set c='there'; +select * from t1; +a b c +4 hi there +drop table t1; diff --git a/mysql-test/suite/tokudb.bugs/t/db771.test b/mysql-test/suite/tokudb.bugs/t/db771.test new file mode 100644 index 00000000000..039ad7471c1 --- /dev/null +++ b/mysql-test/suite/tokudb.bugs/t/db771.test @@ -0,0 +1,13 @@ +# test case for DB-771 +source include/have_tokudb.inc; +set default_storage_engine=tokudb; +disable_warnings; +drop table if exists t1; +enable_warnings; +CREATE TABLE t1 (a int key, b varchar(32), c varchar(32)); +REPLACE t1 SET a = 4; +ALTER TABLE t1 CHANGE COLUMN c c VARCHAR(500); +update t1 set b='hi'; +update t1 set c='there'; +select * from t1; +drop table t1; diff --git a/mysql-test/suite/tokudb/r/change_column_varchar.result b/mysql-test/suite/tokudb/r/change_column_varchar.result index a9cb5e57a36..2e7da5ed5ef 100644 --- a/mysql-test/suite/tokudb/r/change_column_varchar.result +++ b/mysql-test/suite/tokudb/r/change_column_varchar.result @@ -6,6 +6,7 @@ Table Create Table t CREATE TABLE `t` ( `a` varchar(1) DEFAULT NULL ) ENGINE=TokuDB DEFAULT CHARSET=latin1 +INSERT INTO t VALUES (null); ALTER TABLE t CHANGE COLUMN a a VARCHAR(2); ALTER TABLE t CHANGE COLUMN a a VARCHAR(2); ALTER TABLE t CHANGE COLUMN a a VARCHAR(3); diff --git a/mysql-test/suite/tokudb/t/change_column_varchar.test b/mysql-test/suite/tokudb/t/change_column_varchar.test index f2b4e3cbf78..6543952ad29 100644 --- a/mysql-test/suite/tokudb/t/change_column_varchar.test +++ b/mysql-test/suite/tokudb/t/change_column_varchar.test @@ -9,6 +9,7 @@ SET SESSION TOKUDB_DISABLE_SLOW_ALTER=ON; CREATE TABLE t (a VARCHAR(1)) ENGINE=TokuDB; SHOW CREATE TABLE t; +INSERT INTO t VALUES (null); # 1->1 let $i=1 diff --git a/storage/tokudb/tokudb_update_fun.cc b/storage/tokudb/tokudb_update_fun.cc index 3ab7510121a..9754dc989a2 100644 --- a/storage/tokudb/tokudb_update_fun.cc +++ b/storage/tokudb/tokudb_update_fun.cc @@ -851,7 +851,7 @@ static int tokudb_expand_variable_offsets( DBT new_val; memset(&new_val, 0, sizeof new_val); if (old_val != NULL) { - assert(offset_start + number_of_offsets < old_val->size); + assert(offset_start + number_of_offsets <= old_val->size); // compute the new val from the old val uchar *old_val_ptr = (uchar *)old_val->data;