Commit 5a644923 authored by Narayanan V's avatar Narayanan V

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.
parent 9e86abfe
...@@ -1085,7 +1085,7 @@ int32 ha_ibmdb2i::convertMySQLtoDB2(Field* field, const DB2Field& db2Field, char ...@@ -1085,7 +1085,7 @@ int32 ha_ibmdb2i::convertMySQLtoDB2(Field* field, const DB2Field& db2Field, char
if (bytesToStore) if (bytesToStore)
memcpy(db2Buf, dataToStore, bytesToStore); memcpy(db2Buf, dataToStore, bytesToStore);
if (bytesToPad) if (bytesToPad)
wmemset((wchar_t*)(db2Buf + bytesToStore), 0x0020, bytesToPad/2); memset16((db2Buf + bytesToStore), 0x0020, bytesToPad/2);
} }
else else
{ {
...@@ -1108,7 +1108,7 @@ int32 ha_ibmdb2i::convertMySQLtoDB2(Field* field, const DB2Field& db2Field, char ...@@ -1108,7 +1108,7 @@ int32 ha_ibmdb2i::convertMySQLtoDB2(Field* field, const DB2Field& db2Field, char
bytesToStore = db2BytesToStore; bytesToStore = db2BytesToStore;
} }
if (db2BytesToStore < maxDb2BytesToStore) // If need to pad 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) if (db2FieldType == QMY_VARGRAPHIC)
......
...@@ -109,5 +109,21 @@ bool isOrdinaryIdentifier(const char* s) ...@@ -109,5 +109,21 @@ bool isOrdinaryIdentifier(const char* s)
} }
return true; 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 #endif
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