diff options
author | Varun <varun.gupta@mariadb.com> | 2019-06-14 12:16:17 +0530 |
---|---|---|
committer | Varun <varun.gupta@mariadb.com> | 2019-06-14 23:08:00 +0530 |
commit | 772c5f3c78fcdaea2169ba435bac8d851c7945c7 (patch) | |
tree | d65668d14e00ab0174ac39d14e086e25ef645a11 | |
parent | 1e3dc15d62c2f7f7d3afe6affb0db66c8515234d (diff) | |
download | mariadb-git-772c5f3c78fcdaea2169ba435bac8d851c7945c7.tar.gz |
MDEV-19634: Assertion `0' failed in row_sel_convert_mysql_key_to_innobase, [Warning] InnoDB: Using a partial-field key prefix in search
For a key with keyparts (k1,k2,k3) , if we are building a range over the keyparts
we should make sure that if min_value/max_value for a keypart is not added to
key buffer then the keyparts following should also not be allowed.
-rw-r--r-- | mysql-test/main/range_innodb.result | 18 | ||||
-rw-r--r-- | mysql-test/main/range_innodb.test | 19 | ||||
-rw-r--r-- | sql/opt_range.h | 10 |
3 files changed, 43 insertions, 4 deletions
diff --git a/mysql-test/main/range_innodb.result b/mysql-test/main/range_innodb.result index 30161a2711d..8774a623826 100644 --- a/mysql-test/main/range_innodb.result +++ b/mysql-test/main/range_innodb.result @@ -80,3 +80,21 @@ ERROR HY000: Table definition has changed, please retry transaction DROP TABLE t0,t1; set @@global.debug_dbug="-d"; set @@optimizer_switch= @optimizer_switch_save; +# +# MDEV-19634: Assertion `0' failed in row_sel_convert_mysql_key_to_innobase, +# [Warning] InnoDB: Using a partial-field key prefix in search +# +CREATE TABLE t1 ( +pk INT, +a VARCHAR(1), +b INT, +PRIMARY KEY (pk), +KEY (a,b) +) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1,'a',1),(2,'b',2); +explain SELECT a FROM t1 WHERE pk < 0 AND a <= 'w' and b > 0; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index PRIMARY,a a 9 NULL 2 Using where; Using index +SELECT a FROM t1 WHERE pk < 0 AND a <= 'w' and b > 0; +a +drop table t1; diff --git a/mysql-test/main/range_innodb.test b/mysql-test/main/range_innodb.test index a17ef3f1146..2c225df27fe 100644 --- a/mysql-test/main/range_innodb.test +++ b/mysql-test/main/range_innodb.test @@ -87,3 +87,22 @@ select * from t1 where a=10 and b=10; DROP TABLE t0,t1; set @@global.debug_dbug="-d"; set @@optimizer_switch= @optimizer_switch_save; + +--echo # +--echo # MDEV-19634: Assertion `0' failed in row_sel_convert_mysql_key_to_innobase, +--echo # [Warning] InnoDB: Using a partial-field key prefix in search +--echo # + +CREATE TABLE t1 ( + pk INT, + a VARCHAR(1), + b INT, + PRIMARY KEY (pk), + KEY (a,b) +) ENGINE=InnoDB; + +INSERT INTO t1 VALUES (1,'a',1),(2,'b',2); + +explain SELECT a FROM t1 WHERE pk < 0 AND a <= 'w' and b > 0; +SELECT a FROM t1 WHERE pk < 0 AND a <= 'w' and b > 0; +drop table t1; diff --git a/sql/opt_range.h b/sql/opt_range.h index ae0e3822272..73def7bde92 100644 --- a/sql/opt_range.h +++ b/sql/opt_range.h @@ -459,8 +459,9 @@ public: uint res= key_tree->store_min(key[key_tree->part].store_length, range_key, *range_key_flag); // add flags only if a key_part is written to the buffer - if (res) - *range_key_flag|= key_tree->min_flag; + if (!res) + return 0; + *range_key_flag|= key_tree->min_flag; if (key_tree->next_key_part && key_tree->next_key_part->type == SEL_ARG::KEY_RANGE && key_tree->part != last_part && @@ -482,8 +483,9 @@ public: SEL_ARG *key_tree= last(); uint res=key_tree->store_max(key[key_tree->part].store_length, range_key, *range_key_flag); - if (res) - (*range_key_flag)|= key_tree->max_flag; + if (!res) + return 0; + *range_key_flag|= key_tree->max_flag; if (key_tree->next_key_part && key_tree->next_key_part->type == SEL_ARG::KEY_RANGE && key_tree->part != last_part && |