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
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
0695325c
Commit
0695325c
authored
Jun 18, 2004
by
unknown
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
tux optim 9 - use TUP method to read search key
parent
28dc842f
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
179 additions
and
111 deletions
+179
-111
ndb/src/kernel/blocks/dbtup/Dbtup.hpp
ndb/src/kernel/blocks/dbtup/Dbtup.hpp
+9
-4
ndb/src/kernel/blocks/dbtup/DbtupIndex.cpp
ndb/src/kernel/blocks/dbtup/DbtupIndex.cpp
+63
-6
ndb/src/kernel/blocks/dbtux/Dbtux.hpp
ndb/src/kernel/blocks/dbtux/Dbtux.hpp
+57
-32
ndb/src/kernel/blocks/dbtux/DbtuxCmp.cpp
ndb/src/kernel/blocks/dbtux/DbtuxCmp.cpp
+12
-22
ndb/src/kernel/blocks/dbtux/DbtuxGen.cpp
ndb/src/kernel/blocks/dbtux/DbtuxGen.cpp
+5
-2
ndb/src/kernel/blocks/dbtux/DbtuxMaint.cpp
ndb/src/kernel/blocks/dbtux/DbtuxMaint.cpp
+8
-13
ndb/src/kernel/blocks/dbtux/DbtuxNode.cpp
ndb/src/kernel/blocks/dbtux/DbtuxNode.cpp
+3
-0
ndb/src/kernel/blocks/dbtux/DbtuxScan.cpp
ndb/src/kernel/blocks/dbtux/DbtuxScan.cpp
+6
-6
ndb/src/kernel/blocks/dbtux/DbtuxTree.cpp
ndb/src/kernel/blocks/dbtux/DbtuxTree.cpp
+14
-26
ndb/src/kernel/blocks/dbtux/Times.txt
ndb/src/kernel/blocks/dbtux/Times.txt
+2
-0
No files found.
ndb/src/kernel/blocks/dbtup/Dbtup.hpp
View file @
0695325c
...
@@ -1003,17 +1003,22 @@ public:
...
@@ -1003,17 +1003,22 @@ public:
/*
/*
* TUX index in TUP has single Uint32 array attribute which stores an
* TUX index in TUP has single Uint32 array attribute which stores an
* index node. TUX
uses following methods
.
* index node. TUX
reads and writes the node directly via pointer
.
*/
*/
int
tuxAllocNode
(
Signal
*
signal
,
Uint32
fragPtrI
,
Uint32
&
pageId
,
Uint32
&
pageOffset
,
Uint32
*&
node
);
int
tuxAllocNode
(
Signal
*
signal
,
Uint32
fragPtrI
,
Uint32
&
pageId
,
Uint32
&
pageOffset
,
Uint32
*&
node
);
void
tuxFreeNode
(
Signal
*
signal
,
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
*
node
);
void
tuxFreeNode
(
Signal
*
signal
,
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
*
node
);
void
tuxGetNode
(
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
*&
node
);
void
tuxGetNode
(
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
*&
node
);
/*
/*
* TUX reads primary table attributes for 1) index key 2) primary key
* TUX reads primary table attributes for index keys. Input is
* when returning keyinfo. TUX uses following methods.
* attribute ids in AttributeHeader format. Output is pointers to
* attribute data within tuple or 0 for NULL value.
*/
void
tuxReadAttrs
(
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
tupVersion
,
Uint32
numAttrs
,
const
Uint32
*
attrIds
,
const
Uint32
**
attrData
);
/*
* TUX reads primary key for md5 summing and when returning keyinfo.
*/
*/
void
tuxReadAttrs
();
// under construction
void
tuxReadKeys
();
// under construction
void
tuxReadKeys
();
// under construction
private
:
private
:
...
...
ndb/src/kernel/blocks/dbtup/DbtupIndex.cpp
View file @
0695325c
...
@@ -33,6 +33,7 @@
...
@@ -33,6 +33,7 @@
void
void
Dbtup
::
tuxGetTupAddr
(
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
&
tupAddr
)
Dbtup
::
tuxGetTupAddr
(
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
&
tupAddr
)
{
{
ljamEntry
();
FragrecordPtr
fragPtr
;
FragrecordPtr
fragPtr
;
fragPtr
.
i
=
fragPtrI
;
fragPtr
.
i
=
fragPtrI
;
ptrCheckGuard
(
fragPtr
,
cnoOfFragrec
,
fragrecord
);
ptrCheckGuard
(
fragPtr
,
cnoOfFragrec
,
fragrecord
);
...
@@ -54,6 +55,7 @@ Dbtup::tuxGetTupAddr(Uint32 fragPtrI, Uint32 pageId, Uint32 pageOffset, Uint32&
...
@@ -54,6 +55,7 @@ Dbtup::tuxGetTupAddr(Uint32 fragPtrI, Uint32 pageId, Uint32 pageOffset, Uint32&
int
int
Dbtup
::
tuxAllocNode
(
Signal
*
signal
,
Uint32
fragPtrI
,
Uint32
&
pageId
,
Uint32
&
pageOffset
,
Uint32
*&
node
)
Dbtup
::
tuxAllocNode
(
Signal
*
signal
,
Uint32
fragPtrI
,
Uint32
&
pageId
,
Uint32
&
pageOffset
,
Uint32
*&
node
)
{
{
ljamEntry
();
FragrecordPtr
fragPtr
;
FragrecordPtr
fragPtr
;
fragPtr
.
i
=
fragPtrI
;
fragPtr
.
i
=
fragPtrI
;
ptrCheckGuard
(
fragPtr
,
cnoOfFragrec
,
fragrecord
);
ptrCheckGuard
(
fragPtr
,
cnoOfFragrec
,
fragrecord
);
...
@@ -63,7 +65,7 @@ Dbtup::tuxAllocNode(Signal* signal, Uint32 fragPtrI, Uint32& pageId, Uint32& pag
...
@@ -63,7 +65,7 @@ Dbtup::tuxAllocNode(Signal* signal, Uint32 fragPtrI, Uint32& pageId, Uint32& pag
PagePtr
pagePtr
;
PagePtr
pagePtr
;
terrorCode
=
0
;
terrorCode
=
0
;
if
(
!
allocTh
(
fragPtr
.
p
,
tablePtr
.
p
,
NORMAL_PAGE
,
signal
,
pageOffset
,
pagePtr
))
{
if
(
!
allocTh
(
fragPtr
.
p
,
tablePtr
.
p
,
NORMAL_PAGE
,
signal
,
pageOffset
,
pagePtr
))
{
jam
();
l
jam
();
ndbrequire
(
terrorCode
!=
0
);
ndbrequire
(
terrorCode
!=
0
);
return
terrorCode
;
return
terrorCode
;
}
}
...
@@ -77,6 +79,7 @@ Dbtup::tuxAllocNode(Signal* signal, Uint32 fragPtrI, Uint32& pageId, Uint32& pag
...
@@ -77,6 +79,7 @@ Dbtup::tuxAllocNode(Signal* signal, Uint32 fragPtrI, Uint32& pageId, Uint32& pag
void
void
Dbtup
::
tuxFreeNode
(
Signal
*
signal
,
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
*
node
)
Dbtup
::
tuxFreeNode
(
Signal
*
signal
,
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
*
node
)
{
{
ljamEntry
();
FragrecordPtr
fragPtr
;
FragrecordPtr
fragPtr
;
fragPtr
.
i
=
fragPtrI
;
fragPtr
.
i
=
fragPtrI
;
ptrCheckGuard
(
fragPtr
,
cnoOfFragrec
,
fragrecord
);
ptrCheckGuard
(
fragPtr
,
cnoOfFragrec
,
fragrecord
);
...
@@ -95,6 +98,7 @@ Dbtup::tuxFreeNode(Signal* signal, Uint32 fragPtrI, Uint32 pageId, Uint32 pageOf
...
@@ -95,6 +98,7 @@ Dbtup::tuxFreeNode(Signal* signal, Uint32 fragPtrI, Uint32 pageId, Uint32 pageOf
void
void
Dbtup
::
tuxGetNode
(
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
*&
node
)
Dbtup
::
tuxGetNode
(
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
*&
node
)
{
{
ljamEntry
();
FragrecordPtr
fragPtr
;
FragrecordPtr
fragPtr
;
fragPtr
.
i
=
fragPtrI
;
fragPtr
.
i
=
fragPtrI
;
ptrCheckGuard
(
fragPtr
,
cnoOfFragrec
,
fragrecord
);
ptrCheckGuard
(
fragPtr
,
cnoOfFragrec
,
fragrecord
);
...
@@ -109,9 +113,62 @@ Dbtup::tuxGetNode(Uint32 fragPtrI, Uint32 pageId, Uint32 pageOffset, Uint32*& no
...
@@ -109,9 +113,62 @@ Dbtup::tuxGetNode(Uint32 fragPtrI, Uint32 pageId, Uint32 pageOffset, Uint32*& no
node
=
&
pagePtr
.
p
->
pageWord
[
pageOffset
]
+
attrDataOffset
;
node
=
&
pagePtr
.
p
->
pageWord
[
pageOffset
]
+
attrDataOffset
;
}
}
void
// under construction
void
Dbtup
::
tuxReadAttrs
()
Dbtup
::
tuxReadAttrs
(
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
tupVersion
,
Uint32
numAttrs
,
const
Uint32
*
attrIds
,
const
Uint32
**
attrData
)
{
{
ljamEntry
();
FragrecordPtr
fragPtr
;
fragPtr
.
i
=
fragPtrI
;
ptrCheckGuard
(
fragPtr
,
cnoOfFragrec
,
fragrecord
);
TablerecPtr
tablePtr
;
tablePtr
.
i
=
fragPtr
.
p
->
fragTableId
;
ptrCheckGuard
(
tablePtr
,
cnoOfTablerec
,
tablerec
);
PagePtr
pagePtr
;
pagePtr
.
i
=
pageId
;
ptrCheckGuard
(
pagePtr
,
cnoOfPage
,
page
);
// search for tuple version if not original
if
(
pagePtr
.
p
->
pageWord
[
pageOffset
+
1
]
!=
tupVersion
)
{
ljam
();
OperationrecPtr
opPtr
;
opPtr
.
i
=
pagePtr
.
p
->
pageWord
[
pageOffset
];
Uint32
loopGuard
=
0
;
while
(
true
)
{
ptrCheckGuard
(
opPtr
,
cnoOfOprec
,
operationrec
);
if
(
opPtr
.
p
->
realPageIdC
!=
RNIL
)
{
pagePtr
.
i
=
opPtr
.
p
->
realPageIdC
;
pageOffset
=
opPtr
.
p
->
pageOffsetC
;
ptrCheckGuard
(
pagePtr
,
cnoOfPage
,
page
);
if
(
pagePtr
.
p
->
pageWord
[
pageOffset
+
1
]
==
tupVersion
)
{
ljam
();
break
;
}
}
ljam
();
opPtr
.
i
=
opPtr
.
p
->
nextActiveOp
;
ndbrequire
(
++
loopGuard
<
(
1
<<
ZTUP_VERSION_BITS
));
}
}
const
Uint32
tabDescriptor
=
tablePtr
.
p
->
tabDescriptor
;
const
Uint32
*
tupleHeader
=
&
pagePtr
.
p
->
pageWord
[
pageOffset
];
for
(
Uint32
i
=
0
;
i
<
numAttrs
;
i
++
)
{
AttributeHeader
ah
(
attrIds
[
i
]);
Uint32
attrId
=
ah
.
getAttributeId
();
Uint32
index
=
tabDescriptor
+
(
attrId
<<
ZAD_LOG_SIZE
);
Uint32
desc1
=
tableDescriptor
[
index
].
tabDescr
;
Uint32
desc2
=
tableDescriptor
[
index
+
1
].
tabDescr
;
if
(
AttributeDescriptor
::
getNullable
(
desc1
))
{
Uint32
offset
=
AttributeOffset
::
getNullFlagOffset
(
desc2
);
ndbrequire
(
offset
<
tablePtr
.
p
->
tupNullWords
);
offset
+=
tablePtr
.
p
->
tupNullIndex
;
ndbrequire
(
offset
<
tablePtr
.
p
->
tupheadsize
);
if
(
AttributeOffset
::
isNULL
(
tupleHeader
[
offset
],
desc2
))
{
ljam
();
attrData
[
i
]
=
0
;
continue
;
}
}
attrData
[
i
]
=
tupleHeader
+
AttributeOffset
::
getOffset
(
desc2
);
}
}
}
void
// under construction
void
// under construction
...
@@ -259,10 +316,10 @@ Dbtup::execTUP_QUERY_TH(Signal* signal)
...
@@ -259,10 +316,10 @@ Dbtup::execTUP_QUERY_TH(Signal* signal)
for this transaction and savepoint id. If its tuple version equals
for this transaction and savepoint id. If its tuple version equals
the requested then we have a visible tuple otherwise not.
the requested then we have a visible tuple otherwise not.
*/
*/
jam
();
l
jam
();
Uint32
read_tupVersion
=
pagePtr
.
p
->
pageWord
[
tempOp
.
pageOffset
+
1
];
Uint32
read_tupVersion
=
pagePtr
.
p
->
pageWord
[
tempOp
.
pageOffset
+
1
];
if
(
read_tupVersion
==
req_tupVersion
)
{
if
(
read_tupVersion
==
req_tupVersion
)
{
jam
();
l
jam
();
ret_result
=
1
;
ret_result
=
1
;
}
}
}
}
...
@@ -580,7 +637,7 @@ Dbtup::buildIndex(Signal* signal, Uint32 buildPtrI)
...
@@ -580,7 +637,7 @@ Dbtup::buildIndex(Signal* signal, Uint32 buildPtrI)
tuple as a copy tuple. The original tuple is stable and is thus
tuple as a copy tuple. The original tuple is stable and is thus
preferrable to store in TUX.
preferrable to store in TUX.
*/
*/
jam
();
l
jam
();
ptrCheckGuard
(
pageOperPtr
,
cnoOfOprec
,
operationrec
);
ptrCheckGuard
(
pageOperPtr
,
cnoOfOprec
,
operationrec
);
realPageId
=
pageOperPtr
.
p
->
realPageId
;
realPageId
=
pageOperPtr
.
p
->
realPageId
;
pageOffset
=
pageOperPtr
.
p
->
pageOffset
;
pageOffset
=
pageOperPtr
.
p
->
pageOffset
;
...
...
ndb/src/kernel/blocks/dbtux/Dbtux.hpp
View file @
0695325c
...
@@ -20,6 +20,7 @@
...
@@ -20,6 +20,7 @@
#include <new>
#include <new>
#include <ndb_limits.h>
#include <ndb_limits.h>
#include <SimulatedBlock.hpp>
#include <SimulatedBlock.hpp>
#include <AttributeDescriptor.hpp>
#include <AttributeHeader.hpp>
#include <AttributeHeader.hpp>
#include <ArrayPool.hpp>
#include <ArrayPool.hpp>
#include <DataBuffer.hpp>
#include <DataBuffer.hpp>
...
@@ -84,6 +85,10 @@
...
@@ -84,6 +85,10 @@
#define jam() jamLine(90000 + __LINE__)
#define jam() jamLine(90000 + __LINE__)
#define jamEntry() jamEntryLine(90000 + __LINE__)
#define jamEntry() jamEntryLine(90000 + __LINE__)
#endif
#endif
#ifndef jam
#define jam() jamLine(__LINE__)
#define jamEntry() jamEntryLine(__LINE__)
#endif
#undef max
#undef max
#undef min
#undef min
...
@@ -115,7 +120,7 @@ private:
...
@@ -115,7 +120,7 @@ private:
struct
DescEnt
;
struct
DescEnt
;
/*
/*
* Pointer to
Uint32 data. Interpretation is context dependent
.
* Pointer to
array of Uint32
.
*/
*/
struct
Data
{
struct
Data
{
private:
private:
...
@@ -131,7 +136,7 @@ private:
...
@@ -131,7 +136,7 @@ private:
friend
class
Data
;
friend
class
Data
;
/*
/*
* Pointer to
constant Uint32 data
.
* Pointer to
array of constant Uint32
.
*/
*/
struct
ConstData
;
struct
ConstData
;
friend
struct
ConstData
;
friend
struct
ConstData
;
...
@@ -153,6 +158,11 @@ private:
...
@@ -153,6 +158,11 @@ private:
// AttributeHeader size is assumed to be 1 word
// AttributeHeader size is assumed to be 1 word
static
const
unsigned
AttributeHeaderSize
=
1
;
static
const
unsigned
AttributeHeaderSize
=
1
;
/*
* Array of pointers to TUP table attributes. Always read-on|y.
*/
typedef
const
Uint32
**
TableData
;
/*
/*
* Logical tuple address, "local key". Identifies table tuples.
* Logical tuple address, "local key". Identifies table tuples.
*/
*/
...
@@ -560,25 +570,11 @@ private:
...
@@ -560,25 +570,11 @@ private:
struct
SearchPar
;
struct
SearchPar
;
friend
struct
SearchPar
;
friend
struct
SearchPar
;
struct
SearchPar
{
struct
SearchPar
{
Const
Data
m_data
;
// input index key values
Table
Data
m_data
;
// input index key values
TreeEnt
m_ent
;
// input tuple and version
TreeEnt
m_ent
;
// input tuple and version
SearchPar
();
SearchPar
();
};
};
/*
* Attribute data comparison.
*/
struct
CmpPar
;
friend
struct
CmpPar
;
struct
CmpPar
{
ConstData
m_data1
;
// full search key
ConstData
m_data2
;
// full or prefix data
unsigned
m_len2
;
// words in data2 buffer
unsigned
m_first
;
// first attribute
unsigned
m_numEq
;
// number of initial equal attributes
CmpPar
();
};
/*
/*
* Scan bound comparison.
* Scan bound comparison.
*/
*/
...
@@ -672,7 +668,7 @@ private:
...
@@ -672,7 +668,7 @@ private:
/*
/*
* DbtuxCmp.cpp
* DbtuxCmp.cpp
*/
*/
int
cmp
TreeAttrs
(
const
Frag
&
frag
,
CmpPar
&
cmpPar
);
int
cmp
SearchKey
(
const
Frag
&
frag
,
unsigned
&
start
,
TableData
data1
,
ConstData
data2
,
unsigned
size2
=
MaxAttrDataSize
);
int
cmpScanBound
(
const
Frag
&
frag
,
const
BoundPar
boundPar
);
int
cmpScanBound
(
const
Frag
&
frag
,
const
BoundPar
boundPar
);
/*
/*
...
@@ -716,12 +712,23 @@ private:
...
@@ -716,12 +712,23 @@ private:
Uint32
c_internalStartPhase
;
Uint32
c_internalStartPhase
;
Uint32
c_typeOfStart
;
Uint32
c_typeOfStart
;
// buffers
// buffer for scan bounds and keyinfo (primary key)
Data
c_keyBuffer
;
// search key or scan bound
Data
c_dataBuffer
;
// array of index key attribute ids in AttributeHeader format
Data
c_keyAttrs
;
// search key data as pointers to TUP storage
TableData
c_searchKey
;
// current entry key data as pointers to TUP storage
TableData
c_entryKey
;
// inlined utils
// inlined utils
DescEnt
&
getDescEnt
(
Uint32
descPage
,
Uint32
descOff
);
DescEnt
&
getDescEnt
(
Uint32
descPage
,
Uint32
descOff
);
Uint32
getTupAddr
(
const
Frag
&
frag
,
const
TreeEnt
ent
);
Uint32
getTupAddr
(
const
Frag
&
frag
,
TreeEnt
ent
);
void
setKeyAttrs
(
const
Frag
&
frag
,
Data
keyAttrs
);
void
readKeyAttrs
(
const
Frag
&
frag
,
TreeEnt
ent
,
unsigned
start
,
ConstData
keyAttrs
,
TableData
keyData
);
static
unsigned
min
(
unsigned
x
,
unsigned
y
);
static
unsigned
min
(
unsigned
x
,
unsigned
y
);
static
unsigned
max
(
unsigned
x
,
unsigned
y
);
static
unsigned
max
(
unsigned
x
,
unsigned
y
);
};
};
...
@@ -1218,16 +1225,6 @@ Dbtux::SearchPar::SearchPar() :
...
@@ -1218,16 +1225,6 @@ Dbtux::SearchPar::SearchPar() :
{
{
}
}
inline
Dbtux
::
CmpPar
::
CmpPar
()
:
m_data1
(
0
),
m_data2
(
0
),
m_len2
(
0
),
m_first
(
0
),
m_numEq
(
0
)
{
}
inline
inline
Dbtux
::
BoundPar
::
BoundPar
()
:
Dbtux
::
BoundPar
::
BoundPar
()
:
m_data1
(
0
),
m_data1
(
0
),
...
@@ -1267,15 +1264,43 @@ Dbtux::getDescEnt(Uint32 descPage, Uint32 descOff)
...
@@ -1267,15 +1264,43 @@ Dbtux::getDescEnt(Uint32 descPage, Uint32 descOff)
}
}
inline
Uint32
inline
Uint32
Dbtux
::
getTupAddr
(
const
Frag
&
frag
,
const
TreeEnt
ent
)
Dbtux
::
getTupAddr
(
const
Frag
&
frag
,
TreeEnt
ent
)
{
{
const
Uint32
tableFragPtrI
=
frag
.
m_tupTableFragPtrI
[
ent
.
m_fragBit
];
const
Uint32
tableFragPtrI
=
frag
.
m_tupTableFragPtrI
[
ent
.
m_fragBit
];
const
TupLoc
tupLoc
=
ent
.
m_tupLoc
;
const
TupLoc
tupLoc
=
ent
.
m_tupLoc
;
Uint32
tupAddr
=
NullTupAddr
;
Uint32
tupAddr
=
NullTupAddr
;
c_tup
->
tuxGetTupAddr
(
tableFragPtrI
,
tupLoc
.
m_pageId
,
tupLoc
.
m_pageOffset
,
tupAddr
);
c_tup
->
tuxGetTupAddr
(
tableFragPtrI
,
tupLoc
.
m_pageId
,
tupLoc
.
m_pageOffset
,
tupAddr
);
jamEntry
();
return
tupAddr
;
return
tupAddr
;
}
}
inline
void
Dbtux
::
setKeyAttrs
(
const
Frag
&
frag
,
Data
keyAttrs
)
{
const
unsigned
numAttrs
=
frag
.
m_numAttrs
;
const
DescEnt
&
descEnt
=
getDescEnt
(
frag
.
m_descPage
,
frag
.
m_descOff
);
for
(
unsigned
i
=
0
;
i
<
numAttrs
;
i
++
)
{
const
DescAttr
&
descAttr
=
descEnt
.
m_descAttr
[
i
];
Uint32
size
=
AttributeDescriptor
::
getSizeInWords
(
descAttr
.
m_attrDesc
);
keyAttrs
.
ah
()
=
AttributeHeader
(
descAttr
.
m_primaryAttrId
,
size
);
keyAttrs
+=
1
;
}
}
inline
void
Dbtux
::
readKeyAttrs
(
const
Frag
&
frag
,
TreeEnt
ent
,
unsigned
start
,
ConstData
keyAttrs
,
TableData
keyData
)
{
const
Uint32
tableFragPtrI
=
frag
.
m_tupTableFragPtrI
[
ent
.
m_fragBit
];
const
TupLoc
tupLoc
=
ent
.
m_tupLoc
;
const
Uint32
tupVersion
=
ent
.
m_tupVersion
;
ndbrequire
(
start
<
frag
.
m_numAttrs
);
const
unsigned
numAttrs
=
frag
.
m_numAttrs
-
start
;
keyAttrs
+=
start
;
keyData
+=
start
;
c_tup
->
tuxReadAttrs
(
tableFragPtrI
,
tupLoc
.
m_pageId
,
tupLoc
.
m_pageOffset
,
tupVersion
,
numAttrs
,
keyAttrs
,
keyData
);
jamEntry
();
}
inline
unsigned
inline
unsigned
Dbtux
::
min
(
unsigned
x
,
unsigned
y
)
Dbtux
::
min
(
unsigned
x
,
unsigned
y
)
{
{
...
...
ndb/src/kernel/blocks/dbtux/DbtuxCmp.cpp
View file @
0695325c
...
@@ -25,43 +25,35 @@
...
@@ -25,43 +25,35 @@
* many (additional) initial attributes were equal.
* many (additional) initial attributes were equal.
*/
*/
int
int
Dbtux
::
cmp
TreeAttrs
(
const
Frag
&
frag
,
CmpPar
&
cmpPar
)
Dbtux
::
cmp
SearchKey
(
const
Frag
&
frag
,
unsigned
&
start
,
TableData
data1
,
ConstData
data2
,
unsigned
size2
)
{
{
const
unsigned
numAttrs
=
frag
.
m_numAttrs
;
const
DescEnt
&
descEnt
=
getDescEnt
(
frag
.
m_descPage
,
frag
.
m_descOff
);
const
DescEnt
&
descEnt
=
getDescEnt
(
frag
.
m_descPage
,
frag
.
m_descOff
);
ConstData
data1
=
cmpPar
.
m_data1
;
ConstData
data2
=
cmpPar
.
m_data2
;
// number of words of attribute data left
// number of words of attribute data left
unsigned
len2
=
cmpPar
.
m_len2
;
unsigned
len2
=
size2
;
const
unsigned
numAttrs
=
frag
.
m_numAttrs
;
// skip to right position in search key
unsigned
index
=
cmpPar
.
m_first
;
data1
+=
start
;
ndbrequire
(
index
<
numAttrs
);
// skip to right position in search key XXX do it before the call
for
(
unsigned
i
=
0
;
i
<
index
;
i
++
)
{
jam
();
data1
+=
AttributeHeaderSize
+
data1
.
ah
().
getDataSize
();
}
unsigned
numEq
=
0
;
int
ret
=
0
;
int
ret
=
0
;
while
(
index
<
numAttrs
)
{
while
(
start
<
numAttrs
)
{
if
(
len2
<
AttributeHeaderSize
)
{
if
(
len2
<
AttributeHeaderSize
)
{
jam
();
jam
();
ret
=
NdbSqlUtil
::
CmpUnknown
;
ret
=
NdbSqlUtil
::
CmpUnknown
;
break
;
break
;
}
}
len2
-=
AttributeHeaderSize
;
len2
-=
AttributeHeaderSize
;
if
(
!
data1
.
ah
().
isNULL
()
)
{
if
(
*
data1
!=
0
)
{
if
(
!
data2
.
ah
().
isNULL
())
{
if
(
!
data2
.
ah
().
isNULL
())
{
jam
();
jam
();
// current attribute
// current attribute
const
DescAttr
&
descAttr
=
descEnt
.
m_descAttr
[
index
];
const
DescAttr
&
descAttr
=
descEnt
.
m_descAttr
[
start
];
const
unsigned
typeId
=
descAttr
.
m_typeId
;
const
unsigned
typeId
=
descAttr
.
m_typeId
;
// full data size
// full data size
const
unsigned
size1
=
data1
.
ah
().
getDataSize
(
);
const
unsigned
size1
=
AttributeDescriptor
::
getSizeInWords
(
descAttr
.
m_attrDesc
);
ndbrequire
(
size1
!=
0
&&
size1
==
data2
.
ah
().
getDataSize
());
ndbrequire
(
size1
!=
0
&&
size1
==
data2
.
ah
().
getDataSize
());
const
unsigned
size2
=
min
(
size1
,
len2
);
const
unsigned
size2
=
min
(
size1
,
len2
);
len2
-=
size2
;
len2
-=
size2
;
// compare
// compare
const
Uint32
*
const
p1
=
&
data1
[
AttributeHeaderSize
]
;
const
Uint32
*
const
p1
=
*
data1
;
const
Uint32
*
const
p2
=
&
data2
[
AttributeHeaderSize
];
const
Uint32
*
const
p2
=
&
data2
[
AttributeHeaderSize
];
ret
=
NdbSqlUtil
::
cmp
(
typeId
,
p1
,
p2
,
size1
,
size2
);
ret
=
NdbSqlUtil
::
cmp
(
typeId
,
p1
,
p2
,
size1
,
size2
);
if
(
ret
!=
0
)
{
if
(
ret
!=
0
)
{
...
@@ -82,14 +74,12 @@ Dbtux::cmpTreeAttrs(const Frag& frag, CmpPar& cmpPar)
...
@@ -82,14 +74,12 @@ Dbtux::cmpTreeAttrs(const Frag& frag, CmpPar& cmpPar)
break
;
break
;
}
}
}
}
data1
+=
AttributeHeaderSize
+
data1
.
ah
().
getDataSize
()
;
data1
+=
1
;
data2
+=
AttributeHeaderSize
+
data2
.
ah
().
getDataSize
();
data2
+=
AttributeHeaderSize
+
data2
.
ah
().
getDataSize
();
numEq
++
;
start
++
;
index
++
;
}
}
// XXX until data format errors are handled
// XXX until data format errors are handled
ndbrequire
(
ret
!=
NdbSqlUtil
::
CmpError
);
ndbrequire
(
ret
!=
NdbSqlUtil
::
CmpError
);
cmpPar
.
m_numEq
+=
numEq
;
// add to previous count
return
ret
;
return
ret
;
}
}
...
...
ndb/src/kernel/blocks/dbtux/DbtuxGen.cpp
View file @
0695325c
...
@@ -30,7 +30,7 @@ Dbtux::Dbtux(const Configuration& conf) :
...
@@ -30,7 +30,7 @@ Dbtux::Dbtux(const Configuration& conf) :
#endif
#endif
c_internalStartPhase
(
0
),
c_internalStartPhase
(
0
),
c_typeOfStart
(
NodeState
::
ST_ILLEGAL_TYPE
),
c_typeOfStart
(
NodeState
::
ST_ILLEGAL_TYPE
),
c_
key
Buffer
(
0
)
c_
data
Buffer
(
0
)
{
{
BLOCK_CONSTRUCTOR
(
Dbtux
);
BLOCK_CONSTRUCTOR
(
Dbtux
);
// verify size assumptions (also when release-compiled)
// verify size assumptions (also when release-compiled)
...
@@ -195,7 +195,10 @@ Dbtux::execREAD_CONFIG_REQ(Signal* signal)
...
@@ -195,7 +195,10 @@ Dbtux::execREAD_CONFIG_REQ(Signal* signal)
new
(
indexPtr
.
p
)
Index
();
new
(
indexPtr
.
p
)
Index
();
}
}
// allocate buffers
// allocate buffers
c_keyBuffer
=
(
Uint32
*
)
allocRecord
(
"c_keyBuffer"
,
sizeof
(
Uint64
),
(
MaxAttrDataSize
+
1
)
>>
1
);
c_dataBuffer
=
(
Uint32
*
)
allocRecord
(
"c_dataBuffer"
,
sizeof
(
Uint64
),
(
MaxAttrDataSize
+
1
)
>>
1
);
c_keyAttrs
=
(
Uint32
*
)
allocRecord
(
"c_keyAttrs"
,
sizeof
(
Uint32
),
MaxIndexAttributes
);
c_searchKey
=
(
TableData
)
allocRecord
(
"c_searchKey"
,
sizeof
(
Uint32
*
),
MaxIndexAttributes
);
c_entryKey
=
(
TableData
)
allocRecord
(
"c_entryKey"
,
sizeof
(
Uint32
*
),
MaxIndexAttributes
);
// ack
// ack
ReadConfigConf
*
conf
=
(
ReadConfigConf
*
)
signal
->
getDataPtrSend
();
ReadConfigConf
*
conf
=
(
ReadConfigConf
*
)
signal
->
getDataPtrSend
();
conf
->
senderRef
=
reference
();
conf
->
senderRef
=
reference
();
...
...
ndb/src/kernel/blocks/dbtux/DbtuxMaint.cpp
View file @
0695325c
...
@@ -73,30 +73,25 @@ Dbtux::execTUX_MAINT_REQ(Signal* signal)
...
@@ -73,30 +73,25 @@ Dbtux::execTUX_MAINT_REQ(Signal* signal)
}
}
ndbrequire
(
fragPtr
.
i
!=
RNIL
);
ndbrequire
(
fragPtr
.
i
!=
RNIL
);
Frag
&
frag
=
*
fragPtr
.
p
;
Frag
&
frag
=
*
fragPtr
.
p
;
// set up index entry
// set up index keys for this operation
setKeyAttrs
(
frag
,
c_keyAttrs
);
// set up search entry
TreeEnt
ent
;
TreeEnt
ent
;
ent
.
m_tupLoc
=
TupLoc
(
req
->
pageId
,
req
->
pageOffset
);
ent
.
m_tupLoc
=
TupLoc
(
req
->
pageId
,
req
->
pageOffset
);
ent
.
m_tupVersion
=
req
->
tupVersion
;
ent
.
m_tupVersion
=
req
->
tupVersion
;
ent
.
m_fragBit
=
fragBit
;
ent
.
m_fragBit
=
fragBit
;
// read search key
// read search key
ReadPar
readPar
;
readKeyAttrs
(
frag
,
ent
,
0
,
c_keyAttrs
,
c_searchKey
);
readPar
.
m_ent
=
ent
;
readPar
.
m_first
=
0
;
readPar
.
m_count
=
frag
.
m_numAttrs
;
// output goes here
readPar
.
m_data
=
c_keyBuffer
;
tupReadAttrs
(
signal
,
frag
,
readPar
);
// check if all keys are null
// check if all keys are null
{
{
const
unsigned
numAttrs
=
frag
.
m_numAttrs
;
bool
allNull
=
true
;
bool
allNull
=
true
;
ConstData
data
=
readPar
.
m_data
;
for
(
unsigned
i
=
0
;
i
<
numAttrs
;
i
++
)
{
for
(
unsigned
i
=
0
;
i
<
frag
.
m_numAttrs
;
i
++
)
{
if
(
c_searchKey
[
i
]
!=
0
)
{
if
(
!
data
.
ah
().
isNULL
())
{
jam
();
jam
();
allNull
=
false
;
allNull
=
false
;
break
;
break
;
}
}
data
+=
AttributeHeaderSize
+
data
.
ah
().
getDataSize
();
}
}
if
(
allNull
)
{
if
(
allNull
)
{
jam
();
jam
();
...
@@ -107,7 +102,7 @@ Dbtux::execTUX_MAINT_REQ(Signal* signal)
...
@@ -107,7 +102,7 @@ Dbtux::execTUX_MAINT_REQ(Signal* signal)
}
}
// find position in tree
// find position in tree
SearchPar
searchPar
;
SearchPar
searchPar
;
searchPar
.
m_data
=
c_
keyBuffer
;
searchPar
.
m_data
=
c_
searchKey
;
searchPar
.
m_ent
=
ent
;
searchPar
.
m_ent
=
ent
;
TreePos
treePos
;
TreePos
treePos
;
#ifdef VM_TRACE
#ifdef VM_TRACE
...
...
ndb/src/kernel/blocks/dbtux/DbtuxNode.cpp
View file @
0695325c
...
@@ -28,6 +28,7 @@ Dbtux::allocNode(Signal* signal, NodeHandle& node)
...
@@ -28,6 +28,7 @@ Dbtux::allocNode(Signal* signal, NodeHandle& node)
Uint32
pageOffset
=
NullTupLoc
.
m_pageOffset
;
Uint32
pageOffset
=
NullTupLoc
.
m_pageOffset
;
Uint32
*
node32
=
0
;
Uint32
*
node32
=
0
;
int
errorCode
=
c_tup
->
tuxAllocNode
(
signal
,
frag
.
m_tupIndexFragPtrI
,
pageId
,
pageOffset
,
node32
);
int
errorCode
=
c_tup
->
tuxAllocNode
(
signal
,
frag
.
m_tupIndexFragPtrI
,
pageId
,
pageOffset
,
node32
);
jamEntry
();
if
(
errorCode
==
0
)
{
if
(
errorCode
==
0
)
{
jam
();
jam
();
node
.
m_loc
=
TupLoc
(
pageId
,
pageOffset
);
node
.
m_loc
=
TupLoc
(
pageId
,
pageOffset
);
...
@@ -63,6 +64,7 @@ Dbtux::selectNode(Signal* signal, NodeHandle& node, TupLoc loc, AccSize acc)
...
@@ -63,6 +64,7 @@ Dbtux::selectNode(Signal* signal, NodeHandle& node, TupLoc loc, AccSize acc)
Uint32
pageOffset
=
loc
.
m_pageOffset
;
Uint32
pageOffset
=
loc
.
m_pageOffset
;
Uint32
*
node32
=
0
;
Uint32
*
node32
=
0
;
c_tup
->
tuxGetNode
(
frag
.
m_tupIndexFragPtrI
,
pageId
,
pageOffset
,
node32
);
c_tup
->
tuxGetNode
(
frag
.
m_tupIndexFragPtrI
,
pageId
,
pageOffset
,
node32
);
jamEntry
();
node
.
m_loc
=
loc
;
node
.
m_loc
=
loc
;
node
.
m_node
=
reinterpret_cast
<
TreeNode
*>
(
node32
);
node
.
m_node
=
reinterpret_cast
<
TreeNode
*>
(
node32
);
node
.
m_acc
=
AccNone
;
node
.
m_acc
=
AccNone
;
...
@@ -103,6 +105,7 @@ Dbtux::deleteNode(Signal* signal, NodeHandle& node)
...
@@ -103,6 +105,7 @@ Dbtux::deleteNode(Signal* signal, NodeHandle& node)
Uint32
pageOffset
=
loc
.
m_pageOffset
;
Uint32
pageOffset
=
loc
.
m_pageOffset
;
Uint32
*
node32
=
reinterpret_cast
<
Uint32
*>
(
node
.
m_node
);
Uint32
*
node32
=
reinterpret_cast
<
Uint32
*>
(
node
.
m_node
);
c_tup
->
tuxFreeNode
(
signal
,
frag
.
m_tupIndexFragPtrI
,
pageId
,
pageOffset
,
node32
);
c_tup
->
tuxFreeNode
(
signal
,
frag
.
m_tupIndexFragPtrI
,
pageId
,
pageOffset
,
node32
);
jamEntry
();
// invalidate handle and storage
// invalidate handle and storage
node
.
m_loc
=
NullTupLoc
;
node
.
m_loc
=
NullTupLoc
;
node
.
m_node
=
0
;
node
.
m_node
=
0
;
...
...
ndb/src/kernel/blocks/dbtux/DbtuxScan.cpp
View file @
0695325c
...
@@ -390,7 +390,7 @@ Dbtux::execACC_CHECK_SCAN(Signal* signal)
...
@@ -390,7 +390,7 @@ Dbtux::execACC_CHECK_SCAN(Signal* signal)
const
TreeEnt
ent
=
scan
.
m_scanPos
.
m_ent
;
const
TreeEnt
ent
=
scan
.
m_scanPos
.
m_ent
;
// read tuple key
// read tuple key
keyPar
.
m_ent
=
ent
;
keyPar
.
m_ent
=
ent
;
keyPar
.
m_data
=
c_
key
Buffer
;
keyPar
.
m_data
=
c_
data
Buffer
;
tupReadKeys
(
signal
,
frag
,
keyPar
);
tupReadKeys
(
signal
,
frag
,
keyPar
);
// get read lock or exclusive lock
// get read lock or exclusive lock
AccLockReq
*
const
lockReq
=
(
AccLockReq
*
)
signal
->
getDataPtrSend
();
AccLockReq
*
const
lockReq
=
(
AccLockReq
*
)
signal
->
getDataPtrSend
();
...
@@ -483,7 +483,7 @@ Dbtux::execACC_CHECK_SCAN(Signal* signal)
...
@@ -483,7 +483,7 @@ Dbtux::execACC_CHECK_SCAN(Signal* signal)
if
(
keyPar
.
m_data
==
0
)
{
if
(
keyPar
.
m_data
==
0
)
{
jam
();
jam
();
keyPar
.
m_ent
=
ent
;
keyPar
.
m_ent
=
ent
;
keyPar
.
m_data
=
c_
key
Buffer
;
keyPar
.
m_data
=
c_
data
Buffer
;
tupReadKeys
(
signal
,
frag
,
keyPar
);
tupReadKeys
(
signal
,
frag
,
keyPar
);
}
}
}
}
...
@@ -704,12 +704,12 @@ Dbtux::scanFirst(Signal* signal, ScanOpPtr scanPtr)
...
@@ -704,12 +704,12 @@ Dbtux::scanFirst(Signal* signal, ScanOpPtr scanPtr)
bound
.
first
(
iter
);
bound
.
first
(
iter
);
for
(
unsigned
j
=
0
;
j
<
bound
.
getSize
();
j
++
)
{
for
(
unsigned
j
=
0
;
j
<
bound
.
getSize
();
j
++
)
{
jam
();
jam
();
c_
key
Buffer
[
j
]
=
*
iter
.
data
;
c_
data
Buffer
[
j
]
=
*
iter
.
data
;
bound
.
next
(
iter
);
bound
.
next
(
iter
);
}
}
// comparison parameters
// comparison parameters
BoundPar
boundPar
;
BoundPar
boundPar
;
boundPar
.
m_data1
=
c_
key
Buffer
;
boundPar
.
m_data1
=
c_
data
Buffer
;
boundPar
.
m_count1
=
scan
.
m_boundCnt
[
0
];
boundPar
.
m_count1
=
scan
.
m_boundCnt
[
0
];
boundPar
.
m_dir
=
0
;
boundPar
.
m_dir
=
0
;
loop:
{
loop:
{
...
@@ -847,12 +847,12 @@ Dbtux::scanNext(Signal* signal, ScanOpPtr scanPtr)
...
@@ -847,12 +847,12 @@ Dbtux::scanNext(Signal* signal, ScanOpPtr scanPtr)
bound
.
first
(
iter
);
bound
.
first
(
iter
);
for
(
unsigned
j
=
0
;
j
<
bound
.
getSize
();
j
++
)
{
for
(
unsigned
j
=
0
;
j
<
bound
.
getSize
();
j
++
)
{
jam
();
jam
();
c_
key
Buffer
[
j
]
=
*
iter
.
data
;
c_
data
Buffer
[
j
]
=
*
iter
.
data
;
bound
.
next
(
iter
);
bound
.
next
(
iter
);
}
}
// comparison parameters
// comparison parameters
BoundPar
boundPar
;
BoundPar
boundPar
;
boundPar
.
m_data1
=
c_
key
Buffer
;
boundPar
.
m_data1
=
c_
data
Buffer
;
boundPar
.
m_count1
=
scan
.
m_boundCnt
[
1
];
boundPar
.
m_count1
=
scan
.
m_boundCnt
[
1
];
boundPar
.
m_dir
=
1
;
boundPar
.
m_dir
=
1
;
// use copy of position
// use copy of position
...
...
ndb/src/kernel/blocks/dbtux/DbtuxTree.cpp
View file @
0695325c
...
@@ -45,36 +45,28 @@ loop: {
...
@@ -45,36 +45,28 @@ loop: {
const
unsigned
occup
=
node
.
getOccup
();
const
unsigned
occup
=
node
.
getOccup
();
ndbrequire
(
occup
!=
0
);
ndbrequire
(
occup
!=
0
);
// number of equal initial attributes in bounding node
// number of equal initial attributes in bounding node
unsigned
numEq
=
ZNIL
;
unsigned
start
=
ZNIL
;
for
(
unsigned
i
=
0
;
i
<=
1
;
i
++
)
{
for
(
unsigned
i
=
0
;
i
<=
1
;
i
++
)
{
jam
();
jam
();
unsigned
start1
=
0
;
// compare prefix
// compare prefix
CmpPar
cmpPar
;
int
ret
=
cmpSearchKey
(
frag
,
start1
,
searchPar
.
m_data
,
node
.
getPref
(
i
),
tree
.
m_prefSize
);
cmpPar
.
m_data1
=
searchPar
.
m_data
;
cmpPar
.
m_data2
=
node
.
getPref
(
i
);
cmpPar
.
m_len2
=
tree
.
m_prefSize
;
cmpPar
.
m_first
=
0
;
cmpPar
.
m_numEq
=
0
;
int
ret
=
cmpTreeAttrs
(
frag
,
cmpPar
);
if
(
ret
==
NdbSqlUtil
::
CmpUnknown
)
{
if
(
ret
==
NdbSqlUtil
::
CmpUnknown
)
{
jam
();
jam
();
// read full value
// read full value
ReadPar
readPar
;
ReadPar
readPar
;
readPar
.
m_ent
=
node
.
getMinMax
(
i
);
readPar
.
m_ent
=
node
.
getMinMax
(
i
);
ndbrequire
(
cmpPar
.
m_numEq
<
numAttrs
);
ndbrequire
(
start1
<
numAttrs
);
readPar
.
m_first
=
cmpPar
.
m_numEq
;
readPar
.
m_first
=
start1
;
readPar
.
m_count
=
numAttrs
-
cmpPar
.
m_numEq
;
readPar
.
m_count
=
numAttrs
-
start1
;
readPar
.
m_data
=
0
;
// leave in signal data
readPar
.
m_data
=
0
;
// leave in signal data
tupReadAttrs
(
signal
,
frag
,
readPar
);
tupReadAttrs
(
signal
,
frag
,
readPar
);
// compare full value
// compare full value
cmpPar
.
m_data2
=
readPar
.
m_data
;
ret
=
cmpSearchKey
(
frag
,
start1
,
searchPar
.
m_data
,
readPar
.
m_data
);
cmpPar
.
m_len2
=
ZNIL
;
// big
cmpPar
.
m_first
=
readPar
.
m_first
;
ret
=
cmpTreeAttrs
(
frag
,
cmpPar
);
ndbrequire
(
ret
!=
NdbSqlUtil
::
CmpUnknown
);
ndbrequire
(
ret
!=
NdbSqlUtil
::
CmpUnknown
);
}
}
if
(
numEq
>
cmpPar
.
m_numEq
)
if
(
start
>
start1
)
numEq
=
cmpPar
.
m_numEq
;
start
=
start1
;
if
(
ret
==
0
)
{
if
(
ret
==
0
)
{
jam
();
jam
();
// keys are equal, compare entry values
// keys are equal, compare entry values
...
@@ -111,21 +103,17 @@ loop: {
...
@@ -111,21 +103,17 @@ loop: {
jam
();
jam
();
int
ret
=
0
;
int
ret
=
0
;
// compare remaining attributes
// compare remaining attributes
if
(
numEq
<
numAttrs
)
{
if
(
start
<
numAttrs
)
{
jam
();
jam
();
ReadPar
readPar
;
ReadPar
readPar
;
readPar
.
m_ent
=
node
.
getEnt
(
j
);
readPar
.
m_ent
=
node
.
getEnt
(
j
);
readPar
.
m_first
=
numEq
;
readPar
.
m_first
=
start
;
readPar
.
m_count
=
numAttrs
-
numEq
;
readPar
.
m_count
=
numAttrs
-
start
;
readPar
.
m_data
=
0
;
// leave in signal data
readPar
.
m_data
=
0
;
// leave in signal data
tupReadAttrs
(
signal
,
frag
,
readPar
);
tupReadAttrs
(
signal
,
frag
,
readPar
);
// compare
// compare
CmpPar
cmpPar
;
unsigned
start1
=
start
;
cmpPar
.
m_data1
=
searchPar
.
m_data
;
ret
=
cmpSearchKey
(
frag
,
start1
,
searchPar
.
m_data
,
readPar
.
m_data
);
cmpPar
.
m_data2
=
readPar
.
m_data
;
cmpPar
.
m_len2
=
ZNIL
;
// big
cmpPar
.
m_first
=
readPar
.
m_first
;
ret
=
cmpTreeAttrs
(
frag
,
cmpPar
);
ndbrequire
(
ret
!=
NdbSqlUtil
::
CmpUnknown
);
ndbrequire
(
ret
!=
NdbSqlUtil
::
CmpUnknown
);
}
}
if
(
ret
==
0
)
{
if
(
ret
==
0
)
{
...
...
ndb/src/kernel/blocks/dbtux/Times.txt
View file @
0695325c
...
@@ -40,5 +40,7 @@ optim 7 mc02/a 42 ms 69 ms 61 pct
...
@@ -40,5 +40,7 @@ optim 7 mc02/a 42 ms 69 ms 61 pct
optim 8 mc02/a 42 ms 69 ms 62 pct
optim 8 mc02/a 42 ms 69 ms 62 pct
mc02/b 54 ms 104 ms 92 pct
mc02/b 54 ms 104 ms 92 pct
optim 9 mc02/a 43 ms 67 ms 54 pct
mc02/b 53 ms 102 ms 91 pct
vim: set et:
vim: set et:
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