Bug#44811 Tests with utf8 charset fail with ibmdb2i on 64bit MySQL
wmemset was being used to fill the row buffers. wmemset was intended to fill the buffer with 16-bit UCS2 pad values. However, the 64-bit version of wmemset uses 32-bit wide characters and thus filled the buffer incorrectly. In some cases, the null byte map would be overwritten, causing ctype_utf8.test and ibmdb2i_rir.test to fail, giving the error message CPF5035. This patch eliminates the use of wmemset to fill the row buffer. wmemset has been replaced with memset16, which always fills memory with 16-bit values.
This commit is contained in:
parent
9e86abfe2b
commit
5a64492333
@ -1085,7 +1085,7 @@ int32 ha_ibmdb2i::convertMySQLtoDB2(Field* field, const DB2Field& db2Field, char
|
||||
if (bytesToStore)
|
||||
memcpy(db2Buf, dataToStore, bytesToStore);
|
||||
if (bytesToPad)
|
||||
wmemset((wchar_t*)(db2Buf + bytesToStore), 0x0020, bytesToPad/2);
|
||||
memset16((db2Buf + bytesToStore), 0x0020, bytesToPad/2);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1108,7 +1108,7 @@ int32 ha_ibmdb2i::convertMySQLtoDB2(Field* field, const DB2Field& db2Field, char
|
||||
bytesToStore = db2BytesToStore;
|
||||
}
|
||||
if (db2BytesToStore < maxDb2BytesToStore) // If need to pad
|
||||
wmemset((wchar_t*)(db2Buf + db2BytesToStore), 0x0020, (maxDb2BytesToStore - db2BytesToStore)/2);
|
||||
memset16((db2Buf + db2BytesToStore), 0x0020, (maxDb2BytesToStore - db2BytesToStore)/2);
|
||||
}
|
||||
|
||||
if (db2FieldType == QMY_VARGRAPHIC)
|
||||
|
@ -110,4 +110,20 @@ bool isOrdinaryIdentifier(const char* s)
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
Fill memory with a 16-bit word.
|
||||
|
||||
@param p Pointer to space to fill.
|
||||
@param v Value to fill
|
||||
@param l Length of space (in 16-bit words)
|
||||
*/
|
||||
void memset16(void* p, uint16 v, size_t l)
|
||||
{
|
||||
uint16* p2=(uint16*)p;
|
||||
while (l--)
|
||||
{
|
||||
*(p2++) = v;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user