From 2e245412dc59898a53bc7305d685451026cc9010 Mon Sep 17 00:00:00 2001 From: Jakub Vrana Date: Tue, 6 Aug 2013 15:48:45 -0700 Subject: [PATCH] PostgreSQL: Support creating array columns Also allow () in length and IN. --- adminer/drivers/pgsql.inc.php | 9 ++++----- adminer/include/adminer.inc.php | 2 +- adminer/include/editing.inc.php | 7 +++++-- changes.txt | 1 + todo.txt | 1 - 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/adminer/drivers/pgsql.inc.php b/adminer/drivers/pgsql.inc.php index 0240b6be..9f1158d3 100644 --- a/adminer/drivers/pgsql.inc.php +++ b/adminer/drivers/pgsql.inc.php @@ -271,12 +271,11 @@ AND a.attnum > 0 ORDER BY a.attnum" ) as $row) { //! collation, primary - $type = $row["full_type"]; - if (preg_match('~(.+)\\((.*)\\)$~', $row["full_type"], $match)) { - list(, $type, $row["length"]) = $match; - } + preg_match('~([^([]+)(\((.*)\))?((\[[0-9]*])*)$~', $row["full_type"], $match); + list(, $type, $length, $row["length"], $array) = $match; + $row["length"] .= $array; $row["type"] = ($aliases[$type] ? $aliases[$type] : $type); - $row["full_type"] = $row["type"] . ($row["length"] ? "($row[length])" : ""); + $row["full_type"] = $row["type"] . $length . $array; $row["null"] = !$row["attnotnull"]; $row["auto_increment"] = preg_match('~^nextval\\(~i', $row["default"]); $row["privileges"] = array("insert" => 1, "select" => 1, "update" => 1); diff --git a/adminer/include/adminer.inc.php b/adminer/include/adminer.inc.php index 276a15d5..88d0998a 100644 --- a/adminer/include/adminer.inc.php +++ b/adminer/include/adminer.inc.php @@ -403,7 +403,7 @@ username.form['auth[driver]'].onchange(); $cond = " $val[op]"; if (preg_match('~IN$~', $val["op"])) { $in = process_length($val["val"]); - $cond .= " (" . ($in != "" ? $in : "NULL") . ")"; + $cond .= " " . ($in != "" ? $in : "(NULL)"); } elseif ($val["op"] == "SQL") { $cond = " $val[val]"; // SQL injection } elseif ($val["op"] == "LIKE %%") { diff --git a/adminer/include/editing.inc.php b/adminer/include/editing.inc.php index 98aa143c..04076640 100644 --- a/adminer/include/editing.inc.php +++ b/adminer/include/editing.inc.php @@ -153,7 +153,10 @@ function edit_type($key, $field, $collations, $foreign_keys = array()) { */ function process_length($length) { global $enum_length; - return (preg_match("~^\\s*$enum_length(?:\\s*,\\s*$enum_length)*+\\s*\$~", $length) && preg_match_all("~$enum_length~", $length, $matches) ? implode(",", $matches[0]) : preg_replace('~[^0-9,+-]~', '', $length)); + return (preg_match("~^\\s*\\(?\\s*$enum_length(?:\\s*,\\s*$enum_length)*+\\s*\\)?\\s*\$~", $length) && preg_match_all("~$enum_length~", $length, $matches) + ? "(" . implode(",", $matches[0]) . ")" + : preg_replace('~[^-0-9,+()[\]]~', '', preg_replace('~^[0-9]+~', '(\1)', $length)) + ); } /** Create SQL string from field type @@ -164,7 +167,7 @@ function process_length($length) { function process_type($field, $collate = "COLLATE") { global $unsigned; return " $field[type]" - . ($field["length"] != "" ? "(" . process_length($field["length"]) . ")" : "") + . process_length($field["length"]) . (preg_match('~(^|[^o])int|float|double|decimal~', $field["type"]) && in_array($field["unsigned"], $unsigned) ? " $field[unsigned]" : "") . (preg_match('~char|text|enum|set~', $field["type"]) && $field["collation"] ? " $collate " . q($field["collation"]) : "") ; diff --git a/changes.txt b/changes.txt index 64810672..69493a82 100644 --- a/changes.txt +++ b/changes.txt @@ -15,6 +15,7 @@ Don't append newlines to uploaded files, bug since Adminer 3.7.0 Don't display SQL edit form on Ctrl+click on the select query, introduced in Adminer 3.6.4 Use MD5 for editing long keys only in supported drivers, bug since Adminer 3.6.4 PostgreSQL: Fix handling of nextval() default values +PostgreSQL: Support creating array columns Adminer 3.7.1 (released 2013-06-29): Increase click target for checkboxes diff --git a/todo.txt b/todo.txt index 8f848d01..9661f6a0 100644 --- a/todo.txt +++ b/todo.txt @@ -28,7 +28,6 @@ Delimiter in export and SQL command Backward keys in Editor PostgreSQL: -Array data types Display number of schemas in databases overview Users - SELECT * FROM pg_user ORDER BY COUNT(*)