From 380e8940b1450a2a4df25b453d44816709a9ba2e Mon Sep 17 00:00:00 2001 From: Madhura Jayaratne Date: Thu, 9 Oct 2014 11:27:09 +0530 Subject: [PATCH] bug #4552 Incorrect routines display for database due to case insensitive checks Signed-off-by: Madhura Jayaratne --- ChangeLog | 1 + libraries/DatabaseInterface.class.php | 3 ++- libraries/Util.class.php | 18 ++++++++++++++++++ .../navigation/Nodes/Node_Database.class.php | 18 ++++++++++++------ .../navigation/Nodes/Node_Table.class.php | 12 ++++++++---- libraries/rte/rte_events.lib.php | 9 ++++++--- libraries/rte/rte_routines.lib.php | 9 ++++++--- 7 files changed, 53 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index a3a2a593c721..e03b0f37be24 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,6 +8,7 @@ phpMyAdmin - ChangeLog - bug #4543 Changing column name can break saved "order by" clause - bug #4545 trying to favorite table while browser localStorage is disabled throws JS error - bug #4259 reCaptcha sound session expired problem +- bug #4552 Incorrect routines display for database due to case insensitive checks 4.2.9.0 (2014-09-20) - bug ajax.js responseHandler: cannot read property of null diff --git a/libraries/DatabaseInterface.class.php b/libraries/DatabaseInterface.class.php index c126c17d5d22..edab4255b935 100644 --- a/libraries/DatabaseInterface.class.php +++ b/libraries/DatabaseInterface.class.php @@ -1903,7 +1903,8 @@ public function getTriggers($db, $table = '', $delimiter = '//') . ', EVENT_OBJECT_TABLE, ACTION_TIMING, ACTION_STATEMENT' . ', EVENT_OBJECT_SCHEMA, EVENT_OBJECT_TABLE, DEFINER' . ' FROM information_schema.TRIGGERS' - . ' WHERE TRIGGER_SCHEMA= \'' . PMA_Util::sqlAddSlashes($db) . '\''; + . ' WHERE TRIGGER_SCHEMA ' . PMA_Util::getCollateForIS() . '=' + . ' \'' . PMA_Util::sqlAddSlashes($db) . '\''; if (! empty($table)) { $query .= " AND EVENT_OBJECT_TABLE = '" diff --git a/libraries/Util.class.php b/libraries/Util.class.php index 047232a3b90d..6d182b5df621 100644 --- a/libraries/Util.class.php +++ b/libraries/Util.class.php @@ -4392,6 +4392,24 @@ public static function getCompressionMimeType($file) } return 'none'; } + + /** + * Provide COLLATE clause, if required, to perfrom case sensitice comparisons + * for queries on information_schema. + * + * @return string COLLATE clause if needed or empty string. + */ + public static function getCollateForIS() + { + $lowerCaseTableNames = $GLOBALS['dbi']->fetchValue( + "SHOW VARIABLES LIKE 'lower_case_table_names'", 0, 1 + ); + + if ($lowerCaseTableNames === '0') { + return "COLLATE utf8_bin"; + } + return ""; + } } ?> diff --git a/libraries/navigation/Nodes/Node_Database.class.php b/libraries/navigation/Nodes/Node_Database.class.php index eac00581bf46..6829579d42e7 100644 --- a/libraries/navigation/Nodes/Node_Database.class.php +++ b/libraries/navigation/Nodes/Node_Database.class.php @@ -117,7 +117,8 @@ public function getPresence($type = '', $searchClause = '', $singleItem = false) $db = PMA_Util::sqlAddSlashes($db); $query = "SELECT COUNT(*) "; $query .= "FROM `INFORMATION_SCHEMA`.`ROUTINES` "; - $query .= "WHERE `ROUTINE_SCHEMA`='$db'"; + $query .= "WHERE `ROUTINE_SCHEMA` " + . PMA_Util::getCollateForIS() . "='$db'"; $query .= "AND `ROUTINE_TYPE`='PROCEDURE' "; if (! empty($searchClause)) { if ($singleItem) { @@ -140,7 +141,8 @@ public function getPresence($type = '', $searchClause = '', $singleItem = false) $db = PMA_Util::sqlAddSlashes($db); $query = "SELECT COUNT(*) "; $query .= "FROM `INFORMATION_SCHEMA`.`ROUTINES` "; - $query .= "WHERE `ROUTINE_SCHEMA`='$db' "; + $query .= "WHERE `ROUTINE_SCHEMA` " + . PMA_Util::getCollateForIS() . "='$db' "; $query .= "AND `ROUTINE_TYPE`='FUNCTION' "; if (! empty($searchClause)) { if ($singleItem) { @@ -163,7 +165,8 @@ public function getPresence($type = '', $searchClause = '', $singleItem = false) $db = PMA_Util::sqlAddSlashes($db); $query = "SELECT COUNT(*) "; $query .= "FROM `INFORMATION_SCHEMA`.`EVENTS` "; - $query .= "WHERE `EVENT_SCHEMA`='$db' "; + $query .= "WHERE `EVENT_SCHEMA` " + . PMA_Util::getCollateForIS() . "='$db' "; if (! empty($searchClause)) { if ($singleItem) { $query .= "AND `EVENT_NAME` = '"; @@ -250,7 +253,8 @@ public function getData($type, $pos, $searchClause = '') $escdDb = PMA_Util::sqlAddSlashes($db); $query = "SELECT `ROUTINE_NAME` AS `name` "; $query .= "FROM `INFORMATION_SCHEMA`.`ROUTINES` "; - $query .= "WHERE `ROUTINE_SCHEMA`='$escdDb'"; + $query .= "WHERE `ROUTINE_SCHEMA` " + . PMA_Util::getCollateForIS() . "='$escdDb'"; $query .= "AND `ROUTINE_TYPE`='PROCEDURE' "; if (! empty($searchClause)) { $query .= "AND `ROUTINE_NAME` LIKE '%"; @@ -267,7 +271,8 @@ public function getData($type, $pos, $searchClause = '') $escdDb = PMA_Util::sqlAddSlashes($db); $query = "SELECT `ROUTINE_NAME` AS `name` "; $query .= "FROM `INFORMATION_SCHEMA`.`ROUTINES` "; - $query .= "WHERE `ROUTINE_SCHEMA`='$escdDb' "; + $query .= "WHERE `ROUTINE_SCHEMA` " + . PMA_Util::getCollateForIS() . "='$escdDb' "; $query .= "AND `ROUTINE_TYPE`='FUNCTION' "; if (! empty($searchClause)) { $query .= "AND `ROUTINE_NAME` LIKE '%"; @@ -284,7 +289,8 @@ public function getData($type, $pos, $searchClause = '') $escdDb = PMA_Util::sqlAddSlashes($db); $query = "SELECT `EVENT_NAME` AS `name` "; $query .= "FROM `INFORMATION_SCHEMA`.`EVENTS` "; - $query .= "WHERE `EVENT_SCHEMA`='$escdDb' "; + $query .= "WHERE `EVENT_SCHEMA` " + . PMA_Util::getCollateForIS() . "='$escdDb' "; if (! empty($searchClause)) { $query .= "AND `EVENT_NAME` LIKE '%"; $query .= PMA_Util::sqlAddSlashes( diff --git a/libraries/navigation/Nodes/Node_Table.class.php b/libraries/navigation/Nodes/Node_Table.class.php index e984c17de141..395fe8612fbf 100644 --- a/libraries/navigation/Nodes/Node_Table.class.php +++ b/libraries/navigation/Nodes/Node_Table.class.php @@ -98,8 +98,10 @@ public function getPresence($type = '', $searchClause = '') $table = PMA_Util::sqlAddSlashes($table); $query = "SELECT COUNT(*) "; $query .= "FROM `INFORMATION_SCHEMA`.`TRIGGERS` "; - $query .= "WHERE `EVENT_OBJECT_SCHEMA`='$db' "; - $query .= "AND `EVENT_OBJECT_TABLE`='$table'"; + $query .= "WHERE `EVENT_OBJECT_SCHEMA` " + . PMA_Util::getCollateForIS() . "='$db' "; + $query .= "AND `EVENT_OBJECT_TABLE` " + . PMA_Util::getCollateForIS() . "='$table'"; $retval = (int)$GLOBALS['dbi']->fetchValue($query); break; default: @@ -161,8 +163,10 @@ public function getData($type, $pos, $searchClause = '') $table = PMA_Util::sqlAddSlashes($table); $query = "SELECT `TRIGGER_NAME` AS `name` "; $query .= "FROM `INFORMATION_SCHEMA`.`TRIGGERS` "; - $query .= "WHERE `EVENT_OBJECT_SCHEMA`='$db' "; - $query .= "AND `EVENT_OBJECT_TABLE`='$table' "; + $query .= "WHERE `EVENT_OBJECT_SCHEMA` " + . PMA_Util::getCollateForIS() . "='$db' "; + $query .= "AND `EVENT_OBJECT_TABLE` " + . PMA_Util::getCollateForIS() . "='$table' "; $query .= "ORDER BY `TRIGGER_NAME` ASC "; $query .= "LIMIT " . intval($pos) . ", $maxItems"; $retval = $GLOBALS['dbi']->fetchResult($query); diff --git a/libraries/rte/rte_events.lib.php b/libraries/rte/rte_events.lib.php index 0a17686639e5..349030109bb2 100644 --- a/libraries/rte/rte_events.lib.php +++ b/libraries/rte/rte_events.lib.php @@ -64,7 +64,8 @@ function PMA_EVN_main() * Display a list of available events */ $columns = "`EVENT_NAME`, `EVENT_TYPE`, `STATUS`"; - $where = "EVENT_SCHEMA='" . PMA_Util::sqlAddSlashes($db) . "'"; + $where = "EVENT_SCHEMA " . PMA_Util::getCollateForIS() . "=" + . "'" . PMA_Util::sqlAddSlashes($db) . "'"; $query = "SELECT $columns FROM `INFORMATION_SCHEMA`.`EVENTS` " . "WHERE $where ORDER BY `EVENT_NAME` ASC;"; $items = $GLOBALS['dbi']->fetchResult($query); @@ -191,7 +192,8 @@ function PMA_EVN_handleEditor() $response = PMA_Response::getInstance(); if ($message->isSuccess()) { $columns = "`EVENT_NAME`, `EVENT_TYPE`, `STATUS`"; - $where = "EVENT_SCHEMA='" . PMA_Util::sqlAddSlashes($db) . "' " + $where = "EVENT_SCHEMA " . PMA_Util::getCollateForIS() . "=" + . "'" . PMA_Util::sqlAddSlashes($db) . "' " . "AND EVENT_NAME='" . PMA_Util::sqlAddSlashes($_REQUEST['item_name']) . "'"; $query = "SELECT " . $columns @@ -325,7 +327,8 @@ function PMA_EVN_getDataFromName($name) $columns = "`EVENT_NAME`, `STATUS`, `EVENT_TYPE`, `EXECUTE_AT`, " . "`INTERVAL_VALUE`, `INTERVAL_FIELD`, `STARTS`, `ENDS`, " . "`EVENT_DEFINITION`, `ON_COMPLETION`, `DEFINER`, `EVENT_COMMENT`"; - $where = "EVENT_SCHEMA='" . PMA_Util::sqlAddSlashes($db) . "' " + $where = "EVENT_SCHEMA " . PMA_Util::getCollateForIS() . "=" + . "'" . PMA_Util::sqlAddSlashes($db) . "' " . "AND EVENT_NAME='" . PMA_Util::sqlAddSlashes($name) . "'"; $query = "SELECT $columns FROM `INFORMATION_SCHEMA`.`EVENTS` WHERE $where;"; $item = $GLOBALS['dbi']->fetchSingleRow($query); diff --git a/libraries/rte/rte_routines.lib.php b/libraries/rte/rte_routines.lib.php index 2055f4a9ac86..232bfad034b0 100644 --- a/libraries/rte/rte_routines.lib.php +++ b/libraries/rte/rte_routines.lib.php @@ -55,7 +55,8 @@ function PMA_RTN_main($type) */ $columns = "`SPECIFIC_NAME`, `ROUTINE_NAME`, `ROUTINE_TYPE`, "; $columns .= "`DTD_IDENTIFIER`, `ROUTINE_DEFINITION`"; - $where = "ROUTINE_SCHEMA='" . PMA_Util::sqlAddSlashes($db) . "'"; + $where = "ROUTINE_SCHEMA " . PMA_Util::getCollateForIS() . "=" + . "'" . PMA_Util::sqlAddSlashes($db) . "'"; if (PMA_isValid($type, array('FUNCTION','PROCEDURE'))) { $where .= " AND `ROUTINE_TYPE`='" . $type . "'"; } @@ -392,7 +393,8 @@ function PMA_RTN_handleEditor() if ($message->isSuccess()) { $columns = "`SPECIFIC_NAME`, `ROUTINE_NAME`, `ROUTINE_TYPE`," . " `DTD_IDENTIFIER`, `ROUTINE_DEFINITION`"; - $where = "ROUTINE_SCHEMA='" . PMA_Util::sqlAddSlashes($db) . "' " + $where = "ROUTINE_SCHEMA " . PMA_Util::getCollateForIS() . "=" + . "'" . PMA_Util::sqlAddSlashes($db) . "' " . "AND ROUTINE_NAME='" . PMA_Util::sqlAddSlashes($_REQUEST['item_name']) . "'" . "AND ROUTINE_TYPE='" @@ -625,7 +627,8 @@ function PMA_RTN_getDataFromName($name, $type, $all = true) $fields = "SPECIFIC_NAME, ROUTINE_TYPE, DTD_IDENTIFIER, " . "ROUTINE_DEFINITION, IS_DETERMINISTIC, SQL_DATA_ACCESS, " . "ROUTINE_COMMENT, SECURITY_TYPE"; - $where = "ROUTINE_SCHEMA='" . PMA_Util::sqlAddSlashes($db) . "' " + $where = "ROUTINE_SCHEMA " . PMA_Util::getCollateForIS() . "=" + . "'" . PMA_Util::sqlAddSlashes($db) . "' " . "AND SPECIFIC_NAME='" . PMA_Util::sqlAddSlashes($name) . "'" . "AND ROUTINE_TYPE='" . PMA_Util::sqlAddSlashes($type) . "'"; $query = "SELECT $fields FROM INFORMATION_SCHEMA.ROUTINES WHERE $where;";