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 authored and mbeccati committed Sep 21, 2024
1 parent 64d959e commit 7ecea94
Showing 1 changed file with 44 additions and 0 deletions.
44 changes: 44 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,44 @@
--TEST--
MySQL PDO->prepare(), no warnings should be raised for binary values using emulated PS
--EXTENSIONS--
pdo_mysql
--SKIPIF--
<?php
require_once __DIR__ . '/inc/mysql_pdo_test.inc';
MySQLPDOTest::skip();
?>
--FILE--
<?php
require_once __DIR__ . '/inc/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 7ecea94

Please sign in to comment.