Skip to content

Commit ce1b450

Browse files
committed
MDEV-7930 Assertion `table_share->tmp_table != NO_TMP_TABLE || m_lock_type != 2' failed in handler::ha_index_read_map
In optimizing aggregate function do not try to touch tables from outer query.
1 parent e1ed331 commit ce1b450

8 files changed

+171
-2
lines changed

mysql-test/r/subselect.result

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7085,3 +7085,27 @@ sq
70857085
NULL
70867086
deallocate prepare stmt;
70877087
drop table t1,t2,t3,t4;
7088+
#
7089+
# MDEV-7930: Assertion `table_share->tmp_table != NO_TMP_TABLE ||
7090+
# m_lock_type != 2' failed in handler::ha_index_read_map
7091+
#
7092+
CREATE TABLE t1 (f1 INT);
7093+
INSERT INTO t1 VALUES (1),(2);
7094+
CREATE TABLE t2 (f2 INT, KEY(f2));
7095+
INSERT INTO t2 VALUES (3);
7096+
CREATE ALGORITHM=MERGE VIEW v2 AS SELECT * FROM t2;
7097+
SELECT ( SELECT MIN(v2.f2) FROM t1 ) AS sq FROM v2 GROUP BY sq;
7098+
sq
7099+
3
7100+
SELECT * FROM v2 where ( SELECT MIN(v2.f2) FROM t1 ) > 0;
7101+
f2
7102+
3
7103+
SELECT count(*) FROM v2 group by ( SELECT MIN(v2.f2) FROM t1 );
7104+
count(*)
7105+
1
7106+
delete from t1;
7107+
SELECT ( SELECT MIN(v2.f2) FROM t1 ) AS sq FROM v2 GROUP BY sq;
7108+
sq
7109+
NULL
7110+
drop view v2;
7111+
drop table t1,t2;

mysql-test/r/subselect_no_exists_to_in.result

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7085,6 +7085,30 @@ sq
70857085
NULL
70867086
deallocate prepare stmt;
70877087
drop table t1,t2,t3,t4;
7088+
#
7089+
# MDEV-7930: Assertion `table_share->tmp_table != NO_TMP_TABLE ||
7090+
# m_lock_type != 2' failed in handler::ha_index_read_map
7091+
#
7092+
CREATE TABLE t1 (f1 INT);
7093+
INSERT INTO t1 VALUES (1),(2);
7094+
CREATE TABLE t2 (f2 INT, KEY(f2));
7095+
INSERT INTO t2 VALUES (3);
7096+
CREATE ALGORITHM=MERGE VIEW v2 AS SELECT * FROM t2;
7097+
SELECT ( SELECT MIN(v2.f2) FROM t1 ) AS sq FROM v2 GROUP BY sq;
7098+
sq
7099+
3
7100+
SELECT * FROM v2 where ( SELECT MIN(v2.f2) FROM t1 ) > 0;
7101+
f2
7102+
3
7103+
SELECT count(*) FROM v2 group by ( SELECT MIN(v2.f2) FROM t1 );
7104+
count(*)
7105+
1
7106+
delete from t1;
7107+
SELECT ( SELECT MIN(v2.f2) FROM t1 ) AS sq FROM v2 GROUP BY sq;
7108+
sq
7109+
NULL
7110+
drop view v2;
7111+
drop table t1,t2;
70887112
set optimizer_switch=default;
70897113
select @@optimizer_switch like '%exists_to_in=off%';
70907114
@@optimizer_switch like '%exists_to_in=off%'

