mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
BUG#19055: There may exist a SEL_TREE objects with type==KEY and keys[i]==NULL for any i.
(for example, such objects can be returned from get_mm_parts() for "string_field = int_val). Make find_used_partitions_imerge() to handle such SEL_TREE objects. mysql-test/r/partition_pruning.result: BUG#19055: testcase mysql-test/t/partition_pruning.test: BUG#19055: testcase
This commit is contained in:
@ -670,3 +670,11 @@ select * from t1 where a like 'n%';
|
|||||||
a
|
a
|
||||||
na
|
na
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1 (s1 varchar(15)) partition by key (s1);
|
||||||
|
select * from t1 where s1 = 0 or s1 is null;
|
||||||
|
s1
|
||||||
|
insert into t1 values ('aa'),('bb'),('0');
|
||||||
|
explain partitions select * from t1 where s1 = 0 or s1 is null;
|
||||||
|
id select_type table partitions type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 p0 ALL NULL NULL NULL NULL 3 Using where
|
||||||
|
drop table t1;
|
||||||
|
@ -556,7 +556,7 @@ drop table t1;
|
|||||||
# being fixed.
|
# being fixed.
|
||||||
|
|
||||||
#
|
#
|
||||||
#BUG 17946 Like searches fail with partitioning
|
# BUG#17946 Like searches fail with partitioning
|
||||||
#
|
#
|
||||||
create table t1 (a char(32) primary key)
|
create table t1 (a char(32) primary key)
|
||||||
partition by key()
|
partition by key()
|
||||||
@ -566,3 +566,11 @@ select * from t1;
|
|||||||
select * from t1 where a like 'n%';
|
select * from t1 where a like 'n%';
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
|
||||||
|
# BUG#19055 Crashes for varchar_col=NUMBER or varchar_col IS NULL
|
||||||
|
create table t1 (s1 varchar(15)) partition by key (s1);
|
||||||
|
select * from t1 where s1 = 0 or s1 is null;
|
||||||
|
insert into t1 values ('aa'),('bb'),('0');
|
||||||
|
explain partitions select * from t1 where s1 = 0 or s1 is null;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
@ -374,6 +374,12 @@ public:
|
|||||||
keys_map.clear_all();
|
keys_map.clear_all();
|
||||||
bzero((char*) keys,sizeof(keys));
|
bzero((char*) keys,sizeof(keys));
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
Note: there may exist SEL_TREE objects with sel_tree->type=KEY and
|
||||||
|
keys[i]=0 for all i. (SergeyP: it is not clear whether there is any
|
||||||
|
merit in range analyzer functions (e.g. get_mm_parts) returning a
|
||||||
|
pointer to such SEL_TREE instead of NULL)
|
||||||
|
*/
|
||||||
SEL_ARG *keys[MAX_KEY];
|
SEL_ARG *keys[MAX_KEY];
|
||||||
key_map keys_map; /* bitmask of non-NULL elements in keys */
|
key_map keys_map; /* bitmask of non-NULL elements in keys */
|
||||||
|
|
||||||
@ -2580,7 +2586,8 @@ int find_used_partitions_imerge(PART_PRUNE_PARAM *ppar, SEL_IMERGE *imerge)
|
|||||||
ppar->cur_part_fields= 0;
|
ppar->cur_part_fields= 0;
|
||||||
ppar->cur_subpart_fields= 0;
|
ppar->cur_subpart_fields= 0;
|
||||||
init_all_partitions_iterator(ppar->part_info, &ppar->part_iter);
|
init_all_partitions_iterator(ppar->part_info, &ppar->part_iter);
|
||||||
if (-1 == (res |= find_used_partitions(ppar, (*ptree)->keys[0])))
|
SEL_ARG *key_tree= (*ptree)->keys[0];
|
||||||
|
if (!key_tree || (-1 == (res |= find_used_partitions(ppar, key_tree))))
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
@ -5104,7 +5111,7 @@ get_mm_parts(RANGE_OPT_PARAM *param, COND *cond_func, Field *field,
|
|||||||
tree->keys_map.set_bit(key_part->key);
|
tree->keys_map.set_bit(key_part->key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DBUG_RETURN(tree);
|
DBUG_RETURN(tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user