Loading mysql-test/r/ndb_blob.result +2 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,8 @@ commit; select a from t1 where d is null; a 1 delete from t1 where a=45567; commit; delete from t1 where a=1; delete from t1 where a=2; commit; Loading mysql-test/t/ndb_blob.test +5 −0 Original line number Diff line number Diff line Loading @@ -96,6 +96,11 @@ update t1 set d=null where a=1; commit; select a from t1 where d is null; # bug#24028 - does not occur on MySQL level # bug#17986 - not seen by us anymore but could show as warning here delete from t1 where a=45567; commit; # pk delete delete from t1 where a=1; delete from t1 where a=2; Loading ndb/src/ndbapi/NdbBlob.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -407,6 +407,12 @@ NdbBlob::getHeadInlineValue(NdbOperation* anOp) setErrorCode(anOp); DBUG_RETURN(-1); } /* * If we get no data from this op then the operation is aborted * one way or other. Following hack in 5.0 makes sure we don't read * garbage. The proper fix exists only in version >= 5.1. */ theHead->length = 0; DBUG_RETURN(0); } Loading ndb/test/ndbapi/testBlobs.cpp +33 −17 Original line number Diff line number Diff line Loading @@ -129,18 +129,18 @@ printusage() << " s table scans" << endl << " r ordered index scans" << endl << " p performance test" << endl << "additional flags for test/skip" << endl << "operations for test/skip" << endl << " u update existing blob value" << endl << " n normal insert and update" << endl << " w insert and update using writeTuple" << endl << "blob operation styles for test/skip" << endl << " 0 getValue / setValue" << endl << " 1 setActiveHook" << endl << " 2 readData / writeData" << endl << "bug tests (no blob test)" << endl << "example: -test kn0 (need all 3 parts)" << endl << "bug tests" << endl << " -bug 4088 ndb api hang with mixed ops on index table" << endl << " -bug 27018 middle partial part write clobbers rest of part" << endl << " -bug nnnn delete + write gives 626" << endl << " -bug nnnn acc crash on delete and long key" << endl ; } Loading Loading @@ -1028,6 +1028,32 @@ deletePk() return 0; } static int deleteNoPk() { DBG("--- deleteNoPk ---"); Tup no_tup; // bug#24028 no_tup.m_pk1 = 0xb1ffb1ff; sprintf(no_tup.m_pk2, "%-*.*s", g_opt.m_pk2len, g_opt.m_pk2len, "b1ffb1ff"); CHK((g_con = g_ndb->startTransaction()) != 0); Tup& tup = no_tup; DBG("deletePk pk1=" << hex << tup.m_pk1); CHK((g_opr = g_con->getNdbOperation(g_opt.m_tname)) != 0); CHK(g_opr->deleteTuple() == 0); CHK(g_opr->equal("PK1", tup.m_pk1) == 0); if (g_opt.m_pk2len != 0) CHK(g_opr->equal("PK2", tup.m_pk2) == 0); CHK(g_con->execute(Commit) == -1); // fail // BUG: error should be on op but is on con now DBG("con: " << g_con->getNdbError()); DBG("opr: " << g_opr->getNdbError()); CHK(g_con->getNdbError().code == 626 || g_opr->getNdbError().code == 626); g_ndb->closeTransaction(g_con); g_opr = 0; g_con = 0; return 0; } // hash index ops static int Loading Loading @@ -1383,6 +1409,7 @@ testmain() CHK(readPk(style) == 0); } CHK(deletePk() == 0); CHK(deleteNoPk() == 0); CHK(verifyBlob() == 0); } if (testcase('w')) { Loading @@ -1397,6 +1424,7 @@ testmain() CHK(readPk(style) == 0); } CHK(deletePk() == 0); CHK(deleteNoPk() == 0); CHK(verifyBlob() == 0); } } Loading Loading @@ -1857,18 +1885,6 @@ bugtest_27018() return 0; } static int bugtest_2222() { return 0; } static int bugtest_3333() { return 0; } static struct { int m_bug; int (*m_test)(); Loading Loading
mysql-test/r/ndb_blob.result +2 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,8 @@ commit; select a from t1 where d is null; a 1 delete from t1 where a=45567; commit; delete from t1 where a=1; delete from t1 where a=2; commit; Loading
mysql-test/t/ndb_blob.test +5 −0 Original line number Diff line number Diff line Loading @@ -96,6 +96,11 @@ update t1 set d=null where a=1; commit; select a from t1 where d is null; # bug#24028 - does not occur on MySQL level # bug#17986 - not seen by us anymore but could show as warning here delete from t1 where a=45567; commit; # pk delete delete from t1 where a=1; delete from t1 where a=2; Loading
ndb/src/ndbapi/NdbBlob.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -407,6 +407,12 @@ NdbBlob::getHeadInlineValue(NdbOperation* anOp) setErrorCode(anOp); DBUG_RETURN(-1); } /* * If we get no data from this op then the operation is aborted * one way or other. Following hack in 5.0 makes sure we don't read * garbage. The proper fix exists only in version >= 5.1. */ theHead->length = 0; DBUG_RETURN(0); } Loading
ndb/test/ndbapi/testBlobs.cpp +33 −17 Original line number Diff line number Diff line Loading @@ -129,18 +129,18 @@ printusage() << " s table scans" << endl << " r ordered index scans" << endl << " p performance test" << endl << "additional flags for test/skip" << endl << "operations for test/skip" << endl << " u update existing blob value" << endl << " n normal insert and update" << endl << " w insert and update using writeTuple" << endl << "blob operation styles for test/skip" << endl << " 0 getValue / setValue" << endl << " 1 setActiveHook" << endl << " 2 readData / writeData" << endl << "bug tests (no blob test)" << endl << "example: -test kn0 (need all 3 parts)" << endl << "bug tests" << endl << " -bug 4088 ndb api hang with mixed ops on index table" << endl << " -bug 27018 middle partial part write clobbers rest of part" << endl << " -bug nnnn delete + write gives 626" << endl << " -bug nnnn acc crash on delete and long key" << endl ; } Loading Loading @@ -1028,6 +1028,32 @@ deletePk() return 0; } static int deleteNoPk() { DBG("--- deleteNoPk ---"); Tup no_tup; // bug#24028 no_tup.m_pk1 = 0xb1ffb1ff; sprintf(no_tup.m_pk2, "%-*.*s", g_opt.m_pk2len, g_opt.m_pk2len, "b1ffb1ff"); CHK((g_con = g_ndb->startTransaction()) != 0); Tup& tup = no_tup; DBG("deletePk pk1=" << hex << tup.m_pk1); CHK((g_opr = g_con->getNdbOperation(g_opt.m_tname)) != 0); CHK(g_opr->deleteTuple() == 0); CHK(g_opr->equal("PK1", tup.m_pk1) == 0); if (g_opt.m_pk2len != 0) CHK(g_opr->equal("PK2", tup.m_pk2) == 0); CHK(g_con->execute(Commit) == -1); // fail // BUG: error should be on op but is on con now DBG("con: " << g_con->getNdbError()); DBG("opr: " << g_opr->getNdbError()); CHK(g_con->getNdbError().code == 626 || g_opr->getNdbError().code == 626); g_ndb->closeTransaction(g_con); g_opr = 0; g_con = 0; return 0; } // hash index ops static int Loading Loading @@ -1383,6 +1409,7 @@ testmain() CHK(readPk(style) == 0); } CHK(deletePk() == 0); CHK(deleteNoPk() == 0); CHK(verifyBlob() == 0); } if (testcase('w')) { Loading @@ -1397,6 +1424,7 @@ testmain() CHK(readPk(style) == 0); } CHK(deletePk() == 0); CHK(deleteNoPk() == 0); CHK(verifyBlob() == 0); } } Loading Loading @@ -1857,18 +1885,6 @@ bugtest_27018() return 0; } static int bugtest_2222() { return 0; } static int bugtest_3333() { return 0; } static struct { int m_bug; int (*m_test)(); Loading