Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
154d7af0
Commit
154d7af0
authored
Aug 01, 2006
by
jonas@perch.ndb.mysql.com
Browse files
Options
Browse Files
Download
Plain Diff
Merge perch.ndb.mysql.com:/home/jonas/src/41-work
into perch.ndb.mysql.com:/home/jonas/src/50-work
parents
bcc9faee
ca885478
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
191 additions
and
31 deletions
+191
-31
ndb/src/kernel/blocks/ERROR_codes.txt
ndb/src/kernel/blocks/ERROR_codes.txt
+2
-1
ndb/src/kernel/blocks/dbtc/Dbtc.hpp
ndb/src/kernel/blocks/dbtc/Dbtc.hpp
+2
-2
ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
+131
-28
ndb/test/ndbapi/testIndex.cpp
ndb/test/ndbapi/testIndex.cpp
+52
-0
ndb/test/run-test/daily-basic-tests.txt
ndb/test/run-test/daily-basic-tests.txt
+4
-0
No files found.
ndb/src/kernel/blocks/ERROR_codes.txt
View file @
154d7af0
...
@@ -6,7 +6,7 @@ Next DBTUP 4014
...
@@ -6,7 +6,7 @@ Next DBTUP 4014
Next DBLQH 5043
Next DBLQH 5043
Next DBDICT 6007
Next DBDICT 6007
Next DBDIH 7177
Next DBDIH 7177
Next DBTC 803
7
Next DBTC 803
8
Next CMVMI 9000
Next CMVMI 9000
Next BACKUP 10022
Next BACKUP 10022
Next DBUTIL 11002
Next DBUTIL 11002
...
@@ -283,6 +283,7 @@ ABORT OF TCKEYREQ
...
@@ -283,6 +283,7 @@ ABORT OF TCKEYREQ
8032: No free TC records any more
8032: No free TC records any more
8037 : Invalid schema version in TCINDXREQ
CMVMI
CMVMI
-----
-----
...
...
ndb/src/kernel/blocks/dbtc/Dbtc.hpp
View file @
154d7af0
...
@@ -720,7 +720,7 @@ public:
...
@@ -720,7 +720,7 @@ public:
// Index data
// Index data
bool
isIndexOp
;
// Used to mark on-going TcKeyReq as indx table access
Uint8
isIndexOp
;
// Used to mark on-going TcKeyReq as indx table access
bool
indexOpReturn
;
bool
indexOpReturn
;
UintR
noIndexOp
;
// No outstanding index ops
UintR
noIndexOp
;
// No outstanding index ops
...
@@ -808,7 +808,7 @@ public:
...
@@ -808,7 +808,7 @@ public:
UintR
savedState
[
LqhKeyConf
::
SignalLength
];
UintR
savedState
[
LqhKeyConf
::
SignalLength
];
// Index data
// Index data
bool
isIndexOp
;
// Used to mark on-going TcKeyReq as index table access
Uint8
isIndexOp
;
// Used to mark on-going TcKeyReq as index table access
UintR
indexOp
;
UintR
indexOp
;
UintR
currentIndexId
;
UintR
currentIndexId
;
UintR
attrInfoLen
;
UintR
attrInfoLen
;
...
...
ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
View file @
154d7af0
...
@@ -1775,8 +1775,7 @@ void Dbtc::execKEYINFO(Signal* signal)
...
@@ -1775,8 +1775,7 @@ void Dbtc::execKEYINFO(Signal* signal)
apiConnectptr
.
i
=
signal
->
theData
[
0
];
apiConnectptr
.
i
=
signal
->
theData
[
0
];
tmaxData
=
20
;
tmaxData
=
20
;
if
(
apiConnectptr
.
i
>=
capiConnectFilesize
)
{
if
(
apiConnectptr
.
i
>=
capiConnectFilesize
)
{
jam
();
TCKEY_abort
(
signal
,
18
);
warningHandlerLab
(
signal
,
__LINE__
);
return
;
return
;
}
//if
}
//if
ptrAss
(
apiConnectptr
,
apiConnectRecord
);
ptrAss
(
apiConnectptr
,
apiConnectRecord
);
...
@@ -1785,9 +1784,7 @@ void Dbtc::execKEYINFO(Signal* signal)
...
@@ -1785,9 +1784,7 @@ void Dbtc::execKEYINFO(Signal* signal)
compare_transid2
=
apiConnectptr
.
p
->
transid
[
1
]
^
signal
->
theData
[
2
];
compare_transid2
=
apiConnectptr
.
p
->
transid
[
1
]
^
signal
->
theData
[
2
];
compare_transid1
=
compare_transid1
|
compare_transid2
;
compare_transid1
=
compare_transid1
|
compare_transid2
;
if
(
compare_transid1
!=
0
)
{
if
(
compare_transid1
!=
0
)
{
jam
();
TCKEY_abort
(
signal
,
19
);
printState
(
signal
,
10
);
sendSignalErrorRefuseLab
(
signal
);
return
;
return
;
}
//if
}
//if
switch
(
apiConnectptr
.
p
->
apiConnectstate
)
{
switch
(
apiConnectptr
.
p
->
apiConnectstate
)
{
...
@@ -2531,7 +2528,7 @@ void Dbtc::execTCKEYREQ(Signal* signal)
...
@@ -2531,7 +2528,7 @@ void Dbtc::execTCKEYREQ(Signal* signal)
Uint32
TstartFlag
=
tcKeyReq
->
getStartFlag
(
Treqinfo
);
Uint32
TstartFlag
=
tcKeyReq
->
getStartFlag
(
Treqinfo
);
Uint32
TexecFlag
=
TcKeyReq
::
getExecuteFlag
(
Treqinfo
);
Uint32
TexecFlag
=
TcKeyReq
::
getExecuteFlag
(
Treqinfo
);
bool
isIndexOp
=
regApiPtr
->
isIndexOp
;
Uint8
isIndexOp
=
regApiPtr
->
isIndexOp
;
bool
isIndexOpReturn
=
regApiPtr
->
indexOpReturn
;
bool
isIndexOpReturn
=
regApiPtr
->
indexOpReturn
;
regApiPtr
->
isIndexOp
=
false
;
// Reset marker
regApiPtr
->
isIndexOp
=
false
;
// Reset marker
regApiPtr
->
m_exec_flag
|=
TexecFlag
;
regApiPtr
->
m_exec_flag
|=
TexecFlag
;
...
@@ -3277,7 +3274,7 @@ void Dbtc::sendlqhkeyreq(Signal* signal,
...
@@ -3277,7 +3274,7 @@ void Dbtc::sendlqhkeyreq(Signal* signal,
sig1
=
regCachePtr
->
fragmentid
+
(
regTcPtr
->
tcNodedata
[
1
]
<<
16
);
sig1
=
regCachePtr
->
fragmentid
+
(
regTcPtr
->
tcNodedata
[
1
]
<<
16
);
sig2
=
regApiPtr
->
transid
[
0
];
sig2
=
regApiPtr
->
transid
[
0
];
sig3
=
regApiPtr
->
transid
[
1
];
sig3
=
regApiPtr
->
transid
[
1
];
sig4
=
regApiPtr
->
ndbapiBlockref
;
sig4
=
(
regTcPtr
->
isIndexOp
==
2
)
?
reference
()
:
regApiPtr
->
ndbapiBlockref
;
sig5
=
regTcPtr
->
clientData
;
sig5
=
regTcPtr
->
clientData
;
sig6
=
regCachePtr
->
scanInfo
;
sig6
=
regCachePtr
->
scanInfo
;
...
@@ -8619,6 +8616,7 @@ void Dbtc::execSCAN_TABREQ(Signal* signal)
...
@@ -8619,6 +8616,7 @@ void Dbtc::execSCAN_TABREQ(Signal* signal)
// left over from simple/dirty read
// left over from simple/dirty read
}
else
{
}
else
{
jam
();
jam
();
jamLine
(
transP
->
apiConnectstate
);
errCode
=
ZSTATE_ERROR
;
errCode
=
ZSTATE_ERROR
;
goto
SCAN_TAB_error_no_state_change
;
goto
SCAN_TAB_error_no_state_change
;
}
}
...
@@ -12036,14 +12034,18 @@ void Dbtc::readIndexTable(Signal* signal,
...
@@ -12036,14 +12034,18 @@ void Dbtc::readIndexTable(Signal* signal,
opType
==
ZREAD
?
ZREAD
:
ZREAD_EX
);
opType
==
ZREAD
?
ZREAD
:
ZREAD_EX
);
TcKeyReq
::
setAIInTcKeyReq
(
tcKeyRequestInfo
,
1
);
// Allways send one AttrInfo
TcKeyReq
::
setAIInTcKeyReq
(
tcKeyRequestInfo
,
1
);
// Allways send one AttrInfo
TcKeyReq
::
setExecutingTrigger
(
tcKeyRequestInfo
,
0
);
TcKeyReq
::
setExecutingTrigger
(
tcKeyRequestInfo
,
0
);
BlockReference
originalReceiver
=
regApiPtr
->
ndbapiBlockref
;
regApiPtr
->
ndbapiBlockref
=
reference
();
// Send result to me
tcKeyReq
->
senderData
=
indexOp
->
indexOpId
;
tcKeyReq
->
senderData
=
indexOp
->
indexOpId
;
indexOp
->
indexOpState
=
IOS_INDEX_ACCESS
;
indexOp
->
indexOpState
=
IOS_INDEX_ACCESS
;
regApiPtr
->
executingIndexOp
=
regApiPtr
->
accumulatingIndexOp
;
regApiPtr
->
executingIndexOp
=
regApiPtr
->
accumulatingIndexOp
;
regApiPtr
->
accumulatingIndexOp
=
RNIL
;
regApiPtr
->
accumulatingIndexOp
=
RNIL
;
regApiPtr
->
isIndexOp
=
true
;
regApiPtr
->
isIndexOp
=
2
;
if
(
ERROR_INSERTED
(
8037
))
{
ndbout_c
(
"shifting index version"
);
tcKeyReq
->
tableSchemaVersion
=
~
(
Uint32
)
indexOp
->
tcIndxReq
.
indexSchemaVersion
;
}
Uint32
remainingKey
=
indexOp
->
keyInfo
.
getSize
();
Uint32
remainingKey
=
indexOp
->
keyInfo
.
getSize
();
bool
moreKeyData
=
indexOp
->
keyInfo
.
first
(
keyIter
);
bool
moreKeyData
=
indexOp
->
keyInfo
.
first
(
keyIter
);
// *********** KEYINFO in TCKEYREQ ***********
// *********** KEYINFO in TCKEYREQ ***********
...
@@ -12062,21 +12064,13 @@ void Dbtc::readIndexTable(Signal* signal,
...
@@ -12062,21 +12064,13 @@ void Dbtc::readIndexTable(Signal* signal,
ndbassert
(
TcKeyReq
::
getDirtyFlag
(
tcKeyRequestInfo
)
==
0
);
ndbassert
(
TcKeyReq
::
getDirtyFlag
(
tcKeyRequestInfo
)
==
0
);
ndbassert
(
TcKeyReq
::
getSimpleFlag
(
tcKeyRequestInfo
)
==
0
);
ndbassert
(
TcKeyReq
::
getSimpleFlag
(
tcKeyRequestInfo
)
==
0
);
EXECUTE_DIRECT
(
DBTC
,
GSN_TCKEYREQ
,
signal
,
tcKeyLength
);
EXECUTE_DIRECT
(
DBTC
,
GSN_TCKEYREQ
,
signal
,
tcKeyLength
);
jamEntry
();
/**
* "Fool" TC not to start commiting transaction since it always will
* have one outstanding lqhkeyreq
* This is later decreased when the index read is complete
*/
regApiPtr
->
lqhkeyreqrec
++
;
/**
if
(
unlikely
(
regApiPtr
->
apiConnectstate
==
CS_ABORTING
))
* Remember ptr to index read operation
{
* (used to set correct save point id on index operation later)
goto
err
;
*/
}
indexOp
->
indexReadTcConnect
=
regApiPtr
->
lastTcConnect
;
jamEntry
();
// *********** KEYINFO ***********
// *********** KEYINFO ***********
if
(
moreKeyData
)
{
if
(
moreKeyData
)
{
jam
();
jam
();
...
@@ -12096,6 +12090,10 @@ void Dbtc::readIndexTable(Signal* signal,
...
@@ -12096,6 +12090,10 @@ void Dbtc::readIndexTable(Signal* signal,
EXECUTE_DIRECT
(
DBTC
,
GSN_KEYINFO
,
signal
,
EXECUTE_DIRECT
(
DBTC
,
GSN_KEYINFO
,
signal
,
KeyInfo
::
HeaderLength
+
KeyInfo
::
DataLength
);
KeyInfo
::
HeaderLength
+
KeyInfo
::
DataLength
);
jamEntry
();
jamEntry
();
if
(
unlikely
(
regApiPtr
->
apiConnectstate
==
CS_ABORTING
))
{
goto
err
;
}
dataPos
=
0
;
dataPos
=
0
;
dataPtr
=
(
Uint32
*
)
&
keyInfo
->
keyData
;
dataPtr
=
(
Uint32
*
)
&
keyInfo
->
keyData
;
}
}
...
@@ -12106,10 +12104,32 @@ void Dbtc::readIndexTable(Signal* signal,
...
@@ -12106,10 +12104,32 @@ void Dbtc::readIndexTable(Signal* signal,
EXECUTE_DIRECT
(
DBTC
,
GSN_KEYINFO
,
signal
,
EXECUTE_DIRECT
(
DBTC
,
GSN_KEYINFO
,
signal
,
KeyInfo
::
HeaderLength
+
dataPos
);
KeyInfo
::
HeaderLength
+
dataPos
);
jamEntry
();
jamEntry
();
if
(
unlikely
(
regApiPtr
->
apiConnectstate
==
CS_ABORTING
))
{
goto
err
;
}
}
}
}
}
regApiPtr
->
ndbapiBlockref
=
originalReceiver
;
// reset original receiver
/**
* "Fool" TC not to start commiting transaction since it always will
* have one outstanding lqhkeyreq
* This is later decreased when the index read is complete
*/
regApiPtr
->
lqhkeyreqrec
++
;
/**
* Remember ptr to index read operation
* (used to set correct save point id on index operation later)
*/
indexOp
->
indexReadTcConnect
=
regApiPtr
->
lastTcConnect
;
done:
return
;
err:
jam
();
goto
done
;
}
}
/**
/**
...
@@ -12160,7 +12180,7 @@ void Dbtc::executeIndexOperation(Signal* signal,
...
@@ -12160,7 +12180,7 @@ void Dbtc::executeIndexOperation(Signal* signal,
tcKeyReq
->
transId2
=
regApiPtr
->
transid
[
1
];
tcKeyReq
->
transId2
=
regApiPtr
->
transid
[
1
];
tcKeyReq
->
senderData
=
tcIndxReq
->
senderData
;
// Needed for TRANSID_AI to API
tcKeyReq
->
senderData
=
tcIndxReq
->
senderData
;
// Needed for TRANSID_AI to API
indexOp
->
indexOpState
=
IOS_INDEX_OPERATION
;
indexOp
->
indexOpState
=
IOS_INDEX_OPERATION
;
regApiPtr
->
isIndexOp
=
true
;
regApiPtr
->
isIndexOp
=
1
;
regApiPtr
->
executingIndexOp
=
indexOp
->
indexOpId
;;
regApiPtr
->
executingIndexOp
=
indexOp
->
indexOpId
;;
regApiPtr
->
noIndexOp
++
;
// Increase count
regApiPtr
->
noIndexOp
++
;
// Increase count
...
@@ -12233,9 +12253,16 @@ void Dbtc::executeIndexOperation(Signal* signal,
...
@@ -12233,9 +12253,16 @@ void Dbtc::executeIndexOperation(Signal* signal,
const
Uint32
currSavePointId
=
regApiPtr
->
currSavePointId
;
const
Uint32
currSavePointId
=
regApiPtr
->
currSavePointId
;
regApiPtr
->
currSavePointId
=
tmp
.
p
->
savePointId
;
regApiPtr
->
currSavePointId
=
tmp
.
p
->
savePointId
;
EXECUTE_DIRECT
(
DBTC
,
GSN_TCKEYREQ
,
signal
,
tcKeyLength
);
EXECUTE_DIRECT
(
DBTC
,
GSN_TCKEYREQ
,
signal
,
tcKeyLength
);
jamEntry
();
if
(
unlikely
(
regApiPtr
->
apiConnectstate
==
CS_ABORTING
))
{
jam
();
return
;
}
regApiPtr
->
currSavePointId
=
currSavePointId
;
regApiPtr
->
currSavePointId
=
currSavePointId
;
jamEntry
();
// *********** KEYINFO ***********
// *********** KEYINFO ***********
if
(
moreKeyData
)
{
if
(
moreKeyData
)
{
jam
();
jam
();
...
@@ -12256,6 +12283,13 @@ void Dbtc::executeIndexOperation(Signal* signal,
...
@@ -12256,6 +12283,13 @@ void Dbtc::executeIndexOperation(Signal* signal,
EXECUTE_DIRECT
(
DBTC
,
GSN_KEYINFO
,
signal
,
EXECUTE_DIRECT
(
DBTC
,
GSN_KEYINFO
,
signal
,
KeyInfo
::
HeaderLength
+
KeyInfo
::
DataLength
);
KeyInfo
::
HeaderLength
+
KeyInfo
::
DataLength
);
jamEntry
();
jamEntry
();
if
(
unlikely
(
regApiPtr
->
apiConnectstate
==
CS_ABORTING
))
{
jam
();
return
;
}
dataPos
=
0
;
dataPos
=
0
;
dataPtr
=
(
Uint32
*
)
&
keyInfo
->
keyData
;
dataPtr
=
(
Uint32
*
)
&
keyInfo
->
keyData
;
}
}
...
@@ -12266,6 +12300,12 @@ void Dbtc::executeIndexOperation(Signal* signal,
...
@@ -12266,6 +12300,12 @@ void Dbtc::executeIndexOperation(Signal* signal,
EXECUTE_DIRECT
(
DBTC
,
GSN_KEYINFO
,
signal
,
EXECUTE_DIRECT
(
DBTC
,
GSN_KEYINFO
,
signal
,
KeyInfo
::
HeaderLength
+
dataPos
);
KeyInfo
::
HeaderLength
+
dataPos
);
jamEntry
();
jamEntry
();
if
(
unlikely
(
regApiPtr
->
apiConnectstate
==
CS_ABORTING
))
{
jam
();
return
;
}
}
}
}
}
...
@@ -12295,6 +12335,13 @@ void Dbtc::executeIndexOperation(Signal* signal,
...
@@ -12295,6 +12335,13 @@ void Dbtc::executeIndexOperation(Signal* signal,
EXECUTE_DIRECT
(
DBTC
,
GSN_ATTRINFO
,
signal
,
EXECUTE_DIRECT
(
DBTC
,
GSN_ATTRINFO
,
signal
,
AttrInfo
::
HeaderLength
+
AttrInfo
::
DataLength
);
AttrInfo
::
HeaderLength
+
AttrInfo
::
DataLength
);
jamEntry
();
jamEntry
();
if
(
unlikely
(
regApiPtr
->
apiConnectstate
==
CS_ABORTING
))
{
jam
();
return
;
}
attrInfoPos
=
0
;
attrInfoPos
=
0
;
dataPtr
=
(
Uint32
*
)
&
attrInfo
->
attrData
;
dataPtr
=
(
Uint32
*
)
&
attrInfo
->
attrData
;
}
}
...
@@ -12694,9 +12741,16 @@ void Dbtc::insertIntoIndexTable(Signal* signal,
...
@@ -12694,9 +12741,16 @@ void Dbtc::insertIntoIndexTable(Signal* signal,
const
Uint32
currSavePointId
=
regApiPtr
->
currSavePointId
;
const
Uint32
currSavePointId
=
regApiPtr
->
currSavePointId
;
regApiPtr
->
currSavePointId
=
opRecord
->
savePointId
;
regApiPtr
->
currSavePointId
=
opRecord
->
savePointId
;
EXECUTE_DIRECT
(
DBTC
,
GSN_TCKEYREQ
,
signal
,
tcKeyLength
);
EXECUTE_DIRECT
(
DBTC
,
GSN_TCKEYREQ
,
signal
,
tcKeyLength
);
jamEntry
();
if
(
unlikely
(
regApiPtr
->
apiConnectstate
==
CS_ABORTING
))
{
jam
();
return
;
}
regApiPtr
->
currSavePointId
=
currSavePointId
;
regApiPtr
->
currSavePointId
=
currSavePointId
;
tcConnectptr
.
p
->
currentIndexId
=
indexData
->
indexId
;
tcConnectptr
.
p
->
currentIndexId
=
indexData
->
indexId
;
jamEntry
();
// *********** KEYINFO ***********
// *********** KEYINFO ***********
if
(
moreKeyData
)
{
if
(
moreKeyData
)
{
...
@@ -12726,6 +12780,12 @@ void Dbtc::insertIntoIndexTable(Signal* signal,
...
@@ -12726,6 +12780,12 @@ void Dbtc::insertIntoIndexTable(Signal* signal,
KeyInfo
::
HeaderLength
+
KeyInfo
::
DataLength
);
KeyInfo
::
HeaderLength
+
KeyInfo
::
DataLength
);
jamEntry
();
jamEntry
();
#endif
#endif
if
(
unlikely
(
regApiPtr
->
apiConnectstate
==
CS_ABORTING
))
{
jam
();
return
;
}
dataPtr
=
(
Uint32
*
)
&
keyInfo
->
keyData
;
dataPtr
=
(
Uint32
*
)
&
keyInfo
->
keyData
;
dataPos
=
0
;
dataPos
=
0
;
}
}
...
@@ -12761,6 +12821,13 @@ void Dbtc::insertIntoIndexTable(Signal* signal,
...
@@ -12761,6 +12821,13 @@ void Dbtc::insertIntoIndexTable(Signal* signal,
KeyInfo
::
HeaderLength
+
KeyInfo
::
DataLength
);
KeyInfo
::
HeaderLength
+
KeyInfo
::
DataLength
);
jamEntry
();
jamEntry
();
#endif
#endif
if
(
unlikely
(
regApiPtr
->
apiConnectstate
==
CS_ABORTING
))
{
jam
();
return
;
}
dataPtr
=
(
Uint32
*
)
&
keyInfo
->
keyData
;
dataPtr
=
(
Uint32
*
)
&
keyInfo
->
keyData
;
dataPos
=
0
;
dataPos
=
0
;
}
}
...
@@ -12778,6 +12845,11 @@ void Dbtc::insertIntoIndexTable(Signal* signal,
...
@@ -12778,6 +12845,11 @@ void Dbtc::insertIntoIndexTable(Signal* signal,
KeyInfo
::
HeaderLength
+
dataPos
);
KeyInfo
::
HeaderLength
+
dataPos
);
jamEntry
();
jamEntry
();
#endif
#endif
if
(
unlikely
(
regApiPtr
->
apiConnectstate
==
CS_ABORTING
))
{
jam
();
return
;
}
}
}
}
}
...
@@ -12813,6 +12885,12 @@ void Dbtc::insertIntoIndexTable(Signal* signal,
...
@@ -12813,6 +12885,12 @@ void Dbtc::insertIntoIndexTable(Signal* signal,
AttrInfo
::
HeaderLength
+
AttrInfo
::
DataLength
);
AttrInfo
::
HeaderLength
+
AttrInfo
::
DataLength
);
jamEntry
();
jamEntry
();
#endif
#endif
if
(
unlikely
(
regApiPtr
->
apiConnectstate
==
CS_ABORTING
))
{
jam
();
return
;
}
dataPtr
=
(
Uint32
*
)
&
attrInfo
->
attrData
;
dataPtr
=
(
Uint32
*
)
&
attrInfo
->
attrData
;
attrInfoPos
=
0
;
attrInfoPos
=
0
;
}
}
...
@@ -12849,6 +12927,12 @@ void Dbtc::insertIntoIndexTable(Signal* signal,
...
@@ -12849,6 +12927,12 @@ void Dbtc::insertIntoIndexTable(Signal* signal,
AttrInfo
::
HeaderLength
+
AttrInfo
::
DataLength
);
AttrInfo
::
HeaderLength
+
AttrInfo
::
DataLength
);
jamEntry
();
jamEntry
();
#endif
#endif
if
(
unlikely
(
regApiPtr
->
apiConnectstate
==
CS_ABORTING
))
{
jam
();
return
;
}
dataPtr
=
(
Uint32
*
)
&
attrInfo
->
attrData
;
dataPtr
=
(
Uint32
*
)
&
attrInfo
->
attrData
;
attrInfoPos
=
0
;
attrInfoPos
=
0
;
}
}
...
@@ -12994,9 +13078,16 @@ void Dbtc::deleteFromIndexTable(Signal* signal,
...
@@ -12994,9 +13078,16 @@ void Dbtc::deleteFromIndexTable(Signal* signal,
const
Uint32
currSavePointId
=
regApiPtr
->
currSavePointId
;
const
Uint32
currSavePointId
=
regApiPtr
->
currSavePointId
;
regApiPtr
->
currSavePointId
=
opRecord
->
savePointId
;
regApiPtr
->
currSavePointId
=
opRecord
->
savePointId
;
EXECUTE_DIRECT
(
DBTC
,
GSN_TCKEYREQ
,
signal
,
tcKeyLength
);
EXECUTE_DIRECT
(
DBTC
,
GSN_TCKEYREQ
,
signal
,
tcKeyLength
);
jamEntry
();
if
(
unlikely
(
regApiPtr
->
apiConnectstate
==
CS_ABORTING
))
{
jam
();
return
;
}
regApiPtr
->
currSavePointId
=
currSavePointId
;
regApiPtr
->
currSavePointId
=
currSavePointId
;
tcConnectptr
.
p
->
currentIndexId
=
indexData
->
indexId
;
tcConnectptr
.
p
->
currentIndexId
=
indexData
->
indexId
;
jamEntry
();
// *********** KEYINFO ***********
// *********** KEYINFO ***********
if
(
moreKeyData
)
{
if
(
moreKeyData
)
{
...
@@ -13027,6 +13118,12 @@ void Dbtc::deleteFromIndexTable(Signal* signal,
...
@@ -13027,6 +13118,12 @@ void Dbtc::deleteFromIndexTable(Signal* signal,
KeyInfo
::
HeaderLength
+
KeyInfo
::
DataLength
);
KeyInfo
::
HeaderLength
+
KeyInfo
::
DataLength
);
jamEntry
();
jamEntry
();
#endif
#endif
if
(
unlikely
(
regApiPtr
->
apiConnectstate
==
CS_ABORTING
))
{
jam
();
return
;
}
dataPtr
=
(
Uint32
*
)
&
keyInfo
->
keyData
;
dataPtr
=
(
Uint32
*
)
&
keyInfo
->
keyData
;
dataPos
=
0
;
dataPos
=
0
;
}
}
...
@@ -13063,6 +13160,12 @@ void Dbtc::deleteFromIndexTable(Signal* signal,
...
@@ -13063,6 +13160,12 @@ void Dbtc::deleteFromIndexTable(Signal* signal,
KeyInfo
::
HeaderLength
+
KeyInfo
::
DataLength
);
KeyInfo
::
HeaderLength
+
KeyInfo
::
DataLength
);
jamEntry
();
jamEntry
();
#endif
#endif
if
(
unlikely
(
regApiPtr
->
apiConnectstate
==
CS_ABORTING
))
{
jam
();
return
;
}
dataPtr
=
(
Uint32
*
)
&
keyInfo
->
keyData
;
dataPtr
=
(
Uint32
*
)
&
keyInfo
->
keyData
;
dataPos
=
0
;
dataPos
=
0
;
}
}
...
...
ndb/test/ndbapi/testIndex.cpp
View file @
154d7af0
...
@@ -1199,6 +1199,48 @@ int runLQHKEYREF(NDBT_Context* ctx, NDBT_Step* step){
...
@@ -1199,6 +1199,48 @@ int runLQHKEYREF(NDBT_Context* ctx, NDBT_Step* step){
return
NDBT_OK
;
return
NDBT_OK
;
}
}
int
runBug21384
(
NDBT_Context
*
ctx
,
NDBT_Step
*
step
)
{
Ndb
*
pNdb
=
GETNDB
(
step
);
HugoTransactions
hugoTrans
(
*
ctx
->
getTab
());
NdbRestarter
restarter
;
int
loops
=
ctx
->
getNumLoops
();
const
int
rows
=
ctx
->
getNumRecords
();
const
int
batchsize
=
ctx
->
getProperty
(
"BatchSize"
,
50
);
while
(
loops
--
)
{
if
(
restarter
.
insertErrorInAllNodes
(
8037
)
!=
0
)
{
g_err
<<
"Failed to error insert(8037)"
<<
endl
;
return
NDBT_FAILED
;
}
if
(
hugoTrans
.
indexReadRecords
(
pNdb
,
pkIdxName
,
rows
,
batchsize
)
==
0
)
{
g_err
<<
"Index succeded (it should have failed"
<<
endl
;
return
NDBT_FAILED
;
}
if
(
restarter
.
insertErrorInAllNodes
(
0
)
!=
0
)
{
g_err
<<
"Failed to error insert(0)"
<<
endl
;
return
NDBT_FAILED
;
}
if
(
hugoTrans
.
indexReadRecords
(
pNdb
,
pkIdxName
,
rows
,
batchsize
)
!=
0
){
g_err
<<
"Index read failed"
<<
endl
;
return
NDBT_FAILED
;
}
}
return
NDBT_OK
;
}
NDBT_TESTSUITE
(
testIndex
);
NDBT_TESTSUITE
(
testIndex
);
TESTCASE
(
"CreateAll"
,
TESTCASE
(
"CreateAll"
,
"Test that we can create all various indexes on each table
\n
"
"Test that we can create all various indexes on each table
\n
"
...
@@ -1512,6 +1554,16 @@ TESTCASE("UniqueNull",
...
@@ -1512,6 +1554,16 @@ TESTCASE("UniqueNull",
FINALIZER
(
createPkIndex_Drop
);
FINALIZER
(
createPkIndex_Drop
);
FINALIZER
(
runClearTable
);
FINALIZER
(
runClearTable
);
}
}
TESTCASE
(
"Bug21384"
,
"Test that unique indexes and nulls"
){
TC_PROPERTY
(
"LoggedIndexes"
,
(
unsigned
)
0
);
INITIALIZER
(
runClearTable
);
INITIALIZER
(
createPkIndex
);
INITIALIZER
(
runLoadTable
);
STEP
(
runBug21384
);
FINALIZER
(
createPkIndex_Drop
);
FINALIZER
(
runClearTable
);
}
NDBT_TESTSUITE_END
(
testIndex
);
NDBT_TESTSUITE_END
(
testIndex
);
int
main
(
int
argc
,
const
char
**
argv
){
int
main
(
int
argc
,
const
char
**
argv
){
...
...
ndb/test/run-test/daily-basic-tests.txt
View file @
154d7af0
...
@@ -449,6 +449,10 @@ max-time: 1000
...
@@ -449,6 +449,10 @@ max-time: 1000
cmd: testNodeRestart
cmd: testNodeRestart
args: -n Bug20185 T1
args: -n Bug20185 T1
max-time: 1000
cmd: testIndex
args: -n Bug21384
# OLD FLEX
# OLD FLEX
max-time: 500
max-time: 500
cmd: flexBench
cmd: flexBench
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment