summaryrefslogtreecommitdiff
path: root/ndb/src
diff options
context:
space:
mode:
authorunknown <jonas@perch.ndb.mysql.com>2007-10-26 08:42:33 +0200
committerunknown <jonas@perch.ndb.mysql.com>2007-10-26 08:42:33 +0200
commit81b5dbe25bb2ec4c89348539323fc6a9ba844a14 (patch)
treedc1ff981a272d8a7e073e8c80bae2a88716090c9 /ndb/src
parent6e817c8d26533afd2c58f2e79f84d073008f0bda (diff)
downloadmariadb-git-81b5dbe25bb2ec4c89348539323fc6a9ba844a14.tar.gz
ndb - bug#31635 (5.0)
0 pad varsize keys in ndbapi mysql-test/r/ndb_basic.result: new testcase mysql-test/t/ndb_basic.test: new testcase ndb/src/ndbapi/NdbOperationDefine.cpp: pad varsize keys ndb/src/ndbapi/NdbOperationSearch.cpp: pad varsize keys
Diffstat (limited to 'ndb/src')
-rw-r--r--ndb/src/ndbapi/NdbOperationDefine.cpp33
-rw-r--r--ndb/src/ndbapi/NdbOperationSearch.cpp30
2 files changed, 48 insertions, 15 deletions
diff --git a/ndb/src/ndbapi/NdbOperationDefine.cpp b/ndb/src/ndbapi/NdbOperationDefine.cpp
index 95e90609f9b..50f64d4dda4 100644
--- a/ndb/src/ndbapi/NdbOperationDefine.cpp
+++ b/ndb/src/ndbapi/NdbOperationDefine.cpp
@@ -572,15 +572,32 @@ NdbOperation::setValue( const NdbColumnImpl* tAttrInfo,
* If it is not aligned then we start by copying the value to tempData and
* use this as aValue instead.
*************************************************************************/
- const int attributeSize = sizeInBytes;
- const int slack = sizeInBytes & 3;
+ int attributeSize = sizeInBytes;
+ int slack = (sizeInBytes & 3) ? 4 - (sizeInBytes & 3) : 0;
+ switch(tAttrInfo->m_type){
+ case NdbDictionary::Column::Varchar:
+ case NdbDictionary::Column::Varbinary:
+ attributeSize = 1 + *(Uint8*)aValue;
+ slack = 4 * totalSizeInWords - attributeSize;
+ break;
+ case NdbDictionary::Column::Longvarchar:
+ case NdbDictionary::Column::Longvarbinary:
+ {
+ const Uint8* ptr = (const Uint8*)aValue;
+ attributeSize = 2 + ptr[0] + 256 * ptr[1];
+ slack = 4 * totalSizeInWords - attributeSize;
+ break;
+ }
+ }
- if (((UintPtr)aValue & 3) != 0 || (slack != 0)){
- memcpy(&tempData[0], aValue, attributeSize);
- aValue = (char*)&tempData[0];
- if(slack != 0) {
- char * tmp = (char*)&tempData[0];
- memset(&tmp[attributeSize], 0, (4 - slack));
+ if (((UintPtr)aValue & 3) != 0 || (slack != 0))
+ {
+ char * tmp = (char*)tempData;
+ memcpy(tmp, aValue, attributeSize);
+ aValue = tmp;
+ if(slack != 0)
+ {
+ bzero(tmp + attributeSize, slack);
}//if
}//if
diff --git a/ndb/src/ndbapi/NdbOperationSearch.cpp b/ndb/src/ndbapi/NdbOperationSearch.cpp
index a3e3f7a7a91..5639c5dfc09 100644
--- a/ndb/src/ndbapi/NdbOperationSearch.cpp
+++ b/ndb/src/ndbapi/NdbOperationSearch.cpp
@@ -129,6 +129,7 @@ NdbOperation::equal_impl(const NdbColumnImpl* tAttrInfo,
OperationType tOpType = theOperationType;
Uint32 sizeInBytes = tAttrInfo->m_attrSize * tAttrInfo->m_arraySize;
+ const Uint32 totalSizeInWords = (sizeInBytes + 3) / 4;
Uint32 real_len;
if (! tAttrInfo->get_var_length(aValue, real_len)) {
@@ -150,20 +151,35 @@ NdbOperation::equal_impl(const NdbColumnImpl* tAttrInfo,
* aValue. If it is not aligned then we start by copying the value to
* tempData and use this as aValue instead.
***********************************************************************/
- const int attributeSize = sizeInBytes;
- const int slack = sizeInBytes & 3;
+ int attributeSize = sizeInBytes;
+ int slack = (sizeInBytes & 3) ? 4 - (sizeInBytes & 3) : 0;
const int align = UintPtr(aValue) & 7;
+ switch(tAttrInfo->m_type){
+ case NdbDictionary::Column::Varchar:
+ case NdbDictionary::Column::Varbinary:
+ attributeSize = 1 + *(Uint8*)aValue;
+ slack = 4 * totalSizeInWords - attributeSize;
+ break;
+ case NdbDictionary::Column::Longvarchar:
+ case NdbDictionary::Column::Longvarbinary:
+ {
+ const Uint8* ptr = (const Uint8*)aValue;
+ attributeSize = 2 + ptr[0] + 256 * ptr[1];
+ slack = 4*totalSizeInWords - attributeSize;
+ break;
+ }
+ }
+
if (((align & 3) != 0) || (slack != 0) || (tDistrKey && (align != 0)))
{
- ((Uint32*)tempData)[attributeSize >> 2] = 0;
- memcpy(&tempData[0], aValue, attributeSize);
- aValue = (char*)&tempData[0];
+ char * tmp = (char*)tempData;
+ memcpy(tmp, aValue, attributeSize);
+ aValue = tmp;
+ bzero(tmp + attributeSize, slack);
}//if
}
- Uint32 totalSizeInWords = (sizeInBytes + 3)/4; // Inc. bits in last word
-
if (true){ //tArraySize != 0) {
Uint32 tTupKeyLen = theTupKeyLen;