summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2018-05-08 17:18:55 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2018-05-08 17:18:55 +0300
commit1b8749f73b86c4e8adc14d20b29c48d0608d8914 (patch)
tree216d379028b81a577d704ff2ea9d2519e9305890
parent4513de3127df61fa2030690110bb34b7e1c40849 (diff)
parentbd1d152d05ba75bd1bdd2d9bc0358d8508df307a (diff)
downloadmariadb-git-1b8749f73b86c4e8adc14d20b29c48d0608d8914.tar.gz
Merge 10.2 into 10.3
-rw-r--r--mysql-test/main/cte_recursive.result32
-rw-r--r--mysql-test/main/cte_recursive.test32
-rw-r--r--mysql-test/suite/innodb/r/temporary_table.result12
-rw-r--r--mysql-test/suite/innodb/t/temporary_table.test11
-rw-r--r--storage/innobase/row/row0umod.cc4
5 files changed, 89 insertions, 2 deletions
diff --git a/mysql-test/main/cte_recursive.result b/mysql-test/main/cte_recursive.result
index 93fe8a99c16..6fccd39e59d 100644
--- a/mysql-test/main/cte_recursive.result
+++ b/mysql-test/main/cte_recursive.result
@@ -3207,6 +3207,38 @@ a
1
3
drop table t1;
+#
+# MDEV-16086: tmp table for CTE is created as ARIA tables
+#
+CREATE TABLE t1 (
+Id int(11) not null AUTO_INCREMENT,
+Parent varchar(15) not null,
+Child varchar(15) not null,
+PRIMARY KEY (Id)
+) ENGINE = MyISAM;
+INSERT INTO t1 (Parent, Child) VALUES
+('123', '456'),('456', '789'),('321', '654'),('654', '987');
+WITH RECURSIVE cte AS
+( SELECT b.Parent,
+b.Child,
+CAST(CONCAT(b.Child,',') AS CHAR(513)) Path
+FROM t1 b
+LEFT OUTER JOIN t1 bc ON b.Child = bc.Parent
+WHERE bc.Id IS NULL
+UNION ALL SELECT c.Parent,
+c.Child,
+CONCAT(p.Path,c.Child,',') Path
+FROM t1 c
+INNER JOIN cte p ON c.Child = p.Parent)
+SELECT *
+FROM cte
+ORDER BY Path;
+Parent Child Path
+456 789 789,
+123 456 789,456,
+654 987 987,
+321 654 987,654,
+DROP TABLE t1;
# Start of 10.3 tests
#
# MDEV-14217 [db crash] Recursive CTE when SELECT includes new field
diff --git a/mysql-test/main/cte_recursive.test b/mysql-test/main/cte_recursive.test
index 0647e6c15c3..9d7f23a2258 100644
--- a/mysql-test/main/cte_recursive.test
+++ b/mysql-test/main/cte_recursive.test
@@ -2215,6 +2215,38 @@ select * from qn;
drop table t1;
+--echo #
+--echo # MDEV-16086: tmp table for CTE is created as ARIA tables
+--echo #
+
+CREATE TABLE t1 (
+ Id int(11) not null AUTO_INCREMENT,
+ Parent varchar(15) not null,
+ Child varchar(15) not null,
+ PRIMARY KEY (Id)
+) ENGINE = MyISAM;
+
+INSERT INTO t1 (Parent, Child) VALUES
+ ('123', '456'),('456', '789'),('321', '654'),('654', '987');
+
+WITH RECURSIVE cte AS
+ ( SELECT b.Parent,
+ b.Child,
+ CAST(CONCAT(b.Child,',') AS CHAR(513)) Path
+ FROM t1 b
+ LEFT OUTER JOIN t1 bc ON b.Child = bc.Parent
+ WHERE bc.Id IS NULL
+ UNION ALL SELECT c.Parent,
+ c.Child,
+ CONCAT(p.Path,c.Child,',') Path
+ FROM t1 c
+ INNER JOIN cte p ON c.Child = p.Parent)
+SELECT *
+FROM cte
+ORDER BY Path;
+
+DROP TABLE t1;
+
--echo # Start of 10.3 tests
--echo #
diff --git a/mysql-test/suite/innodb/r/temporary_table.result b/mysql-test/suite/innodb/r/temporary_table.result
index 310741b5798..64eb3270934 100644
--- a/mysql-test/suite/innodb/r/temporary_table.result
+++ b/mysql-test/suite/innodb/r/temporary_table.result
@@ -638,3 +638,15 @@ t1 CREATE TEMPORARY TABLE `t1` (
`j` int(11) DEFAULT NULL,
PRIMARY KEY (`i`) KEY_BLOCK_SIZE=8
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC
+DROP TABLE t1;
+CREATE TEMPORARY TABLE t1(f1 INT, KEY(f1)) ENGINE=InnoDB;
+INSERT INTO t1 VALUES(NULL);
+UPDATE t1 SET f1 = 0;
+START TRANSACTION;
+UPDATE t1 SET f1 = 4;
+UPDATE t1 SET f1 = 0;
+ROLLBACK;
+SELECT * FROM t1;
+f1
+0
+DROP TABLE t1;
diff --git a/mysql-test/suite/innodb/t/temporary_table.test b/mysql-test/suite/innodb/t/temporary_table.test
index 4184daaf064..9a640657c4d 100644
--- a/mysql-test/suite/innodb/t/temporary_table.test
+++ b/mysql-test/suite/innodb/t/temporary_table.test
@@ -464,3 +464,14 @@ ALTER TABLE t1 ROW_FORMAT = DYNAMIC;
set innodb_strict_mode = ON;
ALTER TABLE t1 ADD COLUMN j INT;
SHOW CREATE TABLE t1;
+DROP TABLE t1;
+
+CREATE TEMPORARY TABLE t1(f1 INT, KEY(f1)) ENGINE=InnoDB;
+INSERT INTO t1 VALUES(NULL);
+UPDATE t1 SET f1 = 0;
+START TRANSACTION;
+UPDATE t1 SET f1 = 4;
+UPDATE t1 SET f1 = 0;
+ROLLBACK;
+SELECT * FROM t1;
+DROP TABLE t1;
diff --git a/storage/innobase/row/row0umod.cc b/storage/innobase/row/row0umod.cc
index d3aa6f89811..41ba66fd57d 100644
--- a/storage/innobase/row/row0umod.cc
+++ b/storage/innobase/row/row0umod.cc
@@ -540,8 +540,8 @@ row_undo_mod_del_mark_or_remove_sec_low(
/* For temporary table, we can skip to check older version of
clustered index entry, because there is no MVCC or purge. */
- if (!node->table->is_temporary()
- && row_vers_old_has_index_entry(
+ if (node->table->is_temporary()
+ || row_vers_old_has_index_entry(
FALSE, btr_pcur_get_rec(&node->pcur),
&mtr_vers, index, entry, 0, 0)) {
err = btr_cur_del_mark_set_sec_rec(BTR_NO_LOCKING_FLAG,