List:Internals« Previous MessageNext Message »
From:jonas.oreland Date:July 21 2005 9:27am
Subject:bk commit into 5.1 tree (joreland:1.1863)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of jonas. When jonas does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.1863 05/07/21 11:27:17 joreland@stripped +1 -0
  Merge mysql.com:/home/jonas/src/mysql-5.0
  into  mysql.com:/home/jonas/src/mysql-5.1-push

  storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
    1.49 05/07/21 11:27:13 joreland@stripped +0 -0
    Auto merged

  storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
    1.40.8.2 05/07/21 11:27:13 joreland@stripped +0 -0
    Merge rename: ndb/src/kernel/blocks/dbdict/Dbdict.cpp -> storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	joreland
# Host:	eel.(none)
# Root:	/home/jonas/src/mysql-5.1-push/RESYNC

--- 1.40.8.1/ndb/src/kernel/blocks/dbdict/Dbdict.cpp	2005-07-21 11:22:17 +02:00
+++ 1.49/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp	2005-07-21 11:27:13 +02:00
@@ -271,7 +271,6 @@
     req->senderData = RNIL;
     req->fragmentationType = tablePtr.p->fragmentType;
     req->noOfFragments = 0;
-    req->fragmentNode = 0;
     req->primaryTableId = tablePtr.i;
     EXECUTE_DIRECT(DBDIH, GSN_CREATE_FRAGMENTATION_REQ, signal,
 		   CreateFragmentationReq::SignalLength);
@@ -1493,8 +1492,11 @@
   tablePtr.p->gciTableCreated = 0;
   tablePtr.p->noOfAttributes = ZNIL;
   tablePtr.p->noOfNullAttr = 0;
+  tablePtr.p->ngLen = 0;
+  memset(tablePtr.p->ngData, 0, sizeof(tablePtr.p->ngData));
   tablePtr.p->frmLen = 0;
   memset(tablePtr.p->frmData, 0, sizeof(tablePtr.p->frmData));
+  tablePtr.p->fragmentCount = 0;
   /*
     tablePtr.p->lh3PageIndexBits = 0;
     tablePtr.p->lh3DistrBits = 0;
@@ -2920,25 +2922,52 @@
     createTabPtr.p->m_fragmentsPtrI = RNIL;
     createTabPtr.p->m_dihAddFragPtr = RNIL;
 
-    Uint32 * theData = signal->getDataPtrSend();
+    Uint32 *theData = signal->getDataPtrSend(), i;
+    Uint16 *node_group= (Uint16*)&signal->theData[25];
     CreateFragmentationReq * const req = (CreateFragmentationReq*)theData;
     req->senderRef = reference();
     req->senderData = createTabPtr.p->key;
+    req->primaryTableId = parseRecord.tablePtr.p->primaryTableId;
+    req->noOfFragments = parseRecord.tablePtr.p->ngLen >> 1;
     req->fragmentationType = parseRecord.tablePtr.p->fragmentType;
-    req->noOfFragments = 0;
-    req->fragmentNode = 0;
-    req->primaryTableId = RNIL;
+    for (i = 0; i < req->noOfFragments; i++)
+      node_group[i] = parseRecord.tablePtr.p->ngData[i];
     if (parseRecord.tablePtr.p->isOrderedIndex()) {
+      jam();
       // ordered index has same fragmentation as the table
-      const Uint32 primaryTableId = parseRecord.tablePtr.p->primaryTableId;
-      TableRecordPtr primaryTablePtr;
-      c_tableRecordPool.getPtr(primaryTablePtr, primaryTableId);
-      // fragmentationType must be consistent
-      req->fragmentationType = primaryTablePtr.p->fragmentType;
-      req->primaryTableId = primaryTableId;
+      req->primaryTableId = parseRecord.tablePtr.p->primaryTableId;
+      req->fragmentationType = DictTabInfo::DistrKeyOrderedIndex;
+    }
+    else if (parseRecord.tablePtr.p->isHashIndex())
+    {
+      jam();
+      /*
+        Unique hash indexes has same amount of fragments as primary table
+        and distributed in the same manner but has always a normal hash
+        fragmentation.
+      */
+      req->primaryTableId = parseRecord.tablePtr.p->primaryTableId;
+      req->fragmentationType = DictTabInfo::DistrKeyUniqueHashIndex;
+    }
+    else
+    {
+      jam();
+      /*
+        Blob tables come here with primaryTableId != RNIL but we only need
+        it for creating the fragments so we set it to RNIL now that we got
+        what we wanted from it to avoid other side effects.
+      */
+      parseRecord.tablePtr.p->primaryTableId = RNIL;
+    }
+    EXECUTE_DIRECT(DBDIH, GSN_CREATE_FRAGMENTATION_REQ, signal,
+		   CreateFragmentationReq::SignalLength);
+    jamEntry();
+    if (signal->theData[0] != 0)
+    {
+      jam();
+      parseRecord.errorCode= signal->theData[0];
+      break;
     }
