Commit a6e410dd authored by pekka@mysql.com's avatar pekka@mysql.com

Merge pnousiainen@bk-internal.mysql.com:/home/bk/mysql-4.1

into  mysql.com:/export/space/pekka/ndb/version/my41-r1.2456.1.1
parents 87e98c87 a8ce4d27
...@@ -190,12 +190,22 @@ p a ...@@ -190,12 +190,22 @@ p a
6 AAA 6 AAA
drop table t1; drop table t1;
create table t1 ( create table t1 (
a varchar(10) primary key a char(10) primary key
) engine=ndb; ) engine=ndbcluster default charset=latin1;
insert into t1 values ('jonas % '); insert into t1 values ('aaabb');
replace into t1 values ('jonas % '); select * from t1;
replace into t1 values ('jonas % '); 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; select * from t1;
a a
jonas % aaabb
drop table t1; drop table t1;
...@@ -159,14 +159,17 @@ select * from t1 where a = 'AaA' order by p; ...@@ -159,14 +159,17 @@ select * from t1 where a = 'AaA' order by p;
select * from t1 where a = 'AAA' order by p; select * from t1 where a = 'AAA' order by p;
drop table t1; drop table t1;
# bug # bug#14007
create table t1 ( create table t1 (
a varchar(10) primary key a char(10) primary key
) engine=ndb; ) engine=ndbcluster default charset=latin1;
insert into t1 values ('jonas % ');
replace into t1 values ('jonas % '); insert into t1 values ('aaabb');
replace into t1 values ('jonas % '); 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; select * from t1;
drop table t1; drop table t1;
# End of 4.1 tests
...@@ -36,6 +36,7 @@ private: ...@@ -36,6 +36,7 @@ private:
static Uint32 getType(const Uint32 &); static Uint32 getType(const Uint32 &);
static Uint32 getSize(const Uint32 &); static Uint32 getSize(const Uint32 &);
static Uint32 getSizeInBytes(const Uint32 &);
static Uint32 getSizeInWords(const Uint32 &); static Uint32 getSizeInWords(const Uint32 &);
static Uint32 getArrayType(const Uint32 &); static Uint32 getArrayType(const Uint32 &);
static Uint32 getArraySize(const Uint32 &); static Uint32 getArraySize(const Uint32 &);
...@@ -79,6 +80,7 @@ private: ...@@ -79,6 +80,7 @@ private:
#define AD_SIZE_SHIFT (4) #define AD_SIZE_SHIFT (4)
#define AD_SIZE_MASK (7) #define AD_SIZE_MASK (7)
#define AD_SIZE_IN_BYTES_SHIFT (3)
#define AD_SIZE_IN_WORDS_OFFSET (31) #define AD_SIZE_IN_WORDS_OFFSET (31)
#define AD_SIZE_IN_WORDS_SHIFT (5) #define AD_SIZE_IN_WORDS_SHIFT (5)
...@@ -185,6 +187,13 @@ AttributeDescriptor::getSize(const Uint32 & desc){ ...@@ -185,6 +187,13 @@ AttributeDescriptor::getSize(const Uint32 & desc){
return (desc >> AD_SIZE_SHIFT) & AD_SIZE_MASK; 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 inline
Uint32 Uint32
AttributeDescriptor::getSizeInWords(const Uint32 & desc){ AttributeDescriptor::getSizeInWords(const Uint32 & desc){
......
...@@ -700,6 +700,27 @@ Dbtup::checkUpdateOfPrimaryKey(Uint32* updateBuffer, Tablerec* const regTabPtr) ...@@ -700,6 +700,27 @@ Dbtup::checkUpdateOfPrimaryKey(Uint32* updateBuffer, Tablerec* const regTabPtr)
Uint32 attrDescriptorIndex = regTabPtr->tabDescriptor + (attributeId << ZAD_LOG_SIZE); Uint32 attrDescriptorIndex = regTabPtr->tabDescriptor + (attributeId << ZAD_LOG_SIZE);
Uint32 attrDescriptor = tableDescriptor[attrDescriptorIndex].tabDescr; Uint32 attrDescriptor = tableDescriptor[attrDescriptorIndex].tabDescr;
Uint32 attributeOffset = tableDescriptor[attrDescriptorIndex + 1].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]; ReadFunction f = regTabPtr->readFunctionArray[attributeId];
AttributeHeader::init(&attributeHeader, attributeId, 0); AttributeHeader::init(&attributeHeader, attributeId, 0);
...@@ -707,7 +728,7 @@ Dbtup::checkUpdateOfPrimaryKey(Uint32* updateBuffer, Tablerec* const regTabPtr) ...@@ -707,7 +728,7 @@ Dbtup::checkUpdateOfPrimaryKey(Uint32* updateBuffer, Tablerec* const regTabPtr)
tMaxRead = MAX_KEY_SIZE_IN_WORDS; tMaxRead = MAX_KEY_SIZE_IN_WORDS;
bool tmp = tXfrmFlag; bool tmp = tXfrmFlag;
tXfrmFlag = false; tXfrmFlag = true;
ndbrequire((this->*f)(&keyReadBuffer[0], ahOut, attrDescriptor, attributeOffset)); ndbrequire((this->*f)(&keyReadBuffer[0], ahOut, attrDescriptor, attributeOffset));
tXfrmFlag = tmp; tXfrmFlag = tmp;
ndbrequire(tOutBufIndex == ahOut->getDataSize()); ndbrequire(tOutBufIndex == ahOut->getDataSize());
......
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