mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fixed bug mdev-11820.
The fields st_select_lex::cond_pushed_into_where and st_select_lex::cond_pushed_into_having should be re-initialized for the unit specifying a derived table at every re-execution of the query that uses this derived table, because the result of condition pushdown may be different for different executions.
This commit is contained in:
@ -8241,3 +8241,112 @@ SELECT * FROM v1 WHERE v1.d IN ( SELECT MIN(d) FROM t2 WHERE 0 );
|
||||
d
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1,t2;
|
||||
#
|
||||
# MDEV-11820: second execution of PS for query
|
||||
# with false subquery predicate in WHERE
|
||||
#
|
||||
CREATE TABLE t1 (c VARCHAR(3)) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES ('foo'),('bar');
|
||||
CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
|
||||
CREATE TABLE t2 (a INT);
|
||||
INSERT INTO t2 VALUES (3), (4);
|
||||
PREPARE stmt1 FROM
|
||||
" SELECT * FROM v1 WHERE 1 IN (SELECT a FROM t2) OR c = 'foo'";
|
||||
PREPARE stmt2 FROM
|
||||
"EXPLAIN FORMAT=JSON
|
||||
SELECT * FROM v1 WHERE 1 IN (SELECT a FROM t2) OR c = 'foo'";
|
||||
EXECUTE stmt1;
|
||||
c
|
||||
foo
|
||||
EXECUTE stmt2;
|
||||
EXPLAIN
|
||||
{
|
||||
"query_block": {
|
||||
"select_id": 1,
|
||||
"table": {
|
||||
"table_name": "<derived3>",
|
||||
"access_type": "ALL",
|
||||
"rows": 2,
|
||||
"filtered": 100,
|
||||
"attached_condition": "v1.c = 'foo'",
|
||||
"materialized": {
|
||||
"query_block": {
|
||||
"select_id": 3,
|
||||
"table": {
|
||||
"table_name": "t1",
|
||||
"access_type": "ALL",
|
||||
"rows": 2,
|
||||
"filtered": 100,
|
||||
"attached_condition": "t1.c = 'foo'"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"subqueries": [
|
||||
{
|
||||
"query_block": {
|
||||
"select_id": 2,
|
||||
"table": {
|
||||
"table_name": "t2",
|
||||
"access_type": "ALL",
|
||||
"rows": 2,
|
||||
"filtered": 100,
|
||||
"attached_condition": "1 = t2.a"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
INSERT INTO t2 SELECT a+1 FROM t2;
|
||||
INSERT INTO t2 SELECT a+1 FROM t2;
|
||||
INSERT INTO t2 SELECT a+1 FROM t2;
|
||||
INSERT INTO t2 SELECT a+1 FROM t2;
|
||||
INSERT INTO t2 SELECT a+1 FROM t2;
|
||||
INSERT INTO t2 SELECT a+1 FROM t2;
|
||||
EXECUTE stmt1;
|
||||
c
|
||||
foo
|
||||
EXECUTE stmt2;
|
||||
EXPLAIN
|
||||
{
|
||||
"query_block": {
|
||||
"select_id": 1,
|
||||
"table": {
|
||||
"table_name": "<derived3>",
|
||||
"access_type": "ALL",
|
||||
"rows": 2,
|
||||
"filtered": 100,
|
||||
"attached_condition": "<in_optimizer>(1,<exists>(subquery#2)) or v1.c = 'foo'",
|
||||
"materialized": {
|
||||
"query_block": {
|
||||
"select_id": 3,
|
||||
"table": {
|
||||
"table_name": "t1",
|
||||
"access_type": "ALL",
|
||||
"rows": 2,
|
||||
"filtered": 100
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"subqueries": [
|
||||
{
|
||||
"query_block": {
|
||||
"select_id": 2,
|
||||
"table": {
|
||||
"table_name": "t2",
|
||||
"access_type": "ALL",
|
||||
"rows": 128,
|
||||
"filtered": 100,
|
||||
"attached_condition": "1 = t2.a"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
DEALLOCATE PREPARE stmt1;
|
||||
DEALLOCATE PREPARE stmt2;
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1,t2;
|
||||
|
@ -1319,3 +1319,37 @@ SELECT * FROM v1 WHERE v1.d IN ( SELECT MIN(d) FROM t2 WHERE 0 );
|
||||
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-11820: second execution of PS for query
|
||||
--echo # with false subquery predicate in WHERE
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (c VARCHAR(3)) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES ('foo'),('bar');
|
||||
CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
|
||||
CREATE TABLE t2 (a INT);
|
||||
INSERT INTO t2 VALUES (3), (4);
|
||||
|
||||
PREPARE stmt1 FROM
|
||||
" SELECT * FROM v1 WHERE 1 IN (SELECT a FROM t2) OR c = 'foo'";
|
||||
PREPARE stmt2 FROM
|
||||
"EXPLAIN FORMAT=JSON
|
||||
SELECT * FROM v1 WHERE 1 IN (SELECT a FROM t2) OR c = 'foo'";
|
||||
EXECUTE stmt1;
|
||||
EXECUTE stmt2;
|
||||
INSERT INTO t2 SELECT a+1 FROM t2;
|
||||
INSERT INTO t2 SELECT a+1 FROM t2;
|
||||
INSERT INTO t2 SELECT a+1 FROM t2;
|
||||
INSERT INTO t2 SELECT a+1 FROM t2;
|
||||
INSERT INTO t2 SELECT a+1 FROM t2;
|
||||
INSERT INTO t2 SELECT a+1 FROM t2;
|
||||
EXECUTE stmt1;
|
||||
EXECUTE stmt2;
|
||||
DEALLOCATE PREPARE stmt1;
|
||||
# the result here will change after the merge with the fix for mdev-11859
|
||||
DEALLOCATE PREPARE stmt2;
|
||||
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
|
@ -1099,6 +1099,11 @@ bool mysql_derived_reinit(THD *thd, LEX *lex, TABLE_LIST *derived)
|
||||
unit->types.empty();
|
||||
/* for derived tables & PS (which can't be reset by Item_subselect) */
|
||||
unit->reinit_exec_mechanism();
|
||||
for (st_select_lex *sl= unit->first_select(); sl; sl= sl->next_select())
|
||||
{
|
||||
sl->cond_pushed_into_where= NULL;
|
||||
sl->cond_pushed_into_having= NULL;
|
||||
}
|
||||
unit->set_thd(thd);
|
||||
DBUG_RETURN(FALSE);
|
||||
}
|
||||
|
Reference in New Issue
Block a user