summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <jonas@perch.ndb.mysql.com>2007-05-08 14:59:57 +0200
committerunknown <jonas@perch.ndb.mysql.com>2007-05-08 14:59:57 +0200
commitefa9faf2b7da3577b67f7b558b74d6f37d71f471 (patch)
tree4f8d4d791ec85dd744cf2171a7ec5ae102eecf61
parenta6b14a62670c9886ef6903fc4c54603901162c21 (diff)
downloadmariadb-git-efa9faf2b7da3577b67f7b558b74d6f37d71f471.tar.gz
ndb - bug#20535
set null bits on delete+insert storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp: set null bits on delete+insert storage/ndb/test/ndbapi/testBasic.cpp: set null bits on delete+insert 20535 storage/ndb/test/run-test/daily-basic-tests.txt: testcase
-rw-r--r--storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp10
-rw-r--r--storage/ndb/test/ndbapi/testBasic.cpp89
-rw-r--r--storage/ndb/test/run-test/daily-basic-tests.txt4
3 files changed, 103 insertions, 0 deletions
diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp
index 91bc346c071..bba894db7fd 100644
--- a/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp
+++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp
@@ -1198,9 +1198,19 @@ int Dbtup::handleInsertReq(Signal* signal,
if(!prevOp->is_first_operation())
org= (Tuple_header*)c_undo_buffer.get_ptr(&prevOp->m_copy_tuple_location);
if (regTabPtr->need_expand())
+ {
expand_tuple(req_struct, sizes, org, regTabPtr, !disk_insert);
+ memset(req_struct->m_disk_ptr->m_null_bits+
+ regTabPtr->m_offsets[DD].m_null_offset, 0xFF,
+ 4*regTabPtr->m_offsets[DD].m_null_words);
+ }
else
+ {
memcpy(dst, org, 4*regTabPtr->m_offsets[MM].m_fix_header_size);
+ }
+ memset(tuple_ptr->m_null_bits+
+ regTabPtr->m_offsets[MM].m_null_offset, 0xFF,
+ 4*regTabPtr->m_offsets[MM].m_null_words);
}
if (disk_insert)
diff --git a/storage/ndb/test/ndbapi/testBasic.cpp b/storage/ndb/test/ndbapi/testBasic.cpp
index 705c18b55c0..5086cfc8b5b 100644
--- a/storage/ndb/test/ndbapi/testBasic.cpp
+++ b/storage/ndb/test/ndbapi/testBasic.cpp
@@ -1398,6 +1398,91 @@ runBug27756(NDBT_Context* ctx, NDBT_Step* step)
template class Vector<Uint64>;
+int
+runBug20535(NDBT_Context* ctx, NDBT_Step* step)
+{
+ Uint32 i;
+ Ndb* pNdb = GETNDB(step);
+ const NdbDictionary::Table * tab = ctx->getTab();
+ NdbDictionary::Dictionary * dict = pNdb->getDictionary();
+
+ bool null = false;
+ for (i = 0; i<tab->getNoOfColumns(); i++)
+ {
+ if (tab->getColumn(i)->getNullable())
+ {
+ null = true;
+ break;
+ }
+ }
+
+ if (!null)
+ return NDBT_OK;
+
+ HugoTransactions hugoTrans(* tab);
+ hugoTrans.loadTable(pNdb, 1);
+
+ NdbTransaction* pTrans = pNdb->startTransaction();
+ NdbOperation* pOp = pTrans->getNdbOperation(tab->getName());
+ pOp->deleteTuple();
+ hugoTrans.equalForRow(pOp, 0);
+ if (pTrans->execute(NoCommit) != 0)
+ return NDBT_FAILED;
+
+ pOp = pTrans->getNdbOperation(tab->getName());
+ pOp->insertTuple();
+ hugoTrans.equalForRow(pOp, 0);
+ for (i = 0; i<tab->getNoOfColumns(); i++)
+ {
+ if (!tab->getColumn(i)->getPrimaryKey() &&
+ !tab->getColumn(i)->getNullable())
+ {
+ hugoTrans.setValueForAttr(pOp, i, 0, 1);
+ }
+ }
+
+ if (pTrans->execute(Commit) != 0)
+ return NDBT_FAILED;
+
+ pTrans->close();
+
+ pTrans = pNdb->startTransaction();
+ pOp = pTrans->getNdbOperation(tab->getName());
+ pOp->readTuple();
+ hugoTrans.equalForRow(pOp, 0);
+ Vector<NdbRecAttr*> values;
+ for (i = 0; i<tab->getNoOfColumns(); i++)
+ {
+ if (!tab->getColumn(i)->getPrimaryKey() &&
+ tab->getColumn(i)->getNullable())
+ {
+ values.push_back(pOp->getValue(i));
+ }
+ }
+
+ if (pTrans->execute(Commit) != 0)
+ return NDBT_FAILED;
+
+ null = true;
+ for (i = 0; i<values.size(); i++)
+ {
+ if (!values[i]->isNULL())
+ {
+ null = false;
+ ndbout_c("column %s is not NULL", values[i]->getColumn()->getName());
+ }
+ }
+
+ pTrans->close();
+
+ if (null)
+ return NDBT_OK;
+ else
+ return NDBT_FAILED;
+}
+
+template class Vector<NdbRecAttr*>;
+
NDBT_TESTSUITE(testBasic);
TESTCASE("PkInsert",
"Verify that we can insert and delete from this table using PK"
@@ -1676,6 +1761,10 @@ TESTCASE("Bug27756",
"Verify what happens when we fill the db" ){
STEP(runBug27756);
}
+TESTCASE("Bug20535",
+ "Verify what happens when we fill the db" ){
+ STEP(runBug20535);
+}
NDBT_TESTSUITE_END(testBasic);
#if 0
diff --git a/storage/ndb/test/run-test/daily-basic-tests.txt b/storage/ndb/test/run-test/daily-basic-tests.txt
index 203ba4145ec..7d6830f0673 100644
--- a/storage/ndb/test/run-test/daily-basic-tests.txt
+++ b/storage/ndb/test/run-test/daily-basic-tests.txt
@@ -244,6 +244,10 @@ cmd: testBasic
args: -n Bug28073
max-time: 500
+cmd: testBasic
+args: -n Bug20535
+
+max-time: 500
cmd: testIndex
args: -n Bug25059 -r 3000 T1