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
b5d77b3a
Commit
b5d77b3a
authored
Sep 16, 2004
by
unknown
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ndb charsets: TUX must use Dbtup::readAttributes
parent
69b9bbdb
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
161 additions
and
261 deletions
+161
-261
ndb/src/kernel/blocks/dbtup/Dbtup.hpp
ndb/src/kernel/blocks/dbtup/Dbtup.hpp
+10
-7
ndb/src/kernel/blocks/dbtup/DbtupIndex.cpp
ndb/src/kernel/blocks/dbtup/DbtupIndex.cpp
+63
-40
ndb/src/kernel/blocks/dbtup/DbtupRoutines.cpp
ndb/src/kernel/blocks/dbtup/DbtupRoutines.cpp
+1
-1
ndb/src/kernel/blocks/dbtux/Dbtux.hpp
ndb/src/kernel/blocks/dbtux/Dbtux.hpp
+23
-20
ndb/src/kernel/blocks/dbtux/DbtuxCmp.cpp
ndb/src/kernel/blocks/dbtux/DbtuxCmp.cpp
+18
-139
ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp
ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp
+2
-6
ndb/src/kernel/blocks/dbtux/DbtuxGen.cpp
ndb/src/kernel/blocks/dbtux/DbtuxGen.cpp
+40
-44
ndb/src/kernel/blocks/dbtux/DbtuxScan.cpp
ndb/src/kernel/blocks/dbtux/DbtuxScan.cpp
+2
-2
ndb/src/kernel/blocks/dbtux/DbtuxSearch.cpp
ndb/src/kernel/blocks/dbtux/DbtuxSearch.cpp
+2
-2
No files found.
ndb/src/kernel/blocks/dbtup/Dbtup.hpp
View file @
b5d77b3a
...
...
@@ -1004,17 +1004,20 @@ public:
void
tuxGetNode
(
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
*&
node
);
/*
* TUX reads primary table attributes for index keys. Input is
* attribute ids in AttributeHeader format. Output is pointers to
* attribute data within tuple or 0 for NULL value.
* TUX reads primary table attributes for index keys. Tuple is
* specified by location of original tuple and version number. Input
* is attribute ids in AttributeHeader format. Output is attribute
* data with headers. Uses readAttributes with xfrm option set.
* Returns number of words or negative (-terrorCode) on error.
*/
void
tuxReadAttrs
(
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
tupVersion
,
Uint32
numAttrs
,
const
Uint32
*
attrIds
,
const
Uint32
**
attrData
);
int
tuxReadAttrs
(
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
tupVersion
,
const
Uint32
*
attrIds
,
Uint32
numAttrs
,
Uint32
*
dataOut
);
/*
* TUX reads primary key without headers into an array of words. Used
* for md5 summing and when returning keyinfo.
* for md5 summing and when returning keyinfo. Returns number of
* words or negative (-terrorCode) on error.
*/
void
tuxReadKeys
(
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
*
pkSize
,
Uint32
*
pkData
);
int
tuxReadPk
(
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
*
dataOut
);
/*
* TUX checks if tuple is visible to scan.
...
...
@@ -1368,7 +1371,7 @@ private:
//------------------------------------------------------------------
int
readAttributes
(
Page
*
const
pagePtr
,
Uint32
TupHeadOffset
,
Uint32
*
inBuffer
,
const
Uint32
*
inBuffer
,
Uint32
inBufLen
,
Uint32
*
outBuffer
,
Uint32
TmaxRead
);
...
...
ndb/src/kernel/blocks/dbtup/DbtupIndex.cpp
View file @
b5d77b3a
...
...
@@ -112,10 +112,11 @@ Dbtup::tuxGetNode(Uint32 fragPtrI, Uint32 pageId, Uint32 pageOffset, Uint32*& no
node
=
&
pagePtr
.
p
->
pageWord
[
pageOffset
]
+
attrDataOffset
;
}
void
Dbtup
::
tuxReadAttrs
(
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
tupVersion
,
Uint32
numAttrs
,
const
Uint32
*
attrIds
,
const
Uint32
**
attrData
)
int
Dbtup
::
tuxReadAttrs
(
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
tupVersion
,
const
Uint32
*
attrIds
,
Uint32
numAttrs
,
Uint32
*
dataOut
)
{
ljamEntry
();
// use own variables instead of globals
FragrecordPtr
fragPtr
;
fragPtr
.
i
=
fragPtrI
;
ptrCheckGuard
(
fragPtr
,
cnoOfFragrec
,
fragrecord
);
...
...
@@ -134,6 +135,7 @@ Dbtup::tuxReadAttrs(Uint32 fragPtrI, Uint32 pageId, Uint32 pageOffset, Uint32 tu
while
(
true
)
{
ptrCheckGuard
(
opPtr
,
cnoOfOprec
,
operationrec
);
if
(
opPtr
.
p
->
realPageIdC
!=
RNIL
)
{
// update page and offset
pagePtr
.
i
=
opPtr
.
p
->
realPageIdC
;
pageOffset
=
opPtr
.
p
->
pageOffsetC
;
ptrCheckGuard
(
pagePtr
,
cnoOfPage
,
page
);
...
...
@@ -147,33 +149,34 @@ Dbtup::tuxReadAttrs(Uint32 fragPtrI, Uint32 pageId, Uint32 pageOffset, Uint32 tu
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
]);
const
Uint32
attrId
=
ah
.
getAttributeId
();
const
Uint32
index
=
tabDescriptor
+
(
attrId
<<
ZAD_LOG_SIZE
);
const
Uint32
desc1
=
tableDescriptor
[
index
].
tabDescr
;
const
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
);
// read key attributes from found tuple version
// save globals
TablerecPtr
tabptr_old
=
tabptr
;
FragrecordPtr
fragptr_old
=
fragptr
;
OperationrecPtr
operPtr_old
=
operPtr
;
// new globals
tabptr
=
tablePtr
;
fragptr
=
fragPtr
;
operPtr
.
i
=
RNIL
;
operPtr
.
p
=
NULL
;
// do it
int
ret
=
readAttributes
(
pagePtr
.
p
,
pageOffset
,
attrIds
,
numAttrs
,
dataOut
,
ZNIL
);
// restore globals
tabptr
=
tabptr_old
;
fragptr
=
fragptr_old
;
operPtr
=
operPtr_old
;
// done
if
(
ret
==
(
Uint32
)
-
1
)
{
ret
=
terrorCode
?
(
-
(
int
)
terrorCode
)
:
-
1
;
}
return
ret
;
}
void
Dbtup
::
tuxRead
Keys
(
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
*
pkSize
,
Uint32
*
pkData
)
int
Dbtup
::
tuxRead
Pk
(
Uint32
fragPtrI
,
Uint32
pageId
,
Uint32
pageOffset
,
Uint32
*
dataOut
)
{
ljamEntry
();
// use own variables instead of globals
FragrecordPtr
fragPtr
;
fragPtr
.
i
=
fragPtrI
;
ptrCheckGuard
(
fragPtr
,
cnoOfFragrec
,
fragrecord
);
...
...
@@ -184,25 +187,45 @@ Dbtup::tuxReadKeys(Uint32 fragPtrI, Uint32 pageId, Uint32 pageOffset, Uint32* pk
pagePtr
.
i
=
pageId
;
ptrCheckGuard
(
pagePtr
,
cnoOfPage
,
page
);
const
Uint32
tabDescriptor
=
tablePtr
.
p
->
tabDescriptor
;
const
Uint32
numAttrs
=
tablePtr
.
p
->
noOfKeyAttr
;
const
Uint32
*
attrIds
=
&
tableDescriptor
[
tablePtr
.
p
->
readKeyArray
].
tabDescr
;
const
Uint32
*
tupleHeader
=
&
pagePtr
.
p
->
pageWord
[
pageOffset
];
Uint32
size
=
0
;
for
(
Uint32
i
=
0
;
i
<
numAttrs
;
i
++
)
{
AttributeHeader
ah
(
attrIds
[
i
]);
const
Uint32
attrId
=
ah
.
getAttributeId
();
const
Uint32
index
=
tabDescriptor
+
(
attrId
<<
ZAD_LOG_SIZE
);
const
Uint32
desc1
=
tableDescriptor
[
index
].
tabDescr
;
const
Uint32
desc2
=
tableDescriptor
[
index
+
1
].
tabDescr
;
ndbrequire
(
!
AttributeDescriptor
::
getNullable
(
desc1
));
const
Uint32
attrSize
=
AttributeDescriptor
::
getSizeInWords
(
desc1
);
const
Uint32
*
attrData
=
tupleHeader
+
AttributeOffset
::
getOffset
(
desc2
);
for
(
Uint32
j
=
0
;
j
<
attrSize
;
j
++
)
{
pkData
[
size
+
j
]
=
attrData
[
j
];
const
Uint32
numAttrs
=
tablePtr
.
p
->
noOfKeyAttr
;
// read pk attributes from original tuple
// save globals
TablerecPtr
tabptr_old
=
tabptr
;
FragrecordPtr
fragptr_old
=
fragptr
;
OperationrecPtr
operPtr_old
=
operPtr
;
// new globals
tabptr
=
tablePtr
;
fragptr
=
fragPtr
;
operPtr
.
i
=
RNIL
;
operPtr
.
p
=
NULL
;
// do it
int
ret
=
readAttributes
(
pagePtr
.
p
,
pageOffset
,
attrIds
,
numAttrs
,
dataOut
,
ZNIL
);
// restore globals
tabptr
=
tabptr_old
;
fragptr
=
fragptr_old
;
operPtr
=
operPtr_old
;
// done
if
(
ret
!=
(
Uint32
)
-
1
)
{
// remove headers
Uint32
n
=
0
;
Uint32
i
=
0
;
while
(
n
<
numAttrs
)
{
const
AttributeHeader
ah
(
dataOut
[
i
]);
Uint32
size
=
ah
.
getDataSize
();
ndbrequire
(
size
!=
0
);
for
(
Uint32
j
=
0
;
j
<
size
;
j
++
)
{
dataOut
[
i
+
j
-
n
]
=
dataOut
[
i
+
j
+
1
];
}
n
+=
1
;
i
+=
1
+
size
;
}
size
+=
attrSize
;
ndbrequire
(
i
==
ret
);
ret
-=
numAttrs
;
}
else
{
ret
=
terrorCode
?
(
-
(
int
)
terrorCode
)
:
-
1
;
}
*
pkSize
=
size
;
return
ret
;
}
bool
...
...
ndb/src/kernel/blocks/dbtup/DbtupRoutines.cpp
View file @
b5d77b3a
...
...
@@ -146,7 +146,7 @@ Dbtup::setUpQueryRoutines(Tablerec* const regTabPtr)
/* ---------------------------------------------------------------- */
int
Dbtup
::
readAttributes
(
Page
*
const
pagePtr
,
Uint32
tupHeadOffset
,
Uint32
*
inBuffer
,
const
Uint32
*
inBuffer
,
Uint32
inBufLen
,
Uint32
*
outBuffer
,
Uint32
maxRead
)
...
...
ndb/src/kernel/blocks/dbtux/Dbtux.hpp
View file @
b5d77b3a
...
...
@@ -162,11 +162,6 @@ private:
// AttributeHeader size is assumed to be 1 word
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.
*/
...
...
@@ -557,9 +552,9 @@ private:
void
execREAD_CONFIG_REQ
(
Signal
*
signal
);
// utils
void
setKeyAttrs
(
const
Frag
&
frag
);
void
readKeyAttrs
(
const
Frag
&
frag
,
TreeEnt
ent
,
unsigned
start
,
Table
Data
keyData
);
void
readTablePk
(
const
Frag
&
frag
,
TreeEnt
ent
,
unsigned
&
pkSize
,
Data
pkData
);
void
copyAttrs
(
const
Frag
&
frag
,
Table
Data
data1
,
Data
data2
,
unsigned
maxlen2
=
MaxAttrDataSize
);
void
readKeyAttrs
(
const
Frag
&
frag
,
TreeEnt
ent
,
unsigned
start
,
Data
keyData
);
void
readTablePk
(
const
Frag
&
frag
,
TreeEnt
ent
,
Data
pkData
,
unsigned
&
pkSize
);
void
copyAttrs
(
const
Frag
&
frag
,
Const
Data
data1
,
Data
data2
,
unsigned
maxlen2
=
MaxAttrDataSize
);
/*
* DbtuxMeta.cpp
...
...
@@ -626,17 +621,15 @@ private:
/*
* DbtuxSearch.cpp
*/
void
searchToAdd
(
Signal
*
signal
,
Frag
&
frag
,
Table
Data
searchKey
,
TreeEnt
searchEnt
,
TreePos
&
treePos
);
void
searchToRemove
(
Signal
*
signal
,
Frag
&
frag
,
Table
Data
searchKey
,
TreeEnt
searchEnt
,
TreePos
&
treePos
);
void
searchToAdd
(
Signal
*
signal
,
Frag
&
frag
,
Const
Data
searchKey
,
TreeEnt
searchEnt
,
TreePos
&
treePos
);
void
searchToRemove
(
Signal
*
signal
,
Frag
&
frag
,
Const
Data
searchKey
,
TreeEnt
searchEnt
,
TreePos
&
treePos
);
void
searchToScan
(
Signal
*
signal
,
Frag
&
frag
,
ConstData
boundInfo
,
unsigned
boundCount
,
TreePos
&
treePos
);
/*
* DbtuxCmp.cpp
*/
int
cmpSearchKey
(
const
Frag
&
frag
,
unsigned
&
start
,
TableData
searchKey
,
ConstData
entryData
,
unsigned
maxlen
=
MaxAttrDataSize
);
int
cmpSearchKey
(
const
Frag
&
frag
,
unsigned
&
start
,
TableData
searchKey
,
TableData
entryKey
);
int
cmpSearchKey
(
const
Frag
&
frag
,
unsigned
&
start
,
ConstData
searchKey
,
ConstData
entryData
,
unsigned
maxlen
=
MaxAttrDataSize
);
int
cmpScanBound
(
const
Frag
&
frag
,
unsigned
dir
,
ConstData
boundInfo
,
unsigned
boundCount
,
ConstData
entryData
,
unsigned
maxlen
=
MaxAttrDataSize
);
int
cmpScanBound
(
const
Frag
&
frag
,
unsigned
dir
,
ConstData
boundInfo
,
unsigned
boundCount
,
TableData
entryKey
);
/*
* DbtuxDebug.cpp
...
...
@@ -683,17 +676,27 @@ private:
Uint32
c_typeOfStart
;
/*
* Array of index key attribute ids in AttributeHeader format.
* Includes fixed attribute sizes. This is global data set at
* operation start and is not passed as a parameter.
* Global data set at operation start. Unpacked from index metadata.
* Not passed as parameter to methods. Invalid across timeslices.
*
* TODO inline all into index metadata
*/
// index key attr ids with sizes in AttributeHeader format
Data
c_keyAttrs
;
// buffer for search key data as pointers to TUP storage
TableData
c_searchKey
;
// pointers to index key comparison functions
NdbSqlUtil
::
Cmp
**
c_sqlCmp
;
/*
* Other buffers used during the operation.
*/
// buffer for search key data with headers
Data
c_searchKey
;
// buffer for current entry key data
as pointers to TUP storage
Table
Data
c_entryKey
;
// buffer for current entry key data
with headers
Data
c_entryKey
;
// buffer for scan bounds and keyinfo (primary key)
Data
c_dataBuffer
;
...
...
ndb/src/kernel/blocks/dbtux/DbtuxCmp.cpp
View file @
b5d77b3a
...
...
@@ -18,21 +18,24 @@
#include "Dbtux.hpp"
/*
* Search key vs node prefix
.
* Search key vs node prefix
or entry
*
* The comparison starts at given attribute position
(in fact 0). The
*
position is updated by number of equal initial attributes found. The
*
prefix
may be partial in which case CmpUnknown may be returned.
* The comparison starts at given attribute position
. The position is
*
updated by number of equal initial attributes found. The entry data
* may be partial in which case CmpUnknown may be returned.
*/
int
Dbtux
::
cmpSearchKey
(
const
Frag
&
frag
,
unsigned
&
start
,
Table
Data
searchKey
,
ConstData
entryData
,
unsigned
maxlen
)
Dbtux
::
cmpSearchKey
(
const
Frag
&
frag
,
unsigned
&
start
,
Const
Data
searchKey
,
ConstData
entryData
,
unsigned
maxlen
)
{
const
unsigned
numAttrs
=
frag
.
m_numAttrs
;
const
DescEnt
&
descEnt
=
getDescEnt
(
frag
.
m_descPage
,
frag
.
m_descOff
);
// number of words of attribute data left
unsigned
len2
=
maxlen
;
// skip to right position in search key
searchKey
+=
start
;
// skip to right position in search key only
for
(
unsigned
i
=
0
;
i
<
start
;
i
++
)
{
jam
();
searchKey
+=
AttributeHeaderSize
+
searchKey
.
ah
().
getDataSize
();
}
int
ret
=
0
;
while
(
start
<
numAttrs
)
{
if
(
len2
<=
AttributeHeaderSize
)
{
...
...
@@ -41,22 +44,21 @@ Dbtux::cmpSearchKey(const Frag& frag, unsigned& start, TableData searchKey, Cons
break
;
}
len2
-=
AttributeHeaderSize
;
if
(
*
searchKey
!=
0
)
{
if
(
!
searchKey
.
ah
().
isNULL
()
)
{
if
(
!
entryData
.
ah
().
isNULL
())
{
jam
();
// current attribute
const
DescAttr
&
descAttr
=
descEnt
.
m_descAttr
[
start
];
const
NdbSqlUtil
::
Type
&
type
=
NdbSqlUtil
::
getType
(
descAttr
.
m_typeId
);
ndbassert
(
type
.
m_typeId
!=
NdbSqlUtil
::
Type
::
Undefined
);
// full data size
const
unsigned
size1
=
AttributeDescriptor
::
getSizeInWords
(
descAttr
.
m_attrDesc
);
ndbrequire
(
size1
!=
0
&&
size1
==
entryData
.
ah
().
getDataSize
());
const
unsigned
size2
=
min
(
size1
,
len2
);
len2
-=
size2
;
// compare
const
Uint32
*
const
p1
=
*
searchKey
;
NdbSqlUtil
::
Cmp
*
const
cmp
=
c_sqlCmp
[
start
];
const
Uint32
*
const
p1
=
&
searchKey
[
AttributeHeaderSize
];
const
Uint32
*
const
p2
=
&
entryData
[
AttributeHeaderSize
];
ret
=
(
*
type
.
m_
cmp
)(
p1
,
p2
,
size1
,
size2
);
ret
=
(
*
cmp
)(
p1
,
p2
,
size1
,
size2
);
if
(
ret
!=
0
)
{
jam
();
break
;
...
...
@@ -75,7 +77,7 @@ Dbtux::cmpSearchKey(const Frag& frag, unsigned& start, TableData searchKey, Cons
break
;
}
}
searchKey
+=
1
;
searchKey
+=
AttributeHeaderSize
+
searchKey
.
ah
().
getDataSize
()
;
entryData
+=
AttributeHeaderSize
+
entryData
.
ah
().
getDataSize
();
start
++
;
}
...
...
@@ -83,60 +85,7 @@ Dbtux::cmpSearchKey(const Frag& frag, unsigned& start, TableData searchKey, Cons
}
/*
* Search key vs tree entry.
*
* Start position is updated as in previous routine.
*/
int
Dbtux
::
cmpSearchKey
(
const
Frag
&
frag
,
unsigned
&
start
,
TableData
searchKey
,
TableData
entryKey
)
{
const
unsigned
numAttrs
=
frag
.
m_numAttrs
;
const
DescEnt
&
descEnt
=
getDescEnt
(
frag
.
m_descPage
,
frag
.
m_descOff
);
// skip to right position
searchKey
+=
start
;
entryKey
+=
start
;
int
ret
=
0
;
while
(
start
<
numAttrs
)
{
if
(
*
searchKey
!=
0
)
{
if
(
*
entryKey
!=
0
)
{
jam
();
// current attribute
const
DescAttr
&
descAttr
=
descEnt
.
m_descAttr
[
start
];
const
NdbSqlUtil
::
Type
&
type
=
NdbSqlUtil
::
getType
(
descAttr
.
m_typeId
);
ndbassert
(
type
.
m_typeId
!=
NdbSqlUtil
::
Type
::
Undefined
);
// full data size
const
unsigned
size1
=
AttributeDescriptor
::
getSizeInWords
(
descAttr
.
m_attrDesc
);
// compare
const
Uint32
*
const
p1
=
*
searchKey
;
const
Uint32
*
const
p2
=
*
entryKey
;
ret
=
(
*
type
.
m_cmp
)(
p1
,
p2
,
size1
,
size1
);
if
(
ret
!=
0
)
{
jam
();
break
;
}
}
else
{
jam
();
// not NULL > NULL
ret
=
+
1
;
break
;
}
}
else
{
if
(
*
entryKey
!=
0
)
{
jam
();
// NULL < not NULL
ret
=
-
1
;
break
;
}
}
searchKey
+=
1
;
entryKey
+=
1
;
start
++
;
}
return
ret
;
}
/*
* Scan bound vs node prefix.
* Scan bound vs node prefix or entry.
*
* Compare lower or upper bound and index attribute data. The attribute
* data may be partial in which case CmpUnknown may be returned.
...
...
@@ -184,8 +133,6 @@ Dbtux::cmpScanBound(const Frag& frag, unsigned dir, ConstData boundInfo, unsigne
// current attribute
const
unsigned
index
=
boundInfo
.
ah
().
getAttributeId
();
const
DescAttr
&
descAttr
=
descEnt
.
m_descAttr
[
index
];
const
NdbSqlUtil
::
Type
&
type
=
NdbSqlUtil
::
getType
(
descAttr
.
m_typeId
);
ndbassert
(
type
.
m_typeId
!=
NdbSqlUtil
::
Type
::
Undefined
);
ndbrequire
(
entryData
.
ah
().
getAttributeId
()
==
descAttr
.
m_primaryAttrId
);
// full data size
const
unsigned
size1
=
boundInfo
.
ah
().
getDataSize
();
...
...
@@ -193,9 +140,10 @@ Dbtux::cmpScanBound(const Frag& frag, unsigned dir, ConstData boundInfo, unsigne
const
unsigned
size2
=
min
(
size1
,
len2
);
len2
-=
size2
;
// compare
NdbSqlUtil
::
Cmp
*
const
cmp
=
c_sqlCmp
[
index
];
const
Uint32
*
const
p1
=
&
boundInfo
[
AttributeHeaderSize
];
const
Uint32
*
const
p2
=
&
entryData
[
AttributeHeaderSize
];
int
ret
=
(
*
type
.
m_
cmp
)(
p1
,
p2
,
size1
,
size2
);
int
ret
=
(
*
cmp
)(
p1
,
p2
,
size1
,
size2
);
if
(
ret
!=
0
)
{
jam
();
return
ret
;
...
...
@@ -244,72 +192,3 @@ Dbtux::cmpScanBound(const Frag& frag, unsigned dir, ConstData boundInfo, unsigne
return
+
1
;
}
}
/*
* Scan bound vs tree entry.
*/
int
Dbtux
::
cmpScanBound
(
const
Frag
&
frag
,
unsigned
dir
,
ConstData
boundInfo
,
unsigned
boundCount
,
TableData
entryKey
)
{
const
DescEnt
&
descEnt
=
getDescEnt
(
frag
.
m_descPage
,
frag
.
m_descOff
);
// direction 0-lower 1-upper
ndbrequire
(
dir
<=
1
);
// initialize type to equality
unsigned
type
=
4
;
while
(
boundCount
!=
0
)
{
// get and skip bound type
type
=
boundInfo
[
0
];
boundInfo
+=
1
;
if
(
!
boundInfo
.
ah
().
isNULL
())
{
if
(
*
entryKey
!=
0
)
{
jam
();
// current attribute
const
unsigned
index
=
boundInfo
.
ah
().
getAttributeId
();
const
DescAttr
&
descAttr
=
descEnt
.
m_descAttr
[
index
];
const
NdbSqlUtil
::
Type
&
type
=
NdbSqlUtil
::
getType
(
descAttr
.
m_typeId
);
ndbassert
(
type
.
m_typeId
!=
NdbSqlUtil
::
Type
::
Undefined
);
// full data size
const
unsigned
size1
=
AttributeDescriptor
::
getSizeInWords
(
descAttr
.
m_attrDesc
);
// compare
const
Uint32
*
const
p1
=
&
boundInfo
[
AttributeHeaderSize
];
const
Uint32
*
const
p2
=
*
entryKey
;
int
ret
=
(
*
type
.
m_cmp
)(
p1
,
p2
,
size1
,
size1
);
if
(
ret
!=
0
)
{
jam
();
return
ret
;
}
}
else
{
jam
();
// not NULL > NULL
return
+
1
;
}
}
else
{
jam
();
if
(
*
entryKey
!=
0
)
{
jam
();
// NULL < not NULL
return
-
1
;
}
}
boundInfo
+=
AttributeHeaderSize
+
boundInfo
.
ah
().
getDataSize
();
entryKey
+=
1
;
boundCount
-=
1
;
}
if
(
dir
==
0
)
{
// lower bound
jam
();
if
(
type
==
1
)
{
jam
();
return
+
1
;
}
return
-
1
;
}
else
{
// upper bound
jam
();
if
(
type
==
3
)
{
jam
();
return
-
1
;
}
return
+
1
;
}
}
ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp
View file @
b5d77b3a
...
...
@@ -207,14 +207,10 @@ Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupLoc loc, PrintPar&
}
// check ordering within node
for
(
unsigned
j
=
1
;
j
<
node
.
getOccup
();
j
++
)
{
unsigned
start
=
0
;
const
TreeEnt
ent1
=
node
.
getEnt
(
j
-
1
);
const
TreeEnt
ent2
=
node
.
getEnt
(
j
);
if
(
j
==
1
)
{
readKeyAttrs
(
frag
,
ent1
,
start
,
c_searchKey
);
}
else
{
memcpy
(
c_searchKey
,
c_entryKey
,
frag
.
m_numAttrs
<<
2
);
}
unsigned
start
=
0
;
readKeyAttrs
(
frag
,
ent1
,
start
,
c_searchKey
);
readKeyAttrs
(
frag
,
ent2
,
start
,
c_entryKey
);
int
ret
=
cmpSearchKey
(
frag
,
start
,
c_searchKey
,
c_entryKey
);
if
(
ret
==
0
)
...
...
ndb/src/kernel/blocks/dbtux/DbtuxGen.cpp
View file @
b5d77b3a
...
...
@@ -16,8 +16,6 @@
#define DBTUX_GEN_CPP
#include "Dbtux.hpp"
#include <signaldata/TuxContinueB.hpp>
#include <signaldata/TuxContinueB.hpp>
Dbtux
::
Dbtux
(
const
Configuration
&
conf
)
:
SimulatedBlock
(
DBTUX
,
conf
),
...
...
@@ -202,8 +200,9 @@ Dbtux::execREAD_CONFIG_REQ(Signal* signal)
}
// allocate buffers
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
);
c_sqlCmp
=
(
NdbSqlUtil
::
Cmp
**
)
allocRecord
(
"c_sqlCmp"
,
sizeof
(
NdbSqlUtil
::
Cmp
*
),
MaxIndexAttributes
);
c_searchKey
=
(
Uint32
*
)
allocRecord
(
"c_searchKey"
,
sizeof
(
Uint32
*
),
MaxIndexAttributes
);
c_entryKey
=
(
Uint32
*
)
allocRecord
(
"c_entryKey"
,
sizeof
(
Uint32
*
),
MaxIndexAttributes
);
c_dataBuffer
=
(
Uint32
*
)
allocRecord
(
"c_dataBuffer"
,
sizeof
(
Uint64
),
(
MaxAttrDataSize
+
1
)
>>
1
);
// ack
ReadConfigConf
*
conf
=
(
ReadConfigConf
*
)
signal
->
getDataPtrSend
();
...
...
@@ -218,7 +217,8 @@ Dbtux::execREAD_CONFIG_REQ(Signal* signal)
void
Dbtux
::
setKeyAttrs
(
const
Frag
&
frag
)
{
Data
keyAttrs
=
c_keyAttrs
;
// global
Data
keyAttrs
=
c_keyAttrs
;
// global
NdbSqlUtil
::
Cmp
**
sqlCmp
=
c_sqlCmp
;
// global
const
unsigned
numAttrs
=
frag
.
m_numAttrs
;
const
DescEnt
&
descEnt
=
getDescEnt
(
frag
.
m_descPage
,
frag
.
m_descOff
);
for
(
unsigned
i
=
0
;
i
<
numAttrs
;
i
++
)
{
...
...
@@ -227,75 +227,71 @@ Dbtux::setKeyAttrs(const Frag& frag)
// set attr id and fixed size
keyAttrs
.
ah
()
=
AttributeHeader
(
descAttr
.
m_primaryAttrId
,
size
);
keyAttrs
+=
1
;
// set comparison method pointer
const
NdbSqlUtil
::
Type
&
sqlType
=
NdbSqlUtil
::
getTypeBinary
(
descAttr
.
m_typeId
);
ndbrequire
(
sqlType
.
m_cmp
!=
0
);
*
(
sqlCmp
++
)
=
sqlType
.
m_cmp
;
}
}
void
Dbtux
::
readKeyAttrs
(
const
Frag
&
frag
,
TreeEnt
ent
,
unsigned
start
,
Table
Data
keyData
)
Dbtux
::
readKeyAttrs
(
const
Frag
&
frag
,
TreeEnt
ent
,
unsigned
start
,
Data
keyData
)
{
ConstData
keyAttrs
=
c_keyAttrs
;
// global
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
;
// s
tart applies to both keys and output data
const
Uint32
numAttrs
=
frag
.
m_numAttrs
-
start
;
// s
kip to start position in keyAttrs only
keyAttrs
+=
start
;
keyData
+=
start
;
c_tup
->
tuxReadAttrs
(
tableFragPtrI
,
tupLoc
.
m_pageId
,
tupLoc
.
m_pageOffset
,
tupVersion
,
numAttrs
,
keyAttrs
,
keyData
);
int
ret
=
c_tup
->
tuxReadAttrs
(
tableFragPtrI
,
tupLoc
.
m_pageId
,
tupLoc
.
m_pageOffset
,
tupVersion
,
keyAttrs
,
numAttrs
,
keyData
);
jamEntry
();
// TODO handle error
ndbrequire
(
ret
>
0
);
}
void
Dbtux
::
readTablePk
(
const
Frag
&
frag
,
TreeEnt
ent
,
unsigned
&
pkSize
,
Data
pkData
)
Dbtux
::
readTablePk
(
const
Frag
&
frag
,
TreeEnt
ent
,
Data
pkData
,
unsigned
&
pkSize
)
{
const
Uint32
tableFragPtrI
=
frag
.
m_tupTableFragPtrI
[
ent
.
m_fragBit
];
const
TupLoc
tupLoc
=
ent
.
m_tupLoc
;
Uint32
size
=
0
;
c_tup
->
tuxReadKeys
(
tableFragPtrI
,
tupLoc
.
m_pageId
,
tupLoc
.
m_pageOffset
,
&
size
,
pkData
);
ndbrequire
(
size
!=
0
);
pkSize
=
size
;
int
ret
=
c_tup
->
tuxReadPk
(
tableFragPtrI
,
tupLoc
.
m_pageId
,
tupLoc
.
m_pageOffset
,
pkData
);
jamEntry
();
// TODO handle error
ndbrequire
(
ret
>
0
);
pkSize
=
ret
;
}
/*
*
Input is pointers to table attributes. Output is array of attribute
*
data with headers.
Copies whatever fits.
*
Copy attribute data with headers. Input is all index key data.
* Copies whatever fits.
*/
void
Dbtux
::
copyAttrs
(
const
Frag
&
frag
,
Table
Data
data1
,
Data
data2
,
unsigned
maxlen2
)
Dbtux
::
copyAttrs
(
const
Frag
&
frag
,
Const
Data
data1
,
Data
data2
,
unsigned
maxlen2
)
{
ConstData
keyAttrs
=
c_keyAttrs
;
// global
const
unsigned
numAttrs
=
frag
.
m_numAttrs
;
unsigned
n
=
frag
.
m_numAttrs
;
unsigned
len2
=
maxlen2
;
for
(
unsigned
n
=
0
;
n
<
numAttrs
;
n
++
)
{
while
(
n
!=
0
)
{
jam
();
const
unsigned
attrId
=
keyAttrs
.
ah
().
getAttributeId
();
const
unsigned
dataSize
=
keyAttrs
.
ah
().
getDataSize
();
const
Uint32
*
const
p1
=
*
data1
;
if
(
p1
!=
0
)
{
if
(
len2
==
0
)
return
;
data2
.
ah
()
=
AttributeHeader
(
attrId
,
dataSize
);
data2
+=
1
;
len2
-=
1
;
unsigned
n
=
dataSize
;
for
(
unsigned
i
=
0
;
i
<
dataSize
;
i
++
)
{
if
(
len2
==
0
)
return
;
*
data2
=
p1
[
i
];
data2
+=
1
;
len2
-=
1
;
}
}
else
{
const
unsigned
dataSize
=
data1
.
ah
().
getDataSize
();
// copy header
if
(
len2
==
0
)
return
;
data2
[
0
]
=
data1
[
0
];
data1
+=
1
;
data2
+=
1
;
len2
-=
1
;
// copy data
for
(
unsigned
i
=
0
;
i
<
dataSize
;
i
++
)
{
if
(
len2
==
0
)
return
;
data2
.
ah
()
=
AttributeHeader
(
attrId
,
0
);
data2
.
ah
().
setNULL
();
data2
+=
1
;
data2
[
i
]
=
data1
[
i
];
len2
-=
1
;
}
keyAttrs
+=
1
;
data1
+=
1
;
data1
+=
dataSize
;
data2
+=
dataSize
;
n
-=
1
;
}
#ifdef VM_TRACE
memset
(
data2
,
DataFillByte
,
len2
<<
2
);
...
...
ndb/src/kernel/blocks/dbtux/DbtuxScan.cpp
View file @
b5d77b3a
...
...
@@ -389,7 +389,7 @@ Dbtux::execACC_CHECK_SCAN(Signal* signal)
jam
();
const
TreeEnt
ent
=
scan
.
m_scanPos
.
m_ent
;
// read tuple key
readTablePk
(
frag
,
ent
,
pk
Size
,
pkData
);
readTablePk
(
frag
,
ent
,
pk
Data
,
pkSize
);
// get read lock or exclusive lock
AccLockReq
*
const
lockReq
=
(
AccLockReq
*
)
signal
->
getDataPtrSend
();
lockReq
->
returnCode
=
RNIL
;
...
...
@@ -480,7 +480,7 @@ Dbtux::execACC_CHECK_SCAN(Signal* signal)
jam
();
if
(
pkSize
==
0
)
{
jam
();
readTablePk
(
frag
,
ent
,
pk
Size
,
pkData
);
readTablePk
(
frag
,
ent
,
pk
Data
,
pkSize
);
}
}
// conf signal
...
...
ndb/src/kernel/blocks/dbtux/DbtuxSearch.cpp
View file @
b5d77b3a
...
...
@@ -25,7 +25,7 @@
* TODO optimize for initial equal attrs in node min/max
*/
void
Dbtux
::
searchToAdd
(
Signal
*
signal
,
Frag
&
frag
,
Table
Data
searchKey
,
TreeEnt
searchEnt
,
TreePos
&
treePos
)
Dbtux
::
searchToAdd
(
Signal
*
signal
,
Frag
&
frag
,
Const
Data
searchKey
,
TreeEnt
searchEnt
,
TreePos
&
treePos
)
{
const
TreeHead
&
tree
=
frag
.
m_tree
;
const
unsigned
numAttrs
=
frag
.
m_numAttrs
;
...
...
@@ -144,7 +144,7 @@ Dbtux::searchToAdd(Signal* signal, Frag& frag, TableData searchKey, TreeEnt sear
* to it.
*/
void
Dbtux
::
searchToRemove
(
Signal
*
signal
,
Frag
&
frag
,
Table
Data
searchKey
,
TreeEnt
searchEnt
,
TreePos
&
treePos
)
Dbtux
::
searchToRemove
(
Signal
*
signal
,
Frag
&
frag
,
Const
Data
searchKey
,
TreeEnt
searchEnt
,
TreePos
&
treePos
)
{
const
TreeHead
&
tree
=
frag
.
m_tree
;
const
unsigned
numAttrs
=
frag
.
m_numAttrs
;
...
...
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