Commit e051994b authored by mskold/marty@quadfish.(none)'s avatar mskold/marty@quadfish.(none)

Merge mysql.com:/home/marty/MySQL/mysql-5.0-ndb

into  mysql.com:/home/marty/MySQL/mysql-5.1-new-ndb
parents 42cfaa61 fc6f839b
...@@ -588,6 +588,25 @@ int ha_ndbcluster::ndb_err(NdbTransaction *trans) ...@@ -588,6 +588,25 @@ int ha_ndbcluster::ndb_err(NdbTransaction *trans)
err.code, res)); err.code, res));
if (res == HA_ERR_FOUND_DUPP_KEY) if (res == HA_ERR_FOUND_DUPP_KEY)
{ {
uint error_data= (uint) err.details;
uint dupkey= MAX_KEY;
for (uint i= 0; i < MAX_KEY; i++)
{
if (m_index[i].type == UNIQUE_INDEX ||
m_index[i].type == UNIQUE_ORDERED_INDEX)
{
const NDBINDEX *unique_index=
(const NDBINDEX *) m_index[i].unique_index;
if (unique_index &&
unique_index->getIndexTable() &&
(uint) unique_index->getObjectId() == error_data)
{
dupkey= i;
break;
}
}
}
if (m_rows_to_insert == 1) if (m_rows_to_insert == 1)
{ {
/* /*
...@@ -595,7 +614,7 @@ int ha_ndbcluster::ndb_err(NdbTransaction *trans) ...@@ -595,7 +614,7 @@ int ha_ndbcluster::ndb_err(NdbTransaction *trans)
violations here, so we need to return MAX_KEY for non-primary violations here, so we need to return MAX_KEY for non-primary
to signal that key is unknown to signal that key is unknown
*/ */
m_dupkey= err.code == 630 ? table_share->primary_key : MAX_KEY; m_dupkey= err.code == 630 ? table_share->primary_key : dupkey;
} }
else else
{ {
......
...@@ -40,12 +40,13 @@ class TcKeyRef { ...@@ -40,12 +40,13 @@ class TcKeyRef {
friend bool printTCKEYREF(FILE *, const Uint32 *, Uint32, Uint16); friend bool printTCKEYREF(FILE *, const Uint32 *, Uint32, Uint16);
public: public:
STATIC_CONST( SignalLength = 4 ); STATIC_CONST( SignalLength = 5 );
private: private:
Uint32 connectPtr; Uint32 connectPtr;
Uint32 transId[2]; Uint32 transId[2];
Uint32 errorCode; Uint32 errorCode;
Uint32 errorData;
}; };
#endif #endif
...@@ -38,12 +38,13 @@ class TcRollbackRep { ...@@ -38,12 +38,13 @@ class TcRollbackRep {
friend bool printTCROLBACKREP(FILE *, const Uint32 *, Uint32, Uint16); friend bool printTCROLBACKREP(FILE *, const Uint32 *, Uint32, Uint16);
public: public:
STATIC_CONST( SignalLength = 4 ); STATIC_CONST( SignalLength = 5 );
private: private:
Uint32 connectPtr; Uint32 connectPtr;
Uint32 transId[2]; Uint32 transId[2];
Uint32 returnCode; Uint32 returnCode;
Uint32 errorData;
}; };
#endif #endif
...@@ -1020,7 +1020,12 @@ public: ...@@ -1020,7 +1020,12 @@ public:
* Get the name of the table being indexed * Get the name of the table being indexed
*/ */
const char * getTable() const; const char * getTable() const;
/**
* Get the table representing the index
*/
const Table * getIndexTable() const;
/** /**
* Get the number of columns in the index * Get the number of columns in the index
*/ */
......
...@@ -734,6 +734,7 @@ public: ...@@ -734,6 +734,7 @@ public:
// Index op return context // Index op return context
UintR indexOp; UintR indexOp;
UintR clientData; UintR clientData;
Uint32 errorData;
UintR attrInfoLen; UintR attrInfoLen;
UintR accumulatingIndexOp; UintR accumulatingIndexOp;
......
...@@ -5119,6 +5119,7 @@ void Dbtc::releaseDirtyWrite(Signal* signal) ...@@ -5119,6 +5119,7 @@ void Dbtc::releaseDirtyWrite(Signal* signal)
void Dbtc::execLQHKEYREF(Signal* signal) void Dbtc::execLQHKEYREF(Signal* signal)
{ {
const LqhKeyRef * const lqhKeyRef = (LqhKeyRef *)signal->getDataPtr(); const LqhKeyRef * const lqhKeyRef = (LqhKeyRef *)signal->getDataPtr();
Uint32 indexId = 0;
jamEntry(); jamEntry();
UintR compare_transid1, compare_transid2; UintR compare_transid1, compare_transid2;
...@@ -5170,6 +5171,9 @@ void Dbtc::execLQHKEYREF(Signal* signal) ...@@ -5170,6 +5171,9 @@ void Dbtc::execLQHKEYREF(Signal* signal)
ptrCheckGuard(opPtr, ctcConnectFilesize, localTcConnectRecord); ptrCheckGuard(opPtr, ctcConnectFilesize, localTcConnectRecord);
// The operation executed an index trigger // The operation executed an index trigger
TcIndexData* indexData = c_theIndexes.getPtr(currentIndexId);
indexId = indexData->indexId;
regApiPtr->errorData = indexId;
const Uint32 opType = regTcPtr->operation; const Uint32 opType = regTcPtr->operation;
if (errCode == ZALREADYEXIST) if (errCode == ZALREADYEXIST)
errCode = terrorCode = ZNOTUNIQUE; errCode = terrorCode = ZNOTUNIQUE;
...@@ -5182,7 +5186,6 @@ void Dbtc::execLQHKEYREF(Signal* signal) ...@@ -5182,7 +5186,6 @@ void Dbtc::execLQHKEYREF(Signal* signal)
} else { } else {
jam(); jam();
/** ZDELETE && NOT_FOUND */ /** ZDELETE && NOT_FOUND */
TcIndexData* indexData = c_theIndexes.getPtr(currentIndexId);
if(indexData->indexState == IS_BUILDING && state != CS_ABORTING){ if(indexData->indexState == IS_BUILDING && state != CS_ABORTING){
jam(); jam();
/** /**
...@@ -5267,12 +5270,14 @@ void Dbtc::execLQHKEYREF(Signal* signal) ...@@ -5267,12 +5270,14 @@ void Dbtc::execLQHKEYREF(Signal* signal)
jam(); jam();
regApiPtr->lqhkeyreqrec--; // Compensate for extra during read regApiPtr->lqhkeyreqrec--; // Compensate for extra during read
tcKeyRef->connectPtr = indexOp; tcKeyRef->connectPtr = indexOp;
tcKeyRef->errorData = indexId;
EXECUTE_DIRECT(DBTC, GSN_TCKEYREF, signal, TcKeyRef::SignalLength); EXECUTE_DIRECT(DBTC, GSN_TCKEYREF, signal, TcKeyRef::SignalLength);
apiConnectptr.i = save; apiConnectptr.i = save;
apiConnectptr.p = regApiPtr; apiConnectptr.p = regApiPtr;
} else { } else {
jam(); jam();
tcKeyRef->connectPtr = clientData; tcKeyRef->connectPtr = clientData;
tcKeyRef->errorData = indexId;
sendSignal(regApiPtr->ndbapiBlockref, sendSignal(regApiPtr->ndbapiBlockref,
GSN_TCKEYREF, signal, TcKeyRef::SignalLength, JBB); GSN_TCKEYREF, signal, TcKeyRef::SignalLength, JBB);
}//if }//if
...@@ -10573,6 +10578,7 @@ void Dbtc::releaseAbortResources(Signal* signal) ...@@ -10573,6 +10578,7 @@ void Dbtc::releaseAbortResources(Signal* signal)
tcRollbackRep->transId[0] = apiConnectptr.p->transid[0]; tcRollbackRep->transId[0] = apiConnectptr.p->transid[0];
tcRollbackRep->transId[1] = apiConnectptr.p->transid[1]; tcRollbackRep->transId[1] = apiConnectptr.p->transid[1];
tcRollbackRep->returnCode = apiConnectptr.p->returncode; tcRollbackRep->returnCode = apiConnectptr.p->returncode;
tcRollbackRep->errorData = apiConnectptr.p->errorData;
sendSignal(blockRef, GSN_TCROLLBACKREP, signal, sendSignal(blockRef, GSN_TCROLLBACKREP, signal,
TcRollbackRep::SignalLength, JBB); TcRollbackRep::SignalLength, JBB);
} }
...@@ -11997,6 +12003,7 @@ void Dbtc::execTCKEYCONF(Signal* signal) ...@@ -11997,6 +12003,7 @@ void Dbtc::execTCKEYCONF(Signal* signal)
tcIndxRef->transId[0] = regApiPtr->transid[0]; tcIndxRef->transId[0] = regApiPtr->transid[0];
tcIndxRef->transId[1] = regApiPtr->transid[1]; tcIndxRef->transId[1] = regApiPtr->transid[1];
tcIndxRef->errorCode = 4349; tcIndxRef->errorCode = 4349;
tcIndxRef->errorData = 0;
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal, sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
TcKeyRef::SignalLength, JBB); TcKeyRef::SignalLength, JBB);
return; return;
...@@ -12016,6 +12023,7 @@ void Dbtc::execTCKEYCONF(Signal* signal) ...@@ -12016,6 +12023,7 @@ void Dbtc::execTCKEYCONF(Signal* signal)
tcIndxRef->transId[0] = regApiPtr->transid[0]; tcIndxRef->transId[0] = regApiPtr->transid[0];
tcIndxRef->transId[1] = regApiPtr->transid[1]; tcIndxRef->transId[1] = regApiPtr->transid[1];
tcIndxRef->errorCode = 4349; tcIndxRef->errorCode = 4349;
tcIndxRef->errorData = 0;
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal, sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
TcKeyRef::SignalLength, JBB); TcKeyRef::SignalLength, JBB);
return; return;
...@@ -12099,6 +12107,7 @@ void Dbtc::execTCKEYREF(Signal* signal) ...@@ -12099,6 +12107,7 @@ void Dbtc::execTCKEYREF(Signal* signal)
tcIndxRef->transId[0] = tcKeyRef->transId[0]; tcIndxRef->transId[0] = tcKeyRef->transId[0];
tcIndxRef->transId[1] = tcKeyRef->transId[1]; tcIndxRef->transId[1] = tcKeyRef->transId[1];
tcIndxRef->errorCode = tcKeyRef->errorCode; tcIndxRef->errorCode = tcKeyRef->errorCode;
tcIndxRef->errorData = 0;
releaseIndexOperation(regApiPtr, indexOp); releaseIndexOperation(regApiPtr, indexOp);
...@@ -12176,6 +12185,7 @@ void Dbtc::execTRANSID_AI(Signal* signal) ...@@ -12176,6 +12185,7 @@ void Dbtc::execTRANSID_AI(Signal* signal)
tcIndxRef->transId[0] = regApiPtr->transid[0]; tcIndxRef->transId[0] = regApiPtr->transid[0];
tcIndxRef->transId[1] = regApiPtr->transid[1]; tcIndxRef->transId[1] = regApiPtr->transid[1];
tcIndxRef->errorCode = 4000; tcIndxRef->errorCode = 4000;
tcIndxRef->errorData = 0;
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal, sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
TcKeyRef::SignalLength, JBB); TcKeyRef::SignalLength, JBB);
return; return;
...@@ -12191,6 +12201,7 @@ void Dbtc::execTRANSID_AI(Signal* signal) ...@@ -12191,6 +12201,7 @@ void Dbtc::execTRANSID_AI(Signal* signal)
tcIndxRef->transId[0] = regApiPtr->transid[0]; tcIndxRef->transId[0] = regApiPtr->transid[0];
tcIndxRef->transId[1] = regApiPtr->transid[1]; tcIndxRef->transId[1] = regApiPtr->transid[1];
tcIndxRef->errorCode = 4349; tcIndxRef->errorCode = 4349;
tcIndxRef->errorData = 0;
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal, sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
TcKeyRef::SignalLength, JBB); TcKeyRef::SignalLength, JBB);
return; return;
...@@ -12219,6 +12230,7 @@ void Dbtc::execTRANSID_AI(Signal* signal) ...@@ -12219,6 +12230,7 @@ void Dbtc::execTRANSID_AI(Signal* signal)
tcIndxRef->transId[0] = regApiPtr->transid[0]; tcIndxRef->transId[0] = regApiPtr->transid[0];
tcIndxRef->transId[1] = regApiPtr->transid[1]; tcIndxRef->transId[1] = regApiPtr->transid[1];
tcIndxRef->errorCode = 4349; tcIndxRef->errorCode = 4349;
tcIndxRef->errorData = 0;
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal, sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
TcKeyRef::SignalLength, JBB); TcKeyRef::SignalLength, JBB);
*/ */
...@@ -12244,6 +12256,7 @@ void Dbtc::execTRANSID_AI(Signal* signal) ...@@ -12244,6 +12256,7 @@ void Dbtc::execTRANSID_AI(Signal* signal)
tcIndxRef->transId[0] = regApiPtr->transid[0]; tcIndxRef->transId[0] = regApiPtr->transid[0];
tcIndxRef->transId[1] = regApiPtr->transid[1]; tcIndxRef->transId[1] = regApiPtr->transid[1];
tcIndxRef->errorCode = 4349; tcIndxRef->errorCode = 4349;
tcIndxRef->errorData = regApiPtr->errorData;
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal, sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
TcKeyRef::SignalLength, JBB); TcKeyRef::SignalLength, JBB);
return; return;
...@@ -12297,6 +12310,7 @@ void Dbtc::readIndexTable(Signal* signal, ...@@ -12297,6 +12310,7 @@ void Dbtc::readIndexTable(Signal* signal,
tcIndxRef->transId[0] = regApiPtr->transid[0]; tcIndxRef->transId[0] = regApiPtr->transid[0];
tcIndxRef->transId[1] = regApiPtr->transid[1]; tcIndxRef->transId[1] = regApiPtr->transid[1];
tcIndxRef->errorCode = 4000; tcIndxRef->errorCode = 4000;
// tcIndxRef->errorData = ??; Where to find indexId
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal, sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
TcKeyRef::SignalLength, JBB); TcKeyRef::SignalLength, JBB);
return; return;
...@@ -12443,6 +12457,7 @@ void Dbtc::executeIndexOperation(Signal* signal, ...@@ -12443,6 +12457,7 @@ void Dbtc::executeIndexOperation(Signal* signal,
tcIndxRef->transId[0] = regApiPtr->transid[0]; tcIndxRef->transId[0] = regApiPtr->transid[0];
tcIndxRef->transId[1] = regApiPtr->transid[1]; tcIndxRef->transId[1] = regApiPtr->transid[1];
tcIndxRef->errorCode = 4349; tcIndxRef->errorCode = 4349;
tcIndxRef->errorData = 0;
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal, sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
TcKeyRef::SignalLength, JBB); TcKeyRef::SignalLength, JBB);
return; return;
......
...@@ -792,6 +792,15 @@ NdbDictionary::Index::getTable() const { ...@@ -792,6 +792,15 @@ NdbDictionary::Index::getTable() const {
return m_impl.getTable(); return m_impl.getTable();
} }
const NdbDictionary::Table *
NdbDictionary::Index::getIndexTable() const {
NdbTableImpl * t = m_impl.m_table;
if (t) {
return t->m_facade;
}
return 0;
}
unsigned unsigned
NdbDictionary::Index::getNoOfColumns() const { NdbDictionary::Index::getNoOfColumns() const {
return m_impl.m_columns.size(); return m_impl.m_columns.size();
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "Interpreter.hpp" #include "Interpreter.hpp"
#include <AttributeHeader.hpp> #include <AttributeHeader.hpp>
#include <signaldata/TcKeyReq.hpp> #include <signaldata/TcKeyReq.hpp>
#include <signaldata/TcKeyRef.hpp>
#include <signaldata/KeyInfo.hpp> #include <signaldata/KeyInfo.hpp>
#include <signaldata/AttrInfo.hpp> #include <signaldata/AttrInfo.hpp>
#include <signaldata/ScanTab.hpp> #include <signaldata/ScanTab.hpp>
...@@ -545,6 +546,12 @@ NdbOperation::receiveTCKEYREF( NdbApiSignal* aSignal) ...@@ -545,6 +546,12 @@ NdbOperation::receiveTCKEYREF( NdbApiSignal* aSignal)
}//if }//if
setErrorCode(aSignal->readData(4)); setErrorCode(aSignal->readData(4));
if (aSignal->getLength() == TcKeyRef::SignalLength)
{
// Signal may contain additional error data
setErrorDetails((char *) aSignal->readData(5));
}
theStatus = Finished; theStatus = Finished;
theReceiver.m_received_result_length = ~0; theReceiver.m_received_result_length = ~0;
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <signaldata/TcCommit.hpp> #include <signaldata/TcCommit.hpp>
#include <signaldata/TcKeyFailConf.hpp> #include <signaldata/TcKeyFailConf.hpp>
#include <signaldata/TcHbRep.hpp> #include <signaldata/TcHbRep.hpp>
#include <signaldata/TcRollbackRep.hpp>
/***************************************************************************** /*****************************************************************************
NdbTransaction( Ndb* aNdb ); NdbTransaction( Ndb* aNdb );
...@@ -1729,6 +1730,8 @@ Remark: Handles the reception of the ROLLBACKREP signal. ...@@ -1729,6 +1730,8 @@ Remark: Handles the reception of the ROLLBACKREP signal.
int int
NdbTransaction::receiveTCROLLBACKREP( NdbApiSignal* aSignal) NdbTransaction::receiveTCROLLBACKREP( NdbApiSignal* aSignal)
{ {
DBUG_ENTER("NdbTransaction::receiveTCROLLBACKREP");
/**************************************************************************** /****************************************************************************
Check that we are expecting signals from this transaction and that it doesn't Check that we are expecting signals from this transaction and that it doesn't
belong to a transaction already completed. Simply ignore messages from other belong to a transaction already completed. Simply ignore messages from other
...@@ -1736,6 +1739,11 @@ transactions. ...@@ -1736,6 +1739,11 @@ transactions.
****************************************************************************/ ****************************************************************************/
if(checkState_TransId(aSignal->getDataPtr() + 1)){ if(checkState_TransId(aSignal->getDataPtr() + 1)){
theError.code = aSignal->readData(4);// Override any previous errors theError.code = aSignal->readData(4);// Override any previous errors
if (aSignal->getLength() == TcRollbackRep::SignalLength)
{
// Signal may contain additional error data
theError.details = (char *) aSignal->readData(5);
}
/**********************************************************************/ /**********************************************************************/
/* A serious error has occured. This could be due to deadlock or */ /* A serious error has occured. This could be due to deadlock or */
...@@ -1747,14 +1755,14 @@ transactions. ...@@ -1747,14 +1755,14 @@ transactions.
theCompletionStatus = CompletedFailure; theCompletionStatus = CompletedFailure;
theCommitStatus = Aborted; theCommitStatus = Aborted;
theReturnStatus = ReturnFailure; theReturnStatus = ReturnFailure;
return 0; DBUG_RETURN(0);
} else { } else {
#ifdef NDB_NO_DROPPED_SIGNAL #ifdef NDB_NO_DROPPED_SIGNAL
abort(); abort();
#endif #endif
} }
return -1; DBUG_RETURN(-1);
}//NdbTransaction::receiveTCROLLBACKREP() }//NdbTransaction::receiveTCROLLBACKREP()
/******************************************************************************* /*******************************************************************************
......
...@@ -766,8 +766,6 @@ ndberror_update(ndberror_struct * error){ ...@@ -766,8 +766,6 @@ ndberror_update(ndberror_struct * error){
if(!found){ if(!found){
error->status = ST_U; error->status = ST_U;
} }
error->details = 0;
} }
#if CHECK_ERRORCODES #if CHECK_ERRORCODES
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment