Loading mysql-test/r/ndb_blob.result +7 −0 Original line number Diff line number Diff line Loading @@ -428,6 +428,13 @@ delete from t1; select * from t1; a b commit; replace t1 set a=2, b='y'; select * from t1; a b 2 y delete from t1; select * from t1; a b drop table t1; set autocommit=0; create table t1 ( Loading mysql-test/t/ndb_blob.test +5 −1 Original line number Diff line number Diff line Loading @@ -338,7 +338,7 @@ select * from t1 order by a; drop table t1; drop database test2; # -- bug-5252 tinytext crashes plus no-commit result -- # -- bug-5252 tinytext crashes + no-commit result + replace -- set autocommit=0; create table t1 ( Loading @@ -352,6 +352,10 @@ select * from t1; delete from t1; select * from t1; commit; replace t1 set a=2, b='y'; select * from t1; delete from t1; select * from t1; drop table t1; # -- bug-5013 insert empty string to text -- Loading ndb/src/ndbapi/NdbBlob.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -947,6 +947,8 @@ NdbBlob::deletePartsUnknown(Uint32 part) { DBUG_ENTER("NdbBlob::deletePartsUnknown"); DBUG_PRINT("info", ("part=%u count=all", part)); if (thePartSize == 0) // tinyblob DBUG_RETURN(0); static const unsigned maxbat = 256; static const unsigned minbat = 1; unsigned bat = minbat; Loading ndb/test/ndbapi/testBlobs.cpp +64 −20 Original line number Diff line number Diff line Loading @@ -839,9 +839,6 @@ insertPk(int style) CHK(g_con->execute(NoCommit) == 0); CHK(writeBlobData(tup) == 0); } // just another trap if (urandom(10) == 0) CHK(g_con->execute(NoCommit) == 0); if (++n == g_opt.m_batch) { CHK(g_con->execute(Commit) == 0); g_ndb->closeTransaction(g_con); Loading Loading @@ -963,21 +960,31 @@ static int deletePk() { DBG("--- deletePk ---"); unsigned n = 0; CHK((g_con = g_ndb->startTransaction()) != 0); for (unsigned k = 0; k < g_opt.m_rows; k++) { Tup& tup = g_tups[k]; DBG("deletePk pk1=" << hex << tup.m_pk1); CHK((g_con = g_ndb->startTransaction()) != 0); 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); if (++n == g_opt.m_batch) { CHK(g_con->execute(Commit) == 0); g_ndb->closeTransaction(g_con); CHK((g_con = g_ndb->startTransaction()) != 0); n = 0; } g_opr = 0; g_con = 0; tup.m_exists = false; } if (n != 0) { CHK(g_con->execute(Commit) == 0); n = 0; } g_ndb->closeTransaction(g_con); g_con = 0; return 0; } Loading Loading @@ -1080,19 +1087,27 @@ static int deleteIdx() { DBG("--- deleteIdx ---"); unsigned n = 0; CHK((g_con = g_ndb->startTransaction()) != 0); for (unsigned k = 0; k < g_opt.m_rows; k++) { Tup& tup = g_tups[k]; DBG("deleteIdx pk1=" << hex << tup.m_pk1); CHK((g_con = g_ndb->startTransaction()) != 0); CHK((g_opx = g_con->getNdbIndexOperation(g_opt.m_x1name, g_opt.m_tname)) != 0); CHK(g_opx->deleteTuple() == 0); CHK(g_opx->equal("PK2", tup.m_pk2) == 0); if (++n == g_opt.m_batch) { CHK(g_con->execute(Commit) == 0); g_ndb->closeTransaction(g_con); CHK((g_con = g_ndb->startTransaction()) != 0); n = 0; } g_opx = 0; g_con = 0; tup.m_exists = false; } if (n != 0) { CHK(g_con->execute(Commit) == 0); n = 0; } return 0; } Loading Loading @@ -1220,20 +1235,49 @@ deleteScan(bool idx) CHK(g_ops->getValue("PK2", tup.m_pk2) != 0); CHK(g_con->execute(NoCommit) == 0); unsigned rows = 0; unsigned n = 0; while (1) { int ret; tup.m_pk1 = (Uint32)-1; memset(tup.m_pk2, 'x', g_opt.m_pk2len); CHK((ret = g_ops->nextResult()) == 0 || ret == 1); CHK((ret = g_ops->nextResult(true)) == 0 || ret == 1); if (ret == 1) break; while (1) { DBG("deleteScan" << (idx ? "Idx" : "") << " pk1=" << hex << tup.m_pk1); CHK(g_ops->deleteCurrentTuple() == 0); CHK(g_con->execute(NoCommit) == 0); Uint32 k = tup.m_pk1 - g_opt.m_pk1off; CHK(k < g_opt.m_rows && g_tups[k].m_exists); g_tups[k].m_exists = false; CHK(g_ops->deleteCurrentTuple() == 0); rows++; tup.m_pk1 = (Uint32)-1; memset(tup.m_pk2, 'x', g_opt.m_pk2len); CHK((ret = g_ops->nextResult(false)) == 0 || ret == 1 || ret == 2); if (++n == g_opt.m_batch || ret == 2) { DBG("execute batch: n=" << n << " ret=" << ret); switch (0) { case 0: // works normally CHK(g_con->execute(NoCommit) == 0); CHK(true || g_con->restart() == 0); break; case 1: // nonsense - g_con is invalid for 2nd batch CHK(g_con->execute(Commit) == 0); CHK(true || g_con->restart() == 0); break; case 2: // DBTC sendSignalErrorRefuseLab CHK(g_con->execute(NoCommit) == 0); CHK(g_con->restart() == 0); break; case 3: // 266 time-out CHK(g_con->execute(Commit) == 0); CHK(g_con->restart() == 0); break; } n = 0; } if (ret == 2) break; } } CHK(g_con->execute(Commit) == 0); g_ndb->closeTransaction(g_con); Loading @@ -1256,7 +1300,7 @@ static int testmain() { g_ndb = new Ndb(g_ncc, "TEST_DB"); CHK(g_ndb->init() == 0); CHK(g_ndb->init(20) == 0); CHK(g_ndb->waitUntilReady() == 0); g_dic = g_ndb->getDictionary(); g_tups = new Tup [g_opt.m_rows]; Loading ndb/tools/delete_all.cpp +26 −5 Original line number Diff line number Diff line Loading @@ -22,7 +22,8 @@ #include <NdbSleep.h> #include <NDBT.hpp> static int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, int parallelism=240); static int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, bool commit_across_open_cursor, int parallelism=240); NDB_STD_OPTS_VARS; Loading Loading @@ -83,8 +84,18 @@ int main(int argc, char** argv){ ndbout << " Table " << argv[i] << " does not exist!" << endl; return NDBT_ProgramExit(NDBT_WRONGARGS); } // Check if we have any blobs bool commit_across_open_cursor = true; for (int j = 0; j < pTab->getNoOfColumns(); j++) { NdbDictionary::Column::Type t = pTab->getColumn(j)->getType(); if (t == NdbDictionary::Column::Blob || t == NdbDictionary::Column::Text) { commit_across_open_cursor = false; break; } } ndbout << "Deleting all from " << argv[i] << "..."; if(clear_table(&MyNdb, pTab) == NDBT_FAILED){ if(clear_table(&MyNdb, pTab, commit_across_open_cursor) == NDBT_FAILED){ res = NDBT_FAILED; ndbout << "FAILED" << endl; } Loading @@ -93,7 +104,8 @@ int main(int argc, char** argv){ } int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, int parallelism) int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, bool commit_across_open_cursor, int parallelism) { // Scan all records exclusive and delete // them one by one Loading Loading @@ -154,8 +166,12 @@ int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, int parallelism) } while((check = pOp->nextResult(false)) == 0); if(check != -1){ if (commit_across_open_cursor) { check = pTrans->execute(NdbTransaction::Commit); pTrans->restart(); pTrans->restart(); // new tx id } else { check = pTrans->execute(NdbTransaction::NoCommit); } } err = pTrans->getNdbError(); Loading @@ -181,6 +197,11 @@ int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, int parallelism) } goto failed; } if (! commit_across_open_cursor && pTrans->execute(NdbTransaction::Commit) != 0) { err = pTrans->getNdbError(); goto failed; } pNdb->closeTransaction(pTrans); return NDBT_OK; } Loading Loading
mysql-test/r/ndb_blob.result +7 −0 Original line number Diff line number Diff line Loading @@ -428,6 +428,13 @@ delete from t1; select * from t1; a b commit; replace t1 set a=2, b='y'; select * from t1; a b 2 y delete from t1; select * from t1; a b drop table t1; set autocommit=0; create table t1 ( Loading
mysql-test/t/ndb_blob.test +5 −1 Original line number Diff line number Diff line Loading @@ -338,7 +338,7 @@ select * from t1 order by a; drop table t1; drop database test2; # -- bug-5252 tinytext crashes plus no-commit result -- # -- bug-5252 tinytext crashes + no-commit result + replace -- set autocommit=0; create table t1 ( Loading @@ -352,6 +352,10 @@ select * from t1; delete from t1; select * from t1; commit; replace t1 set a=2, b='y'; select * from t1; delete from t1; select * from t1; drop table t1; # -- bug-5013 insert empty string to text -- Loading
ndb/src/ndbapi/NdbBlob.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -947,6 +947,8 @@ NdbBlob::deletePartsUnknown(Uint32 part) { DBUG_ENTER("NdbBlob::deletePartsUnknown"); DBUG_PRINT("info", ("part=%u count=all", part)); if (thePartSize == 0) // tinyblob DBUG_RETURN(0); static const unsigned maxbat = 256; static const unsigned minbat = 1; unsigned bat = minbat; Loading
ndb/test/ndbapi/testBlobs.cpp +64 −20 Original line number Diff line number Diff line Loading @@ -839,9 +839,6 @@ insertPk(int style) CHK(g_con->execute(NoCommit) == 0); CHK(writeBlobData(tup) == 0); } // just another trap if (urandom(10) == 0) CHK(g_con->execute(NoCommit) == 0); if (++n == g_opt.m_batch) { CHK(g_con->execute(Commit) == 0); g_ndb->closeTransaction(g_con); Loading Loading @@ -963,21 +960,31 @@ static int deletePk() { DBG("--- deletePk ---"); unsigned n = 0; CHK((g_con = g_ndb->startTransaction()) != 0); for (unsigned k = 0; k < g_opt.m_rows; k++) { Tup& tup = g_tups[k]; DBG("deletePk pk1=" << hex << tup.m_pk1); CHK((g_con = g_ndb->startTransaction()) != 0); 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); if (++n == g_opt.m_batch) { CHK(g_con->execute(Commit) == 0); g_ndb->closeTransaction(g_con); CHK((g_con = g_ndb->startTransaction()) != 0); n = 0; } g_opr = 0; g_con = 0; tup.m_exists = false; } if (n != 0) { CHK(g_con->execute(Commit) == 0); n = 0; } g_ndb->closeTransaction(g_con); g_con = 0; return 0; } Loading Loading @@ -1080,19 +1087,27 @@ static int deleteIdx() { DBG("--- deleteIdx ---"); unsigned n = 0; CHK((g_con = g_ndb->startTransaction()) != 0); for (unsigned k = 0; k < g_opt.m_rows; k++) { Tup& tup = g_tups[k]; DBG("deleteIdx pk1=" << hex << tup.m_pk1); CHK((g_con = g_ndb->startTransaction()) != 0); CHK((g_opx = g_con->getNdbIndexOperation(g_opt.m_x1name, g_opt.m_tname)) != 0); CHK(g_opx->deleteTuple() == 0); CHK(g_opx->equal("PK2", tup.m_pk2) == 0); if (++n == g_opt.m_batch) { CHK(g_con->execute(Commit) == 0); g_ndb->closeTransaction(g_con); CHK((g_con = g_ndb->startTransaction()) != 0); n = 0; } g_opx = 0; g_con = 0; tup.m_exists = false; } if (n != 0) { CHK(g_con->execute(Commit) == 0); n = 0; } return 0; } Loading Loading @@ -1220,20 +1235,49 @@ deleteScan(bool idx) CHK(g_ops->getValue("PK2", tup.m_pk2) != 0); CHK(g_con->execute(NoCommit) == 0); unsigned rows = 0; unsigned n = 0; while (1) { int ret; tup.m_pk1 = (Uint32)-1; memset(tup.m_pk2, 'x', g_opt.m_pk2len); CHK((ret = g_ops->nextResult()) == 0 || ret == 1); CHK((ret = g_ops->nextResult(true)) == 0 || ret == 1); if (ret == 1) break; while (1) { DBG("deleteScan" << (idx ? "Idx" : "") << " pk1=" << hex << tup.m_pk1); CHK(g_ops->deleteCurrentTuple() == 0); CHK(g_con->execute(NoCommit) == 0); Uint32 k = tup.m_pk1 - g_opt.m_pk1off; CHK(k < g_opt.m_rows && g_tups[k].m_exists); g_tups[k].m_exists = false; CHK(g_ops->deleteCurrentTuple() == 0); rows++; tup.m_pk1 = (Uint32)-1; memset(tup.m_pk2, 'x', g_opt.m_pk2len); CHK((ret = g_ops->nextResult(false)) == 0 || ret == 1 || ret == 2); if (++n == g_opt.m_batch || ret == 2) { DBG("execute batch: n=" << n << " ret=" << ret); switch (0) { case 0: // works normally CHK(g_con->execute(NoCommit) == 0); CHK(true || g_con->restart() == 0); break; case 1: // nonsense - g_con is invalid for 2nd batch CHK(g_con->execute(Commit) == 0); CHK(true || g_con->restart() == 0); break; case 2: // DBTC sendSignalErrorRefuseLab CHK(g_con->execute(NoCommit) == 0); CHK(g_con->restart() == 0); break; case 3: // 266 time-out CHK(g_con->execute(Commit) == 0); CHK(g_con->restart() == 0); break; } n = 0; } if (ret == 2) break; } } CHK(g_con->execute(Commit) == 0); g_ndb->closeTransaction(g_con); Loading @@ -1256,7 +1300,7 @@ static int testmain() { g_ndb = new Ndb(g_ncc, "TEST_DB"); CHK(g_ndb->init() == 0); CHK(g_ndb->init(20) == 0); CHK(g_ndb->waitUntilReady() == 0); g_dic = g_ndb->getDictionary(); g_tups = new Tup [g_opt.m_rows]; Loading
ndb/tools/delete_all.cpp +26 −5 Original line number Diff line number Diff line Loading @@ -22,7 +22,8 @@ #include <NdbSleep.h> #include <NDBT.hpp> static int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, int parallelism=240); static int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, bool commit_across_open_cursor, int parallelism=240); NDB_STD_OPTS_VARS; Loading Loading @@ -83,8 +84,18 @@ int main(int argc, char** argv){ ndbout << " Table " << argv[i] << " does not exist!" << endl; return NDBT_ProgramExit(NDBT_WRONGARGS); } // Check if we have any blobs bool commit_across_open_cursor = true; for (int j = 0; j < pTab->getNoOfColumns(); j++) { NdbDictionary::Column::Type t = pTab->getColumn(j)->getType(); if (t == NdbDictionary::Column::Blob || t == NdbDictionary::Column::Text) { commit_across_open_cursor = false; break; } } ndbout << "Deleting all from " << argv[i] << "..."; if(clear_table(&MyNdb, pTab) == NDBT_FAILED){ if(clear_table(&MyNdb, pTab, commit_across_open_cursor) == NDBT_FAILED){ res = NDBT_FAILED; ndbout << "FAILED" << endl; } Loading @@ -93,7 +104,8 @@ int main(int argc, char** argv){ } int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, int parallelism) int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, bool commit_across_open_cursor, int parallelism) { // Scan all records exclusive and delete // them one by one Loading Loading @@ -154,8 +166,12 @@ int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, int parallelism) } while((check = pOp->nextResult(false)) == 0); if(check != -1){ if (commit_across_open_cursor) { check = pTrans->execute(NdbTransaction::Commit); pTrans->restart(); pTrans->restart(); // new tx id } else { check = pTrans->execute(NdbTransaction::NoCommit); } } err = pTrans->getNdbError(); Loading @@ -181,6 +197,11 @@ int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, int parallelism) } goto failed; } if (! commit_across_open_cursor && pTrans->execute(NdbTransaction::Commit) != 0) { err = pTrans->getNdbError(); goto failed; } pNdb->closeTransaction(pTrans); return NDBT_OK; } Loading