maria-developers team mailing list archive
-
maria-developers team
-
Mailing list archive
-
Message #09946
Re: [Commits] 0a86a91: MDEV-10765: Wrong result - query does not retrieve values from default partition on a table partitioned by list columns
Hi Sanja,
> revision-id: 0a86a915842d268477c5febd8481263f00d6c792 (mariadb-10.1.8-242-g0a86a91)
> parent(s): effb65bc863da0f1115e16ef5f11d11a13cdc7a0
> committer: Oleksandr Byelkin
> timestamp: 2016-09-08 19:43:09 +0200
> message:
>
> MDEV-10765: Wrong result - query does not retrieve values from default partition on a table partitioned by list columns
>
> Partial matches should be treat as not exact one.
>
So I'm running this example:
create table t14n
(
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 t14n values
(10,10,1234),
(10,20,1234),
(10,30,1234),
(10,40,1234),
(10,50,1234);
explain partitions
select * from t14n
where a>=10 and (a <=10 and b <=30);
and then I get:
#1 0x0000555555eb88ef in get_part_iter_for_interval_cols_via_map (part_info=0x7fff90046208, is_subpart=false, store_length_array=0x7ffff436a0a0, min_value=0x7fff90069518 "\n", max_value=0x7fff90069528 "\n", min_len=8, max_len=4, flags=0, part_iter=0x7ffff436a858) at /home/psergey/dev-git/10.2/sql/sql_partition.cc:7751
This means I get all the way to the
memcmp(min_value, max_value, min_len)
call, where min_len=8, max_len=4, which means we're comparing garbage.
Please add a check that min_len==max_len.
Ok to push after this is addressed.
On Thu, Sep 08, 2016 at 07:43:10PM +0200, Oleksandr Byelkin wrote:
> diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc
> index 54396b9..24dff23 100644
> --- a/sql/sql_partition.cc
> +++ b/sql/sql_partition.cc
> @@ -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)
> @@ -7740,9 +7741,13 @@ 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 != 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())
> _______________________________________________
> commits mailing list
> commits@xxxxxxxxxxx
> https://lists.askmonty.org/cgi-bin/mailman/listinfo/commits
--
BR
Sergei
--
Sergei Petrunia, Software Developer
MariaDB Corporation | Skype: sergefp | Blog: http://s.petrunia.net/blog