Loading mysql-test/r/ndb_basic.result +24 −0 Original line number Diff line number Diff line Loading @@ -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 mysql-test/t/ndb_basic.test +20 −2 Original line number Diff line number Diff line Loading @@ -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; # # 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 ndb/src/ndbapi/NdbOperationDefine.cpp +25 −8 Original line number Diff line number Diff line Loading @@ -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; 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)); 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)) { char * tmp = (char*)tempData; memcpy(tmp, aValue, attributeSize); aValue = tmp; if(slack != 0) { bzero(tmp + attributeSize, slack); }//if }//if Loading ndb/src/ndbapi/NdbOperationSearch.cpp +23 −7 Original line number Diff line number Diff line Loading @@ -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)) { Loading @@ -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; Loading Loading
mysql-test/r/ndb_basic.result +24 −0 Original line number Diff line number Diff line Loading @@ -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
mysql-test/t/ndb_basic.test +20 −2 Original line number Diff line number Diff line Loading @@ -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; # # 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
ndb/src/ndbapi/NdbOperationDefine.cpp +25 −8 Original line number Diff line number Diff line Loading @@ -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; 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)); 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)) { char * tmp = (char*)tempData; memcpy(tmp, aValue, attributeSize); aValue = tmp; if(slack != 0) { bzero(tmp + attributeSize, slack); }//if }//if Loading
ndb/src/ndbapi/NdbOperationSearch.cpp +23 −7 Original line number Diff line number Diff line Loading @@ -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)) { Loading @@ -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; Loading