addSelectWhereClause() as $field => $vals) { if ($vals && $field == $joinColumn) { $clauses = array_merge($clauses, (array) $vals); } elseif ($vals) { $subclauses[] = "$field " . implode(" AND $field ", (array) $vals); } } if ($subclauses) { $clauses[] = "IN (SELECT `$joinColumn` FROM `" . $bao->tableName() . "` WHERE " . implode(' AND ', $subclauses) . ")"; } return $clauses; } /** * Get current sqlModes of the session * @return array */ public static function getSqlModes() { $sqlModes = explode(',', CRM_Core_DAO::singleValueQuery('SELECT @@sql_mode')); return $sqlModes; } /** * Checks if this system enforce the MYSQL mode ONLY_FULL_GROUP_BY. * This function should be named supportsAnyValueAndEnforcesFullGroupBY(), * but should be deprecated instead. * * @return mixed * @deprecated */ public static function supportsFullGroupBy() { // CRM-21455 MariaDB 10.2 does not support ANY_VALUE $version = CRM_Core_DAO::singleValueQuery('SELECT VERSION()'); if (stripos($version, 'mariadb') !== FALSE) { return FALSE; } return version_compare($version, '5.7', '>='); } /** * Disable ONLY_FULL_GROUP_BY for MySQL versions lower then 5.7 * * @return bool */ public static function disableFullGroupByMode() { $sqlModes = self::getSqlModes(); // Disable only_full_group_by mode for lower sql versions. if (!self::supportsFullGroupBy() || (!empty($sqlModes) && !in_array('ONLY_FULL_GROUP_BY', $sqlModes))) { if ($key = array_search('ONLY_FULL_GROUP_BY', $sqlModes)) { unset($sqlModes[$key]); CRM_Core_DAO::executeQuery("SET SESSION sql_mode = '" . implode(',', $sqlModes) . "'"); } return TRUE; } return FALSE; } /** * CHeck if ONLY_FULL_GROUP_BY is in the global sql_modes * @return bool */ public static function isGroupByModeInDefault() { if (!self::supportsFullGroupBy()) { return FALSE; } $sqlModes = explode(',', CRM_Core_DAO::singleValueQuery('SELECT @@global.sql_mode')); if (!in_array('ONLY_FULL_GROUP_BY', $sqlModes)) { return FALSE; } return TRUE; } }