diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp index ec44d127f2c..59b3de2227b 100644 --- a/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp +++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp @@ -1201,9 +1201,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 838ab8a1997..952b5a50dc5 100644 --- a/storage/ndb/test/ndbapi/testBasic.cpp +++ b/storage/ndb/test/ndbapi/testBasic.cpp @@ -1458,6 +1458,91 @@ runBug28073(NDBT_Context *ctx, NDBT_Step* step) template class Vector; +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; igetNoOfColumns(); 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; igetNoOfColumns(); 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 values; + for (i = 0; igetNoOfColumns(); 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; iisNULL()) + { + 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; + NDBT_TESTSUITE(testBasic); TESTCASE("PkInsert", "Verify that we can insert and delete from this table using PK" @@ -1742,6 +1827,10 @@ TESTCASE("Bug28073", "Infinite loop in lock queue" ){ STEP(runBug28073); } +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 96473c28199..e080536dad9 100644 --- a/storage/ndb/test/run-test/daily-basic-tests.txt +++ b/storage/ndb/test/run-test/daily-basic-tests.txt @@ -247,6 +247,10 @@ max-time: 500 cmd: testBasic args: -n Bug28073 +max-time: 500 +cmd: testBasic +args: -n Bug20535 + max-time: 500 cmd: testIndex args: -n Bug25059 -r 3000 T1