ndb - bug#20535

  set null bits on delete+insert
parent 73f24392
......@@ -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)
......
......@@ -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
......
......@@ -243,6 +243,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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment