From f01ed1196c06ba0fcd7a6b889a9ccaef5be705b7 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 3 Feb 2008 21:24:59 +0100 Subject: [PATCH] ndb - bug#33619 make sure to alloc logspace and set bits if doing delete after previous update wo/ touching DD part mysql-test/suite/ndb/r/ndb_dd_basic.result: testcase mysql-test/suite/ndb/t/ndb_dd_basic.test: testcase --- mysql-test/suite/ndb/r/ndb_dd_basic.result | 10 +++++ mysql-test/suite/ndb/t/ndb_dd_basic.test | 10 +++++ .../kernel/blocks/dbtup/DbtupExecQuery.cpp | 42 ++++++++----------- 3 files changed, 37 insertions(+), 25 deletions(-) diff --git a/mysql-test/suite/ndb/r/ndb_dd_basic.result b/mysql-test/suite/ndb/r/ndb_dd_basic.result index 2a79fcfb3c8..41e3d10fe5b 100644 --- a/mysql-test/suite/ndb/r/ndb_dd_basic.result +++ b/mysql-test/suite/ndb/r/ndb_dd_basic.result @@ -406,6 +406,16 @@ a b c 1 7 7 2 2 2 3 3 3 +DELETE FROM t1; +INSERT INTO t1 VALUES (3,'1','1'); +BEGIN; +UPDATE t1 SET b = b + 2 WHERE A = 3; +DELETE FROM t1 WHERE A = 3; +INSERT INTO t1 VALUES (3,'0','0'); +COMMIT; +SELECT * from t1 ORDER BY 1; +a b c +3 0 0 DROP TABLE t1; CREATE TABLE t1 ( a INT NOT NULL PRIMARY KEY, diff --git a/mysql-test/suite/ndb/t/ndb_dd_basic.test b/mysql-test/suite/ndb/t/ndb_dd_basic.test index fc35ef03b39..0fb793e2142 100644 --- a/mysql-test/suite/ndb/t/ndb_dd_basic.test +++ b/mysql-test/suite/ndb/t/ndb_dd_basic.test @@ -346,6 +346,16 @@ UPDATE t1 SET c = '6' WHERE b = '7'; SELECT * FROM t1 ORDER BY 1; UPDATE t1 SET c = '7' WHERE c = '6'; SELECT * FROM t1 ORDER BY 1; + +DELETE FROM t1; +INSERT INTO t1 VALUES (3,'1','1'); +BEGIN; +UPDATE t1 SET b = b + 2 WHERE A = 3; +DELETE FROM t1 WHERE A = 3; +INSERT INTO t1 VALUES (3,'0','0'); +COMMIT; +SELECT * from t1 ORDER BY 1; + DROP TABLE t1; ######################## diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp index 418e85dc182..348b16ac2c1 100644 --- a/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp +++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp @@ -1503,32 +1503,22 @@ int Dbtup::handleDeleteReq(Signal* signal, else { regOperPtr->tupVersion= req_struct->m_tuple_ptr->get_tuple_version(); - if(regTabPtr->m_no_of_disk_attributes) + } + + if(disk && regOperPtr->m_undo_buffer_space == 0) + { + regOperPtr->op_struct.m_wait_log_buffer = 1; + regOperPtr->op_struct.m_load_diskpage_on_commit = 1; + Uint32 sz= regOperPtr->m_undo_buffer_space= + (sizeof(Dbtup::Disk_undo::Free) >> 2) + + regTabPtr->m_offsets[DD].m_fix_header_size - 1; + + terrorCode= c_lgman->alloc_log_space(regFragPtr->m_logfile_group_id, + sz); + if(unlikely(terrorCode)) { - Uint32 sz; - if(regTabPtr->m_attributes[DD].m_no_of_varsize) - { - /** - * Need to have page in memory to read size - * to alloc undo space - */ - abort(); - } - else - sz= (sizeof(Dbtup::Disk_undo::Free) >> 2) + - regTabPtr->m_offsets[DD].m_fix_header_size - 1; - - regOperPtr->m_undo_buffer_space= sz; - - int res; - if((res= c_lgman->alloc_log_space(regFragPtr->m_logfile_group_id, - sz))) - { - terrorCode= res; - regOperPtr->m_undo_buffer_space= 0; - goto error; - } - + regOperPtr->m_undo_buffer_space= 0; + goto error; } } if (req_struct->attrinfo_len == 0) @@ -1537,7 +1527,9 @@ int Dbtup::handleDeleteReq(Signal* signal, } if (regTabPtr->need_expand(disk)) + { prepare_read(req_struct, regTabPtr, disk); + } { Uint32 RlogSize;