]> git.joonet.de Git - adminer.git/commitdiff
MySQL: Fix displaying multi-columns foreign keys (bug #675)
authorJakub Vrana <jakub@vrana.cz>
Sun, 14 Jul 2019 17:53:41 +0000 (19:53 +0200)
committerJakub Vrana <jakub@vrana.cz>
Sun, 14 Jul 2019 17:53:41 +0000 (19:53 +0200)
adminer/drivers/mysql.inc.php
changes.txt

index 4d704fc55c0616da06274025f1751ae47b21c33b..c39020e3b64b606a9ffd8bffda5273c9b0829e1a 100644 (file)
@@ -582,24 +582,18 @@ if (!defined("DRIVER")) {
        * @return array array($name => array("db" => , "ns" => , "table" => , "source" => array(), "target" => array(), "on_delete" => , "on_update" => ))
        */
        function foreign_keys($table) {
-               global $connection, $on_actions;
-               static $pattern = '(?:`(?:[^`]|``)+`)|(?:"(?:[^"]|"")+")';
                $return = array();
-               $create_table = $connection->result("SHOW CREATE TABLE " . table($table), 1);
-               if ($create_table) {
-                       preg_match_all("~CONSTRAINT ($pattern) FOREIGN KEY ?\\(((?:$pattern,? ?)+)\\) REFERENCES ($pattern)(?:\\.($pattern))? \\(((?:$pattern,? ?)+)\\)(?: ON DELETE ($on_actions))?(?: ON UPDATE ($on_actions))?~", $create_table, $matches, PREG_SET_ORDER);
-                       foreach ($matches as $match) {
-                               preg_match_all("~$pattern~", $match[2], $source);
-                               preg_match_all("~$pattern~", $match[5], $target);
-                               $return[idf_unescape($match[1])] = array(
-                                       "db" => idf_unescape($match[4] != "" ? $match[3] : $match[4]),
-                                       "table" => idf_unescape($match[4] != "" ? $match[4] : $match[3]),
-                                       "source" => array_map('idf_unescape', $source[0]),
-                                       "target" => array_map('idf_unescape', $target[0]),
-                                       "on_delete" => ($match[6] ? $match[6] : "RESTRICT"),
-                                       "on_update" => ($match[7] ? $match[7] : "RESTRICT"),
-                               );
-                       }
+               foreach (get_rows("SELECT * FROM information_schema.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = " . q(DB) . " AND TABLE_NAME = " . q($table)) as $row) {
+                       $columns = get_key_vals("SELECT COLUMN_NAME, REFERENCED_COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE CONSTRAINT_SCHEMA = " . q(DB) . " AND CONSTRAINT_NAME = " . q($row["CONSTRAINT_NAME"]) . " ORDER BY ORDINAL_POSITION");
+                       $db = $row["UNIQUE_CONSTRAINT_SCHEMA"];
+                       $return[$row["CONSTRAINT_NAME"]] = array(
+                               "db" => ($db == DB ? "" : $db),
+                               "table" => $row["REFERENCED_TABLE_NAME"],
+                               "source" => array_keys($columns),
+                               "target" => array_values($columns),
+                               "on_delete" => $row["DELETE_RULE"],
+                               "on_update" => $row["UPDATE_RULE"],
+                       );
                }
                return $return;
        }
index e49090314acc60ba68f7f793862f9d8483136d9c..4a757fb82f2ca603b5ef15c1776d5480971b6298 100644 (file)
@@ -3,6 +3,7 @@ Do not attempt logging in without password (bug #676)
 Stretch footer over the whole table width (bug #624)
 Allow overwriting tables when copying them
 Cache busting for adminer.css
+MySQL: Fix displaying multi-columns foreign keys (bug #675)
 MySQL: Fix creating users and changing password in MySQL 8 (bug #663)
 MySQL: Pass SRID to GeomFromText
 Elasticsearch: Fix setting number of rows