Skip to content

Commit

Permalink
(dev/core/68) Fix DB Error on 'Find Participant' page when MySQL FULL…
Browse files Browse the repository at this point in the history
…_GROUP_BY_MODE is enabled
  • Loading branch information
monishdeb committed May 8, 2018
1 parent c10f7a5 commit 4fa404b
Showing 1 changed file with 18 additions and 9 deletions.
27 changes: 18 additions & 9 deletions CRM/Contact/BAO/Query.php
Original file line number Diff line number Diff line change
Expand Up @@ -4734,17 +4734,26 @@ public static function appendAnyValueToSelect($selectClauses, $groupBy, $aggrega
* on full_group_by mode, then append the those missing columns to GROUP BY clause
* keyword to select fields not present in groupBy
*
* @param string $groupBy - GROUP BY clause where missing ORDER BY columns will be appended
* @param string|array $groupBy - GROUP BY clause or array of columns where missing ORDER BY columns will be appended if not present
* @param array $orderBys - ORDER BY sub-clauses
*
*/
public static function getGroupByFromOrderBy(&$groupBy, $orderBys) {
if (!CRM_Utils_SQL::disableFullGroupByMode()) {
foreach ($orderBys as $orderBy) {
$orderBy = str_replace(array(' DESC', ' ASC', '`'), '', $orderBy); // remove sort syntax from ORDER BY clauses if present
$orderBy = str_ireplace(array(' DESC', ' ASC', '`'), '', $orderBy); // remove sort syntax from ORDER BY clauses if present
// if ORDER BY column is not present in GROUP BY then append it to end
if (preg_match('/(MAX|MIN)\(/i', trim($orderBy)) !== 1 && !strstr($groupBy, $orderBy)) {
$groupBy .= ", {$orderBy}";
if (preg_match('/(MAX|MIN)\(/i', trim($orderBy)) !== 1) {
if (is_array($groupBy)) {
// retrieve and add all the ORDER BY columns which are not in GROUP BY list of columns
$groupBy += array_filter($groupBy,
function($var) use ($orderBy) {
return !strstr($var, $orderBy);
});
}
elseif (!strstr($groupBy, $orderBy)) {
$groupBy .= ", {$orderBy}";
}
}
}
}
Expand Down Expand Up @@ -4905,16 +4914,16 @@ public function searchQuery(
list($select, $from, $where, $having) = $this->query($count, $sortByChar, $groupContacts, $onlyDeleted);

if (!empty($groupByCols)) {
if (!empty($order)) {
// retrieve order by columns from ORDER BY clause
$orderBys = explode(",", str_replace('ORDER BY ', '', $order));
self::getGroupByFromOrderBy($groupByCols, $orderBys);
}
// It doesn't matter to include columns in SELECT clause, which are present in GROUP BY when we just want the contact IDs
if (!$groupContacts && !$sortByChar) {
$select = self::appendAnyValueToSelect($this->_select, $groupByCols, 'GROUP_CONCAT');
}
$groupBy = " GROUP BY " . implode(', ', $groupByCols);
if (!empty($order)) {
// retrieve order by columns from ORDER BY clause
$orderBys = explode(",", str_replace('ORDER BY ', '', $order));
self::getGroupByFromOrderBy($groupBy, $orderBys);
}
}

if ($additionalWhereClause) {
Expand Down

0 comments on commit 4fa404b

Please sign in to comment.