diff options
author | unknown <joreland@mysql.com> | 2005-06-07 15:10:57 +0200 |
---|---|---|
committer | unknown <joreland@mysql.com> | 2005-06-07 15:10:57 +0200 |
commit | 62321bd298b26c49412d8c01cec7d0d80b1f5236 (patch) | |
tree | 1f996a66b2ec0eca49cae817714e2274e1962720 /ndb/src | |
parent | 4c30434d150338c8eb6a7decf84db349e316a23b (diff) | |
download | mariadb-git-62321bd298b26c49412d8c01cec7d0d80b1f5236.tar.gz |
bug#11133 - ndb
incorrect handling of writeTuple with multi op transaction
ndb/src/kernel/blocks/dbacc/DbaccMain.cpp:
1) Pass operation instead of insertIsDone to LQH
2) transform operation correctly when in parallell que
(multi op within same trans)
ndb/src/kernel/blocks/dblqh/DblqhMain.cpp:
Let ACC decide what operation was performed when WRITE
ndb/test/ndbapi/testNdbApi.cpp:
Add testcase for bug 11133
ndb/test/run-test/daily-basic-tests.txt:
Add testcase for bug 11133
Diffstat (limited to 'ndb/src')
-rw-r--r-- | ndb/src/kernel/blocks/dbacc/DbaccMain.cpp | 13 | ||||
-rw-r--r-- | ndb/src/kernel/blocks/dblqh/DblqhMain.cpp | 27 |
2 files changed, 26 insertions, 14 deletions
diff --git a/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp b/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp index 44c891fc220..5921c3b63eb 100644 --- a/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp +++ b/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp @@ -1589,7 +1589,7 @@ void Dbacc::initOpRec(Signal* signal) void Dbacc::sendAcckeyconf(Signal* signal) { signal->theData[0] = operationRecPtr.p->userptr; - signal->theData[1] = operationRecPtr.p->insertIsDone; + signal->theData[1] = operationRecPtr.p->operation; signal->theData[2] = operationRecPtr.p->fid; signal->theData[3] = operationRecPtr.p->localdata[0]; signal->theData[4] = operationRecPtr.p->localdata[1]; @@ -1671,6 +1671,11 @@ void Dbacc::execACCKEYREQ(Signal* signal) case ZWRITE: case ZSCAN_OP: if (!tgeLocked){ + if(operationRecPtr.p->operation == ZWRITE) + { + jam(); + operationRecPtr.p->operation = ZUPDATE; + } sendAcckeyconf(signal); if (operationRecPtr.p->dirtyRead == ZFALSE) { /*---------------------------------------------------------------*/ @@ -2182,6 +2187,12 @@ Uint32 Dbacc::placeWriteInLockQueue(Signal* signal) return ZWRITE_ERROR; }//if + if(operationRecPtr.p->operation == ZWRITE) + { + operationRecPtr.p->operation = + (mlpqOperPtr.p->operation == ZDELETE) ? ZINSERT : ZUPDATE; + } + operationRecPtr.p->localdata[0] = queOperPtr.p->localdata[0]; operationRecPtr.p->localdata[1] = queOperPtr.p->localdata[1]; operationRecPtr.p->prevParallelQue = mlpqOperPtr.i; diff --git a/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp b/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp index 3967098b8e9..5d689274f26 100644 --- a/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp +++ b/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp @@ -3897,20 +3897,21 @@ void Dblqh::execACCKEYCONF(Signal* signal) * EITHER TO THE TC BLOCK OR DIRECTLY TO THE APPLICATION. THE SCHEMA VERSION * IS NEEDED SINCE TWO SCHEMA VERSIONS CAN BE ACTIVE SIMULTANEOUSLY ON A * TABLE. - * ------------------------------------------------------------------------ */ - if (regTcPtr->operation == ZWRITE) { - if (signal->theData[1] > 0) { - /* -------------------------------------------------------------------- - * ACC did perform an insert and thus we should indicate that the WRITE - * is an INSERT otherwise it is an UPDATE. - * -------------------------------------------------------------------- */ - jam(); - regTcPtr->operation = ZINSERT; - } else { - jam(); - tcConnectptr.p->operation = ZUPDATE; - }//if + * ----------------------------------------------------------------------- */ + if (regTcPtr->operation == ZWRITE) + { + Uint32 op= signal->theData[1]; + if(likely(op == ZINSERT || op == ZUPDATE)) + { + regTcPtr->operation = op; + } + else + { + warningEvent("Convering %d to ZUPDATE", op); + regTcPtr->operation = ZUPDATE; + } }//if + ndbrequire(localKeyFlag == 1); localKey2 = localKey1 & MAX_TUPLES_PER_PAGE; localKey1 = localKey1 >> MAX_TUPLES_BITS; |