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
|
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 % ');
|
|
||||||
replace into t1 values ('jonas % ');
|
|
||||||
select * from t1;
|
select * from t1;
|
||||||
a
|
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;
|
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;
|
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:
|
|||||||
|
|
||||||
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:
|
|||||||
#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){
|
|||||||
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)
|
|||||||
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)
|
|||||||
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());
|
||||||
|
Reference in New Issue
Block a user