Fixed bug mdev-9628.
In the function create_key_parts_for_pseudo_indexes() the key part structures of pseudo-indexes created for BLOB fields were set incorrectly. Also the key parts for long fields must be 'truncated' up to the maximum length acceptable for key parts.
This commit is contained in:
parent
9d4a0dde0a
commit
d451d772fd
@ -1470,3 +1470,50 @@ d
|
||||
drop table t1;
|
||||
set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
|
||||
set use_stat_tables=@save_use_stat_tables;
|
||||
#
|
||||
# Bug mdev-9628: unindexed blob column without min-max statistics
|
||||
# with optimizer_use_condition_selectivity=3
|
||||
#
|
||||
set use_stat_tables='preferably';
|
||||
set optimizer_use_condition_selectivity=3;
|
||||
create table t1(col1 char(32));
|
||||
insert into t1 values ('a'),('b'),('c'),('d'), ('e'),('f'),('g'),('h');
|
||||
analyze table t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 analyze status Engine-independent statistics collected
|
||||
test.t1 analyze status OK
|
||||
create table t2(col1 text);
|
||||
insert into t2 values ('a'),('b'),('c'),('d'), ('e'),('f'),('g'),('h');
|
||||
analyze table t2;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t2 analyze status Engine-independent statistics collected
|
||||
test.t2 analyze status OK
|
||||
select * from t1 where col1 > 'b' and col1 < 'd';
|
||||
col1
|
||||
c
|
||||
explain extended
|
||||
select * from t1 where col1 > 'b' and col1 < 'd';
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 28.57 Using where
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`col1` AS `col1` from `test`.`t1` where ((`test`.`t1`.`col1` > 'b') and (`test`.`t1`.`col1` < 'd'))
|
||||
select * from t2 where col1 > 'b' and col1 < 'd';
|
||||
col1
|
||||
c
|
||||
explain extended
|
||||
select * from t2 where col1 > 'b' and col1 < 'd';
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 ALL NULL NULL NULL NULL 8 100.00 Using where
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t2`.`col1` AS `col1` from `test`.`t2` where ((`test`.`t2`.`col1` > 'b') and (`test`.`t2`.`col1` < 'd'))
|
||||
select * from t2 where col1 < 'b' and col1 > 'd';
|
||||
col1
|
||||
explain extended
|
||||
select * from t2 where col1 < 'b' and col1 > 'd';
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t2`.`col1` AS `col1` from `test`.`t2` where 0
|
||||
drop table t1,t2;
|
||||
set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
|
||||
set use_stat_tables=@save_use_stat_tables;
|
||||
|
@ -1474,6 +1474,53 @@ d
|
||||
drop table t1;
|
||||
set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
|
||||
set use_stat_tables=@save_use_stat_tables;
|
||||
#
|
||||
# Bug mdev-9628: unindexed blob column without min-max statistics
|
||||
# with optimizer_use_condition_selectivity=3
|
||||
#
|
||||
set use_stat_tables='preferably';
|
||||
set optimizer_use_condition_selectivity=3;
|
||||
create table t1(col1 char(32));
|
||||
insert into t1 values ('a'),('b'),('c'),('d'), ('e'),('f'),('g'),('h');
|
||||
analyze table t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 analyze status Engine-independent statistics collected
|
||||
test.t1 analyze status OK
|
||||
create table t2(col1 text);
|
||||
insert into t2 values ('a'),('b'),('c'),('d'), ('e'),('f'),('g'),('h');
|
||||
analyze table t2;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t2 analyze status Engine-independent statistics collected
|
||||
test.t2 analyze status OK
|
||||
select * from t1 where col1 > 'b' and col1 < 'd';
|
||||
col1
|
||||
c
|
||||
explain extended
|
||||
select * from t1 where col1 > 'b' and col1 < 'd';
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 28.57 Using where
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`col1` AS `col1` from `test`.`t1` where ((`test`.`t1`.`col1` > 'b') and (`test`.`t1`.`col1` < 'd'))
|
||||
select * from t2 where col1 > 'b' and col1 < 'd';
|
||||
col1
|
||||
c
|
||||
explain extended
|
||||
select * from t2 where col1 > 'b' and col1 < 'd';
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 ALL NULL NULL NULL NULL 8 100.00 Using where
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t2`.`col1` AS `col1` from `test`.`t2` where ((`test`.`t2`.`col1` > 'b') and (`test`.`t2`.`col1` < 'd'))
|
||||
select * from t2 where col1 < 'b' and col1 > 'd';
|
||||
col1
|
||||
explain extended
|
||||
select * from t2 where col1 < 'b' and col1 > 'd';
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t2`.`col1` AS `col1` from `test`.`t2` where 0
|
||||
drop table t1,t2;
|
||||
set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
|
||||
set use_stat_tables=@save_use_stat_tables;
|
||||
set optimizer_switch=@save_optimizer_switch_for_selectivity_test;
|
||||
set @tmp_ust= @@use_stat_tables;
|
||||
set @tmp_oucs= @@optimizer_use_condition_selectivity;
|
||||
@ -1560,6 +1607,44 @@ where t1.child_user_id=t3.id and t1.child_group_id is null and t2.lower_group_na
|
||||
parent_id child_group_id child_user_id id lower_group_name directory_id id
|
||||
drop table t1,t2,t3;
|
||||
#
|
||||
# MDEV-9187: duplicate of bug mdev-9628
|
||||
#
|
||||
set use_stat_tables = preferably;
|
||||
set optimizer_use_condition_selectivity=3;
|
||||
CREATE TABLE t1 (f1 char(32)) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES ('foo'),('bar'),('qux');
|
||||
ANALYZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 analyze status Engine-independent statistics collected
|
||||
test.t1 analyze status OK
|
||||
SELECT * FROM t1 WHERE f1 < 'm';
|
||||
f1
|
||||
foo
|
||||
bar
|
||||
EXPLAIN EXTENDED
|
||||
SELECT * FROM t1 WHERE f1 < 'm';
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 3 72.09 Using where
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`f1` AS `f1` from `test`.`t1` where (`test`.`t1`.`f1` < 'm')
|
||||
CREATE TABLE t2 (f1 TEXT) ENGINE=InnoDB;
|
||||
INSERT INTO t2 VALUES ('foo'),('bar'),('qux');
|
||||
ANALYZE TABLE t2;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t2 analyze status Engine-independent statistics collected
|
||||
test.t2 analyze status OK
|
||||
SELECT * FROM t2 WHERE f1 <> 'qux';
|
||||
f1
|
||||
foo
|
||||
bar
|
||||
EXPLAIN EXTENDED
|
||||
SELECT * FROM t2 WHERE f1 <> 'qux';
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t2`.`f1` AS `f1` from `test`.`t2` where (`test`.`t2`.`f1` <> 'qux')
|
||||
DROP TABLE t1,t2;
|
||||
#
|
||||
# End of 10.0 tests
|
||||
#
|
||||
set use_stat_tables= @tmp_ust;
|
||||
|
@ -992,3 +992,36 @@ drop table t1;
|
||||
set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
|
||||
set use_stat_tables=@save_use_stat_tables;
|
||||
|
||||
--echo #
|
||||
--echo # Bug mdev-9628: unindexed blob column without min-max statistics
|
||||
--echo # with optimizer_use_condition_selectivity=3
|
||||
--echo #
|
||||
|
||||
set use_stat_tables='preferably';
|
||||
set optimizer_use_condition_selectivity=3;
|
||||
|
||||
create table t1(col1 char(32));
|
||||
insert into t1 values ('a'),('b'),('c'),('d'), ('e'),('f'),('g'),('h');
|
||||
analyze table t1;
|
||||
|
||||
create table t2(col1 text);
|
||||
insert into t2 values ('a'),('b'),('c'),('d'), ('e'),('f'),('g'),('h');
|
||||
analyze table t2;
|
||||
|
||||
select * from t1 where col1 > 'b' and col1 < 'd';
|
||||
explain extended
|
||||
select * from t1 where col1 > 'b' and col1 < 'd';
|
||||
|
||||
select * from t2 where col1 > 'b' and col1 < 'd';
|
||||
explain extended
|
||||
select * from t2 where col1 > 'b' and col1 < 'd';
|
||||
|
||||
select * from t2 where col1 < 'b' and col1 > 'd';
|
||||
explain extended
|
||||
select * from t2 where col1 < 'b' and col1 > 'd';
|
||||
|
||||
drop table t1,t2;
|
||||
|
||||
set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
|
||||
set use_stat_tables=@save_use_stat_tables;
|
||||
|
||||
|
@ -109,6 +109,31 @@ where t1.child_user_id=t3.id and t1.child_group_id is null and t2.lower_group_na
|
||||
|
||||
drop table t1,t2,t3;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-9187: duplicate of bug mdev-9628
|
||||
--echo #
|
||||
|
||||
set use_stat_tables = preferably;
|
||||
set optimizer_use_condition_selectivity=3;
|
||||
|
||||
CREATE TABLE t1 (f1 char(32)) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES ('foo'),('bar'),('qux');
|
||||
ANALYZE TABLE t1;
|
||||
|
||||
SELECT * FROM t1 WHERE f1 < 'm';
|
||||
EXPLAIN EXTENDED
|
||||
SELECT * FROM t1 WHERE f1 < 'm';
|
||||
|
||||
CREATE TABLE t2 (f1 TEXT) ENGINE=InnoDB;
|
||||
INSERT INTO t2 VALUES ('foo'),('bar'),('qux');
|
||||
ANALYZE TABLE t2;
|
||||
|
||||
SELECT * FROM t2 WHERE f1 <> 'qux';
|
||||
EXPLAIN EXTENDED
|
||||
SELECT * FROM t2 WHERE f1 <> 'qux';
|
||||
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.0 tests
|
||||
--echo #
|
||||
|
@ -3345,9 +3345,16 @@ bool create_key_parts_for_pseudo_indexes(RANGE_OPT_PARAM *param,
|
||||
{
|
||||
Field *field= *field_ptr;
|
||||
uint16 store_length;
|
||||
uint16 max_key_part_length= (uint16) table->file->max_key_part_length();
|
||||
key_part->key= keys;
|
||||
key_part->part= 0;
|
||||
key_part->length= (uint16) field->key_length();
|
||||
if (field->flags & BLOB_FLAG)
|
||||
key_part->length= max_key_part_length;
|
||||
else
|
||||
{
|
||||
key_part->length= (uint16) field->key_length();
|
||||
set_if_smaller(key_part->length, max_key_part_length);
|
||||
}
|
||||
store_length= key_part->length;
|
||||
if (field->real_maybe_null())
|
||||
store_length+= HA_KEY_NULL_LENGTH;
|
||||
|
Loading…
x
Reference in New Issue
Block a user