summaryrefslogtreecommitdiffstats
path: root/mysql-test/main/multi_update.test
diff options
context:
space:
mode:
Diffstat (limited to 'mysql-test/main/multi_update.test')
-rw-r--r--mysql-test/main/multi_update.test142
1 files changed, 140 insertions, 2 deletions
diff --git a/mysql-test/main/multi_update.test b/mysql-test/main/multi_update.test
index 329394e8..c6247a21 100644
--- a/mysql-test/main/multi_update.test
+++ b/mysql-test/main/multi_update.test
@@ -391,7 +391,6 @@ drop table t1, t2, t3;
create table t1 (col1 int);
create table t2 (col1 int);
update t1,t2 set t1.col1 = (select max(col1) from t1) where t1.col1 = t2.col1;
--- error ER_UPDATE_TABLE_USED
delete t1 from t1,t2 where t1.col1 < (select max(col1) from t1) and t1.col1 = t2.col1;
drop table t1,t2;
@@ -400,7 +399,6 @@ drop table t1,t2;
#
create table t1(a int);
create table t2(a int);
---error ER_UPDATE_TABLE_USED
delete from t1,t2 using t1,t2 where t1.a=(select a from t1);
drop table t1, t2;
# End of 4.1 tests
@@ -1121,12 +1119,15 @@ 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"
+--source include/explain-no-costs.inc
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"
+--source include/explain-no-costs.inc
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"
+--source include/explain-no-costs.inc
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;
@@ -1200,3 +1201,140 @@ select * from t1;
drop table t1,t2,t3,t;
--echo # End of 10.4 tests
+
+--echo #
+--echo # MDEV-31150: 2nd execution of multi-update with
+--echo # mergeable derived table in WHERE
+--echo #
+
+CREATE TABLE t1 (a int);
+INSERT INTO t1 VALUES (3),(7),(1),(3);
+CREATE TABLE t2 (b int);
+INSERT INTO t2 VALUES (3),(4),(1);
+CREATE TABLE t3 (c int);
+INSERT INTO t3 VALUES (3),(4),(1),(5),(1);
+
+--delimiter |
+CREATE PROCEDURE restore_t1()
+BEGIN
+DELETE FROM t1;
+INSERT INTO t1 VALUES (3),(7),(1),(3);
+END|
+--delimiter ;
+
+let $q1=
+UPDATE t1,t3 SET a = NULL
+ WHERE a=c AND a IN (SELECT * FROM (SELECT b FROM t2) dt);
+
+SELECT * FROM t1;
+eval EXPLAIN $q1;
+eval $q1;
+SELECT * FROM t1;
+CALL restore_t1();
+eval PREPARE stmt FROM "$q1";
+EXECUTE stmt;
+SELECT * FROM t1;
+CALL restore_t1();
+EXECUTE stmt;
+SELECT * FROM t1;
+CALL restore_t1();
+DEALLOCATE PREPARE stmt;
+
+eval CREATE PROCEDURE p1() $q1;
+SELECT * FROM t1;
+CALL p1();
+SELECT * FROM t1;
+CALL restore_t1();
+CALL p1();
+SELECT * FROM t1;
+CALL restore_t1();
+DROP procedure p1;
+
+let $q2=
+UPDATE t1,t3 SET a = NULL
+ WHERE a=c AND a IN (WITH cte AS (SELECT b FROM t2) SELECT * FROM cte);
+
+SELECT * FROM t1;
+eval EXPLAIN $q2;
+eval $q2;
+SELECT * FROM t1;
+CALL restore_t1();
+eval PREPARE stmt FROM "$q2";
+EXECUTE stmt;
+SELECT * FROM t1;
+CALL restore_t1();
+EXECUTE stmt;
+SELECT * FROM t1;
+CALL restore_t1();
+DEALLOCATE PREPARE stmt;
+
+eval CREATE PROCEDURE p1() $q2;
+SELECT * FROM t1;
+CALL p1();
+SELECT * FROM t1;
+CALL restore_t1();
+CALL p1();
+SELECT * FROM t1;
+CALL restore_t1();
+DROP procedure p1;
+
+let $q3=
+UPDATE t1 SET a = NULL
+ WHERE a IN (SELECT * FROM (SELECT b FROM t2) dt);
+
+SELECT * FROM t1;
+eval EXPLAIN $q3;
+eval $q3;
+SELECT * FROM t1;
+CALL restore_t1();
+eval PREPARE stmt FROM "$q3";
+EXECUTE stmt;
+SELECT * FROM t1;
+CALL restore_t1();
+EXECUTE stmt;
+SELECT * FROM t1;
+CALL restore_t1();
+DEALLOCATE PREPARE stmt;
+
+eval CREATE PROCEDURE p1() $q3;
+SELECT * FROM t1;
+CALL p1();
+SELECT * FROM t1;
+CALL restore_t1();
+CALL p1();
+SELECT * FROM t1;
+CALL restore_t1();
+DROP procedure p1;
+
+let $q4=
+UPDATE t1 SET a = NULL
+ WHERE a IN (WITH cte AS (SELECT b FROM t2) SELECT * FROM cte);
+
+SELECT * FROM t1;
+eval EXPLAIN $q4;
+eval $q4;
+SELECT * FROM t1;
+CALL restore_t1();
+eval PREPARE stmt FROM "$q4";
+EXECUTE stmt;
+SELECT * FROM t1;
+CALL restore_t1();
+EXECUTE stmt;
+SELECT * FROM t1;
+CALL restore_t1();
+DEALLOCATE PREPARE stmt;
+
+eval CREATE PROCEDURE p1() $q4;
+SELECT * FROM t1;
+CALL p1();
+SELECT * FROM t1;
+CALL restore_t1();
+CALL p1();
+SELECT * FROM t1;
+CALL restore_t1();
+DROP procedure p1;
+
+DROP TABLE t1,t2,t3;
+DROP PROCEDURE restore_t1;
+
+--echo # End of 11.1 tests