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
This commit is contained in:
unknown 2007-05-08 14:59:57 +02:00
parent a6b14a6267
commit efa9faf2b7
3 changed files with 103 additions and 0 deletions

View file

@ -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)

View file

@ -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

View file

@ -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