Commit 563e5c8d authored by unknown's avatar unknown
Browse files

ndb - bug#14007 4.1 [re-commit for LenZ merge]


mysql-test/r/ndb_charset.result:
  bug#14007 test [re-commit]
mysql-test/t/ndb_charset.test:
  bug#14007 test [re-commit]
ndb/include/kernel/AttributeDescriptor.hpp:
  bug#14007 4.1 need getSizeInBytes [re-commit]
ndb/src/kernel/blocks/dbtup/DbtupRoutines.cpp:
  bug#14007 4.1 *** do not AUTOmerge to 5.0 *** [re-commit]
parent 467deb4c
Loading
Loading
Loading
Loading
+16 −6
Original line number Diff line number Diff line
@@ -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;
+11 −8
Original line number Diff line number Diff line
@@ -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
+9 −0
Original line number Diff line number Diff line
@@ -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){
+22 −1
Original line number Diff line number Diff line
@@ -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());