From 877d9ba5cea2f3aa7d1fd3896c1552b99f390bb5 Mon Sep 17 00:00:00 2001 From: Jakub Vrana Date: Tue, 2 Jul 2013 09:20:06 -0700 Subject: [PATCH] PostgreSQL: Fix handling of nextval() default values (thanks to @ujovlado) --- adminer/drivers/pgsql.inc.php | 6 +++--- adminer/include/editing.inc.php | 8 +++++++- changes.txt | 1 + 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/adminer/drivers/pgsql.inc.php b/adminer/drivers/pgsql.inc.php index 3ee7c86b..2e46e28b 100644 --- a/adminer/drivers/pgsql.inc.php +++ b/adminer/drivers/pgsql.inc.php @@ -252,8 +252,8 @@ ORDER BY a.attnum" $row["null"] = !$row["attnotnull"]; $row["auto_increment"] = eregi("^nextval\\(", $row["default"]); $row["privileges"] = array("insert" => 1, "select" => 1, "update" => 1); - if (preg_match('~^(.*)::.+$~', $row["default"], $match)) { - $row["default"] = ($match[1][0] == "'" ? idf_unescape($match[1]) : $match[1]); + if (preg_match('~(.+)::[^)]+(.*)~', $row["default"], $match)) { + $row["default"] = ($match[1][0] == "'" ? idf_unescape($match[1]) : $match[1]) . $match[2]; } $return[$row["field"]] = $row; } @@ -372,7 +372,7 @@ ORDER BY conkey, conname") as $row) { } $alter[] = "ALTER $column TYPE$val[1]"; if (!$val[6]) { - $alter[] = "ALTER $column " . ($val[3] ? "SET$val[3]" : "DROP DEFAULT"); //! quoting + $alter[] = "ALTER $column " . ($val[3] ? "SET$val[3]" : "DROP DEFAULT"); $alter[] = "ALTER $column " . ($val[2] == " NULL" ? "DROP NOT" : "SET") . $val[2]; } } diff --git a/adminer/include/editing.inc.php b/adminer/include/editing.inc.php index d42541ea..a5986dfe 100644 --- a/adminer/include/editing.inc.php +++ b/adminer/include/editing.inc.php @@ -176,11 +176,17 @@ function process_type($field, $collate = "COLLATE") { * @return array array("field", "type", "NULL", "DEFAULT", "ON UPDATE", "COMMENT", "AUTO_INCREMENT") */ function process_field($field, $type_field) { + global $jush; + $default = $field["default"]; return array( idf_escape(trim($field["field"])), process_type($type_field), ($field["null"] ? " NULL" : " NOT NULL"), // NULL for timestamp - (isset($field["default"]) ? " DEFAULT " . ((ereg("time", $field["type"]) && eregi('^CURRENT_TIMESTAMP$', $field["default"])) || ($field["type"] == "bit" && ereg("^([0-9]+|b'[0-1]+')\$", $field["default"])) ? $field["default"] : q($field["default"])) : ""), + (isset($default) ? " DEFAULT " . ( + (ereg("time", $field["type"]) && eregi('^CURRENT_TIMESTAMP$', $default)) + || ($field["type"] == "bit" && ereg("^([0-9]+|b'[0-1]+')\$", $default)) + || ($jush == "pgsql" && ereg("^[a-z]+\(('[^']*')+\)\$", $default)) + ? $default : q($default)) : ""), ($field["type"] == "timestamp" && $field["on_update"] ? " ON UPDATE $field[on_update]" : ""), (support("comment") && $field["comment"] != "" ? " COMMENT " . q($field["comment"]) : ""), ($field["auto_increment"] ? auto_increment() : null), diff --git a/changes.txt b/changes.txt index ce1d8242..b48919fa 100644 --- a/changes.txt +++ b/changes.txt @@ -1,5 +1,6 @@ Adminer 3.7.2-dev: Save and continue edit by AJAX +PostgreSQL: Fix handling of nextval() default values Adminer 3.7.1 (released 2013-06-29): Increase click target for checkboxes