Skip to content

Commit f4d6f26

Browse files
committed
Fixed bug mdev-11315.
There were no implementations for the virtual functions exclusive_dependence_on_table_processor and exclusive_dependence_on_table_processor. As a result the procedure pushdown_cond_for_derived erroneously detected some conditions with outer references as pushable into materialized view / derived table.
1 parent 779d416 commit f4d6f26

File tree

3 files changed

+151
-2
lines changed

3 files changed

+151
-2
lines changed

mysql-test/r/derived_cond_pushdown.result

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7262,3 +7262,117 @@ i
72627262
2
72637263
DROP VIEW v1;
72647264
DROP TABLE t1;
7265+
#
7266+
# MDEV-11315: condition with outer reference to mergeable derived
7267+
#
7268+
CREATE TABLE t1 (pk1 INT PRIMARY KEY, a INT, b INT) ENGINE=MyISAM;
7269+
INSERT INTO t1 VALUES (10,7,1),(11,0,2);
7270+
CREATE TABLE t2 (pk2 INT PRIMARY KEY, c INT, d DATETIME) ENGINE=MyISAM;
7271+
INSERT INTO t2 VALUES
7272+
(1,4,'2008-09-27 00:34:58'),
7273+
(2,5,'2007-05-28 00:00:00'),
7274+
(3,6,'2009-07-25 09:21:20');
7275+
CREATE VIEW v1 AS SELECT * FROM t1;
7276+
CREATE ALGORITHM=TEMPTABLE VIEW v2 AS SELECT * FROM t2;
7277+
SELECT * FROM v1 AS sq
7278+
WHERE b IN ( SELECT pk2 FROM v2 WHERE c > sq.b ) OR b = 100;
7279+
pk1 a b
7280+
10 7 1
7281+
11 0 2
7282+
EXPLAIN FORMAT=JSON
7283+
SELECT * FROM v1 AS sq
7284+
WHERE b IN ( SELECT pk2 FROM v2 WHERE c > sq.b ) OR b = 100;
7285+
EXPLAIN
7286+
{
7287+
"query_block": {
7288+
"select_id": 1,
7289+
"table": {
7290+
"table_name": "t1",
7291+
"access_type": "ALL",
7292+
"rows": 2,
7293+
"filtered": 100,
7294+
"attached_condition": "(<in_optimizer>(t1.b,<exists>(subquery#2)) or (t1.b = 100))"
7295+
},
7296+
"subqueries": [
7297+
{
7298+
"query_block": {
7299+
"select_id": 2,
7300+
"table": {
7301+
"table_name": "<derived4>",
7302+
"access_type": "index_subquery",
7303+
"possible_keys": ["key0"],
7304+
"key": "key0",
7305+
"key_length": "4",
7306+
"used_key_parts": ["pk2"],
7307+
"ref": ["func"],
7308+
"rows": 2,
7309+
"filtered": 100,
7310+
"materialized": {
7311+
"query_block": {
7312+
"select_id": 4,
7313+
"table": {
7314+
"table_name": "t2",
7315+
"access_type": "ALL",
7316+
"rows": 3,
7317+
"filtered": 100
7318+
}
7319+
}
7320+
}
7321+
}
7322+
}
7323+
}
7324+
]
7325+
}
7326+
}
7327+
SELECT * FROM ( SELECT * FROM t1 ) AS sq
7328+
WHERE b IN ( SELECT pk2 FROM v2 WHERE c > sq.b ) OR b = 100;
7329+
pk1 a b
7330+
10 7 1
7331+
11 0 2
7332+
EXPLAIN FORMAT=JSON
7333+
SELECT * FROM ( SELECT * FROM t1 ) AS sq
7334+
WHERE b IN ( SELECT pk2 FROM v2 WHERE c > sq.b ) OR b = 100;
7335+
EXPLAIN
7336+
{
7337+
"query_block": {
7338+
"select_id": 1,
7339+
"table": {
7340+
"table_name": "t1",
7341+
"access_type": "ALL",
7342+
"rows": 2,
7343+
"filtered": 100,
7344+
"attached_condition": "(<in_optimizer>(t1.b,<exists>(subquery#3)) or (t1.b = 100))"
7345+
},
7346+
"subqueries": [
7347+
{
7348+
"query_block": {
7349+
"select_id": 3,
7350+
"table": {
7351+
"table_name": "<derived4>",
7352+
"access_type": "index_subquery",
7353+
"possible_keys": ["key0"],
7354+
"key": "key0",
7355+
"key_length": "4",
7356+
"used_key_parts": ["pk2"],
7357+
"ref": ["func"],
7358+
"rows": 2,
7359+
"filtered": 100,
7360+
"materialized": {
7361+
"query_block": {
7362+
"select_id": 4,
7363+
"table": {
7364+
"table_name": "t2",
7365+
"access_type": "ALL",
7366+
"rows": 3,
7367+
"filtered": 100
7368+
}
7369+
}
7370+
}
7371+
}
7372+
}
7373+
}
7374+
]
7375+
}
7376+
}
7377+
DROP VIEW v1,v2;
7378+
DROP TABLE t1,t2;

