mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +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
|
d
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1,t2;
|
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 VIEW v1;
|
||||||
DROP TABLE t1,t2;
|
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();
|
unit->types.empty();
|
||||||
/* for derived tables & PS (which can't be reset by Item_subselect) */
|
/* for derived tables & PS (which can't be reset by Item_subselect) */
|
||||||
unit->reinit_exec_mechanism();
|
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);
|
unit->set_thd(thd);
|
||||||
DBUG_RETURN(FALSE);
|
DBUG_RETURN(FALSE);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user