-    sendSignal(DBDIH_REF, GSN_CREATE_FRAGMENTATION_REQ, signal,
-	       CreateFragmentationReq::SignalLength, JBB);
     
     c_blockState = BS_CREATE_TAB;
     return;
@@ -4957,6 +4986,10 @@
   tablePtr.p->frmLen = tableDesc.FrmLen;
   memcpy(tablePtr.p->frmData, tableDesc.FrmData, tableDesc.FrmLen);  
 
+  tablePtr.p->ngLen = tableDesc.FragmentDataLen;
+  memcpy(tablePtr.p->ngData, tableDesc.FragmentData,
+         tableDesc.FragmentDataLen);
+
   if(tableDesc.PrimaryTableId != RNIL) {
     
     tablePtr.p->primaryTableId = tableDesc.PrimaryTableId;
@@ -6587,6 +6620,9 @@
 Dbdict::createIndex_slavePrepare(Signal* signal, OpCreateIndexPtr opPtr)
 {
   jam();
+  if (ERROR_INSERTED(6006) && ! opPtr.p->m_isMaster) {
+    ndbrequire(false);
+  }
 }
 
 void
@@ -6630,7 +6666,7 @@
   initialiseTableRecord(indexPtr);
   if (req->getIndexType() == DictTabInfo::UniqueHashIndex) {
     indexPtr.p->storedTable = opPtr.p->m_storedIndex;
-    indexPtr.p->fragmentType = tablePtr.p->fragmentType;
+    indexPtr.p->fragmentType = DictTabInfo::DistrKeyUniqueHashIndex;
   } else if (req->getIndexType() == DictTabInfo::OrderedIndex) {
     // first version will not supported logging
     if (opPtr.p->m_storedIndex) {
@@ -6640,8 +6676,7 @@
       return;
     }
     indexPtr.p->storedTable = false;
-    // follows table fragmentation
-    indexPtr.p->fragmentType = tablePtr.p->fragmentType;
+    indexPtr.p->fragmentType = DictTabInfo::DistrKeyOrderedIndex;
   } else {
     jam();
     opPtr.p->m_errorCode = CreateIndxRef::InvalidIndexType;
@@ -6765,7 +6800,7 @@
     w.add(DictTabInfo::AttributeKeyFlag, (Uint32)false);
     w.add(DictTabInfo::AttributeNullableFlag, (Uint32)false);
     w.add(DictTabInfo::AttributeExtType, (Uint32)DictTabInfo::ExtUnsigned);
-    w.add(DictTabInfo::AttributeExtLength, tablePtr.p->tupKeyLength);
+    w.add(DictTabInfo::AttributeExtLength, tablePtr.p->tupKeyLength+1);
     w.add(DictTabInfo::AttributeEnd, (Uint32)true);
   }
   if (indexPtr.p->isOrderedIndex()) {
@@ -6901,14 +6936,16 @@
   CreateIndxRef* rep = (CreateIndxRef*)signal->getDataPtrSend();
   Uint32 gsn = GSN_CREATE_INDX_CONF;
   Uint32 length = CreateIndxConf::InternalLength;
-  bool sendRef = opPtr.p->hasError();
+  bool sendRef;
   if (! toUser) {
+    sendRef = opPtr.p->hasLastError();
     rep->setUserRef(opPtr.p->m_coordinatorRef);
     rep->setConnectionPtr(opPtr.p->key);
     rep->setRequestType(opPtr.p->m_requestType);
     if (opPtr.p->m_requestType == CreateIndxReq::RT_DICT_ABORT)
       sendRef = false;
   } else {
+    sendRef = opPtr.p->hasError();
     rep->setUserRef(opPtr.p->m_request.getUserRef());
     rep->setConnectionPtr(opPtr.p->m_request.getConnectionPtr());
     rep->setRequestType(opPtr.p->m_request.getRequestType());
@@ -6977,11 +7014,8 @@
 	goto error;
       }
 
-      if (tmp.p->indexState == TableRecord::IS_DROPPING){
-	jam();
-	err = DropIndxRef::IndexNotFound;
-	goto error;
-      }
+      if (tmp.p->indexState != TableRecord::IS_ONLINE)
+        req->addRequestFlag(RequestFlag::RF_FORCE);
 
       tmp.p->indexState = TableRecord::IS_DROPPING;
 
@@ -7244,14 +7278,16 @@
   DropIndxRef* rep = (DropIndxRef*)signal->getDataPtrSend();
   Uint32 gsn = GSN_DROP_INDX_CONF;
   Uint32 length = DropIndxConf::InternalLength;
-  bool sendRef = opPtr.p->hasError();
+  bool sendRef;
   if (! toUser) {
+    sendRef = opPtr.p->hasLastError();
     rep->setUserRef(opPtr.p->m_coordinatorRef);
     rep->setConnectionPtr(opPtr.p->key);
     rep->setRequestType(opPtr.p->m_requestType);
     if (opPtr.p->m_requestType == DropIndxReq::RT_DICT_ABORT)
       sendRef = false;
   } else {
+    sendRef = opPtr.p->hasError();
     rep->setUserRef(opPtr.p->m_request.getUserRef());
     rep->setConnectionPtr(opPtr.p->m_request.getConnectionPtr());
     rep->setRequestType(opPtr.p->m_request.getRequestType());
@@ -9768,7 +9804,7 @@
 {
   jam();
   // mark created in local TC
-  if (! opPtr.p->hasError()) {
+  if (! opPtr.p->hasLastError()) {
     TableRecordPtr indexPtr;
     c_tableRecordPool.getPtr(indexPtr, opPtr.p->m_request.getIndexId());
     indexPtr.p->indexLocal |= TableRecord::IL_CREATED_TC;
@@ -9784,9 +9820,10 @@
   jam();
   TableRecordPtr indexPtr;
   c_tableRecordPool.getPtr(indexPtr, opPtr.p->m_request.getIndexId());
-  // broken index
+  // broken index allowed if force
   if (! (indexPtr.p->indexLocal & TableRecord::IL_CREATED_TC)) {
     jam();
+    ndbassert(opPtr.p->m_requestFlag & RequestFlag::RF_FORCE);
     alterIndex_sendReply(signal, opPtr, false);
     return;
   }
@@ -9808,8 +9845,8 @@
 {
   jam();
   ndbrequire(opPtr.p->m_requestType == AlterIndxReq::RT_DICT_TC);
-  if (! opPtr.p->hasError()) {
-    // mark dropped in local TC
+  // mark dropped locally
+  if (! opPtr.p->hasLastError()) {
     TableRecordPtr indexPtr;
     c_tableRecordPool.getPtr(indexPtr, opPtr.p->m_request.getIndexId());
     indexPtr.p->indexLocal &= ~TableRecord::IL_CREATED_TC;
@@ -9947,51 +9984,46 @@
   req->setUserRef(reference());
   req->setConnectionPtr(opPtr.p->key);
   req->setRequestType(DropTrigReq::RT_ALTER_INDEX);
+  req->addRequestFlag(opPtr.p->m_requestFlag);
   req->setTableId(opPtr.p->m_request.getTableId());
   req->setIndexId(opPtr.p->m_request.getIndexId());
   req->setTriggerInfo(0);       // not used
   opPtr.p->m_triggerCounter = 0;
-  // insert
-  if (indexPtr.p->insertTriggerId != RNIL) {
+  if (indexPtr.p->isHashIndex()) {
+    // insert
     req->setTriggerId(indexPtr.p->insertTriggerId);
     sendSignal(reference(), GSN_DROP_TRIG_REQ, 
         signal, DropTrigReq::SignalLength, JBB);
     opPtr.p->m_triggerCounter++;
-  }
-  // update
-  if (indexPtr.p->updateTriggerId != RNIL) {
+    // update
     req->setTriggerId(indexPtr.p->updateTriggerId);
     sendSignal(reference(), GSN_DROP_TRIG_REQ, 
         signal, DropTrigReq::SignalLength, JBB);
     opPtr.p->m_triggerCounter++;
-  }
-  // delete
-  if (indexPtr.p->deleteTriggerId != RNIL) {
+    // delete
     req->setTriggerId(indexPtr.p->deleteTriggerId);
     sendSignal(reference(), GSN_DROP_TRIG_REQ, 
         signal, DropTrigReq::SignalLength, JBB);
     opPtr.p->m_triggerCounter++;
+    // build
+    if (indexPtr.p->buildTriggerId != RNIL) {
+      req->setTriggerId(indexPtr.p->buildTriggerId);
+      sendSignal(reference(), GSN_DROP_TRIG_REQ, 
+          signal, DropTrigReq::SignalLength, JBB);
+      opPtr.p->m_triggerCounter++;
+    }
+    return;
   }
-  // custom
-  if (indexPtr.p->customTriggerId != RNIL) {
+  if (indexPtr.p->isOrderedIndex()) {
+    // custom
+    req->addRequestFlag(RequestFlag::RF_NOTCTRIGGER);
     req->setTriggerId(indexPtr.p->customTriggerId);
     sendSignal(reference(), GSN_DROP_TRIG_REQ, 
         signal, DropTrigReq::SignalLength, JBB);
     opPtr.p->m_triggerCounter++;
+    return;
   }
-  // build
-  if (indexPtr.p->buildTriggerId != RNIL) {
-    req->setTriggerId(indexPtr.p->buildTriggerId);
-    sendSignal(reference(), GSN_DROP_TRIG_REQ, 
-        signal, DropTrigReq::SignalLength, JBB);
-    opPtr.p->m_triggerCounter++;
-  }
-  if (opPtr.p->m_triggerCounter == 0) {
-    // drop in each TC
-    jam();
-    opPtr.p->m_requestType = AlterIndxReq::RT_DICT_TC;
-    alterIndex_sendSlaveReq(signal, opPtr);
-  }
+  ndbrequire(false);
 }
 
 void
@@ -10109,14 +10141,16 @@
   AlterIndxRef* rep = (AlterIndxRef*)signal->getDataPtrSend();
   Uint32 gsn = GSN_ALTER_INDX_CONF;
   Uint32 length = AlterIndxConf::InternalLength;
-  bool sendRef = opPtr.p->hasError();
+  bool sendRef;
   if (! toUser) {
+    sendRef = opPtr.p->hasLastError();
     rep->setUserRef(opPtr.p->m_coordinatorRef);
     rep->setConnectionPtr(opPtr.p->key);
     rep->setRequestType(opPtr.p->m_requestType);
     if (opPtr.p->m_requestType == AlterIndxReq::RT_DICT_ABORT)
       sendRef = false;
   } else {
+    sendRef = opPtr.p->hasError();
     rep->setUserRef(opPtr.p->m_request.getUserRef());
     rep->setConnectionPtr(opPtr.p->m_request.getConnectionPtr());
     rep->setRequestType(opPtr.p->m_request.getRequestType());
@@ -10529,8 +10563,10 @@
   req->setUserRef(reference());
   req->setConnectionPtr(opPtr.p->key);
   if (opPtr.p->m_requestType == BuildIndxReq::RT_DICT_TC) {
+    jam();
     req->setRequestType(AlterIndxReq::RT_TC);
   } else if (opPtr.p->m_requestType == BuildIndxReq::RT_DICT_TUX) {
+    jam();
     req->setRequestType(AlterIndxReq::RT_TUX);
   } else {
     ndbrequire(false);
@@ -10541,8 +10577,10 @@
   req->setOnline(true);
   BlockReference blockRef = 0;
   if (opPtr.p->m_requestType == BuildIndxReq::RT_DICT_TC) {
+    jam();
     blockRef = calcTcBlockRef(getOwnNodeId());
   } else if (opPtr.p->m_requestType == BuildIndxReq::RT_DICT_TUX) {
+    jam();
     blockRef = calcTuxBlockRef(getOwnNodeId());
   } else {
     ndbrequire(false);
@@ -10569,15 +10607,14 @@
   req->setConnectionPtr(opPtr.p->key);
   req->setRequestType(opPtr.p->m_requestType);
   req->addRequestFlag(opPtr.p->m_requestFlag);
-  if(opPtr.p->m_requestFlag & RequestFlag::RF_LOCAL)
-  {
+  if(opPtr.p->m_requestFlag & RequestFlag::RF_LOCAL) {
+    jam();
     opPtr.p->m_signalCounter.clearWaitingFor();
     opPtr.p->m_signalCounter.setWaitingFor(getOwnNodeId());
     sendSignal(reference(), GSN_BUILDINDXREQ,
 	       signal, BuildIndxReq::SignalLength, JBB);
-  }
-  else
-  {
+  } else {
+    jam();
     opPtr.p->m_signalCounter = c_aliveNodes;
     NodeReceiverGroup rg(DBDICT, c_aliveNodes);
     sendSignal(rg, GSN_BUILDINDXREQ,
@@ -10592,14 +10629,16 @@
   BuildIndxRef* rep = (BuildIndxRef*)signal->getDataPtrSend();
   Uint32 gsn = GSN_BUILDINDXCONF;
   Uint32 length = BuildIndxConf::InternalLength;
-  bool sendRef = opPtr.p->hasError();
+  bool sendRef;
   if (! toUser) {
+    sendRef = opPtr.p->hasLastError();
     rep->setUserRef(opPtr.p->m_coordinatorRef);
     rep->setConnectionPtr(opPtr.p->key);
     rep->setRequestType(opPtr.p->m_requestType);
     if (opPtr.p->m_requestType == BuildIndxReq::RT_DICT_ABORT)
       sendRef = false;
   } else {
+    sendRef = opPtr.p->hasError();
     rep->setUserRef(opPtr.p->m_request.getUserRef());
     rep->setConnectionPtr(opPtr.p->m_request.getConnectionPtr());
     rep->setRequestType(opPtr.p->m_request.getRequestType());
@@ -11086,14 +11125,16 @@
   CreateTrigRef* rep = (CreateTrigRef*)signal->getDataPtrSend();
   Uint32 gsn = GSN_CREATE_TRIG_CONF;
   Uint32 length = CreateTrigConf::InternalLength;
-  bool sendRef = opPtr.p->hasError();
+  bool sendRef;
   if (! toUser) {
+    sendRef = opPtr.p->hasLastError();
     rep->setUserRef(opPtr.p->m_coordinatorRef);
     rep->setConnectionPtr(opPtr.p->key);
     rep->setRequestType(opPtr.p->m_requestType);
     if (opPtr.p->m_requestType == CreateTrigReq::RT_DICT_ABORT)
       sendRef = false;
   } else {
+    sendRef = opPtr.p->hasError();
     rep->setUserRef(opPtr.p->m_request.getUserRef());
     rep->setConnectionPtr(opPtr.p->m_request.getConnectionPtr());
     rep->setRequestType(opPtr.p->m_request.getRequestType());
@@ -11181,8 +11222,10 @@
 	OpDropTrigger opBad;
 	opPtr.p = &opBad;
 	opPtr.p->save(req);
-	opPtr.p->m_errorCode = DropTrigRef::TriggerNotFound;
-	opPtr.p->m_errorLine = __LINE__;
+        if (! (req->getRequestFlag() & RequestFlag::RF_FORCE)) {
+          opPtr.p->m_errorCode = DropTrigRef::TriggerNotFound;
+          opPtr.p->m_errorLine = __LINE__;
+        }
 	dropTrigger_sendReply(signal,  opPtr, true);
 	return;
       }
@@ -11349,6 +11392,7 @@
   req->setUserRef(reference());
   req->setConnectionPtr(opPtr.p->key);
   req->setRequestType(AlterTrigReq::RT_DROP_TRIGGER);
+  req->addRequestFlag(opPtr.p->m_requestFlag);
   req->setTableId(opPtr.p->m_request.getTableId());
   req->setTriggerId(opPtr.p->m_request.getTriggerId());
   req->setTriggerInfo(0);       // not used
@@ -11444,14 +11488,16 @@
   DropTrigRef* rep = (DropTrigRef*)signal->getDataPtrSend();
   Uint32 gsn = GSN_DROP_TRIG_CONF;
   Uint32 length = DropTrigConf::InternalLength;
-  bool sendRef = opPtr.p->hasError();
+  bool sendRef;
   if (! toUser) {
+    sendRef = opPtr.p->hasLastError();
     rep->setUserRef(opPtr.p->m_coordinatorRef);
     rep->setConnectionPtr(opPtr.p->key);
     rep->setRequestType(opPtr.p->m_requestType);
     if (opPtr.p->m_requestType == DropTrigReq::RT_DICT_ABORT)
       sendRef = false;
   } else {
+    sendRef = opPtr.p->hasError();
     rep->setUserRef(opPtr.p->m_request.getUserRef());
     rep->setConnectionPtr(opPtr.p->m_request.getConnectionPtr());
     rep->setRequestType(opPtr.p->m_request.getRequestType());
@@ -11675,28 +11721,37 @@
   if (! (opPtr.p->m_request.getRequestFlag() & RequestFlag::RF_NOTCTRIGGER)) {
     if (requestType == AlterTrigReq::RT_DICT_PREPARE) {
       jam();
-      if (opPtr.p->m_request.getOnline())
+      if (opPtr.p->m_request.getOnline()) {
+        jam();
         opPtr.p->m_requestType = AlterTrigReq::RT_DICT_TC;
-      else
+      } else {
+        jam();
         opPtr.p->m_requestType = AlterTrigReq::RT_DICT_LQH;
+      }
       alterTrigger_sendSlaveReq(signal, opPtr);
       return;
     }
     if (requestType == AlterTrigReq::RT_DICT_TC) {
       jam();
-      if (opPtr.p->m_request.getOnline())
+      if (opPtr.p->m_request.getOnline()) {
+        jam();
         opPtr.p->m_requestType = AlterTrigReq::RT_DICT_LQH;
-      else
+      } else {
+        jam();
         opPtr.p->m_requestType = AlterTrigReq::RT_DICT_COMMIT;
+      }
       alterTrigger_sendSlaveReq(signal, opPtr);
       return;
     }
     if (requestType == AlterTrigReq::RT_DICT_LQH) {
       jam();
-      if (opPtr.p->m_request.getOnline())
+      if (opPtr.p->m_request.getOnline()) {
+        jam();
         opPtr.p->m_requestType = AlterTrigReq::RT_DICT_COMMIT;
-      else
+      } else {
+        jam();
         opPtr.p->m_requestType = AlterTrigReq::RT_DICT_TC;
+      }
       alterTrigger_sendSlaveReq(signal, opPtr);
       return;
     }
@@ -11756,8 +11811,10 @@
   req->setUserRef(reference());
   req->setConnectionPtr(opPtr.p->key);
   if (opPtr.p->m_requestType == AlterTrigReq::RT_DICT_TC) {
+    jam();
     req->setRequestType(CreateTrigReq::RT_TC);
   } else if (opPtr.p->m_requestType == AlterTrigReq::RT_DICT_LQH) {
+    jam();
     req->setRequestType(CreateTrigReq::RT_LQH);
   } else {
     ndbassert(false);
@@ -11774,8 +11831,10 @@
   req->setReceiverRef(opPtr.p->m_request.getReceiverRef());
   BlockReference blockRef = 0;
   if (opPtr.p->m_requestType == AlterTrigReq::RT_DICT_TC) {
+    jam();
     blockRef = calcTcBlockRef(getOwnNodeId());
   } else if (opPtr.p->m_requestType == AlterTrigReq::RT_DICT_LQH) {
+    jam();
     blockRef = calcLqhBlockRef(getOwnNodeId());
   } else {
     ndbassert(false);
@@ -11789,13 +11848,15 @@
 Dbdict::alterTrigger_fromCreateLocal(Signal* signal, OpAlterTriggerPtr opPtr)
 {
   jam();
-  if (! opPtr.p->hasError()) {
+  if (! opPtr.p->hasLastError()) {
     // mark created locally
     TriggerRecordPtr triggerPtr;
     c_triggerRecordPool.getPtr(triggerPtr, opPtr.p->m_request.getTriggerId());
     if (opPtr.p->m_requestType == AlterTrigReq::RT_DICT_TC) {
+      jam();
       triggerPtr.p->triggerLocal |= TriggerRecord::TL_CREATED_TC;
     } else if (opPtr.p->m_requestType == AlterTrigReq::RT_DICT_LQH) {
+      jam();
       triggerPtr.p->triggerLocal |= TriggerRecord::TL_CREATED_LQH;
     } else {
       ndbrequire(false);
@@ -11815,17 +11876,21 @@
   req->setUserRef(reference());
   req->setConnectionPtr(opPtr.p->key);
   if (opPtr.p->m_requestType == AlterTrigReq::RT_DICT_TC) {
-    // broken trigger
+    jam();
+    // broken trigger allowed if force
     if (! (triggerPtr.p->triggerLocal & TriggerRecord::TL_CREATED_TC)) {
       jam();
+      ndbassert(opPtr.p->m_requestFlag & RequestFlag::RF_FORCE);
       alterTrigger_sendReply(signal, opPtr, false);
       return;
     }
     req->setRequestType(DropTrigReq::RT_TC);
   } else if (opPtr.p->m_requestType == AlterTrigReq::RT_DICT_LQH) {
-    // broken trigger
+    jam();
+    // broken trigger allowed if force
     if (! (triggerPtr.p->triggerLocal & TriggerRecord::TL_CREATED_LQH)) {
       jam();
+      ndbassert(opPtr.p->m_requestFlag & RequestFlag::RF_FORCE);
       alterTrigger_sendReply(signal, opPtr, false);
       return;
     }
@@ -11843,8 +11908,10 @@
   req->setMonitorAllAttributes(triggerPtr.p->monitorAllAttributes);
   BlockReference blockRef = 0;
   if (opPtr.p->m_requestType == AlterTrigReq::RT_DICT_TC) {
+    jam();
     blockRef = calcTcBlockRef(getOwnNodeId());
   } else if (opPtr.p->m_requestType == AlterTrigReq::RT_DICT_LQH) {
+    jam();
     blockRef = calcLqhBlockRef(getOwnNodeId());
   } else {
     ndbassert(false);
@@ -11857,13 +11924,15 @@
 Dbdict::alterTrigger_fromDropLocal(Signal* signal, OpAlterTriggerPtr opPtr)
 {
   jam();
-  if (! opPtr.p->hasError()) {
+  if (! opPtr.p->hasLastError()) {
     // mark dropped locally
     TriggerRecordPtr triggerPtr;
     c_triggerRecordPool.getPtr(triggerPtr, opPtr.p->m_request.getTriggerId());
     if (opPtr.p->m_requestType == AlterTrigReq::RT_DICT_TC) {
+      jam();
       triggerPtr.p->triggerLocal &= ~TriggerRecord::TL_CREATED_TC;
     } else if (opPtr.p->m_requestType == AlterTrigReq::RT_DICT_LQH) {
+      jam();
       triggerPtr.p->triggerLocal &= ~TriggerRecord::TL_CREATED_LQH;
     } else {
       ndbrequire(false);
@@ -11920,8 +11989,9 @@
   AlterTrigRef* rep = (AlterTrigRef*)signal->getDataPtrSend();
   Uint32 gsn = GSN_ALTER_TRIG_CONF;
   Uint32 length = AlterTrigConf::InternalLength;
-  bool sendRef = opPtr.p->hasError();
+  bool sendRef;
   if (! toUser) {
+    sendRef = opPtr.p->hasLastError();
     rep->setUserRef(opPtr.p->m_coordinatorRef);
     rep->setConnectionPtr(opPtr.p->key);
     rep->setRequestType(opPtr.p->m_requestType);
@@ -11932,6 +12002,7 @@
       jam();
     }
   } else {
+    sendRef = opPtr.p->hasError();
     jam();
     rep->setUserRef(opPtr.p->m_request.getUserRef());
     rep->setConnectionPtr(opPtr.p->m_request.getConnectionPtr());
@@ -11960,11 +12031,19 @@
  * MODULE: Support routines for index and trigger.
  */
 
+/*
+  This routine is used to set-up the primary key attributes of the unique
+  hash index. Since we store fragment id as part of the primary key here
+  we insert the pseudo column for getting fragment id first in the array.
+  This routine is used as part of the building of the index.
+*/
+
 void
 Dbdict::getTableKeyList(TableRecordPtr tablePtr, AttributeList& list)
 {
   jam();
   list.sz = 0;
+  list.id[list.sz++] = AttributeHeader::FRAGMENT;
   for (Uint32 tAttr = tablePtr.p->firstAttribute; tAttr != RNIL; ) {
     AttributeRecord* aRec = c_attributeRecordPool.getPtr(tAttr);
     if (aRec->tupleKey)
Thread
bk commit into 5.1 tree (joreland:1.1863)jonas.oreland21 Jul