Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
340feb01
Commit
340feb01
authored
4 years ago
by
Marko Mäkelä
Browse files
Options
Browse Files
Download
Plain Diff
Merge mariadb-10.3.27 into 10.3
parents
bafbfb55
dba846ce
Branches unavailable
Tags unavailable
No related merge requests found
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
143 additions
and
15 deletions
+143
-15
mysql-test/main/range.result
mysql-test/main/range.result
+34
-1
mysql-test/main/range.test
mysql-test/main/range.test
+46
-0
mysql-test/main/range_mrr_icp.result
mysql-test/main/range_mrr_icp.result
+34
-1
sql/opt_range.cc
sql/opt_range.cc
+7
-7
sql/sql_prepare.cc
sql/sql_prepare.cc
+17
-4
tests/mysql_client_test.c
tests/mysql_client_test.c
+5
-2
No files found.
mysql-test/main/range.result
View file @
340feb01
...
...
@@ -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=1 or 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
...
...
This diff is collapsed.
Click to expand it.
mysql-test/main/range.test
View file @
340feb01
...
...
@@ -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=1 or 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
...
...
This diff is collapsed.
Click to expand it.
mysql-test/main/range_mrr_icp.result
View file @
340feb01
...
...
@@ -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=1 or 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
...
...
This diff is collapsed.
Click to expand it.
sql/opt_range.cc
View file @
340feb01
...
...
@@ -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
)
...
...
This diff is collapsed.
Click to expand it.
sql/sql_prepare.cc
View file @
340feb01
...
...
@@ -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
;
}
...
...
This diff is collapsed.
Click to expand it.
tests/mysql_client_test.c
View file @
340feb01
...
...
@@ -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
);
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment