Commit 81b5dbe2 authored by unknown's avatar unknown

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
parent 6e817c8d
......@@ -841,4 +841,28 @@ a b
3 30
4 1
drop table t1,t2;
create table t1 (a varchar(100) primary key, b varchar(100)) engine = NDB;
insert into t1 values
('a', 'a'),('b','b'),('c', 'c'),('aa', 'aa'),('bb', 'bb'),('cc', 'cc');
replace into t1 values ('a', '-a');
replace into t1 values ('b', '-b');
replace into t1 values ('c', '-c');
replace into t1 values ('aa', '-aa');
replace into t1 values ('bb', '-bb');
replace into t1 values ('cc', '-cc');
replace into t1 values ('aaa', '-aaa');
replace into t1 values ('bbb', '-bbb');
replace into t1 values ('ccc', '-ccc');
select * from t1 order by 1,2;
a b
a -a
aa -aa
aaa -aaa
b -b
bb -bb
bbb -bbb
c -c
cc -cc
ccc -ccc
drop table t1;
End of 5.0 tests
......@@ -780,7 +780,25 @@ update ignore t1,t2 set a = 1, c = 1 where a = 3 and c = 3;
select * from t1 order by a;
drop table t1,t2;
# End of 5.0 tests
--echo End of 5.0 tests
#
# Bug#31635
#
create table t1 (a varchar(100) primary key, b varchar(100)) engine = NDB;
insert into t1 values
('a', 'a'),('b','b'),('c', 'c'),('aa', 'aa'),('bb', 'bb'),('cc', 'cc');
replace into t1 values ('a', '-a');
replace into t1 values ('b', '-b');
replace into t1 values ('c', '-c');
replace into t1 values ('aa', '-aa');
replace into t1 values ('bb', '-bb');
replace into t1 values ('cc', '-cc');
replace into t1 values ('aaa', '-aaa');
replace into t1 values ('bbb', '-bbb');
replace into t1 values ('ccc', '-ccc');
select * from t1 order by 1,2;
drop table t1;
# End of 5.0 tests
--echo End of 5.0 tests
......@@ -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
......
......@@ -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;
......
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