diff --git a/mysql-test/r/ndb_dd_basic.result b/mysql-test/r/ndb_dd_basic.result index e8aa9edf751944e304eee2ebd40a7ec6e38b6e21..c0d52a2b3fcdcb48e1c34648d927abb7b84bbf28 100644 --- a/mysql-test/r/ndb_dd_basic.result +++ b/mysql-test/r/ndb_dd_basic.result @@ -422,6 +422,26 @@ SELECT COUNT(*) FROM t1; COUNT(*) 0 DROP TABLE t1; +CREATE TABLE t1 ( +a int NOT NULL, +b varchar(4000), -- must use 2 pages undo +PRIMARY KEY using hash (a) +) +TABLESPACE ts1 STORAGE DISK ENGINE=NDBCLUSTER; +set autocommit = 0; +insert into t1 values(0,'x'); +insert into t1 values(1,'x'); +insert into t1 values(2,'x'); +insert into t1 values(3,'x'); +insert into t1 values(4,'x'); +insert into t1 values(5,'x'); +insert into t1 values(6,'x'); +insert into t1 values(7,'x'); +insert into t1 values(8,'x'); +delete from t1 where a = 0; +commit; +set autocommit = 1; +drop table t1; create table test.t1 (f1 varchar(50) primary key, f2 text,f3 int) TABLESPACE ts1 STORAGE DISK engine=NDB; insert into test.t1 (f1,f2,f3)VALUES("111111","aaaaaa",1); diff --git a/mysql-test/t/ndb_dd_basic.test b/mysql-test/t/ndb_dd_basic.test index 08a4053aa2953b1e333c9a1a3c42d65dfb144240..5d43d7997b0f59a8aa21744765faeb3c24ddeab1 100644 --- a/mysql-test/t/ndb_dd_basic.test +++ b/mysql-test/t/ndb_dd_basic.test @@ -345,6 +345,31 @@ DELETE FROM t1 WHERE a=2; SELECT COUNT(*) FROM t1; DROP TABLE t1; +# bug#20612 INS-DEL bug (not pgman bug) +# found via disk data assert but is not pgman or disk data related + +CREATE TABLE t1 ( + a int NOT NULL, + b varchar(4000), -- must use 2 pages undo + PRIMARY KEY using hash (a) +) +TABLESPACE ts1 STORAGE DISK ENGINE=NDBCLUSTER; + +set autocommit = 0; +insert into t1 values(0,'x'); +insert into t1 values(1,'x'); +insert into t1 values(2,'x'); +insert into t1 values(3,'x'); +insert into t1 values(4,'x'); +insert into t1 values(5,'x'); +insert into t1 values(6,'x'); +insert into t1 values(7,'x'); +insert into t1 values(8,'x'); +delete from t1 where a = 0; +commit; +set autocommit = 1; + +drop table t1; ############################# # Customer posted order by test case # Org in ndb_dd_advance.test diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp index dc1b194eed2262e973e6611f399067dfeaeb2851..3118164badda25e95d8e556f611567762c3ee456 100644 --- a/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp +++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp @@ -1469,7 +1469,15 @@ int Dbtup::handleDeleteReq(Signal* signal, { Operationrec* prevOp= req_struct->prevOpPtr.p; regOperPtr->tupVersion= prevOp->tupVersion; - regOperPtr->m_copy_tuple_location= prevOp->m_copy_tuple_location; + // make copy since previous op is committed before this one + const Uint32* org = c_undo_buffer.get_ptr(&prevOp->m_copy_tuple_location); + Uint32* dst = c_undo_buffer.alloc_copy_tuple( + ®OperPtr->m_copy_tuple_location, regTabPtr->total_rec_size); + if (dst == 0) { + terrorCode = ZMEM_NOMEM_ERROR; + goto error; + } + memcpy(dst, org, regTabPtr->total_rec_size << 2); } else {