From 457f9b8f50c407b7566d571f3e0245eb63d52d58 Mon Sep 17 00:00:00 2001 From: Eric Lippmann Date: Mon, 29 Jul 2013 18:37:59 +0200 Subject: [PATCH] Db: Set MySQL server SQL modes to behave closer to ANSI SQL refs #4413 --- library/Icinga/Data/Db/Connection.php | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/library/Icinga/Data/Db/Connection.php b/library/Icinga/Data/Db/Connection.php index 9c8e3686c..f9ce6d425 100644 --- a/library/Icinga/Data/Db/Connection.php +++ b/library/Icinga/Data/Db/Connection.php @@ -59,13 +59,18 @@ class Connection implements DatasourceInterface switch ($this->dbtype) { case 'mysql': $adapter = 'Pdo_Mysql'; - $drv_options[PDO::MYSQL_ATTR_INIT_COMMAND] = - "SET SESSION SQL_MODE='STRICT_ALL_TABLES,NO_ZERO_IN_DATE," - . "NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT," - . "ANSI_QUOTES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER';"; - // Not using ONLY_FULL_GROUP_BY as of performance impact - // TODO: NO_ZERO_IN_DATE as been added with 5.1.11. Is it - // ignored by other versions? + /* Set MySQL server SQL modes to behave as closely as possible to Oracle and + * PostgreSQL. Note that the ONLY_FULL_GROUP_BY mode is left on purpose because + * MySQL requires you to specify all non-aggregate columns in the group by list + * even if the query is grouped by the master table's primary key which is valid + * ANSI SQL though. Further in that case the query plan would suffer if you add more + * columns to the group by list. + * @TODO(#4462): NO_ZERO_IN_DATE has been added with MySQL version 5.1.11. Is it + * safe to pass this option since (older) versions ignore modes unknown by this time? + */ + $drv_ptions[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET SESSION SQL_MODE='" + . "STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO," + . "NO_AUTO_CREATE_USER,ANSI_QUOTES,PIPES_AS_CONCAT,NO_ENGINE_SUBSTITUTION';"; $port = $this->config->get('port', 3306); break; case 'pgsql': @@ -110,7 +115,7 @@ class Connection implements DatasourceInterface if ($adapter === 'Oracle') { $this->db->setLobAsString(false); } - + // TODO: ZfDb::FETCH_ASSOC for Oracle? $this->db->setFetchMode(ZfDb::FETCH_OBJ);