mirror of
https://github.com/MariaDB/server.git
synced 2025-01-27 09:14:17 +01:00
Merge branch '10.2' into 10.3
This commit is contained in:
commit
212d92ad26
7 changed files with 144 additions and 16 deletions
2
VERSION
2
VERSION
|
@ -1,4 +1,4 @@
|
|||
MYSQL_VERSION_MAJOR=10
|
||||
MYSQL_VERSION_MINOR=3
|
||||
MYSQL_VERSION_PATCH=26
|
||||
MYSQL_VERSION_PATCH=27
|
||||
SERVER_MATURITY=stable
|
||||
|
|
|
@ -1251,7 +1251,7 @@ SELECT * FROM t1 WHERE
|
|||
5 <= a AND b = 3 OR
|
||||
3 <= a;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range a a 5 NULL 3 Using where; Using index
|
||||
1 SIMPLE t1 range a a 5 NULL 4 Using where; Using index
|
||||
SELECT * FROM t1 WHERE
|
||||
3 <= a AND a <= 5 OR
|
||||
5 <= a AND b = 3 OR
|
||||
|
@ -3033,6 +3033,39 @@ a b
|
|||
set eq_range_index_dive_limit=default;
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-24117: Memory management problem in statistics state...
|
||||
# (just the testcase)
|
||||
#
|
||||
create table t0(a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1(a int);
|
||||
insert into t1
|
||||
select A.a + B.a* 10 + C.a * 100 + D.a * 1000
|
||||
from t0 A, t0 B, t0 C, t0 D
|
||||
where D.a<4;
|
||||
create table t2 (
|
||||
a int,
|
||||
b int,
|
||||
key(a)
|
||||
);
|
||||
insert into t2 values (1,1),(2,2),(3,3);
|
||||
set @query=(select group_concat(a) from t1);
|
||||
set @tmp_24117= @@max_session_mem_used;
|
||||
#
|
||||
# On debug build, the usage was
|
||||
# - 2.8M without the bug
|
||||
# - 1G with the bug.
|
||||
set max_session_mem_used=64*1024*1024;
|
||||
set @query=concat('explain select * from t2 where a in (', @query, ')');
|
||||
prepare s from @query;
|
||||
# This should not fail with an error:
|
||||
execute s;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t2 ALL a NULL NULL NULL 3 Using where
|
||||
set max_session_mem_used=@tmp_24117;
|
||||
deallocate prepare s;
|
||||
drop table t0,t1,t2;
|
||||
#
|
||||
# MDEV-23811: Both disjunct of WHERE condition contain range conditions
|
||||
# for the same index such that the second range condition
|
||||
# fully covers the first one. Additionally one of the disjuncts
|
||||
|
|
|
@ -2067,6 +2067,52 @@ set eq_range_index_dive_limit=default;
|
|||
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-24117: Memory management problem in statistics state...
|
||||
--echo # (just the testcase)
|
||||
--echo #
|
||||
|
||||
create table t0(a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
|
||||
create table t1(a int);
|
||||
|
||||
# 4K rows
|
||||
insert into t1
|
||||
select A.a + B.a* 10 + C.a * 100 + D.a * 1000
|
||||
from t0 A, t0 B, t0 C, t0 D
|
||||
where D.a<4;
|
||||
|
||||
create table t2 (
|
||||
a int,
|
||||
b int,
|
||||
key(a)
|
||||
);
|
||||
|
||||
insert into t2 values (1,1),(2,2),(3,3);
|
||||
|
||||
set @query=(select group_concat(a) from t1);
|
||||
|
||||
set @tmp_24117= @@max_session_mem_used;
|
||||
|
||||
--echo #
|
||||
--echo # On debug build, the usage was
|
||||
--echo # - 2.8M without the bug
|
||||
--echo # - 1G with the bug.
|
||||
|
||||
set max_session_mem_used=64*1024*1024;
|
||||
|
||||
set @query=concat('explain select * from t2 where a in (', @query, ')');
|
||||
|
||||
prepare s from @query;
|
||||
|
||||
--echo # This should not fail with an error:
|
||||
execute s;
|
||||
set max_session_mem_used=@tmp_24117;
|
||||
|
||||
deallocate prepare s;
|
||||
|
||||
drop table t0,t1,t2;
|
||||
--echo #
|
||||
--echo # MDEV-23811: Both disjunct of WHERE condition contain range conditions
|
||||
--echo # for the same index such that the second range condition
|
||||
|
|
|
@ -1253,7 +1253,7 @@ SELECT * FROM t1 WHERE
|
|||
5 <= a AND b = 3 OR
|
||||
3 <= a;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range a a 5 NULL 3 Using where; Using index
|
||||
1 SIMPLE t1 range a a 5 NULL 4 Using where; Using index
|
||||
SELECT * FROM t1 WHERE
|
||||
3 <= a AND a <= 5 OR
|
||||
5 <= a AND b = 3 OR
|
||||
|
@ -3045,6 +3045,39 @@ a b
|
|||
set eq_range_index_dive_limit=default;
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-24117: Memory management problem in statistics state...
|
||||
# (just the testcase)
|
||||
#
|
||||
create table t0(a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1(a int);
|
||||
insert into t1
|
||||
select A.a + B.a* 10 + C.a * 100 + D.a * 1000
|
||||
from t0 A, t0 B, t0 C, t0 D
|
||||
where D.a<4;
|
||||
create table t2 (
|
||||
a int,
|
||||
b int,
|
||||
key(a)
|
||||
);
|
||||
insert into t2 values (1,1),(2,2),(3,3);
|
||||
set @query=(select group_concat(a) from t1);
|
||||
set @tmp_24117= @@max_session_mem_used;
|
||||
#
|
||||
# On debug build, the usage was
|
||||
# - 2.8M without the bug
|
||||
# - 1G with the bug.
|
||||
set max_session_mem_used=64*1024*1024;
|
||||
set @query=concat('explain select * from t2 where a in (', @query, ')');
|
||||
prepare s from @query;
|
||||
# This should not fail with an error:
|
||||
execute s;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t2 ALL a NULL NULL NULL 3 Using where
|
||||
set max_session_mem_used=@tmp_24117;
|
||||
deallocate prepare s;
|
||||
drop table t0,t1,t2;
|
||||
#
|
||||
# MDEV-23811: Both disjunct of WHERE condition contain range conditions
|
||||
# for the same index such that the second range condition
|
||||
# fully covers the first one. Additionally one of the disjuncts
|
||||
|
|
|
@ -8910,15 +8910,9 @@ tree_or(RANGE_OPT_PARAM *param,SEL_TREE *tree1,SEL_TREE *tree2)
|
|||
}
|
||||
bool no_imerge_from_ranges= FALSE;
|
||||
|
||||
SEL_TREE *rt1= tree1;
|
||||
SEL_TREE *rt2= tree2;
|
||||
/* Build the range part of the tree for the formula (1) */
|
||||
if (sel_trees_can_be_ored(param, tree1, tree2, &ored_keys))
|
||||
{
|
||||
if (no_merges1)
|
||||
rt1= new SEL_TREE(tree1, TRUE, param);
|
||||
if (no_merges2)
|
||||
rt2= new SEL_TREE(tree2, TRUE, param);
|
||||
bool must_be_ored= sel_trees_must_be_ored(param, tree1, tree2, ored_keys);
|
||||
no_imerge_from_ranges= must_be_ored;
|
||||
|
||||
|
@ -8976,6 +8970,12 @@ tree_or(RANGE_OPT_PARAM *param,SEL_TREE *tree1,SEL_TREE *tree2)
|
|||
else if (!no_ranges1 && !no_ranges2 && !no_imerge_from_ranges)
|
||||
{
|
||||
/* Build the imerge part of the tree for the formula (1) */
|
||||
SEL_TREE *rt1= tree1;
|
||||
SEL_TREE *rt2= tree2;
|
||||
if (no_merges1)
|
||||
rt1= new SEL_TREE(tree1, TRUE, param);
|
||||
if (no_merges2)
|
||||
rt2= new SEL_TREE(tree2, TRUE, param);
|
||||
if (!rt1 || !rt2 ||
|
||||
result->merges.push_back(imerge_from_ranges) ||
|
||||
imerge_from_ranges->or_sel_tree(param, rt1) ||
|
||||
|
@ -9641,7 +9641,7 @@ key_or(RANGE_OPT_PARAM *param, SEL_ARG *key1,SEL_ARG *key2)
|
|||
if (!tmp->next_key_part)
|
||||
{
|
||||
SEL_ARG *key2_next= key2->next;
|
||||
if (key2->use_count)
|
||||
if (key2_shared)
|
||||
{
|
||||
SEL_ARG *key2_cpy= new SEL_ARG(*key2);
|
||||
if (!key2_cpy)
|
||||
|
|
|
@ -3238,10 +3238,19 @@ void mysqld_stmt_execute(THD *thd, char *packet_arg, uint packet_length)
|
|||
void mysqld_stmt_bulk_execute(THD *thd, char *packet_arg, uint packet_length)
|
||||
{
|
||||
uchar *packet= (uchar*)packet_arg; // GCC 4.0.1 workaround
|
||||
DBUG_ENTER("mysqld_stmt_execute_bulk");
|
||||
|
||||
const uint packet_header_lenght= 4 + 2; //ID & 2 bytes of flags
|
||||
|
||||
if (packet_length < packet_header_lenght)
|
||||
{
|
||||
my_error(ER_MALFORMED_PACKET, MYF(0));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
ulong stmt_id= uint4korr(packet);
|
||||
uint flags= (uint) uint2korr(packet + 4);
|
||||
uchar *packet_end= packet + packet_length;
|
||||
DBUG_ENTER("mysqld_stmt_execute_bulk");
|
||||
|
||||
if (!(thd->client_capabilities &
|
||||
MARIADB_CLIENT_STMT_BULK_OPERATIONS))
|
||||
|
@ -3249,16 +3258,18 @@ void mysqld_stmt_bulk_execute(THD *thd, char *packet_arg, uint packet_length)
|
|||
DBUG_PRINT("error",
|
||||
("An attempt to execute bulk operation without support"));
|
||||
my_error(ER_UNSUPPORTED_PS, MYF(0));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
/* Check for implemented parameters */
|
||||
if (flags & (~STMT_BULK_FLAG_CLIENT_SEND_TYPES))
|
||||
{
|
||||
DBUG_PRINT("error", ("unsupported bulk execute flags %x", flags));
|
||||
my_error(ER_UNSUPPORTED_PS, MYF(0));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
/* stmt id and two bytes of flags */
|
||||
packet+= 4 + 2;
|
||||
packet+= packet_header_lenght;
|
||||
mysql_stmt_execute_common(thd, stmt_id, packet, packet_end, 0, TRUE,
|
||||
(flags & STMT_BULK_FLAG_CLIENT_SEND_TYPES));
|
||||
DBUG_VOID_RETURN;
|
||||
|
@ -3335,9 +3346,11 @@ stmt_execute_packet_sanity_check(Prepared_statement *stmt,
|
|||
{
|
||||
/*
|
||||
If there is no parameters, this should be normally already end
|
||||
of the packet. If it's not - then error
|
||||
of the packet, but it is not a problem if something left (popular
|
||||
mistake in protocol implementation) because we will not read anymore
|
||||
from the buffer.
|
||||
*/
|
||||
return (packet_end > packet);
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -20995,8 +20995,11 @@ static void test_mdev19838()
|
|||
" VALUES "
|
||||
"(0x1111111111111111)", -1);
|
||||
|
||||
/* Expecting an error if parameters are sent */
|
||||
DIE_UNLESS(rc != 0 || paramCount == 0);
|
||||
/*
|
||||
We allow junk at the end of the packet in case of
|
||||
no parameters. So it will succeed.
|
||||
*/
|
||||
DIE_UNLESS(rc == 0);
|
||||
}
|
||||
|
||||
mysql_stmt_close(stmt);
|
||||
|
|
Loading…
Add table
Reference in a new issue