mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge pnousiainen@bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/export/space/pekka/ndb/version/my41-r1.2456.1.1
This commit is contained in:
@ -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
|
||||
jonas %
|
||||
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
|
||||
aaabb
|
||||
drop table t1;
|
||||
|
@ -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
|
||||
|
@ -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 &);
|
||||
@ -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)
|
||||
|
||||
@ -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){
|
||||
|
@ -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);
|
||||
@ -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());
|
||||
|
Reference in New Issue
Block a user