Loading mysql-test/r/ndb_charset.result +16 −6 Original line number Diff line number Diff line Loading @@ -190,12 +190,22 @@ p a 6 AAA drop table t1; create table t1 ( a varchar(10) primary key ) engine=ndb; insert into t1 values ('jonas % '); replace into t1 values ('jonas % '); replace into t1 values ('jonas % '); a char(10) primary key ) engine=ndbcluster default charset=latin1; insert into t1 values ('aaabb'); select * from t1; a aaabb replace into t1 set a = 'AAABB'; select * from t1; a AAABB replace into t1 set a = 'aAaBb'; select * from t1; a aAaBb replace into t1 set a = 'aaabb'; select * from t1; a jonas % aaabb drop table t1; mysql-test/t/ndb_charset.test +11 −8 Original line number Diff line number Diff line Loading @@ -159,14 +159,17 @@ select * from t1 where a = 'AaA' order by p; select * from t1 where a = 'AAA' order by p; drop table t1; # bug # bug#14007 create table t1 ( a varchar(10) primary key ) engine=ndb; insert into t1 values ('jonas % '); replace into t1 values ('jonas % '); replace into t1 values ('jonas % '); a char(10) primary key ) engine=ndbcluster default charset=latin1; insert into t1 values ('aaabb'); select * from t1; replace into t1 set a = 'AAABB'; select * from t1; replace into t1 set a = 'aAaBb'; select * from t1; replace into t1 set a = 'aaabb'; select * from t1; drop table t1; # End of 4.1 tests ndb/include/kernel/AttributeDescriptor.hpp +9 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ private: static Uint32 getType(const Uint32 &); static Uint32 getSize(const Uint32 &); static Uint32 getSizeInBytes(const Uint32 &); static Uint32 getSizeInWords(const Uint32 &); static Uint32 getArrayType(const Uint32 &); static Uint32 getArraySize(const Uint32 &); Loading Loading @@ -79,6 +80,7 @@ private: #define AD_SIZE_SHIFT (4) #define AD_SIZE_MASK (7) #define AD_SIZE_IN_BYTES_SHIFT (3) #define AD_SIZE_IN_WORDS_OFFSET (31) #define AD_SIZE_IN_WORDS_SHIFT (5) Loading Loading @@ -185,6 +187,13 @@ AttributeDescriptor::getSize(const Uint32 & desc){ return (desc >> AD_SIZE_SHIFT) & AD_SIZE_MASK; } inline Uint32 AttributeDescriptor::getSizeInBytes(const Uint32 & desc){ return (getArraySize(desc) << getSize(desc)) >> AD_SIZE_IN_BYTES_SHIFT; } inline Uint32 AttributeDescriptor::getSizeInWords(const Uint32 & desc){ Loading ndb/src/kernel/blocks/dbtup/DbtupRoutines.cpp +22 −1 Original line number Diff line number Diff line Loading @@ -700,6 +700,27 @@ Dbtup::checkUpdateOfPrimaryKey(Uint32* updateBuffer, Tablerec* const regTabPtr) Uint32 attrDescriptorIndex = regTabPtr->tabDescriptor + (attributeId << ZAD_LOG_SIZE); Uint32 attrDescriptor = tableDescriptor[attrDescriptorIndex].tabDescr; Uint32 attributeOffset = tableDescriptor[attrDescriptorIndex + 1].tabDescr; Uint32 xfrmBuffer[1 + MAX_KEY_SIZE_IN_WORDS * 1]; // strxfrm_multiply == 1 Uint32 charsetFlag = AttributeOffset::getCharsetFlag(attributeOffset); if (charsetFlag) { Uint32 csPos = AttributeOffset::getCharsetPos(attributeOffset); CHARSET_INFO* cs = regTabPtr->charsetArray[csPos]; Uint32 sizeInBytes = AttributeDescriptor::getSizeInBytes(attrDescriptor); Uint32 sizeInWords = AttributeDescriptor::getSizeInWords(attrDescriptor); const uchar* srcPtr = (uchar*)&updateBuffer[1]; uchar* dstPtr = (uchar*)&xfrmBuffer[1]; Uint32 n = (*cs->coll->strnxfrm)(cs, dstPtr, sizeInBytes, srcPtr, sizeInBytes); // pad with blanks (unlikely) and zeroes to match NDB API behaviour while (n < sizeInBytes) dstPtr[n++] = 0x20; while (n < 4 * sizeInWords) dstPtr[n++] = 0; xfrmBuffer[0] = ahIn.m_value; updateBuffer = xfrmBuffer; } ReadFunction f = regTabPtr->readFunctionArray[attributeId]; AttributeHeader::init(&attributeHeader, attributeId, 0); Loading @@ -707,7 +728,7 @@ Dbtup::checkUpdateOfPrimaryKey(Uint32* updateBuffer, Tablerec* const regTabPtr) tMaxRead = MAX_KEY_SIZE_IN_WORDS; bool tmp = tXfrmFlag; tXfrmFlag = false; tXfrmFlag = true; ndbrequire((this->*f)(&keyReadBuffer[0], ahOut, attrDescriptor, attributeOffset)); tXfrmFlag = tmp; ndbrequire(tOutBufIndex == ahOut->getDataSize()); Loading Loading
mysql-test/r/ndb_charset.result +16 −6 Original line number Diff line number Diff line Loading @@ -190,12 +190,22 @@ p a 6 AAA drop table t1; create table t1 ( a varchar(10) primary key ) engine=ndb; insert into t1 values ('jonas % '); replace into t1 values ('jonas % '); replace into t1 values ('jonas % '); a char(10) primary key ) engine=ndbcluster default charset=latin1; insert into t1 values ('aaabb'); select * from t1; a aaabb replace into t1 set a = 'AAABB'; select * from t1; a AAABB replace into t1 set a = 'aAaBb'; select * from t1; a aAaBb replace into t1 set a = 'aaabb'; select * from t1; a jonas % aaabb drop table t1;
mysql-test/t/ndb_charset.test +11 −8 Original line number Diff line number Diff line Loading @@ -159,14 +159,17 @@ select * from t1 where a = 'AaA' order by p; select * from t1 where a = 'AAA' order by p; drop table t1; # bug # bug#14007 create table t1 ( a varchar(10) primary key ) engine=ndb; insert into t1 values ('jonas % '); replace into t1 values ('jonas % '); replace into t1 values ('jonas % '); a char(10) primary key ) engine=ndbcluster default charset=latin1; insert into t1 values ('aaabb'); select * from t1; replace into t1 set a = 'AAABB'; select * from t1; replace into t1 set a = 'aAaBb'; select * from t1; replace into t1 set a = 'aaabb'; select * from t1; drop table t1; # End of 4.1 tests
ndb/include/kernel/AttributeDescriptor.hpp +9 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ private: static Uint32 getType(const Uint32 &); static Uint32 getSize(const Uint32 &); static Uint32 getSizeInBytes(const Uint32 &); static Uint32 getSizeInWords(const Uint32 &); static Uint32 getArrayType(const Uint32 &); static Uint32 getArraySize(const Uint32 &); Loading Loading @@ -79,6 +80,7 @@ private: #define AD_SIZE_SHIFT (4) #define AD_SIZE_MASK (7) #define AD_SIZE_IN_BYTES_SHIFT (3) #define AD_SIZE_IN_WORDS_OFFSET (31) #define AD_SIZE_IN_WORDS_SHIFT (5) Loading Loading @@ -185,6 +187,13 @@ AttributeDescriptor::getSize(const Uint32 & desc){ return (desc >> AD_SIZE_SHIFT) & AD_SIZE_MASK; } inline Uint32 AttributeDescriptor::getSizeInBytes(const Uint32 & desc){ return (getArraySize(desc) << getSize(desc)) >> AD_SIZE_IN_BYTES_SHIFT; } inline Uint32 AttributeDescriptor::getSizeInWords(const Uint32 & desc){ Loading
ndb/src/kernel/blocks/dbtup/DbtupRoutines.cpp +22 −1 Original line number Diff line number Diff line Loading @@ -700,6 +700,27 @@ Dbtup::checkUpdateOfPrimaryKey(Uint32* updateBuffer, Tablerec* const regTabPtr) Uint32 attrDescriptorIndex = regTabPtr->tabDescriptor + (attributeId << ZAD_LOG_SIZE); Uint32 attrDescriptor = tableDescriptor[attrDescriptorIndex].tabDescr; Uint32 attributeOffset = tableDescriptor[attrDescriptorIndex + 1].tabDescr; Uint32 xfrmBuffer[1 + MAX_KEY_SIZE_IN_WORDS * 1]; // strxfrm_multiply == 1 Uint32 charsetFlag = AttributeOffset::getCharsetFlag(attributeOffset); if (charsetFlag) { Uint32 csPos = AttributeOffset::getCharsetPos(attributeOffset); CHARSET_INFO* cs = regTabPtr->charsetArray[csPos]; Uint32 sizeInBytes = AttributeDescriptor::getSizeInBytes(attrDescriptor); Uint32 sizeInWords = AttributeDescriptor::getSizeInWords(attrDescriptor); const uchar* srcPtr = (uchar*)&updateBuffer[1]; uchar* dstPtr = (uchar*)&xfrmBuffer[1]; Uint32 n = (*cs->coll->strnxfrm)(cs, dstPtr, sizeInBytes, srcPtr, sizeInBytes); // pad with blanks (unlikely) and zeroes to match NDB API behaviour while (n < sizeInBytes) dstPtr[n++] = 0x20; while (n < 4 * sizeInWords) dstPtr[n++] = 0; xfrmBuffer[0] = ahIn.m_value; updateBuffer = xfrmBuffer; } ReadFunction f = regTabPtr->readFunctionArray[attributeId]; AttributeHeader::init(&attributeHeader, attributeId, 0); Loading @@ -707,7 +728,7 @@ Dbtup::checkUpdateOfPrimaryKey(Uint32* updateBuffer, Tablerec* const regTabPtr) tMaxRead = MAX_KEY_SIZE_IN_WORDS; bool tmp = tXfrmFlag; tXfrmFlag = false; tXfrmFlag = true; ndbrequire((this->*f)(&keyReadBuffer[0], ahOut, attrDescriptor, attributeOffset)); tXfrmFlag = tmp; ndbrequire(tOutBufIndex == ahOut->getDataSize()); Loading