mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-28246 Optimizer uses all partitions after upgrade to 10.3
Cause: a copy of the joined TABLE_LIST is created during multi_update::prepare and TABLE::pos_in_table_list of the tables are set to point to the new TABLE_LIST object. This prevents some optimization steps to perform correctly. Solution: do not update pos_in_table_list during multi_update::prepare
This commit is contained in:
@ -1161,3 +1161,93 @@ ERROR 21000: Subquery returns more than 1 row
|
|||||||
update t1 set a= (select 2 from t1 having (a = 3));
|
update t1 set a= (select 2 from t1 having (a = 3));
|
||||||
ERROR 21000: Subquery returns more than 1 row
|
ERROR 21000: Subquery returns more than 1 row
|
||||||
drop tables t1;
|
drop tables t1;
|
||||||
|
#
|
||||||
|
# MDEV-28246 Optimizer uses all partitions during an update in MariaDB 10.6.x but not in 10.2.x
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
part INT(1),
|
||||||
|
a INT(1),
|
||||||
|
b INT(1),
|
||||||
|
PRIMARY KEY (a,part),
|
||||||
|
INDEX b (b,part)
|
||||||
|
) PARTITION BY LIST (part) (
|
||||||
|
PARTITION Current VALUES IN (0),
|
||||||
|
PARTITION Relevant VALUES IN (1),
|
||||||
|
PARTITION Archive VALUES IN (2)
|
||||||
|
);
|
||||||
|
CREATE TABLE t2 LIKE t1;
|
||||||
|
INSERT INTO t1 (part,a,b) VALUES (0,0,0),(1,1,1),(2,2,2);
|
||||||
|
INSERT INTO t2 (part,a,b) VALUES (0,0,0),(1,1,1),(2,2,2);
|
||||||
|
# Expecting partition "Current"
|
||||||
|
EXPLAIN FORMAT=JSON UPDATE t2 JOIN t1 USING(a) SET t2.part=3 WHERE t2.part=0 AND t1.part=0;
|
||||||
|
EXPLAIN
|
||||||
|
{
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"table": {
|
||||||
|
"table_name": "t2",
|
||||||
|
"partitions": ["Current"],
|
||||||
|
"access_type": "system",
|
||||||
|
"possible_keys": ["PRIMARY"],
|
||||||
|
"rows": 1,
|
||||||
|
"filtered": 100
|
||||||
|
},
|
||||||
|
"table": {
|
||||||
|
"table_name": "t1",
|
||||||
|
"partitions": ["Current"],
|
||||||
|
"access_type": "system",
|
||||||
|
"possible_keys": ["PRIMARY"],
|
||||||
|
"rows": 1,
|
||||||
|
"filtered": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# Expecting partition "Relevant"
|
||||||
|
EXPLAIN FORMAT=JSON UPDATE t2 JOIN t1 USING(a) SET t2.part=2 WHERE t2.part=1 AND t1.part=1;
|
||||||
|
EXPLAIN
|
||||||
|
{
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"table": {
|
||||||
|
"table_name": "t2",
|
||||||
|
"partitions": ["Relevant"],
|
||||||
|
"access_type": "system",
|
||||||
|
"possible_keys": ["PRIMARY"],
|
||||||
|
"rows": 1,
|
||||||
|
"filtered": 100
|
||||||
|
},
|
||||||
|
"table": {
|
||||||
|
"table_name": "t1",
|
||||||
|
"partitions": ["Relevant"],
|
||||||
|
"access_type": "system",
|
||||||
|
"possible_keys": ["PRIMARY"],
|
||||||
|
"rows": 1,
|
||||||
|
"filtered": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# Expecting partition "Archive"
|
||||||
|
EXPLAIN FORMAT=JSON UPDATE t2 JOIN t1 USING(a) SET t2.part=3 WHERE t2.part=2 AND t1.part=2;
|
||||||
|
EXPLAIN
|
||||||
|
{
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"table": {
|
||||||
|
"table_name": "t2",
|
||||||
|
"partitions": ["Archive"],
|
||||||
|
"access_type": "system",
|
||||||
|
"possible_keys": ["PRIMARY"],
|
||||||
|
"rows": 1,
|
||||||
|
"filtered": 100
|
||||||
|
},
|
||||||
|
"table": {
|
||||||
|
"table_name": "t1",
|
||||||
|
"partitions": ["Archive"],
|
||||||
|
"access_type": "system",
|
||||||
|
"possible_keys": ["PRIMARY"],
|
||||||
|
"rows": 1,
|
||||||
|
"filtered": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DROP TABLES t1, t2;
|
||||||
|
@ -1098,3 +1098,34 @@ select a from t1 where a= (select 2 from t1 having (a = 3));
|
|||||||
--error ER_SUBQUERY_NO_1_ROW
|
--error ER_SUBQUERY_NO_1_ROW
|
||||||
update t1 set a= (select 2 from t1 having (a = 3));
|
update t1 set a= (select 2 from t1 having (a = 3));
|
||||||
drop tables t1;
|
drop tables t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-28246 Optimizer uses all partitions during an update in MariaDB 10.6.x but not in 10.2.x
|
||||||
|
--echo #
|
||||||
|
--source include/have_partition.inc
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
part INT(1),
|
||||||
|
a INT(1),
|
||||||
|
b INT(1),
|
||||||
|
PRIMARY KEY (a,part),
|
||||||
|
INDEX b (b,part)
|
||||||
|
) PARTITION BY LIST (part) (
|
||||||
|
PARTITION Current VALUES IN (0),
|
||||||
|
PARTITION Relevant VALUES IN (1),
|
||||||
|
PARTITION Archive VALUES IN (2)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE t2 LIKE t1;
|
||||||
|
INSERT INTO t1 (part,a,b) VALUES (0,0,0),(1,1,1),(2,2,2);
|
||||||
|
INSERT INTO t2 (part,a,b) VALUES (0,0,0),(1,1,1),(2,2,2);
|
||||||
|
|
||||||
|
--echo # Expecting partition "Current"
|
||||||
|
EXPLAIN FORMAT=JSON UPDATE t2 JOIN t1 USING(a) SET t2.part=3 WHERE t2.part=0 AND t1.part=0;
|
||||||
|
|
||||||
|
--echo # Expecting partition "Relevant"
|
||||||
|
EXPLAIN FORMAT=JSON UPDATE t2 JOIN t1 USING(a) SET t2.part=2 WHERE t2.part=1 AND t1.part=1;
|
||||||
|
|
||||||
|
--echo # Expecting partition "Archive"
|
||||||
|
EXPLAIN FORMAT=JSON UPDATE t2 JOIN t1 USING(a) SET t2.part=3 WHERE t2.part=2 AND t1.part=2;
|
||||||
|
|
||||||
|
DROP TABLES t1, t2;
|
||||||
|
@ -1977,10 +1977,9 @@ int multi_update::prepare(List<Item> ¬_used_values,
|
|||||||
if (!tl)
|
if (!tl)
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
update.link_in_list(tl, &tl->next_local);
|
update.link_in_list(tl, &tl->next_local);
|
||||||
tl->shared= table_count++;
|
table_ref->shared= tl->shared= table_count++;
|
||||||
table->no_keyread=1;
|
table->no_keyread=1;
|
||||||
table->covering_keys.clear_all();
|
table->covering_keys.clear_all();
|
||||||
table->pos_in_table_list= tl;
|
|
||||||
table->prepare_triggers_for_update_stmt_or_event();
|
table->prepare_triggers_for_update_stmt_or_event();
|
||||||
table->reset_default_fields();
|
table->reset_default_fields();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user