]> git.joonet.de Git - adminer.git/commitdiff
AdminerBackwardKeys: Support PostgreSQL
authorJakub Vrana <jakub@vrana.cz>
Wed, 18 Jun 2025 14:51:29 +0000 (16:51 +0200)
committerJakub Vrana <jakub@vrana.cz>
Wed, 18 Jun 2025 16:21:38 +0000 (18:21 +0200)
plugins/backward-keys.php

index ea41e6d3fdbb3e0d5df5bf59af985f2f4cfbdfa6..0bf10ec39119cd333e40f51a2e55fee479a0378a 100644 (file)
@@ -11,15 +11,23 @@ class AdminerBackwardKeys extends Adminer\Plugin {
 
        function backwardKeys($table, $tableName) {
                $return = array();
+               // we couldn't use the same query in MySQL and PostgreSQL because unique_constraint_name is not table-specific in MySQL and referenced_table_name is not available in PostgreSQL
                foreach (
-                       Adminer\get_rows($q = "SELECT TABLE_NAME, CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_COLUMN_NAME
-FROM information_schema.KEY_COLUMN_USAGE
-WHERE TABLE_SCHEMA = " . Adminer\q(Adminer\DB) . "
-AND REFERENCED_TABLE_SCHEMA = " . Adminer\q(Adminer\DB) . "
-AND REFERENCED_TABLE_NAME = " . Adminer\q($table) . "
-ORDER BY ORDINAL_POSITION", null, "") as $row
+                       Adminer\get_rows("SELECT s.table_name table_name, s.constraint_name constraint_name, s.column_name column_name, " . (Adminer\JUSH == "sql" ? "referenced_column_name" : "t.column_name") . " referenced_column_name
+FROM information_schema.key_column_usage s" . (Adminer\JUSH == "sql" ? "
+WHERE table_schema = " . Adminer\q(Adminer\DB) . "
+AND referenced_table_schema = " . Adminer\q(Adminer\DB) . "
+AND referenced_table_name" : "
+JOIN information_schema.referential_constraints r USING (constraint_catalog, constraint_schema, constraint_name)
+JOIN information_schema.key_column_usage t ON r.unique_constraint_catalog = t.constraint_catalog
+       AND r.unique_constraint_schema = t.constraint_schema
+       AND r.unique_constraint_name = t.constraint_name
+       AND s.position_in_unique_constraint = t.ordinal_position
+WHERE t.table_catalog = " . Adminer\q(Adminer\DB) . " AND t.table_schema = " . Adminer\q($_GET["ns"]) . "
+AND t.table_name") . " = " . Adminer\q($table) . "
+ORDER BY s.ordinal_position", null, "") as $row
                ) {
-                       $return[$row["TABLE_NAME"]]["keys"][$row["CONSTRAINT_NAME"]][$row["COLUMN_NAME"]] = $row["REFERENCED_COLUMN_NAME"];
+                       $return[$row["table_name"]]["keys"][$row["constraint_name"]][$row["column_name"]] = $row["referenced_column_name"];
                }
                foreach ($return as $key => $val) {
                        $name = Adminer\adminer()->tableName(Adminer\table_status1($key, true));