MDEV-29545 InnoDB: Can't find record during replace stmt

Problem:
========
- InnoDB replace statement returns can't find record as result during
bulk insert operation. InnoDB returns DB_END_OF_INDEX blindly when
bulk transaction is visible to current transaction even though
the search tuple is inserted as a part of current replace statement.

Solution:
=========
row_search_mvcc(): InnoDB should allow the transaction to read
all the rows when innodb intends to do any locking on the
record even though bulk insert transaction changes are
visible to the current transaction
parent 07460c31
...@@ -229,4 +229,26 @@ commit; ...@@ -229,4 +229,26 @@ commit;
SELECT * FROM t; SELECT * FROM t;
c c
DROP TABLE t; DROP TABLE t;
#
# MDEV-29545 InnoDB: Can't find record during replace stmt
#
CREATE TABLE t1(c1 INT PRIMARY KEY)ENGINE=InnoDB;
BEGIN;
INSERT INTO t1 VALUES(3331);
connect con1,localhost,root,,,;
BEGIN;
SELECT c1 FROM t1;
c1
connection default;
COMMIT;
connection con1;
REPLACE INTO t1 VALUES(1984), (1984);
COMMIT;
connection default;
disconnect con1;
SELECT * FROM t1;
c1
1984
3331
DROP TABLE t1;
# End of 10.6 tests # End of 10.6 tests
...@@ -247,4 +247,26 @@ SAVEPOINT a; ...@@ -247,4 +247,26 @@ SAVEPOINT a;
commit; commit;
SELECT * FROM t; SELECT * FROM t;
DROP TABLE t; DROP TABLE t;
--echo #
--echo # MDEV-29545 InnoDB: Can't find record during replace stmt
--echo #
CREATE TABLE t1(c1 INT PRIMARY KEY)ENGINE=InnoDB;
BEGIN;
INSERT INTO t1 VALUES(3331);
connect(con1,localhost,root,,,);
BEGIN;
SELECT c1 FROM t1;
connection default;
COMMIT;
connection con1;
REPLACE INTO t1 VALUES(1984), (1984);
COMMIT;
connection default;
disconnect con1;
SELECT * FROM t1;
DROP TABLE t1;
--echo # End of 10.6 tests --echo # End of 10.6 tests
...@@ -4892,7 +4892,11 @@ row_search_mvcc( ...@@ -4892,7 +4892,11 @@ row_search_mvcc(
if (trx->isolation_level == TRX_ISO_READ_UNCOMMITTED if (trx->isolation_level == TRX_ISO_READ_UNCOMMITTED
|| !trx->read_view.is_open()) { || !trx->read_view.is_open()) {
} else if (trx_id_t bulk_trx_id = index->table->bulk_trx_id) { } else if (trx_id_t bulk_trx_id = index->table->bulk_trx_id) {
if (!trx->read_view.changes_visible(bulk_trx_id)) { /* InnoDB should allow the transaction to read all
the rows when InnoDB intends to do any locking
on the record */
if (prebuilt->select_lock_type == LOCK_NONE
&& !trx->read_view.changes_visible(bulk_trx_id)) {
trx->op_info = ""; trx->op_info = "";
err = DB_END_OF_INDEX; err = DB_END_OF_INDEX;
goto normal_return; goto normal_return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment