From 239b0616ad72d5b3a9785bba48a456484b1bde8d Mon Sep 17 00:00:00 2001 From: Maxim Smakouz Date: Fri, 7 Jun 2024 13:27:12 +0300 Subject: [PATCH 1/3] test: add tests using fragments in orderBy --- .../Driver/Common/Query/SelectQueryTest.php | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/tests/Database/Functional/Driver/Common/Query/SelectQueryTest.php b/tests/Database/Functional/Driver/Common/Query/SelectQueryTest.php index 4cc3cd45..90963ba2 100644 --- a/tests/Database/Functional/Driver/Common/Query/SelectQueryTest.php +++ b/tests/Database/Functional/Driver/Common/Query/SelectQueryTest.php @@ -926,6 +926,45 @@ public function testMultipleOrderByFullySpecifiedAliasedAndPrefixed(): void ); } + public function testOrderByWithExpressionAndParameter(): void + { + $select = $this->database + ->select() + ->from('permissions') + ->orderBy(new Expression('role = ?', '*'), 'DESC'); + + $this->assertSameQuery('SELECT * FROM {permissions} ORDER BY {role} = ? DESC', $select); + $this->assertSameParameters(['*'], $select); + } + + public function testOrderByWithFragmentAndParameter(): void + { + $select = $this->database + ->select() + ->from('permissions') + ->orderBy(new Fragment('"role" = ?', '*'), 'DESC'); + + $this->assertSameQuery('SELECT * FROM {permissions} ORDER BY "role" = ? DESC', $select); + $this->assertSameParameters(['*'], $select); + } + + public function testOrderByWithFragmentAndParameterInArray(): void + { + $select = $this->database + ->select() + ->from('permissions') + ->orderBy([ + new Fragment('"role" = ? DESC', '*'), + 'read' => 'ASC', + ]); + + $this->assertSameQuery( + 'SELECT * FROM {permissions} ORDER BY "role" = ? DESC, {read} ASC', + $select + ); + $this->assertSameParameters(['*'], $select); + } + //Group By public function testGroupBy(): void From c874f7d4548a190f0415b3a2c94cc9a3955e9cfa Mon Sep 17 00:00:00 2001 From: Maxim Smakouz Date: Fri, 7 Jun 2024 13:34:15 +0300 Subject: [PATCH 2/3] fix: add parameter consideration when hashing the query part with orderBy --- src/Driver/CompilerCache.php | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/Driver/CompilerCache.php b/src/Driver/CompilerCache.php index 8c8d8cf7..2968a3d2 100644 --- a/src/Driver/CompilerCache.php +++ b/src/Driver/CompilerCache.php @@ -193,9 +193,7 @@ protected function hashSelectQuery(QueryParameters $params, array $tokens): stri $hash .= implode(',', $tokens['groupBy']); - foreach ($tokens['orderBy'] as $order) { - $hash .= $order[0] . $order[1]; - } + $hash .= $this->hashOrderBy($params, $tokens['orderBy']); $hash .= $this->compiler->hashLimit($params, $tokens); @@ -355,4 +353,19 @@ private function hashParam(QueryParameters $params, ParameterInterface $param): return '?'; } + + private function hashOrderBy(QueryParameters $params, array $tokens): string + { + $hash = ''; + foreach ($tokens as $order) { + if ($order[0] instanceof FragmentInterface) { + foreach ($order[0]->getTokens()['parameters'] as $param) { + $params->push($param); + } + } + $hash .= $order[0] . $order[1]; + } + + return $hash; + } } From 375f47bb321c0273832012d7440eb3d9303a8e51 Mon Sep 17 00:00:00 2001 From: Maxim Smakouz Date: Mon, 10 Jun 2024 19:04:01 +0300 Subject: [PATCH 3/3] fix enabling mysql-native-password --- tests/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/docker-compose.yml b/tests/docker-compose.yml index 9e892c28..0e3997f1 100644 --- a/tests/docker-compose.yml +++ b/tests/docker-compose.yml @@ -15,7 +15,7 @@ services: mysql_latest: image: mysql:latest restart: always - command: --default-authentication-plugin=mysql_native_password + command: --mysql-native-password=ON ports: - "13306:3306" environment: