diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2022-09-12 09:27:46 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2022-09-12 09:27:46 +0300 |
commit | 667df98c3e0f32d391af4eb65c618043720b6a2f (patch) | |
tree | 55a77f8e16ef1c08d36f0d67fed784f6caa67380 | |
parent | 43745b7e17e2889c0e2891a2ffaf4ec203aa5c7b (diff) | |
download | mariadb-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.result | 10 | ||||
-rw-r--r-- | mysql-test/suite/innodb_gis/t/rtree_temporary.test | 13 | ||||
-rw-r--r-- | storage/innobase/lock/lock0prdt.cc | 3 |
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 |