From b2d0a33ea04a5eb20124667ea277fe78eb981a90 Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Sat, 6 Apr 2013 00:51:41 -0700 Subject: [PATCH] Fixed bug mdev-4373: Valgrind complained on usage of uninitialized memory. --- mysql-test/r/selectivity.result | 17 +++++++++++++++++ mysql-test/r/selectivity_innodb.result | 17 +++++++++++++++++ mysql-test/t/selectivity.test | 23 +++++++++++++++++++++++ sql/field.cc | 12 +++++++----- 4 files changed, 64 insertions(+), 5 deletions(-) diff --git a/mysql-test/r/selectivity.result b/mysql-test/r/selectivity.result index f05b26cc724..e26d2481820 100644 --- a/mysql-test/r/selectivity.result +++ b/mysql-test/r/selectivity.result @@ -850,4 +850,21 @@ set optimizer_switch=@save_optimizer_switch; set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; DROP TABLE t1,t2; set use_stat_tables=@save_use_stat_tables; +# +# Bug mdev-4373: condition on a short varchar column +# with optimizer_use_condition_selectivity=3 +# +set use_stat_tables=PREFERABLY; +CREATE TABLE t1 (a varchar(1)); +INSERT INTO t1 VALUES ('x'), ('y'); +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +FLUSH TABLES; +set optimizer_use_condition_selectivity=3; +SELECT * FROM t1 WHERE a <= 'w'; +a +set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; +DROP TABLE t1; +set use_stat_tables=@save_use_stat_tables; set use_stat_tables=@save_use_stat_tables; diff --git a/mysql-test/r/selectivity_innodb.result b/mysql-test/r/selectivity_innodb.result index 57037574e5d..5f4ddf76383 100644 --- a/mysql-test/r/selectivity_innodb.result +++ b/mysql-test/r/selectivity_innodb.result @@ -858,6 +858,23 @@ set optimizer_switch=@save_optimizer_switch; set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; DROP TABLE t1,t2; set use_stat_tables=@save_use_stat_tables; +# +# Bug mdev-4373: condition on a short varchar column +# with optimizer_use_condition_selectivity=3 +# +set use_stat_tables=PREFERABLY; +CREATE TABLE t1 (a varchar(1)); +INSERT INTO t1 VALUES ('x'), ('y'); +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +FLUSH TABLES; +set optimizer_use_condition_selectivity=3; +SELECT * FROM t1 WHERE a <= 'w'; +a +set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; +DROP TABLE t1; +set use_stat_tables=@save_use_stat_tables; set use_stat_tables=@save_use_stat_tables; set optimizer_switch=@save_optimizer_switch_for_selectivity_test; SET SESSION STORAGE_ENGINE=DEFAULT; diff --git a/mysql-test/t/selectivity.test b/mysql-test/t/selectivity.test index 095c853d7de..ccd5b09ce68 100644 --- a/mysql-test/t/selectivity.test +++ b/mysql-test/t/selectivity.test @@ -444,5 +444,28 @@ DROP TABLE t1,t2; set use_stat_tables=@save_use_stat_tables; +--echo # +--echo # Bug mdev-4373: condition on a short varchar column +--echo # with optimizer_use_condition_selectivity=3 +--echo # + +set use_stat_tables=PREFERABLY; + +CREATE TABLE t1 (a varchar(1)); +INSERT INTO t1 VALUES ('x'), ('y'); + +ANALYZE TABLE t1; +FLUSH TABLES; + +set optimizer_use_condition_selectivity=3; + +SELECT * FROM t1 WHERE a <= 'w'; + +set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; + +DROP TABLE t1; + +set use_stat_tables=@save_use_stat_tables; + set use_stat_tables=@save_use_stat_tables; diff --git a/sql/field.cc b/sql/field.cc index 51fa24fc9ad..7eba901d46b 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -6202,14 +6202,16 @@ double Field_str::middle_point_pos(Field *min, Field *max) uchar minp_prefix[sizeof(ulonglong)]; uchar maxp_prefix[sizeof(ulonglong)]; ulonglong mp, minp, maxp; + uint dsz= min(field_length, sizeof(ulonglong) * charset()->mbmaxlen); + memset(mp_prefix, 0, sizeof(ulonglong)); + memset(minp_prefix, 0, sizeof(ulonglong)); + memset(maxp_prefix, 0, sizeof(ulonglong)); my_strnxfrm(charset(), mp_prefix, sizeof(mp), - ptr + length_size(), sizeof(mp) * charset()->mbmaxlen); + ptr + length_size(), dsz); my_strnxfrm(charset(), minp_prefix, sizeof(minp), - min->ptr + length_size(), - sizeof(minp) * charset()->mbmaxlen); + min->ptr + length_size(), dsz); my_strnxfrm(charset(), maxp_prefix, sizeof(maxp), - max->ptr + length_size(), - sizeof(maxp) * charset()->mbmaxlen); + max->ptr + length_size(), dsz); mp= char_prefix_to_ulonglong(mp_prefix); minp= char_prefix_to_ulonglong(minp_prefix); maxp= char_prefix_to_ulonglong(maxp_prefix);