mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
ndb - bug#20612 ins-del fix in tup
storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp: allocate separate copy tuple for delete after insert or update in same tx, instead of sharing pointer to same copy tuple. this is an easy fix independent of commit/abort order of operations mysql-test/r/ndb_dd_basic.result: test INS-DEL via assert in disk data code mysql-test/t/ndb_dd_basic.test: test INS-DEL via assert in disk data code
This commit is contained in:
@ -422,6 +422,26 @@ SELECT COUNT(*) FROM t1;
|
|||||||
COUNT(*)
|
COUNT(*)
|
||||||
0
|
0
|
||||||
DROP TABLE t1;
|
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;
|
||||||
ALTER TABLESPACE ts1
|
ALTER TABLESPACE ts1
|
||||||
DROP DATAFILE 'datafile.dat'
|
DROP DATAFILE 'datafile.dat'
|
||||||
ENGINE = NDB;
|
ENGINE = NDB;
|
||||||
|
@ -345,6 +345,32 @@ DELETE FROM t1 WHERE a=2;
|
|||||||
SELECT COUNT(*) FROM t1;
|
SELECT COUNT(*) FROM t1;
|
||||||
DROP TABLE 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;
|
||||||
|
|
||||||
###################
|
###################
|
||||||
# Test Cleanup
|
# Test Cleanup
|
||||||
###################
|
###################
|
||||||
|
@ -1469,7 +1469,15 @@ int Dbtup::handleDeleteReq(Signal* signal,
|
|||||||
{
|
{
|
||||||
Operationrec* prevOp= req_struct->prevOpPtr.p;
|
Operationrec* prevOp= req_struct->prevOpPtr.p;
|
||||||
regOperPtr->tupVersion= prevOp->tupVersion;
|
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
|
else
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user