summaryrefslogtreecommitdiff
path: root/ndb/src
diff options
context:
space:
mode:
authorunknown <pekka@mysql.com>2005-03-30 22:17:11 +0200
committerunknown <pekka@mysql.com>2005-03-30 22:17:11 +0200
commite12f1a44537074aef095fa1f75a5af6ea367c9c5 (patch)
treebbe36a7074ec29e37d585c07eb0b797f4b88828d /ndb/src
parent30c85129548f7d8267fab809a723672161c6fce9 (diff)
downloadmariadb-git-e12f1a44537074aef095fa1f75a5af6ea367c9c5.tar.gz
ndb - CSC#4927: ordered index + long pk, second half
ndb/src/kernel/blocks/dbacc/DbaccMain.cpp: ACC_LOCKREQ - element may have moved after lock request was made
Diffstat (limited to 'ndb/src')
-rw-r--r--ndb/src/kernel/blocks/dbacc/DbaccMain.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp b/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp
index a124e15eea4..c6d4e6af4d4 100644
--- a/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp
+++ b/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp
@@ -2522,6 +2522,26 @@ void Dbacc::execACC_LOCKREQ(Signal* signal)
*sig = *req;
return;
}
+ operationRecPtr.i = req->accOpPtr;
+ ptrCheckGuard(operationRecPtr, coprecsize, operationrec);
+ fragrecptr.i = operationRecPtr.p->fragptr;
+ ptrCheckGuard(fragrecptr, cfragmentsize, fragmentrec);
+ if (fragrecptr.p->keyLength == 0 &&
+ // should test some state variable
+ operationRecPtr.p->elementPage != RNIL) {
+ jam();
+ // re-compute long key vars
+ Page8Ptr tPageptr;
+ tPageptr.i = operationRecPtr.p->elementPage;
+ ptrCheckGuard(tPageptr, cpagesize, page8);
+ Uint32 tKeyptr =
+ operationRecPtr.p->elementPointer +
+ operationRecPtr.p->elementIsforward *
+ (ZELEM_HEAD_SIZE + fragrecptr.p->localkeylen);
+ tslcPageIndex = tPageptr.p->word32[tKeyptr] & 0x3ff;
+ tslcPagedir = tPageptr.p->word32[tKeyptr] >> 10;
+ searchLongKey(signal, false);
+ }
if (lockOp == AccLockReq::Unlock) {
jam();
// do unlock via ACC_COMMITREQ (immediate)