List:Internals« Previous MessageNext Message »
From:pekka Date:July 19 2005 4:01am
Subject:bk commit into 5.0 tree (pekka:1.1953) BUG#11355
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of pekka. When pekka 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.1953 05/07/19 04:01:46 pekka@stripped +5 -0
  ndb - bug#11355 some fixes to index drop etc

  ndb/src/kernel/blocks/dbtup/DbtupTrigger.cpp
    1.8 05/07/19 03:59:56 pekka@stripped +4 -0
    fix some bugs in protocols drop index etc

  ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
    1.79 05/07/19 03:59:55 pekka@stripped +8 -2
    fix some bugs in protocols drop index etc

  ndb/src/kernel/blocks/dbdict/Dbdict.hpp
    1.12 05/07/19 03:59:55 pekka@stripped +230 -99
    fix some bugs in protocols drop index etc

  ndb/src/kernel/blocks/dbdict/Dbdict.cpp
    1.46 05/07/19 03:59:55 pekka@stripped +92 -56
    fix some bugs in protocols drop index etc

  ndb/src/kernel/blocks/ERROR_codes.txt
    1.11 05/07/19 03:59:55 pekka@stripped +3 -2
    fix some bugs in protocols drop index etc

# 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:	pekka
# Host:	clam.ndb.mysql.com
# Root:	/export/space/pekka/ndb/version/my50-ndb

--- 1.10/ndb/src/kernel/blocks/ERROR_codes.txt	2005-04-23 18:41:32 +02:00
+++ 1.11/ndb/src/kernel/blocks/ERROR_codes.txt	2005-07-19 03:59:55 +02:00
@@ -408,10 +408,11 @@
 4001: Crash on REL_TABMEMREQ in TUP
 4002: Crash on DROP_TABFILEREQ in TUP
 4003: Fail next trigger create in TUP
+4004: Fail next trigger drop in TUP
 8033: Fail next trigger create in TC
 8034: Fail next index create in TC
-
-
+8035: Fail next trigger drop in TC
+8036: Fail next index drop in TC
 
 System Restart:
 ---------------

--- 1.45/ndb/src/kernel/blocks/dbdict/Dbdict.cpp	2005-05-15 18:08:38 +02:00
+++ 1.46/ndb/src/kernel/blocks/dbdict/Dbdict.cpp	2005-07-19 03:59:55 +02:00
@@ -6781,14 +6781,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());
@@ -6857,11 +6859,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;
 
@@ -7124,14 +7123,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());
@@ -9648,7 +9649,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;
@@ -9664,9 +9665,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();
+    ndbrequire(opPtr.p->m_requestFlag & RequestFlag::RF_FORCE);
     alterIndex_sendReply(signal, opPtr, false);
     return;
   }
@@ -9688,8 +9690,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;
@@ -9827,51 +9829,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
@@ -9989,14 +9986,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());
@@ -10409,8 +10408,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);
@@ -10421,8 +10422,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);
@@ -10449,15 +10452,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,
@@ -10472,14 +10474,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());
@@ -10965,14 +10969,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());
@@ -11060,8 +11066,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;
       }
@@ -11228,6 +11236,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
@@ -11323,14 +11332,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());
@@ -11554,28 +11565,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;
     }
@@ -11630,8 +11650,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);
@@ -11648,8 +11670,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);
@@ -11663,13 +11687,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);
@@ -11689,17 +11715,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();
+      ndbrequire(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();
+      ndbrequire(opPtr.p->m_requestFlag & RequestFlag::RF_FORCE);
       alterTrigger_sendReply(signal, opPtr, false);
       return;
     }
@@ -11717,8 +11747,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);
@@ -11731,13 +11763,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);
@@ -11794,8 +11828,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);
@@ -11806,6 +11841,7 @@
       jam();
     }
   } else {
+    sendRef = opPtr.p->hasError();
     jam();
     rep->setUserRef(opPtr.p->m_request.getUserRef());
     rep->setConnectionPtr(opPtr.p->m_request.getConnectionPtr());

--- 1.11/ndb/src/kernel/blocks/dbdict/Dbdict.hpp	2005-05-15 18:08:38 +02:00
+++ 1.12/ndb/src/kernel/blocks/dbdict/Dbdict.hpp	2005-07-19 03:59:55 +02:00
@@ -953,7 +953,8 @@
     enum {
       RF_LOCAL = 1 << 0,        // create on local node only
       RF_NOBUILD = 1 << 1,      // no need to build index
-      RF_NOTCTRIGGER = 1 << 2   // alter trigger: no trigger in TC
+      RF_NOTCTRIGGER = 1 << 2,  // alter trigger: no trigger in TC
+      RF_FORCE = 1 << 4         // force drop
     };
   };
 
