mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge 10.3 into 10.4
This commit is contained in:
@ -1187,6 +1187,7 @@ common_schema.sum_ints(seq)
|
|||||||
drop database common_schema;
|
drop database common_schema;
|
||||||
drop database another_schema;
|
drop database another_schema;
|
||||||
USE test;
|
USE test;
|
||||||
|
# End of 10.3 tests
|
||||||
#
|
#
|
||||||
# MDEV-18813 PROCEDURE and anonymous blocks silently ignore FETCH GROUP NEXT ROW
|
# MDEV-18813 PROCEDURE and anonymous blocks silently ignore FETCH GROUP NEXT ROW
|
||||||
#
|
#
|
||||||
|
@ -1001,6 +1001,8 @@ drop database another_schema;
|
|||||||
|
|
||||||
USE test;
|
USE test;
|
||||||
|
|
||||||
|
--echo # End of 10.3 tests
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-18813 PROCEDURE and anonymous blocks silently ignore FETCH GROUP NEXT ROW
|
--echo # MDEV-18813 PROCEDURE and anonymous blocks silently ignore FETCH GROUP NEXT ROW
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -2535,6 +2535,38 @@ c1
|
|||||||
1
|
1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
#
|
#
|
||||||
|
# MDEV-22498: SIGSEGV in Bitmap<64u>::merge on SELECT
|
||||||
|
#
|
||||||
|
set @save_sql_select_limit= @@sql_select_limit;
|
||||||
|
SET sql_select_limit=0;
|
||||||
|
CREATE TABLE t1(b INT, c INT);
|
||||||
|
CREATE TABLE t2(a INT, b INT);
|
||||||
|
INSERT INTO t1 VALUES (1,1),(2,2),(3,3);
|
||||||
|
INSERT INTO t2 VALUES (1,1),(2,2),(3,3);
|
||||||
|
EXPLAIN EXTENDED SELECT sum(a), t2.a, t2.b FROM t2 HAVING t2.a IN (SELECT t2.b FROM t1);
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL Zero limit
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 100.00
|
||||||
|
Warnings:
|
||||||
|
Note 1276 Field or reference 'test.t2.b' of SELECT #2 was resolved in SELECT #1
|
||||||
|
Note 1276 Field or reference 'test.t2.b' of SELECT #2 was resolved in SELECT #1
|
||||||
|
Note 1003 /* select#1 */ select sum(`test`.`t2`.`a`) AS `sum(a)`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b` from `test`.`t2` having <in_optimizer>(`test`.`t2`.`a`,<exists>(/* select#2 */ select `test`.`t2`.`b` from `test`.`t1` where <cache>(`test`.`t2`.`a`) = `test`.`t2`.`b`))
|
||||||
|
SELECT sum(a), t2.a, t2.b FROM t2 HAVING t2.a IN (SELECT t2.b FROM t1);
|
||||||
|
sum(a) a b
|
||||||
|
SET @@sql_select_limit= @save_sql_select_limit;
|
||||||
|
EXPLAIN EXTENDED SELECT sum(a), t2.a, t2.b FROM t2 HAVING t2.a IN (SELECT t2.b FROM t1);
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 3 100.00
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 100.00
|
||||||
|
Warnings:
|
||||||
|
Note 1276 Field or reference 'test.t2.b' of SELECT #2 was resolved in SELECT #1
|
||||||
|
Note 1276 Field or reference 'test.t2.b' of SELECT #2 was resolved in SELECT #1
|
||||||
|
Note 1003 /* select#1 */ select sum(`test`.`t2`.`a`) AS `sum(a)`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b` from `test`.`t2` having <expr_cache><`test`.`t2`.`a`,`test`.`t2`.`b`>(<in_optimizer>(`test`.`t2`.`a`,<exists>(/* select#2 */ select `test`.`t2`.`b` from `test`.`t1` where <cache>(`test`.`t2`.`a`) = `test`.`t2`.`b`)))
|
||||||
|
SELECT sum(a), t2.a, t2.b FROM t2 HAVING t2.a IN (SELECT t2.b FROM t1);
|
||||||
|
sum(a) a b
|
||||||
|
6 1 1
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
#
|
||||||
# MDEV-19134: EXISTS() slower if ORDER BY is defined
|
# MDEV-19134: EXISTS() slower if ORDER BY is defined
|
||||||
#
|
#
|
||||||
create table t0 (a int);
|
create table t0 (a int);
|
||||||
@ -2582,3 +2614,4 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1
|
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1
|
||||||
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 100
|
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 100
|
||||||
drop table t0, t1, t2;
|
drop table t0, t1, t2;
|
||||||
|
# End of 10.4 tests
|
||||||
|
@ -2078,6 +2078,30 @@ select (select c1 from t1 group by c1,c2 order by c1 limit 1) as x;
|
|||||||
(select c1 from t1 group by c1,c2 order by c1 limit 1);
|
(select c1 from t1 group by c1,c2 order by c1 limit 1);
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-22498: SIGSEGV in Bitmap<64u>::merge on SELECT
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
set @save_sql_select_limit= @@sql_select_limit;
|
||||||
|
SET sql_select_limit=0;
|
||||||
|
|
||||||
|
CREATE TABLE t1(b INT, c INT);
|
||||||
|
CREATE TABLE t2(a INT, b INT);
|
||||||
|
INSERT INTO t1 VALUES (1,1),(2,2),(3,3);
|
||||||
|
INSERT INTO t2 VALUES (1,1),(2,2),(3,3);
|
||||||
|
|
||||||
|
let $query=
|
||||||
|
SELECT sum(a), t2.a, t2.b FROM t2 HAVING t2.a IN (SELECT t2.b FROM t1);
|
||||||
|
|
||||||
|
eval EXPLAIN EXTENDED $query;
|
||||||
|
eval $query;
|
||||||
|
|
||||||
|
SET @@sql_select_limit= @save_sql_select_limit;
|
||||||
|
|
||||||
|
eval EXPLAIN EXTENDED $query;
|
||||||
|
eval $query;
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-19134: EXISTS() slower if ORDER BY is defined
|
--echo # MDEV-19134: EXISTS() slower if ORDER BY is defined
|
||||||
--echo #
|
--echo #
|
||||||
@ -2118,3 +2142,4 @@ select * from t1 where t1.a in (select t2.a from t2 order by t2.b);
|
|||||||
|
|
||||||
drop table t0, t1, t2;
|
drop table t0, t1, t2;
|
||||||
|
|
||||||
|
--echo # End of 10.4 tests
|
||||||
|
@ -4,6 +4,10 @@
|
|||||||
# Embedded server does not support restarting
|
# Embedded server does not support restarting
|
||||||
--source include/not_embedded.inc
|
--source include/not_embedded.inc
|
||||||
|
|
||||||
|
--disable_query_log
|
||||||
|
FLUSH TABLES;
|
||||||
|
--enable_query_log
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # Bug#20872655 XA ROLLBACK IS NOT CRASH-SAFE
|
--echo # Bug#20872655 XA ROLLBACK IS NOT CRASH-SAFE
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -2190,10 +2190,13 @@ Item_in_subselect::create_single_in_to_exists_cond(JOIN *join,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
No need to use real_item for the item, as the ref items that are possible
|
||||||
|
in the subquery either belong to views or to the parent select.
|
||||||
|
For such case we need to refer to the reference and not to the original
|
||||||
|
item.
|
||||||
|
*/
|
||||||
Item *item= (Item*) select_lex->item_list.head();
|
Item *item= (Item*) select_lex->item_list.head();
|
||||||
if (item->type() != REF_ITEM ||
|
|
||||||
((Item_ref*)item)->ref_type() != Item_ref::VIEW_REF)
|
|
||||||
item= item->real_item();
|
|
||||||
|
|
||||||
if (select_lex->table_list.elements)
|
if (select_lex->table_list.elements)
|
||||||
{
|
{
|
||||||
|
@ -286,10 +286,13 @@ rw_lock_s_lock_spin(
|
|||||||
|
|
||||||
ut_ad(rw_lock_validate(lock));
|
ut_ad(rw_lock_validate(lock));
|
||||||
|
|
||||||
|
rw_lock_stats.rw_s_spin_wait_count.inc();
|
||||||
|
|
||||||
lock_loop:
|
lock_loop:
|
||||||
|
|
||||||
/* Spin waiting for the writer field to become free */
|
/* Spin waiting for the writer field to become free */
|
||||||
HMT_low();
|
HMT_low();
|
||||||
|
ulint j = i;
|
||||||
while (i < srv_n_spin_wait_rounds &&
|
while (i < srv_n_spin_wait_rounds &&
|
||||||
lock->lock_word <= 0) {
|
lock->lock_word <= 0) {
|
||||||
ut_delay(srv_spin_wait_delay);
|
ut_delay(srv_spin_wait_delay);
|
||||||
@ -301,7 +304,7 @@ lock_loop:
|
|||||||
os_thread_yield();
|
os_thread_yield();
|
||||||
}
|
}
|
||||||
|
|
||||||
++spin_count;
|
spin_count += lint(i - j);
|
||||||
|
|
||||||
/* We try once again to obtain the lock */
|
/* We try once again to obtain the lock */
|
||||||
if (rw_lock_s_lock_low(lock, pass, file_name, line)) {
|
if (rw_lock_s_lock_low(lock, pass, file_name, line)) {
|
||||||
@ -421,7 +424,7 @@ rw_lock_x_lock_wait_func(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* If there is still a reader, then go to sleep.*/
|
/* If there is still a reader, then go to sleep.*/
|
||||||
++n_spins;
|
n_spins += i;
|
||||||
|
|
||||||
sync_cell_t* cell;
|
sync_cell_t* cell;
|
||||||
|
|
||||||
@ -651,6 +654,12 @@ rw_lock_x_lock_func(
|
|||||||
ut_ad(rw_lock_validate(lock));
|
ut_ad(rw_lock_validate(lock));
|
||||||
ut_ad(!rw_lock_own(lock, RW_LOCK_S));
|
ut_ad(!rw_lock_own(lock, RW_LOCK_S));
|
||||||
|
|
||||||
|
if (rw_lock_x_lock_low(lock, pass, file_name, line)) {
|
||||||
|
/* Locking succeeded */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
rw_lock_stats.rw_x_spin_wait_count.inc();
|
||||||
|
|
||||||
lock_loop:
|
lock_loop:
|
||||||
|
|
||||||
if (rw_lock_x_lock_low(lock, pass, file_name, line)) {
|
if (rw_lock_x_lock_low(lock, pass, file_name, line)) {
|
||||||
@ -670,6 +679,7 @@ lock_loop:
|
|||||||
|
|
||||||
/* Spin waiting for the lock_word to become free */
|
/* Spin waiting for the lock_word to become free */
|
||||||
HMT_low();
|
HMT_low();
|
||||||
|
ulint j = i;
|
||||||
while (i < srv_n_spin_wait_rounds
|
while (i < srv_n_spin_wait_rounds
|
||||||
&& lock->lock_word <= X_LOCK_HALF_DECR) {
|
&& lock->lock_word <= X_LOCK_HALF_DECR) {
|
||||||
ut_delay(srv_spin_wait_delay);
|
ut_delay(srv_spin_wait_delay);
|
||||||
@ -677,7 +687,7 @@ lock_loop:
|
|||||||
}
|
}
|
||||||
|
|
||||||
HMT_medium();
|
HMT_medium();
|
||||||
spin_count += lint(i);
|
spin_count += lint(i - j);
|
||||||
|
|
||||||
if (i >= srv_n_spin_wait_rounds) {
|
if (i >= srv_n_spin_wait_rounds) {
|
||||||
|
|
||||||
@ -745,11 +755,17 @@ rw_lock_sx_lock_func(
|
|||||||
sync_array_t* sync_arr;
|
sync_array_t* sync_arr;
|
||||||
lint spin_count = 0;
|
lint spin_count = 0;
|
||||||
int64_t count_os_wait = 0;
|
int64_t count_os_wait = 0;
|
||||||
lint spin_wait_count = 0;
|
|
||||||
|
|
||||||
ut_ad(rw_lock_validate(lock));
|
ut_ad(rw_lock_validate(lock));
|
||||||
ut_ad(!rw_lock_own(lock, RW_LOCK_S));
|
ut_ad(!rw_lock_own(lock, RW_LOCK_S));
|
||||||
|
|
||||||
|
if (rw_lock_sx_lock_low(lock, pass, file_name, line)) {
|
||||||
|
/* Locking succeeded */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rw_lock_stats.rw_sx_spin_wait_count.inc();
|
||||||
|
|
||||||
lock_loop:
|
lock_loop:
|
||||||
|
|
||||||
if (rw_lock_sx_lock_low(lock, pass, file_name, line)) {
|
if (rw_lock_sx_lock_low(lock, pass, file_name, line)) {
|
||||||
@ -761,23 +777,21 @@ lock_loop:
|
|||||||
}
|
}
|
||||||
|
|
||||||
rw_lock_stats.rw_sx_spin_round_count.add(spin_count);
|
rw_lock_stats.rw_sx_spin_round_count.add(spin_count);
|
||||||
rw_lock_stats.rw_sx_spin_wait_count.add(spin_wait_count);
|
|
||||||
|
|
||||||
/* Locking succeeded */
|
/* Locking succeeded */
|
||||||
return;
|
return;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
++spin_wait_count;
|
|
||||||
|
|
||||||
/* Spin waiting for the lock_word to become free */
|
/* Spin waiting for the lock_word to become free */
|
||||||
|
ulint j = i;
|
||||||
while (i < srv_n_spin_wait_rounds
|
while (i < srv_n_spin_wait_rounds
|
||||||
&& lock->lock_word <= X_LOCK_HALF_DECR) {
|
&& lock->lock_word <= X_LOCK_HALF_DECR) {
|
||||||
ut_delay(srv_spin_wait_delay);
|
ut_delay(srv_spin_wait_delay);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_count += lint(i);
|
spin_count += lint(i - j);
|
||||||
|
|
||||||
if (i >= srv_n_spin_wait_rounds) {
|
if (i >= srv_n_spin_wait_rounds) {
|
||||||
|
|
||||||
@ -809,7 +823,6 @@ lock_loop:
|
|||||||
}
|
}
|
||||||
|
|
||||||
rw_lock_stats.rw_sx_spin_round_count.add(spin_count);
|
rw_lock_stats.rw_sx_spin_round_count.add(spin_count);
|
||||||
rw_lock_stats.rw_sx_spin_wait_count.add(spin_wait_count);
|
|
||||||
|
|
||||||
/* Locking succeeded */
|
/* Locking succeeded */
|
||||||
return;
|
return;
|
||||||
|
Reference in New Issue
Block a user