summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2022-09-12 09:27:46 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2022-09-12 09:27:46 +0300
commit667df98c3e0f32d391af4eb65c618043720b6a2f (patch)
tree55a77f8e16ef1c08d36f0d67fed784f6caa67380
parent43745b7e17e2889c0e2891a2ffaf4ec203aa5c7b (diff)
downloadmariadb-git-667df98c3e0f32d391af4eb65c618043720b6a2f.tar.gz
MDEV-29507 InnoDB: Failing assertion: table->n_rec_locks == 0
lock_place_prdt_page_lock(): Do not place locks on temporary tables. Temporary tables can only be accessed from one connection, so it does not make any sense to acquire any transactional locks on them.
-rw-r--r--mysql-test/suite/innodb_gis/r/rtree_temporary.result10
-rw-r--r--mysql-test/suite/innodb_gis/t/rtree_temporary.test13
-rw-r--r--storage/innobase/lock/lock0prdt.cc3
3 files changed, 26 insertions, 0 deletions
diff --git a/mysql-test/suite/innodb_gis/r/rtree_temporary.result b/mysql-test/suite/innodb_gis/r/rtree_temporary.result
index 5ce02c881cc..c34df7f2d9c 100644
--- a/mysql-test/suite/innodb_gis/r/rtree_temporary.result
+++ b/mysql-test/suite/innodb_gis/r/rtree_temporary.result
@@ -12,3 +12,13 @@ CREATE TEMPORARY TABLE t1 (c POINT NOT NULL,SPATIAL (c)) ENGINE=InnoDB;
INSERT INTO t1 SELECT POINT(0,0) FROM seq_1_to_366;
INSERT INTO t1 VALUES (POINT(1e-270,1e-130));
DROP TABLE t1;
+#
+# MDEV-29507 InnoDB: Failing assertion: table->n_rec_locks == 0
+#
+connect con1,localhost,root,,;
+CREATE TEMPORARY TABLE t (c POINT NOT NULL,SPATIAL (c)) ENGINE=InnoDB;
+INSERT INTO t SELECT POINTFROMTEXT ('POINT(0 0)') FROM seq_1_to_500;
+XA BEGIN 'a';
+DELETE FROM t ORDER BY c;
+disconnect con1;
+# End of 10.3 tests
diff --git a/mysql-test/suite/innodb_gis/t/rtree_temporary.test b/mysql-test/suite/innodb_gis/t/rtree_temporary.test
index 5c4df251970..e541d7c2698 100644
--- a/mysql-test/suite/innodb_gis/t/rtree_temporary.test
+++ b/mysql-test/suite/innodb_gis/t/rtree_temporary.test
@@ -16,3 +16,16 @@ CREATE TEMPORARY TABLE t1 (c POINT NOT NULL,SPATIAL (c)) ENGINE=InnoDB;
INSERT INTO t1 SELECT POINT(0,0) FROM seq_1_to_366;
INSERT INTO t1 VALUES (POINT(1e-270,1e-130));
DROP TABLE t1;
+
+--echo #
+--echo # MDEV-29507 InnoDB: Failing assertion: table->n_rec_locks == 0
+--echo #
+
+connect con1,localhost,root,,;
+CREATE TEMPORARY TABLE t (c POINT NOT NULL,SPATIAL (c)) ENGINE=InnoDB;
+INSERT INTO t SELECT POINTFROMTEXT ('POINT(0 0)') FROM seq_1_to_500;
+XA BEGIN 'a';
+DELETE FROM t ORDER BY c;
+disconnect con1;
+
+--echo # End of 10.3 tests
diff --git a/storage/innobase/lock/lock0prdt.cc b/storage/innobase/lock/lock0prdt.cc
index 9827243177d..11c1de7a1ef 100644
--- a/storage/innobase/lock/lock0prdt.cc
+++ b/storage/innobase/lock/lock0prdt.cc
@@ -916,6 +916,9 @@ lock_place_prdt_page_lock(
ut_ad(!dict_index_is_clust(index));
ut_ad(!dict_index_is_online_ddl(index));
+ if (index->table->is_temporary()) {
+ return DB_SUCCESS;
+ }
/* Another transaction cannot have an implicit lock on the record,
because when we come here, we already have modified the clustered