summaryrefslogtreecommitdiff
path: root/ndb/src
diff options
context:
space:
mode:
authorunknown <joreland@mysql.com>2005-06-07 15:10:57 +0200
committerunknown <joreland@mysql.com>2005-06-07 15:10:57 +0200
commit62321bd298b26c49412d8c01cec7d0d80b1f5236 (patch)
tree1f996a66b2ec0eca49cae817714e2274e1962720 /ndb/src
parent4c30434d150338c8eb6a7decf84db349e316a23b (diff)
downloadmariadb-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.cpp13
-rw-r--r--ndb/src/kernel/blocks/dblqh/DblqhMain.cpp27
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;