mysql-test/r/subselect_no_mat.result

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7078,6 +7078,30 @@ sq
70787078
NULL
70797079
deallocate prepare stmt;
70807080
drop table t1,t2,t3,t4;
7081+
#
7082+
# MDEV-7930: Assertion `table_share->tmp_table != NO_TMP_TABLE ||
7083+
# m_lock_type != 2' failed in handler::ha_index_read_map
7084+
#
7085+
CREATE TABLE t1 (f1 INT);
7086+
INSERT INTO t1 VALUES (1),(2);
7087+
CREATE TABLE t2 (f2 INT, KEY(f2));
7088+
INSERT INTO t2 VALUES (3);
7089+
CREATE ALGORITHM=MERGE VIEW v2 AS SELECT * FROM t2;
7090+
SELECT ( SELECT MIN(v2.f2) FROM t1 ) AS sq FROM v2 GROUP BY sq;
7091+
sq
7092+
3
7093+
SELECT * FROM v2 where ( SELECT MIN(v2.f2) FROM t1 ) > 0;
7094+
f2
7095+
3
7096+
SELECT count(*) FROM v2 group by ( SELECT MIN(v2.f2) FROM t1 );
7097+
count(*)
7098+
1
7099+
delete from t1;
7100+
SELECT ( SELECT MIN(v2.f2) FROM t1 ) AS sq FROM v2 GROUP BY sq;
7101+
sq
7102+
NULL
7103+
drop view v2;
7104+
drop table t1,t2;
70817105
set optimizer_switch=default;
70827106
select @@optimizer_switch like '%materialization=on%';
70837107
@@optimizer_switch like '%materialization=on%'

mysql-test/r/subselect_no_opts.result

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7076,4 +7076,28 @@ sq
70767076
NULL
70777077
deallocate prepare stmt;
70787078
drop table t1,t2,t3,t4;
7079+
#
7080+
# MDEV-7930: Assertion `table_share->tmp_table != NO_TMP_TABLE ||
7081+
# m_lock_type != 2' failed in handler::ha_index_read_map
7082+
#
7083+
CREATE TABLE t1 (f1 INT);
7084+
INSERT INTO t1 VALUES (1),(2);
7085+
CREATE TABLE t2 (f2 INT, KEY(f2));
7086+
INSERT INTO t2 VALUES (3);
7087+
CREATE ALGORITHM=MERGE VIEW v2 AS SELECT * FROM t2;
7088+
SELECT ( SELECT MIN(v2.f2) FROM t1 ) AS sq FROM v2 GROUP BY sq;
7089+
sq
7090+
3
7091+
SELECT * FROM v2 where ( SELECT MIN(v2.f2) FROM t1 ) > 0;
7092+
f2
7093+
3
7094+
SELECT count(*) FROM v2 group by ( SELECT MIN(v2.f2) FROM t1 );
7095+
count(*)
7096+
1
7097+
delete from t1;
7098+
SELECT ( SELECT MIN(v2.f2) FROM t1 ) AS sq FROM v2 GROUP BY sq;
7099+
sq
7100+
NULL
7101+
drop view v2;
7102+
drop table t1,t2;
70797103
set @optimizer_switch_for_subselect_test=null;

mysql-test/r/subselect_no_scache.result

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7091,6 +7091,30 @@ sq
70917091
NULL
70927092
deallocate prepare stmt;
70937093
drop table t1,t2,t3,t4;
7094+
#
7095+
# MDEV-7930: Assertion `table_share->tmp_table != NO_TMP_TABLE ||
7096+
# m_lock_type != 2' failed in handler::ha_index_read_map
7097+
#
7098+
CREATE TABLE t1 (f1 INT);
7099+
INSERT INTO t1 VALUES (1),(2);
7100+
CREATE TABLE t2 (f2 INT, KEY(f2));
7101+
INSERT INTO t2 VALUES (3);
7102+
CREATE ALGORITHM=MERGE VIEW v2 AS SELECT * FROM t2;
7103+
SELECT ( SELECT MIN(v2.f2) FROM t1 ) AS sq FROM v2 GROUP BY sq;
7104+
sq
7105+
3
7106+
SELECT * FROM v2 where ( SELECT MIN(v2.f2) FROM t1 ) > 0;
7107+
f2
7108+
3
7109+
SELECT count(*) FROM v2 group by ( SELECT MIN(v2.f2) FROM t1 );
7110+
count(*)
7111+
1
7112+
delete from t1;
7113+
SELECT ( SELECT MIN(v2.f2) FROM t1 ) AS sq FROM v2 GROUP BY sq;
7114+
sq
7115+
NULL
7116+
drop view v2;
7117+
drop table t1,t2;
70947118
set optimizer_switch=default;
70957119
select @@optimizer_switch like '%subquery_cache=on%';
70967120
@@optimizer_switch like '%subquery_cache=on%'

