From 3f979793f7d3cc5266fc8cfb92e2c910176fedcd Mon Sep 17 00:00:00 2001 From: Jakub Vrana Date: Mon, 7 Apr 2025 19:51:43 +0200 Subject: [PATCH] Fix foreign key actions (regression from 5.1.1) https://github.com/vrana/adminer/discussions/969#discussioncomment-12752117 --- CHANGELOG.md | 1 + adminer/drivers/mysql.inc.php | 2 +- adminer/drivers/pgsql.inc.php | 4 ++-- adminer/include/editing.inc.php | 6 +++--- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0288b6d0..8054a60f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## Adminer dev - Autocomplete SQL commands - Do not edit NULL values by Modify (bug #967) +- Fix foreign key actions (regression from 5.1.1) - PostgreSQL: Support COPY FROM stdin in SQL query (bug #942) - MySQL: Display number of found rows in group queries (regression from 5.1.1) - non-MySQL: Parse '--' without trailing space as comment in SQL command (bug SF-842) diff --git a/adminer/drivers/mysql.inc.php b/adminer/drivers/mysql.inc.php index 4e16df49..0daed0dc 100644 --- a/adminer/drivers/mysql.inc.php +++ b/adminer/drivers/mysql.inc.php @@ -556,7 +556,7 @@ if (!defined('Adminer\DRIVER')) { $create_table = get_val("SHOW CREATE TABLE " . table($table), 1); if ($create_table) { preg_match_all( - "~CONSTRAINT ($pattern) FOREIGN KEY ?\\(((?:$pattern,? ?)+)\\) REFERENCES ($pattern)(?:\\.($pattern))? \\(((?:$pattern,? ?)+)\\)(?: ON DELETE (driver()->onActions))?(?: ON UPDATE (driver()->onActions))?~", + "~CONSTRAINT ($pattern) FOREIGN KEY ?\\(((?:$pattern,? ?)+)\\) REFERENCES ($pattern)(?:\\.($pattern))? \\(((?:$pattern,? ?)+)\\)(?: ON DELETE (" . driver()->onActions . "))?(?: ON UPDATE (" . driver()->onActions . "))?~", $create_table, $matches, PREG_SET_ORDER diff --git a/adminer/drivers/pgsql.inc.php b/adminer/drivers/pgsql.inc.php index 85911476..a9a423f3 100644 --- a/adminer/drivers/pgsql.inc.php +++ b/adminer/drivers/pgsql.inc.php @@ -527,8 +527,8 @@ ORDER BY conkey, conname") as $row $row['table'] = idf_unescape($match2[4]); } $row['target'] = array_map('Adminer\idf_unescape', array_map('trim', explode(',', $match[3]))); - $row['on_delete'] = (preg_match("~ON DELETE (driver()->onActions)~", $match[4], $match2) ? $match2[1] : 'NO ACTION'); - $row['on_update'] = (preg_match("~ON UPDATE (driver()->onActions)~", $match[4], $match2) ? $match2[1] : 'NO ACTION'); + $row['on_delete'] = (preg_match("~ON DELETE (" . driver()->onActions . ")~", $match[4], $match2) ? $match2[1] : 'NO ACTION'); + $row['on_update'] = (preg_match("~ON UPDATE (" . driver()->onActions . ")~", $match[4], $match2) ? $match2[1] : 'NO ACTION'); $return[$row['conname']] = $row; } } diff --git a/adminer/include/editing.inc.php b/adminer/include/editing.inc.php index d5f8763a..4af1f272 100644 --- a/adminer/include/editing.inc.php +++ b/adminer/include/editing.inc.php @@ -470,7 +470,7 @@ function create_routine($routine, array $row): string { ksort($fields); // enforce fields order foreach ($fields as $field) { if ($field["field"] != "") { - $set[] = (preg_match("~^(driver()->inout)\$~", $field["inout"]) ? "$field[inout] " : "") . idf_escape($field["field"]) . process_type($field, "CHARACTER SET"); + $set[] = (preg_match("~^(" . driver()->inout . ")\$~", $field["inout"]) ? "$field[inout] " : "") . idf_escape($field["field"]) . process_type($field, "CHARACTER SET"); } } $definition = rtrim($row["definition"], ";"); @@ -499,8 +499,8 @@ function format_foreign_key(array $foreign_key): string { . ($ns != "" && $ns != $_GET["ns"] ? idf_escape($ns) . "." : "") . idf_escape($foreign_key["table"]) . " (" . implode(", ", array_map('Adminer\idf_escape', $foreign_key["target"])) . ")" //! reuse $name - check in older MySQL versions - . (preg_match("~^(driver()->onActions)\$~", $foreign_key["on_delete"]) ? " ON DELETE $foreign_key[on_delete]" : "") - . (preg_match("~^(driver()->onActions)\$~", $foreign_key["on_update"]) ? " ON UPDATE $foreign_key[on_update]" : "") + . (preg_match("~^(" . driver()->onActions . ")\$~", $foreign_key["on_delete"]) ? " ON DELETE $foreign_key[on_delete]" : "") + . (preg_match("~^(" . driver()->onActions . ")\$~", $foreign_key["on_update"]) ? " ON UPDATE $foreign_key[on_update]" : "") ; }