Skip to content

Commit

Permalink
MDEV-10765: Wrong result - query does not retrieve values from defaul…
Browse files Browse the repository at this point in the history
…t partition on a table partitioned by list columns

Partial matches should be treat as not exact one.
  • Loading branch information
sanja-byelkin committed Sep 9, 2016
1 parent 2c52493 commit b22ed66
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 0 deletions.
55 changes: 55 additions & 0 deletions mysql-test/r/partition_default.result
Original file line number Diff line number Diff line change
Expand Up @@ -1149,3 +1149,58 @@ t1 CREATE TABLE `t1` (
PARTITION p2 VALUES IN ((1,4),(2,5),(3,6)) ENGINE = MyISAM,
PARTITION p1 VALUES IN ((1,1),(0,0)) ENGINE = MyISAM) */
drop table t1;
#
# MDEV-10765: Wrong result - query does not retrieve values from
# default partition on a table partitioned by list columns
#
create table t1 (i int, j int) partition by list columns(i,j) (partition p1 values in ((10,10)), partition p2 default);
insert into t1 values (10,1);
select * from t1 where i = 10;
i j
10 1
explain partitions
select * from t1 where i = 10;
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p1,p2 system NULL NULL NULL NULL 1
select * from t1 where i = 10 and j=1;
i j
10 1
explain partitions
select * from t1 where i = 10 and j=1;
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p2 system NULL NULL NULL NULL 1
insert into t1 values (10,10);
select * from t1 where i = 10 and j=10;
i j
10 10
explain partitions
select * from t1 where i = 10 and j=10;
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p1 system NULL NULL NULL NULL 1
drop table t1;
create table t1
(
a int not null,
b int not null,
c int
)
partition by list columns(a,b)
(
partition p1 values in ((10,10)),
partition p2 values in ((10,20)),
partition p3 values in ((10,30)),
partition p4 values in ((10,40)),
partition p5 values in ((10,50))
);
insert into t1 values
(10,10,1234),
(10,20,1234),
(10,30,1234),
(10,40,1234),
(10,50,1234);
explain partitions
select * from t1
where a>=10 and (a <=10 and b <=30);
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p1,p2,p3 ALL NULL NULL NULL NULL 3 Using where
drop table t1;
47 changes: 47 additions & 0 deletions mysql-test/t/partition_default.test
Original file line number Diff line number Diff line change
Expand Up @@ -453,3 +453,50 @@ create table t1 (a int, b int)
show create table t1;

drop table t1;

--echo #
--echo # MDEV-10765: Wrong result - query does not retrieve values from
--echo # default partition on a table partitioned by list columns
--echo #

create table t1 (i int, j int) partition by list columns(i,j) (partition p1 values in ((10,10)), partition p2 default);
insert into t1 values (10,1);
select * from t1 where i = 10;
explain partitions
select * from t1 where i = 10;
select * from t1 where i = 10 and j=1;
explain partitions
select * from t1 where i = 10 and j=1;
insert into t1 values (10,10);
select * from t1 where i = 10 and j=10;
explain partitions
select * from t1 where i = 10 and j=10;
drop table t1;

create table t1
(
a int not null,
b int not null,
c int
)
partition by list columns(a,b)
(
partition p1 values in ((10,10)),
partition p2 values in ((10,20)),
partition p3 values in ((10,30)),
partition p4 values in ((10,40)),
partition p5 values in ((10,50))
);

insert into t1 values
(10,10,1234),
(10,20,1234),
(10,30,1234),
(10,40,1234),
(10,50,1234);

explain partitions
select * from t1
where a>=10 and (a <=10 and b <=30);

drop table t1;
6 changes: 6 additions & 0 deletions sql/sql_partition.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7723,6 +7723,7 @@ int get_part_iter_for_interval_cols_via_map(partition_info *part_info,
bool can_match_multiple_values;
uint32 nparts;
get_col_endpoint_func UNINIT_VAR(get_col_endpoint);
uint full_length= 0;
DBUG_ENTER("get_part_iter_for_interval_cols_via_map");

if (part_info->part_type == RANGE_PARTITION)
Expand All @@ -7740,9 +7741,14 @@ int get_part_iter_for_interval_cols_via_map(partition_info *part_info,
else
assert(0);

for (uint32 i= 0; i < part_info->num_columns; i++)
full_length+= store_length_array[i];

can_match_multiple_values= ((flags &
(NO_MIN_RANGE | NO_MAX_RANGE | NEAR_MIN |
NEAR_MAX)) ||
(min_len != max_len) ||
(min_len != full_length) ||
memcmp(min_value, max_value, min_len));
DBUG_ASSERT(can_match_multiple_values || (flags & EQ_RANGE) || flags == 0);
if (can_match_multiple_values && part_info->has_default_partititon())
Expand Down

0 comments on commit b22ed66

Please sign in to comment.