@@ -973,6 +974,7 @@
     CreateIndxReq::RequestType m_requestType;
     Uint32 m_requestFlag;
     // error info
+    CreateIndxRef::ErrorCode m_lastError;
     CreateIndxRef::ErrorCode m_errorCode;
     Uint32 m_errorLine;
     Uint32 m_errorNode;
@@ -984,6 +986,7 @@
       m_coordinatorRef = 0;
       m_requestType = CreateIndxReq::RT_UNDEFINED;
       m_requestFlag = 0;
+      m_lastError = CreateIndxRef::NoError;
       m_errorCode = CreateIndxRef::NoError;
       m_errorLine = 0;
       m_errorNode = 0;
@@ -993,34 +996,49 @@
       m_requestType = req->getRequestType();
       m_requestFlag = req->getRequestFlag();
     }
+    bool hasLastError() {
+      return m_lastError != CreateIndxRef::NoError;
+    }
     bool hasError() {
       return m_errorCode != CreateIndxRef::NoError;
     }
     void setError(const CreateIndxRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = CreateIndxRef::NoError;
+      if (ref != 0) {
+        m_lastError = ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
     void setError(const CreateTableRef* ref) {
-      if (ref != 0 && ! hasError()) {
+      m_lastError = CreateIndxRef::NoError;
+      if (ref != 0) {
         switch (ref->getErrorCode()) {
         case CreateTableRef::TableAlreadyExist:
-          m_errorCode = CreateIndxRef::IndexExists;
+          m_lastError = CreateIndxRef::IndexExists;
           break;
         default:
-          m_errorCode = (CreateIndxRef::ErrorCode)ref->getErrorCode();
+          m_lastError = (CreateIndxRef::ErrorCode)ref->getErrorCode();
           break;
         }
-        m_errorLine = ref->getErrorLine();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+        }
       }
     }
     void setError(const AlterIndxRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = (CreateIndxRef::ErrorCode)ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = CreateIndxRef::NoError;
+      if (ref != 0) {
+        m_lastError = (CreateIndxRef::ErrorCode)ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
   };
@@ -1039,6 +1057,7 @@
     DropIndxReq::RequestType m_requestType;
     Uint32 m_requestFlag;
     // error info
+    DropIndxRef::ErrorCode m_lastError;
     DropIndxRef::ErrorCode m_errorCode;
     Uint32 m_errorLine;
     Uint32 m_errorNode;
@@ -1050,6 +1069,7 @@
       m_coordinatorRef = 0;
       m_requestType = DropIndxReq::RT_UNDEFINED;
       m_requestFlag = 0;
+      m_lastError = DropIndxRef::NoError;
       m_errorCode = DropIndxRef::NoError;
       m_errorLine = 0;
       m_errorNode = 0;
@@ -1059,44 +1079,59 @@
       m_requestType = req->getRequestType();
       m_requestFlag = req->getRequestFlag();
     }
+    bool hasLastError() {
+      return m_lastError != DropIndxRef::NoError;
+    }
     bool hasError() {
       return m_errorCode != DropIndxRef::NoError;
     }
     void setError(const DropIndxRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = DropIndxRef::NoError;
+      if (ref != 0) {
+        m_lastError = ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = ref->getErrorCode();
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
     void setError(const AlterIndxRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = (DropIndxRef::ErrorCode)ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = DropIndxRef::NoError;
+      if (ref != 0) {
+        m_lastError = (DropIndxRef::ErrorCode)ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
     void setError(const DropTableRef* ref) {
-      if (ref != 0 && ! hasError()) {
-	switch(ref->errorCode) {
-	case(DropTableRef::Busy):
-	  m_errorCode = DropIndxRef::Busy;
+      m_lastError = DropIndxRef::NoError;
+      if (ref != 0) {
+	switch (ref->errorCode) {
+	case DropTableRef::Busy:
+	  m_lastError = DropIndxRef::Busy;
 	  break;
-	case(DropTableRef::NoSuchTable):
-	  m_errorCode = DropIndxRef::IndexNotFound;
+	case DropTableRef::NoSuchTable:
+	  m_lastError = DropIndxRef::IndexNotFound;
 	  break;
-	case(DropTableRef::DropInProgress):
-	  m_errorCode = DropIndxRef::Busy;
+	case DropTableRef::DropInProgress:
+	  m_lastError = DropIndxRef::Busy;
 	  break;
-	case(DropTableRef::NoDropTableRecordAvailable):
-	  m_errorCode = DropIndxRef::Busy;
+	case DropTableRef::NoDropTableRecordAvailable:
+	  m_lastError = DropIndxRef::Busy;
 	  break;
 	default:
-	  m_errorCode = (DropIndxRef::ErrorCode)ref->errorCode;
+	  m_lastError = (DropIndxRef::ErrorCode)ref->errorCode;
 	  break;
 	}
-        //m_errorLine = ref->getErrorLine();
-        //m_errorNode = ref->getErrorNode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = 0;
+          m_errorNode = 0;
+        }
       }
     }
   };
@@ -1117,6 +1152,7 @@
     AlterIndxReq::RequestType m_requestType;
     Uint32 m_requestFlag;
     // error info
+    AlterIndxRef::ErrorCode m_lastError;
     AlterIndxRef::ErrorCode m_errorCode;
     Uint32 m_errorLine;
     Uint32 m_errorNode;
@@ -1129,6 +1165,7 @@
       m_coordinatorRef = 0;
       m_requestType = AlterIndxReq::RT_UNDEFINED;
       m_requestFlag = 0;
+      m_lastError = AlterIndxRef::NoError;
       m_errorCode = AlterIndxRef::NoError;
       m_errorLine = 0;
       m_errorNode = 0;
@@ -1139,47 +1176,76 @@
       m_requestType = req->getRequestType();
       m_requestFlag = req->getRequestFlag();
     }
+    bool hasLastError() {
+      return m_lastError != AlterIndxRef::NoError;
+    }
     bool hasError() {
       return m_errorCode != AlterIndxRef::NoError;
     }
     void setError(const AlterIndxRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = AlterIndxRef::NoError;
+      if (ref != 0) {
+        m_lastError = ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
     void setError(const CreateIndxRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = (AlterIndxRef::ErrorCode)ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = AlterIndxRef::NoError;
+      if (ref != 0) {
+        m_lastError = (AlterIndxRef::ErrorCode)ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
     void setError(const DropIndxRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = (AlterIndxRef::ErrorCode)ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = AlterIndxRef::NoError;
+      if (ref != 0) {
+        m_lastError = (AlterIndxRef::ErrorCode)ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
     void setError(const BuildIndxRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = (AlterIndxRef::ErrorCode)ref->getErrorCode();
+      m_lastError = AlterIndxRef::NoError;
+      if (ref != 0) {
+        m_lastError = (AlterIndxRef::ErrorCode)ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = 0;
+          m_errorNode = 0;
+        }
       }
     }
     void setError(const CreateTrigRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = (AlterIndxRef::ErrorCode)ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = AlterIndxRef::NoError;
+      if (ref != 0) {
+        m_lastError = (AlterIndxRef::ErrorCode)ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
     void setError(const DropTrigRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = (AlterIndxRef::ErrorCode)ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = AlterIndxRef::NoError;
+      if (ref != 0) {
+        m_lastError = (AlterIndxRef::ErrorCode)ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
   };
@@ -1201,6 +1267,7 @@
     Uint32 m_requestFlag;
     Uint32 m_constrTriggerId;
     // error info
+    BuildIndxRef::ErrorCode m_lastError;
     BuildIndxRef::ErrorCode m_errorCode;
     Uint32 m_errorLine;
     Uint32 m_errorNode;
@@ -1212,7 +1279,7 @@
       m_coordinatorRef = 0;
       m_requestType = BuildIndxReq::RT_UNDEFINED;
       m_requestFlag = 0;
-//      Uint32 m_constrTriggerId = RNIL;
+      m_lastError = BuildIndxRef::NoError;
       m_errorCode = BuildIndxRef::NoError;
       m_errorLine = 0;
       m_errorNode = 0;
@@ -1222,33 +1289,54 @@
       m_requestType = req->getRequestType();
       m_requestFlag = req->getRequestFlag();
     }
+    bool hasLastError() {
+      return m_lastError != BuildIndxRef::NoError;
+    }
     bool hasError() {
       return m_errorCode != BuildIndxRef::NoError;
     }
     void setError(const BuildIndxRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = ref->getErrorCode();
+      m_lastError = BuildIndxRef::NoError;
+      if (ref != 0) {
+        m_lastError = ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = 0;
+          m_errorNode = 0;
+        }
       }
     }
     void setError(const AlterIndxRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = (BuildIndxRef::ErrorCode)ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = BuildIndxRef::NoError;
+      if (ref != 0) {
+        m_lastError = (BuildIndxRef::ErrorCode)ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
     void setError(const CreateTrigRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = (BuildIndxRef::ErrorCode)ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = BuildIndxRef::NoError;
+      if (ref != 0) {
+        m_lastError = (BuildIndxRef::ErrorCode)ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
     void setError(const DropTrigRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = (BuildIndxRef::ErrorCode)ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = BuildIndxRef::NoError;
+      if (ref != 0) {
+        m_lastError = (BuildIndxRef::ErrorCode)ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
   };
@@ -1381,6 +1469,7 @@
     CreateTrigReq::RequestType m_requestType;
     Uint32 m_requestFlag;
     // error info
+    CreateTrigRef::ErrorCode m_lastError;
     CreateTrigRef::ErrorCode m_errorCode;
     Uint32 m_errorLine;
     Uint32 m_errorNode;
@@ -1392,6 +1481,7 @@
       m_coordinatorRef = 0;
       m_requestType = CreateTrigReq::RT_UNDEFINED;
       m_requestFlag = 0;
+      m_lastError = CreateTrigRef::NoError;
       m_errorCode = CreateTrigRef::NoError;
       m_errorLine = 0;
       m_errorNode = 0;
@@ -1401,21 +1491,32 @@
       m_requestType = req->getRequestType();
       m_requestFlag = req->getRequestFlag();
     }
+    bool hasLastError() {
+      return m_lastError != CreateTrigRef::NoError;
+    }
     bool hasError() {
       return m_errorCode != CreateTrigRef::NoError;
     }
     void setError(const CreateTrigRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = CreateTrigRef::NoError;
+      if (ref != 0) {
+        m_lastError = ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
     void setError(const AlterTrigRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = (CreateTrigRef::ErrorCode)ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = CreateTrigRef::NoError;
+      if (ref != 0) {
+        m_lastError = (CreateTrigRef::ErrorCode)ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
   };
@@ -1434,6 +1535,7 @@
     DropTrigReq::RequestType m_requestType;
     Uint32 m_requestFlag;
     // error info
+    DropTrigRef::ErrorCode m_lastError;
     DropTrigRef::ErrorCode m_errorCode;
     Uint32 m_errorLine;
     Uint32 m_errorNode;
@@ -1445,6 +1547,7 @@
       m_coordinatorRef = 0;
       m_requestType = DropTrigReq::RT_UNDEFINED;
       m_requestFlag = 0;
+      m_lastError = DropTrigRef::NoError;
       m_errorCode = DropTrigRef::NoError;
       m_errorLine = 0;
       m_errorNode = 0;
@@ -1454,21 +1557,32 @@
       m_requestType = req->getRequestType();
       m_requestFlag = req->getRequestFlag();
     }
+    bool hasLastError() {
+      return m_lastError != DropTrigRef::NoError;
+    }
     bool hasError() {
       return m_errorCode != DropTrigRef::NoError;
     }
     void setError(const DropTrigRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = DropTrigRef::NoError;
+      if (ref != 0) {
+        m_lastError = ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
     void setError(const AlterTrigRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = (DropTrigRef::ErrorCode)ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = DropTrigRef::NoError;
+      if (ref != 0) {
+        m_lastError = (DropTrigRef::ErrorCode)ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
   };
@@ -1489,6 +1603,7 @@
     AlterTrigReq::RequestType m_requestType;
     Uint32 m_requestFlag;
     // error info
+    AlterTrigRef::ErrorCode m_lastError;
     AlterTrigRef::ErrorCode m_errorCode;
     Uint32 m_errorLine;
     Uint32 m_errorNode;
@@ -1500,6 +1615,7 @@
       m_coordinatorRef = 0;
       m_requestType = AlterTrigReq::RT_UNDEFINED;
       m_requestFlag = 0;
+      m_lastError = AlterTrigRef::NoError;
       m_errorCode = AlterTrigRef::NoError;
       m_errorLine = 0;
       m_errorNode = 0;
@@ -1509,28 +1625,43 @@
       m_requestType = req->getRequestType();
       m_requestFlag = req->getRequestFlag();
     }
+    bool hasLastError() {
+      return m_lastError != AlterTrigRef::NoError;
+    }
     bool hasError() {
       return m_errorCode != AlterTrigRef::NoError;
     }
     void setError(const AlterTrigRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = (AlterTrigRef::ErrorCode)ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = AlterTrigRef::NoError;
+      if (ref != 0) {
+        m_lastError = (AlterTrigRef::ErrorCode)ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
     void setError(const CreateTrigRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = (AlterTrigRef::ErrorCode)ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = AlterTrigRef::NoError;
+      if (ref != 0) {
+        m_lastError = (AlterTrigRef::ErrorCode)ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
     void setError(const DropTrigRef* ref) {
-      if (ref != 0 && ! hasError()) {
-        m_errorCode = (AlterTrigRef::ErrorCode)ref->getErrorCode();
-        m_errorLine = ref->getErrorLine();
-        m_errorNode = ref->getErrorNode();
+      m_lastError = AlterTrigRef::NoError;
+      if (ref != 0) {
+        m_lastError = (AlterTrigRef::ErrorCode)ref->getErrorCode();
+        if (! hasError()) {
+          m_errorCode = m_lastError;
+          m_errorLine = ref->getErrorLine();
+          m_errorNode = ref->getErrorNode();
+        }
       }
     }
   };

--- 1.78/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp	2005-06-30 12:20:45 +02:00
+++ 1.79/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp	2005-07-19 03:59:55 +02:00
@@ -11043,6 +11043,7 @@
   if (ERROR_INSERTED(8033) ||
       !c_theDefinedTriggers.seizeId(triggerPtr, 
 				    createTrigReq->getTriggerId())) {
+    jam();
     CLEAR_ERROR_INSERT_VALUE;
     // Failed to allocate trigger record
     CreateTrigRef * const createTrigRef =  
@@ -11077,8 +11078,10 @@
   DropTrigReq * const dropTrigReq =  (DropTrigReq *)&signal->theData[0];
   BlockReference sender = signal->senderBlockRef();
 
-  if ((c_theDefinedTriggers.getPtr(dropTrigReq->getTriggerId())) == NULL) {
+  if (ERROR_INSERTED(8035) ||
+      (c_theDefinedTriggers.getPtr(dropTrigReq->getTriggerId())) == NULL) {
     jam();
+    CLEAR_ERROR_INSERT_VALUE;
     // Failed to find find trigger record
     DropTrigRef * const dropTrigRef =  (DropTrigRef *)&signal->theData[0];
 
@@ -11110,6 +11113,7 @@
   
   if (ERROR_INSERTED(8034) ||
       !c_theIndexes.seizeId(indexPtr, createIndxReq->getIndexId())) {
+    jam();
     CLEAR_ERROR_INSERT_VALUE;
     // Failed to allocate index record
      CreateIndxRef * const createIndxRef =  
@@ -11321,8 +11325,10 @@
   TcIndexData* indexData;
   BlockReference sender = signal->senderBlockRef();
   
-  if ((indexData = c_theIndexes.getPtr(dropIndxReq->getIndexId())) == NULL) {
+  if (ERROR_INSERTED(8036) ||
+      (indexData = c_theIndexes.getPtr(dropIndxReq->getIndexId())) == NULL) {
     jam();
+    CLEAR_ERROR_INSERT_VALUE;
     // Failed to find index record
     DropIndxRef * const dropIndxRef =  
       (DropIndxRef *)signal->getDataPtrSend();

--- 1.7/ndb/src/kernel/blocks/dbtup/DbtupTrigger.cpp	2005-04-23 17:35:43 +02:00
+++ 1.8/ndb/src/kernel/blocks/dbtup/DbtupTrigger.cpp	2005-07-19 03:59:56 +02:00
@@ -305,6 +305,10 @@
 Uint32
 Dbtup::dropTrigger(Tablerec* table, const DropTrigReq* req)
 {
+  if (ERROR_INSERTED(4004)) {
+    CLEAR_ERROR_INSERT_VALUE;
+    return 9999;
+  }
   Uint32 triggerId = req->getTriggerId();
 
   TriggerType::Value ttype = req->getTriggerType();
Thread
bk commit into 5.0 tree (pekka:1.1953) BUG#11355pekka19 Jul