Skip to content

Commit

Permalink
Reproduce unexpected MySQL warnings for binary values
Browse files Browse the repository at this point in the history
The prepared statement emulation layer is handling binary content in a
way that creates warnings in MySQL.

When analysing the query logs, we saw that the content sent to the
server is missing `0x5C` characters when the using emulated prepares.

This introduces a minimal test case that reproduces the issue to aid the
solution.

More info: doctrine/dbal#6522 (comment)

Signed-off-by: Luís Cobucci <[email protected]>
  • Loading branch information
lcobucci committed Sep 18, 2024
1 parent a87ccc7 commit dd983d9
Showing 1 changed file with 45 additions and 0 deletions.
45 changes: 45 additions & 0 deletions ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_binary.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
--TEST--
MySQL PDO->prepare(), no warnings should be raised for binary values using emulated PS
--EXTENSIONS--
pdo_mysql
--SKIPIF--
<?php
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
MySQLPDOTest::skip();
$db = MySQLPDOTest::factory();
?>
--FILE--
<?php
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
$db = MySQLPDOTest::factory();
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

$content = '0191D886E6DC73E7AF1FEE7F99EC6235';

$statement = $db->prepare('SELECT HEX(?) as test');
$statement->bindValue(1, hex2bin($content), PDO::PARAM_LOB);
$statement->execute();

var_dump($statement->fetchAll(PDO::FETCH_ASSOC)[0]['test'] === $content);
var_dump($db->query('SHOW WARNINGS')->fetchAll(PDO::FETCH_ASSOC));

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$statement2 = $db->prepare('SELECT HEX(?) as test');
$statement2->bindValue(1, hex2bin($content), PDO::PARAM_LOB);
$statement2->execute();

var_dump($statement2->fetchAll(PDO::FETCH_ASSOC)[0]['test'] === $content);

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); // SHOW WARNINGS can only be used when PDO::ATTR_EMULATE_PREPARES=true
var_dump($db->query('SHOW WARNINGS')->fetchAll(PDO::FETCH_ASSOC));
print "done!";
?>
--EXPECTF--
bool(true)
array(0) {
}
bool(true)
array(0) {
}
done!

0 comments on commit dd983d9

Please sign in to comment.