mysql-test/r/subselect_no_semijoin.result

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7076,5 +7076,29 @@ sq
70767076
NULL
70777077
deallocate prepare stmt;
70787078
drop table t1,t2,t3,t4;
7079+
#
7080+
# MDEV-7930: Assertion `table_share->tmp_table != NO_TMP_TABLE ||
7081+
# m_lock_type != 2' failed in handler::ha_index_read_map
7082+
#
7083+
CREATE TABLE t1 (f1 INT);
7084+
INSERT INTO t1 VALUES (1),(2);
7085+
CREATE TABLE t2 (f2 INT, KEY(f2));
7086+
INSERT INTO t2 VALUES (3);
7087+
CREATE ALGORITHM=MERGE VIEW v2 AS SELECT * FROM t2;
7088+
SELECT ( SELECT MIN(v2.f2) FROM t1 ) AS sq FROM v2 GROUP BY sq;
7089+
sq
7090+
3
7091+
SELECT * FROM v2 where ( SELECT MIN(v2.f2) FROM t1 ) > 0;
7092+
f2
7093+
3
7094+
SELECT count(*) FROM v2 group by ( SELECT MIN(v2.f2) FROM t1 );
7095+
count(*)
7096+
1
7097+
delete from t1;
7098+
SELECT ( SELECT MIN(v2.f2) FROM t1 ) AS sq FROM v2 GROUP BY sq;
7099+
sq
7100+
NULL
7101+
drop view v2;
7102+
drop table t1,t2;
70797103
set @optimizer_switch_for_subselect_test=null;
70807104
set @join_cache_level_for_subselect_test=NULL;

mysql-test/t/subselect.test

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5964,3 +5964,26 @@ EXECUTE stmt;
59645964

59655965
deallocate prepare stmt;
59665966
drop table t1,t2,t3,t4;
5967+
5968+
--echo #
5969+
--echo # MDEV-7930: Assertion `table_share->tmp_table != NO_TMP_TABLE ||
5970+
--echo # m_lock_type != 2' failed in handler::ha_index_read_map
5971+
--echo #
5972+
5973+
CREATE TABLE t1 (f1 INT);
5974+
INSERT INTO t1 VALUES (1),(2);
5975+
5976+
CREATE TABLE t2 (f2 INT, KEY(f2));
5977+
INSERT INTO t2 VALUES (3);
5978+
5979+
CREATE ALGORITHM=MERGE VIEW v2 AS SELECT * FROM t2;
5980+
5981+
SELECT ( SELECT MIN(v2.f2) FROM t1 ) AS sq FROM v2 GROUP BY sq;
5982+
SELECT * FROM v2 where ( SELECT MIN(v2.f2) FROM t1 ) > 0;
5983+
SELECT count(*) FROM v2 group by ( SELECT MIN(v2.f2) FROM t1 );
5984+
5985+
delete from t1;
5986+
SELECT ( SELECT MIN(v2.f2) FROM t1 ) AS sq FROM v2 GROUP BY sq;
5987+
5988+
drop view v2;
5989+
drop table t1,t2;

sql/opt_sum.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,8 @@ int opt_sum_query(THD *thd,
341341
there are no outer joins.
342342
*/
343343
if (!conds && !((Item_sum_count*) item)->get_arg(0)->maybe_null &&
344-
!outer_tables && maybe_exact_count)
344+
!outer_tables && maybe_exact_count &&
345+
((item->used_tables() & OUTER_REF_TABLE_BIT) == 0))
345346
{
346347
if (!is_exact_count)
347348
{
@@ -369,7 +370,8 @@ int opt_sum_query(THD *thd,
369370
indexes to find the key.
370371
*/
371372
Item *expr=item_sum->get_arg(0);
372-
if (expr->real_item()->type() == Item::FIELD_ITEM)
373+
if (((expr->used_tables() & OUTER_REF_TABLE_BIT) == 0) &&
374+
expr->real_item()->type() == Item::FIELD_ITEM)
373375
{
374376
uchar key_buff[MAX_KEY_LENGTH];
375377
TABLE_REF ref;

0 commit comments

Comments
 (0)