diff options
author | evgen@sunlight.local <> | 2006-07-29 23:54:55 +0400 |
---|---|---|
committer | evgen@sunlight.local <> | 2006-07-29 23:54:55 +0400 |
commit | 8cd88a91794e37ec05509ef5ea121bcb69eef0c9 (patch) | |
tree | 994c44f0506354afa0f3a7ada5c686497b506b44 | |
parent | 69f9fe7531baba37e29b4a09c5247f7b324ed573 (diff) | |
parent | 285e392512b6c46f2893bceb10577c5698d1eb4e (diff) | |
download | mariadb-git-8cd88a91794e37ec05509ef5ea121bcb69eef0c9.tar.gz |
Merge epotemkin@bk-internal.mysql.com:/home/bk/mysql-5.1
into sunlight.local:/local_work/tmp_merge-5.1-opt-mysql
-rw-r--r-- | mysql-test/r/partition_pruning.result | 86 | ||||
-rw-r--r-- | mysql-test/t/partition_pruning.test | 73 | ||||
-rw-r--r-- | sql/sql_partition.cc | 16 | ||||
-rw-r--r-- | sql/sql_select.cc | 3 |
4 files changed, 174 insertions, 4 deletions
diff --git a/mysql-test/r/partition_pruning.result b/mysql-test/r/partition_pruning.result index bf7888bfd99..220d5cd6ec0 100644 --- a/mysql-test/r/partition_pruning.result +++ b/mysql-test/r/partition_pruning.result @@ -775,3 +775,89 @@ ref NULL rows 2 Extra drop table t2; +create table t1 (s1 int); +explain partitions select 1 from t1 union all select 2; +id select_type table partitions type possible_keys key key_len ref rows Extra +1 PRIMARY t1 NULL system NULL NULL NULL NULL 0 const row not found +2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used +NULL UNION RESULT <union1,2> NULL ALL NULL NULL NULL NULL NULL +drop table t1; +create table t1 (a bigint unsigned not null) partition by range(a) ( +partition p0 values less than (10), +partition p1 values less than (100), +partition p2 values less than (1000), +partition p3 values less than (18446744073709551000), +partition p4 values less than (18446744073709551614) +); +insert into t1 values (5),(15),(105),(1005); +insert into t1 values (18446744073709551000+1); +insert into t1 values (18446744073709551614-1); +explain partitions select * from t1 where a < 10; +id select_type table partitions type possible_keys key key_len ref rows Extra +1 SIMPLE t1 p0 system NULL NULL NULL NULL 1 +explain partitions select * from t1 +where a >= 18446744073709551000-1 and a <= 18446744073709551000+1; +id select_type table partitions type possible_keys key key_len ref rows Extra +1 SIMPLE t1 p3,p4 ALL NULL NULL NULL NULL 3 Using where +explain partitions select * from t1 +where a between 18446744073709551001 and 18446744073709551002; +id select_type table partitions type possible_keys key key_len ref rows Extra +1 SIMPLE t1 p4 ALL NULL NULL NULL NULL 2 Using where +explain partitions select * from t1 where a = 18446744073709551000; +id select_type table partitions type possible_keys key key_len ref rows Extra +1 SIMPLE t1 p4 ALL NULL NULL NULL NULL 2 Using where +explain partitions select * from t1 where a = 18446744073709551613; +id select_type table partitions type possible_keys key key_len ref rows Extra +1 SIMPLE t1 p4 ALL NULL NULL NULL NULL 2 Using where +explain partitions select * from t1 where a = 18446744073709551614; +id select_type table partitions type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +drop table t1; +create table t1 (a int) +partition by range((a & 0xFF) << 56) ( +partition p0 values less than (0x40 << 56), +partition p1 values less than (0x80 << 56), +partition p2 values less than (0xFF << 56) +); +insert into t1 values (0x20), (0x20), (0x41), (0x41), (0xFE), (0xFE); +explain partitions select * from t1 where a=0; +id select_type table partitions type possible_keys key key_len ref rows Extra +1 SIMPLE t1 p0 ALL NULL NULL NULL NULL 2 Using where +explain partitions select * from t1 where a=0xFE; +id select_type table partitions type possible_keys key key_len ref rows Extra +1 SIMPLE t1 p2 ALL NULL NULL NULL NULL 2 Using where +explain partitions select * from t1 where a>0xFE and a<= 0xFF; +id select_type table partitions type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +drop table t1; +create table t1(a bigint unsigned not null) partition by range(a+0) ( +partition p1 values less than (10), +partition p2 values less than (20), +partition p3 values less than (2305561538531885056), +partition p4 values less than (2305561538531950591) +); +insert into t1 values (9),(19),(0xFFFF0000FFFF000-1), (0xFFFF0000FFFFFFF-1); +insert into t1 values (9),(19),(0xFFFF0000FFFF000-1), (0xFFFF0000FFFFFFF-1); +explain partitions select * from t1 where +a >= 2305561538531885056-10 and a <= 2305561538531885056-8; +id select_type table partitions type possible_keys key key_len ref rows Extra +1 SIMPLE t1 p3 ALL NULL NULL NULL NULL 4 Using where +explain partitions select * from t1 where +a > 0xFFFFFFFFFFFFFFEC and a < 0xFFFFFFFFFFFFFFEE; +id select_type table partitions type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +explain partitions select * from t1 where a>=0 and a <= 0xFFFFFFFFFFFFFFFF; +id select_type table partitions type possible_keys key key_len ref rows Extra +1 SIMPLE t1 p1,p2,p3,p4 ALL NULL NULL NULL NULL 8 Using where +drop table t1; +create table t1 (a bigint) partition by range(a+0) ( +partition p1 values less than (-1000), +partition p2 values less than (-10), +partition p3 values less than (10), +partition p4 values less than (1000) +); +insert into t1 values (-15),(-5),(5),(15),(-15),(-5),(5),(15); +explain partitions select * from t1 where a>-2 and a <=0; +id select_type table partitions type possible_keys key key_len ref rows Extra +1 SIMPLE t1 p3 ALL NULL NULL NULL NULL 4 Using where +drop table t1; diff --git a/mysql-test/t/partition_pruning.test b/mysql-test/t/partition_pruning.test index dd79e8d3acb..cf310793848 100644 --- a/mysql-test/t/partition_pruning.test +++ b/mysql-test/t/partition_pruning.test @@ -642,3 +642,76 @@ explain partitions select * from t2; --horizontal_results drop table t2; + +# BUG#20484 "Partitions: crash with explain and union" +create table t1 (s1 int); +explain partitions select 1 from t1 union all select 2; +drop table t1; + + +# BUG#20257: partition pruning test coverage for BIGINT UNSIGNED +create table t1 (a bigint unsigned not null) partition by range(a) ( + partition p0 values less than (10), + partition p1 values less than (100), + partition p2 values less than (1000), + partition p3 values less than (18446744073709551000), + partition p4 values less than (18446744073709551614) +); +insert into t1 values (5),(15),(105),(1005); +insert into t1 values (18446744073709551000+1); +insert into t1 values (18446744073709551614-1); + +explain partitions select * from t1 where a < 10; +explain partitions select * from t1 + where a >= 18446744073709551000-1 and a <= 18446744073709551000+1; + +explain partitions select * from t1 + where a between 18446744073709551001 and 18446744073709551002; + +explain partitions select * from t1 where a = 18446744073709551000; +explain partitions select * from t1 where a = 18446744073709551613; +explain partitions select * from t1 where a = 18446744073709551614; +drop table t1; + +create table t1 (a int) + partition by range((a & 0xFF) << 56) ( + partition p0 values less than (0x40 << 56), + partition p1 values less than (0x80 << 56), + partition p2 values less than (0xFF << 56) +); + +insert into t1 values (0x20), (0x20), (0x41), (0x41), (0xFE), (0xFE); +explain partitions select * from t1 where a=0; +explain partitions select * from t1 where a=0xFE; +explain partitions select * from t1 where a>0xFE and a<= 0xFF; +drop table t1; + +create table t1(a bigint unsigned not null) partition by range(a+0) ( + partition p1 values less than (10), + partition p2 values less than (20), + partition p3 values less than (2305561538531885056), + partition p4 values less than (2305561538531950591) +); + +insert into t1 values (9),(19),(0xFFFF0000FFFF000-1), (0xFFFF0000FFFFFFF-1); +insert into t1 values (9),(19),(0xFFFF0000FFFF000-1), (0xFFFF0000FFFFFFF-1); + +explain partitions select * from t1 where + a >= 2305561538531885056-10 and a <= 2305561538531885056-8; + +explain partitions select * from t1 where + a > 0xFFFFFFFFFFFFFFEC and a < 0xFFFFFFFFFFFFFFEE; + +explain partitions select * from t1 where a>=0 and a <= 0xFFFFFFFFFFFFFFFF; +drop table t1; + +create table t1 (a bigint) partition by range(a+0) ( + partition p1 values less than (-1000), + partition p2 values less than (-10), + partition p3 values less than (10), + partition p4 values less than (1000) +); +insert into t1 values (-15),(-5),(5),(15),(-15),(-5),(5),(15); +explain partitions select * from t1 where a>-2 and a <=0; +drop table t1; + diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 3f1572ee676..73091c0994e 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -6577,10 +6577,19 @@ int get_part_iter_for_interval_via_walking(partition_info *part_info, store_key_image_to_rec(field, max_value, len); b= field->val_int(); + + /* + Handle a special case where the distance between interval bounds is + exactly 4G-1. This interval is too big for range walking, and if it is an + (x,y]-type interval then the following "b +=..." code will convert it to + an empty interval by "wrapping around" a + 4G-1 + 1 = a. + */ + if ((ulonglong)b - (ulonglong)a == ~0ULL) + return -1; a += test(flags & NEAR_MIN); b += test(!(flags & NEAR_MAX)); - uint n_values= b - a; + ulonglong n_values= b - a; if (n_values > total_parts || n_values > MAX_RANGE_TO_WALK) return -1; @@ -6684,7 +6693,8 @@ static uint32 get_next_partition_via_walking(PARTITION_ITERATOR *part_iter) while (part_iter->field_vals.cur != part_iter->field_vals.end) { longlong dummy; - field->store(part_iter->field_vals.cur++, FALSE); + field->store(part_iter->field_vals.cur++, + ((Field_num*)field)->unsigned_flag); if (part_iter->part_info->is_sub_partitioned() && !part_iter->part_info->get_part_partition_id(part_iter->part_info, &part_id, &dummy) || @@ -6692,8 +6702,6 @@ static uint32 get_next_partition_via_walking(PARTITION_ITERATOR *part_iter) &part_id, &dummy)) return part_id; } - //psergey-todo: return partition(part_func(NULL)) here... - part_iter->field_vals.cur= part_iter->field_vals.start; return NOT_A_PARTITION_ID; } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 0dc19c5417d..f224f333a98 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -14114,6 +14114,9 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, } item_list.push_back(new Item_string(table_name_buffer, len, cs)); } + /* partitions */ + if (join->thd->lex->describe & DESCRIBE_PARTITIONS) + item_list.push_back(item_null); /* type */ item_list.push_back(new Item_string(join_type_str[JT_ALL], strlen(join_type_str[JT_ALL]), |