Merge #16824 - Fix #16777 - Non-UTF8 Primary Key fix

Signed-off-by: William Desportes <williamdes@wdes.fr>
This commit is contained in:
William Desportes 2021-04-19 19:06:29 +02:00
commit 6eac1dd56a
No known key found for this signature in database
GPG Key ID: 90A0EF1B8251A889
2 changed files with 64 additions and 4 deletions

View File

@ -957,6 +957,9 @@ class Util
}
$conditionValue = '';
$isBinaryString = $meta->type === 'string' && stripos($fieldFlags, 'BINARY') !== false;
// 63 is the binary charset, see: https://dev.mysql.com/doc/internals/en/charsets.html
$isBlobAndIsBinaryCharset = $meta->type === 'blob' && $meta->charsetnr === 63;
// timestamp is numeric on some MySQL 4.1
// for real we use CONCAT above and it should compare to string
if ($meta->numeric
@ -964,10 +967,7 @@ class Util
&& ($meta->type !== 'real')
) {
$conditionValue = '= ' . $row;
} elseif (($meta->type === 'blob') || ($meta->type === 'string')
&& stripos($fieldFlags, 'BINARY') !== false
&& ! empty($row)
) {
} elseif ($isBlobAndIsBinaryCharset || (! empty($row) && $isBinaryString)) {
// hexify only if this is a true not empty BLOB or a BINARY
// do not waste memory building a too big condition

View File

@ -207,6 +207,66 @@ class UtilTest extends AbstractTestCase
]
)
);
$this->assertSame(
['= \'value\'', ''],
$this->callFunction(
null,
Util::class,
'getConditionValue',
[
'value',// row
((object) [
'numeric' => false,
'type' => 'blob',
'charsetnr' => 32,// armscii8_general_ci
]),// field meta
'',// field flags
0,// fields count
'',// condition key
'',// condition
]
)
);
$this->assertSame(
['= \'value\'', ''],
$this->callFunction(
null,
Util::class,
'getConditionValue',
[
'value',// row
((object) [
'numeric' => false,
'type' => 'blob',
'charsetnr' => 48,// latin1_general_ci
]),// field meta
'',// field flags
0,// fields count
'',// condition key
'',// condition
]
)
);
$this->assertSame(
['= CAST(0x76616c7565 AS BINARY)', ''],
$this->callFunction(
null,
Util::class,
'getConditionValue',
[
'value',// row
((object) [
'numeric' => false,
'type' => 'blob',
'charsetnr' => 63,// binary
]),// field meta
'',// field flags
0,// fields count
'',// condition key
'',// condition
]
)
);
$this->assertSame(
['= CAST(0x76616c7565 AS BINARY)', ''],
$this->callFunction(