summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikael Ronstrom <mikael@mysql.com>2009-10-06 16:22:15 +0200
committerMikael Ronstrom <mikael@mysql.com>2009-10-06 16:22:15 +0200
commitc6e67a9b04289ccf78f5f11485c34875ddf8ad89 (patch)
treed9308e481af7e82829423a1f7d70f0ebc9fa598f
parent01072e22fe7cc5e7a53e9ea0a065ba22027d52bf (diff)
downloadmariadb-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.result12
-rw-r--r--mysql-test/t/partition_column.test27
-rw-r--r--sql/sql_partition.cc11
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