From 6c81fa2879ae84abd342e6c7e688d2524e259244 Mon Sep 17 00:00:00 2001 From: William Desportes Date: Fri, 14 May 2021 14:21:47 +0200 Subject: [PATCH] Fix #16734 - SQL group by count results are not accurate Signed-off-by: William Desportes --- libraries/classes/Sql.php | 9 ++------- test/classes/Stubs/DbiDummy.php | 10 ++++++---- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/libraries/classes/Sql.php b/libraries/classes/Sql.php index 8cde36c757..6fcaee9fc4 100644 --- a/libraries/classes/Sql.php +++ b/libraries/classes/Sql.php @@ -803,11 +803,6 @@ class Sql $statement = $analyzed_sql_results['statement']; $token_list = $analyzed_sql_results['parser']->list; $replaces = [ - // Replace select by COUNT - [ - 'SELECT', - 'SELECT COUNT(*)', - ], // Remove ORDER BY to decrease unnecessary sorting time [ 'ORDER BY', @@ -819,11 +814,11 @@ class Sql '', ], ]; - $count_query = Query::replaceClauses( + $count_query = 'SELECT COUNT(*) FROM (' . Query::replaceClauses( $statement, $token_list, $replaces - ); + ) . ') as cnt'; $unlim_num_rows = $this->dbi->fetchValue($count_query); if ($unlim_num_rows === false) { $unlim_num_rows = 0; diff --git a/test/classes/Stubs/DbiDummy.php b/test/classes/Stubs/DbiDummy.php index c27d2db387..d327b7209f 100644 --- a/test/classes/Stubs/DbiDummy.php +++ b/test/classes/Stubs/DbiDummy.php @@ -2405,17 +2405,17 @@ class DbiDummy implements DbiExtension ], ], [ - 'query' => 'SELECT COUNT(*) FROM company_users WHERE not_working_count != 0', + 'query' => 'SELECT COUNT(*) FROM (SELECT * FROM company_users WHERE not_working_count != 0 ) as cnt', 'result' => false, ], [ - 'query' => 'SELECT COUNT(*) FROM company_users', + 'query' => 'SELECT COUNT(*) FROM (SELECT * FROM company_users ) as cnt', 'result' => [ [4], ], ], [ - 'query' => 'SELECT COUNT(*) FROM company_users WHERE working_count = 0', + 'query' => 'SELECT COUNT(*) FROM (SELECT * FROM company_users WHERE working_count = 0 ) as cnt', 'result' => [ [15], ], @@ -2427,7 +2427,9 @@ class DbiDummy implements DbiExtension ], ], [ - 'query' => 'SELECT COUNT(*) FROM company_users WHERE subquery_case = 0', + 'query' => 'SELECT COUNT(*) FROM (' + . 'SELECT *, 1, (SELECT COUNT(*) FROM tbl1) as c1, ' + . '(SELECT 1 FROM tbl2) as c2 FROM company_users WHERE subquery_case = 0 ) as cnt', 'result' => [ [42], ],