mysql-test/t/derived_cond_pushdown.test

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,3 +1027,34 @@ SELECT * FROM v1 WHERE i <= ANY ( SELECT 3 );
10271027

10281028
DROP VIEW v1;
10291029
DROP TABLE t1;
1030+
1031+
--echo #
1032+
--echo # MDEV-11315: condition with outer reference to mergeable derived
1033+
--echo #
1034+
1035+
CREATE TABLE t1 (pk1 INT PRIMARY KEY, a INT, b INT) ENGINE=MyISAM;
1036+
INSERT INTO t1 VALUES (10,7,1),(11,0,2);
1037+
1038+
CREATE TABLE t2 (pk2 INT PRIMARY KEY, c INT, d DATETIME) ENGINE=MyISAM;
1039+
INSERT INTO t2 VALUES
1040+
(1,4,'2008-09-27 00:34:58'),
1041+
(2,5,'2007-05-28 00:00:00'),
1042+
(3,6,'2009-07-25 09:21:20');
1043+
1044+
CREATE VIEW v1 AS SELECT * FROM t1;
1045+
CREATE ALGORITHM=TEMPTABLE VIEW v2 AS SELECT * FROM t2;
1046+
1047+
SELECT * FROM v1 AS sq
1048+
WHERE b IN ( SELECT pk2 FROM v2 WHERE c > sq.b ) OR b = 100;
1049+
EXPLAIN FORMAT=JSON
1050+
SELECT * FROM v1 AS sq
1051+
WHERE b IN ( SELECT pk2 FROM v2 WHERE c > sq.b ) OR b = 100;
1052+
1053+
SELECT * FROM ( SELECT * FROM t1 ) AS sq
1054+
WHERE b IN ( SELECT pk2 FROM v2 WHERE c > sq.b ) OR b = 100;
1055+
EXPLAIN FORMAT=JSON
1056+
SELECT * FROM ( SELECT * FROM t1 ) AS sq
1057+
WHERE b IN ( SELECT pk2 FROM v2 WHERE c > sq.b ) OR b = 100;
1058+
1059+
DROP VIEW v1,v2;
1060+
DROP TABLE t1,t2;

sql/item.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2665,7 +2665,7 @@ class Item_field :public Item_ident
26652665
bool exclusive_dependence_on_table_processor(void *map);
26662666
bool exclusive_dependence_on_grouping_fields_processor(void *arg);
26672667
bool cleanup_excluding_outer_fields_processor(void *arg)
2668-
{ return depended_from ? 0 :cleanup_processor(arg); }
2668+
{ return depended_from ? 0 : cleanup_processor(arg); }
26692669

26702670
Item *get_copy(THD *thd, MEM_ROOT *mem_root)
26712671
{ return get_item_copy<Item_field>(thd, mem_root, this); }
@@ -4278,7 +4278,11 @@ class Item_ref :public Item_ident
42784278
}
42794279
Item *get_copy(THD *thd, MEM_ROOT *mem_root)
42804280
{ return get_item_copy<Item_ref>(thd, mem_root, this); }
4281-
};
4281+
bool exclusive_dependence_on_table_processor(void *map)
4282+
{ return depended_from != NULL; }
4283+
bool exclusive_dependence_on_grouping_fields_processor(void *arg)
4284+
{ return depended_from != NULL; }
4285+
};
42824286

42834287

42844288
/*

0 commit comments

Comments
 (0)