Commit 66f1e288 authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.3 into 10.4

parents 9e6e4355 38d62189
......@@ -1187,6 +1187,7 @@ common_schema.sum_ints(seq)
drop database common_schema;
drop database another_schema;
USE test;
# End of 10.3 tests
#
# MDEV-18813 PROCEDURE and anonymous blocks silently ignore FETCH GROUP NEXT ROW
#
......
......@@ -1001,6 +1001,8 @@ drop database another_schema;
USE test;
--echo # End of 10.3 tests
--echo #
--echo # MDEV-18813 PROCEDURE and anonymous blocks silently ignore FETCH GROUP NEXT ROW
--echo #
......
......@@ -2535,6 +2535,38 @@ c1
1
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
#
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
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 100
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);
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 # MDEV-19134: EXISTS() slower if ORDER BY is defined
--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;
--echo # End of 10.4 tests
......@@ -4,6 +4,10 @@
# Embedded server does not support restarting
--source include/not_embedded.inc
--disable_query_log
FLUSH TABLES;
--enable_query_log
--echo #
--echo # Bug#20872655 XA ROLLBACK IS NOT CRASH-SAFE
--echo #
......
......@@ -2190,10 +2190,13 @@ Item_in_subselect::create_single_in_to_exists_cond(JOIN *join,
}
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();
if (item->type() != REF_ITEM ||
((Item_ref*)item)->ref_type() != Item_ref::VIEW_REF)
item= item->real_item();
if (select_lex->table_list.elements)
{
......
......@@ -286,10 +286,13 @@ rw_lock_s_lock_spin(
ut_ad(rw_lock_validate(lock));
rw_lock_stats.rw_s_spin_wait_count.inc();
lock_loop:
/* Spin waiting for the writer field to become free */
HMT_low();
ulint j = i;
while (i < srv_n_spin_wait_rounds &&
lock->lock_word <= 0) {
ut_delay(srv_spin_wait_delay);
......@@ -301,7 +304,7 @@ rw_lock_s_lock_spin(
os_thread_yield();
}
++spin_count;
spin_count += lint(i - j);
/* We try once again to obtain the lock */
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.*/
++n_spins;
n_spins += i;
sync_cell_t* cell;
......@@ -651,6 +654,12 @@ rw_lock_x_lock_func(
ut_ad(rw_lock_validate(lock));
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:
if (rw_lock_x_lock_low(lock, pass, file_name, line)) {
......@@ -670,6 +679,7 @@ rw_lock_x_lock_func(
/* Spin waiting for the lock_word to become free */
HMT_low();
ulint j = i;
while (i < srv_n_spin_wait_rounds
&& lock->lock_word <= X_LOCK_HALF_DECR) {
ut_delay(srv_spin_wait_delay);
......@@ -677,7 +687,7 @@ rw_lock_x_lock_func(
}
HMT_medium();
spin_count += lint(i);
spin_count += lint(i - j);
if (i >= srv_n_spin_wait_rounds) {
......@@ -745,11 +755,17 @@ rw_lock_sx_lock_func(
sync_array_t* sync_arr;
lint spin_count = 0;
int64_t count_os_wait = 0;
lint spin_wait_count = 0;
ut_ad(rw_lock_validate(lock));
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:
if (rw_lock_sx_lock_low(lock, pass, file_name, line)) {
......@@ -761,23 +777,21 @@ rw_lock_sx_lock_func(
}
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 */
return;
} else {
++spin_wait_count;
/* Spin waiting for the lock_word to become free */
ulint j = i;
while (i < srv_n_spin_wait_rounds
&& lock->lock_word <= X_LOCK_HALF_DECR) {
ut_delay(srv_spin_wait_delay);
i++;
}
spin_count += lint(i);
spin_count += lint(i - j);
if (i >= srv_n_spin_wait_rounds) {
......@@ -809,7 +823,6 @@ rw_lock_sx_lock_func(
}
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 */
return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment