diff --git a/adminer/drivers/pgsql.inc.php b/adminer/drivers/pgsql.inc.php index eb40104f..2cc438c8 100644 --- a/adminer/drivers/pgsql.inc.php +++ b/adminer/drivers/pgsql.inc.php @@ -729,7 +729,7 @@ ORDER BY SPECIFIC_NAME'); } function types() { - return get_vals("SELECT typname + return get_key_vals("SELECT oid, typname FROM pg_type WHERE typnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema()) AND typtype IN ('b','d','e') @@ -752,9 +752,9 @@ AND typelem = 0" $connection2 = $connection; } $return = $connection2->query("SET search_path TO " . idf_escape($schema)); - foreach (types() as $type) { //! get types from current_schemas('t') + foreach (types() as $key => $type) { //! get types from current_schemas('t') if (!isset($types[$type])) { - $types[$type] = 0; + $types[$type] = $key; $structured_types[lang('User types')][] = $type; } } diff --git a/adminer/include/functions.inc.php b/adminer/include/functions.inc.php index 6612b84e..6e0158e5 100644 --- a/adminer/include/functions.inc.php +++ b/adminer/include/functions.inc.php @@ -869,13 +869,13 @@ function column_foreign_keys($table) { * @return null */ function enum_input($type, $attrs, $field, $value, $empty = null) { - global $adminer; + global $adminer, $jush; preg_match_all("~'((?:[^']|'')*)'~", $field["length"], $matches); $return = ($empty !== null ? "" : ""); foreach ($matches[1] as $i => $val) { $val = stripcslashes(str_replace("''", "'", $val)); $checked = (is_int($value) ? $value == $i+1 : (is_array($value) ? in_array($i+1, $value) : $value === $val)); - $return .= " '; + $return .= " '; } return $return; } @@ -887,7 +887,7 @@ function enum_input($type, $attrs, $field, $value, $empty = null) { * @return null */ function input($field, $value, $function) { - global $types, $adminer, $jush; + global $types, $structured_types, $adminer, $jush; $name = h(bracket_escape($field["field"])); echo ""; if (is_array($value) && !$function) { @@ -905,6 +905,13 @@ function input($field, $value, $function) { $functions = (isset($_GET["select"]) || $reset ? array("orig" => lang('original')) : array()) + $adminer->editFunctions($field); $disabled = stripos($field["default"], "GENERATED ALWAYS AS ") === 0 ? " disabled=''" : ""; $attrs = " name='fields[$name]'$disabled"; + if ($jush == "pgsql" && in_array($field["type"], (array) $structured_types[lang('User types')])) { + $enums = get_vals("SELECT enumlabel FROM pg_enum WHERE enumtypid = " . $types[$field["type"]] . " ORDER BY enumsortorder"); + if ($enums) { + $field["type"] = "enum"; + $field["length"] = "'" . implode("','", array_map('addslashes', $enums)) . "'"; + } + } if ($field["type"] == "enum") { echo h($functions[""]) . "" . $adminer->editInput($_GET["edit"], $field, $attrs, $value); } else { diff --git a/changes.txt b/changes.txt index fefb3373..f93081d1 100644 --- a/changes.txt +++ b/changes.txt @@ -1,6 +1,7 @@ Adminer 4.16.1-dev: Hide index column options by default PostgreSQL: Link user defined types +PostgreSQL: Constraint enum values in editing (bug #270) SQLite: Show all supported pragmas in Variables MS SQL: Allow altering table in non-default schema (bug #405) MS SQL: Fix default values (bug #732, bug #733)