From 6a0648f08d35aac2a6cde587b1122a8f3f25a423 Mon Sep 17 00:00:00 2001 From: Guillaume Date: Fri, 24 Jul 2020 11:16:30 +0200 Subject: [PATCH 1/2] Prepare Statement Cache issue: test case --- tests/Mouf/Database/MagicQueryTest.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/Mouf/Database/MagicQueryTest.php b/tests/Mouf/Database/MagicQueryTest.php index f3aa8a7..788df1e 100644 --- a/tests/Mouf/Database/MagicQueryTest.php +++ b/tests/Mouf/Database/MagicQueryTest.php @@ -475,4 +475,12 @@ public function testSetOutputDialect() $this->assertEquals('SELECT id FROM users', self::simplifySql($magicQuery->buildPreparedStatement($sql))); } + + public function testPrepareStatementCache(): void + { + $magicQuery = new MagicQuery(null, new ArrayCache()); + + $this->assertEquals('SELECT * FROM users WHERE 0 <> 0', self::simplifySql($magicQuery->buildPreparedStatement('SELECT * FROM users WHERE id IN :users', ['users' => []]))); + $this->assertEquals('SELECT * FROM users WHERE id IN (:users)', self::simplifySql($magicQuery->buildPreparedStatement('SELECT * FROM users WHERE id IN :users', ['users' => [1]]))); + } } From d2415e63a45aa01ff822e8e426dffbf770a4a7e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20N=C3=A9grier?= Date: Fri, 24 Jul 2020 16:14:41 +0200 Subject: [PATCH 2/2] Params with empty array should be cached differently than params with arrays --- src/Mouf/Database/MagicQuery.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Mouf/Database/MagicQuery.php b/src/Mouf/Database/MagicQuery.php index 95061d5..c9158ef 100644 --- a/src/Mouf/Database/MagicQuery.php +++ b/src/Mouf/Database/MagicQuery.php @@ -137,7 +137,7 @@ public function buildPreparedStatement(string $sql, array $parameters = []): str $sql = $this->getTwigEnvironment()->render($sql, $parameters); } - $availableParameterKeys = array_keys(array_filter($parameters, static function($param) { return $param !== null;})); + $availableParameterKeys = array_keys(array_filter($parameters, static function($param) { return $param !== null && $param !== [];})); // We choose md4 because it is fast. $cacheKey = 'request_build_'.hash('md4', get_class($this->platform).'__'.$sql.'__'.implode('_/_', $availableParameterKeys)); $newSql = $this->cache->fetch($cacheKey);