diff options
author | Mikael Ronstrom <mikael@mysql.com> | 2009-10-06 16:22:15 +0200 |
---|---|---|
committer | Mikael Ronstrom <mikael@mysql.com> | 2009-10-06 16:22:15 +0200 |
commit | c6e67a9b04289ccf78f5f11485c34875ddf8ad89 (patch) | |
tree | d9308e481af7e82829423a1f7d70f0ebc9fa598f | |
parent | 01072e22fe7cc5e7a53e9ea0a065ba22027d52bf (diff) | |
download | mariadb-git-c6e67a9b04289ccf78f5f11485c34875ddf8ad89.tar.gz |
BUG#47838, NULL values in ranges was dropped due to missing else part in store_tuple_to_record
-rw-r--r-- | mysql-test/r/partition_column.result | 12 | ||||
-rw-r--r-- | mysql-test/t/partition_column.test | 27 | ||||
-rw-r--r-- | sql/sql_partition.cc | 11 |
3 files changed, 46 insertions, 4 deletions
diff --git a/mysql-test/r/partition_column.result b/mysql-test/r/partition_column.result index 43538cb7c69..f5b5b49de56 100644 --- a/mysql-test/r/partition_column.result +++ b/mysql-test/r/partition_column.result @@ -1,4 +1,16 @@ drop table if exists t1; +create table t1 (a int signed) +partition by list column_list(a) +( partition p0 values in (column_list(1), column_list(3), column_list(5), +column_list(7), column_list(9), column_list(NULL)), +partition p1 values in (column_list(2), column_list(4), column_list(6), +column_list(8), column_list(0))); +insert into t1 values (NULL),(0),(1),(2),(2),(4),(4),(4),(8),(8); +select * from t1 where a <= 1; +a +1 +0 +drop table t1; create table t1 (a int, b int) partition by list column_list(a,b) ( partition p0 values in (column_list(1, NULL), column_list(2, NULL), diff --git a/mysql-test/t/partition_column.test b/mysql-test/t/partition_column.test index 4edb03405b5..5eef85b4fa2 100644 --- a/mysql-test/t/partition_column.test +++ b/mysql-test/t/partition_column.test @@ -8,6 +8,33 @@ drop table if exists t1; --enable_warnings +# +# BUG#47838, List partitioning have problems with <= and >= +# +create table t1 (a int signed) +partition by list (a) +( partition p0 values in (1, 3, 5, 7, 9, NULL), + partition p1 values in (2, 4, 6, 8, 0)); +insert into t1 values (NULL),(0),(1),(2),(2),(4),(4),(4),(8),(8); +select * from t1 where NULL <= a; +select * from t1 where a is null; +explain partitions select * from t1 where a is null; +select * from t1 where a <= 1; +drop table t1; + +create table t1 (a int signed) +partition by list column_list(a) +( partition p0 values in (column_list(1), column_list(3), column_list(5), + column_list(7), column_list(9), column_list(NULL)), + partition p1 values in (column_list(2), column_list(4), column_list(6), + column_list(8), column_list(0))); +insert into t1 values (NULL),(0),(1),(2),(2),(4),(4),(4),(8),(8); +select * from t1 where a <= NULL; +select * from t1 where a is null; +explain partitions select * from t1 where a is null; +select * from t1 where a <= 1; +drop table t1; + create table t1 (a int, b int) partition by list column_list(a,b) ( partition p0 values in (column_list(1, NULL), column_list(2, NULL), diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 5e7fdb6c981..52e28311ead 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -6761,10 +6761,9 @@ uint32 store_tuple_to_record(Field **pfield, if ((*pfield)->real_maybe_null()) { if (*loc_value) - { (*pfield)->set_null(); - } - (*pfield)->set_notnull(); + else + (*pfield)->set_notnull(); loc_value++; } uint len= (*pfield)->pack_length(); @@ -6950,12 +6949,16 @@ int get_part_iter_for_interval_cols_via_map(partition_info *part_info, get_col_endpoint= get_partition_id_cols_range_for_endpoint; part_iter->get_next= get_next_partition_id_range; } - else + else if (part_info->part_type == LIST_PARTITION) { get_col_endpoint= get_partition_id_cols_list_for_endpoint; part_iter->get_next= get_next_partition_id_list; part_iter->part_info= part_info; + DBUG_ASSERT(part_info->num_list_values); } + else + assert(0); + if (flags & NO_MIN_RANGE) part_iter->part_nums.start= part_iter->part_nums.cur= 0; else |