$field) { $foreign_keys[str_replace("`", "``", $table_name) . "`" . str_replace("`", "``", $field["field"])] = $table_name; // not idf_escape() - used in JS } $orig_fields = array(); $table_status = array(); if ($TABLE != "") { $orig_fields = fields($TABLE); $table_status = table_status($TABLE); if (!$table_status) { $error = lang('No tables.'); } } $row = $_POST; $row["fields"] = (array) $row["fields"]; if ($row["auto_increment_col"]) { $row["fields"][$row["auto_increment_col"]]["auto_increment"] = true; } if ($_POST) { set_adminer_settings(array("comments" => $_POST["comments"], "defaults" => $_POST["defaults"])); } if ($_POST && !process_fields($row["fields"]) && !$error) { if ($_POST["drop"]) { queries_redirect(substr(ME, 0, -1), lang('Table has been dropped.'), drop_tables(array($TABLE))); } else { $fields = array(); $all_fields = array(); $use_all_fields = false; $foreign = array(); $orig_field = reset($orig_fields); $after = " FIRST"; foreach ($row["fields"] as $key => $field) { $foreign_key = $foreign_keys[$field["type"]]; $type_field = ($foreign_key !== null ? $referencable_primary[$foreign_key] : $field); //! can collide with user defined type if ($field["field"] != "") { if (!$field["generated"]) { $field["default"] = null; } $process_field = process_field($field, $type_field); $all_fields[] = array($field["orig"], $process_field, $after); if (!$orig_field || $process_field !== process_field($orig_field, $orig_field)) { $fields[] = array($field["orig"], $process_field, $after); if ($field["orig"] != "" || $after) { $use_all_fields = true; } } if ($foreign_key !== null) { $foreign[idf_escape($field["field"])] = ($TABLE != "" && JUSH != "sqlite" ? "ADD" : " ") . format_foreign_key(array( 'table' => $foreign_keys[$field["type"]], 'source' => array($field["field"]), 'target' => array($type_field["field"]), 'on_delete' => $field["on_delete"], )); } $after = " AFTER " . idf_escape($field["field"]); } elseif ($field["orig"] != "") { $use_all_fields = true; $fields[] = array($field["orig"]); } if ($field["orig"] != "") { $orig_field = next($orig_fields); if (!$orig_field) { $after = ""; } } } $partitioning = ""; if (support("partitioning")) { if (isset($partition_by[$row["partition_by"]])) { $params = array_filter($row, function ($key) { return preg_match('~^partition~', $key); }, ARRAY_FILTER_USE_KEY); foreach ($params["partition_names"] as $key => $name) { if ($name == "") { unset($params["partition_names"][$key]); unset($params["partition_values"][$key]); } } if ($params != get_partitions_info($TABLE)) { $partitions = array(); if ($params["partition_by"] == 'RANGE' || $params["partition_by"] == 'LIST') { foreach ($params["partition_names"] as $key => $name) { $value = $params["partition_values"][$key]; $partitions[] = "\n PARTITION " . idf_escape($name) . " VALUES " . ($params["partition_by"] == 'RANGE' ? "LESS THAN" : "IN") . ($value != "" ? " ($value)" : " MAXVALUE"); //! SQL injection } } // $params["partition"] can be expression, not only column $partitioning .= "\nPARTITION BY $params[partition_by]($params[partition])"; if ($partitions) { $partitioning .= " (" . implode(",", $partitions) . "\n)"; } elseif ($params["partitions"]) { $partitioning .= " PARTITIONS " . (+$params["partitions"]); } } } elseif (preg_match("~partitioned~", $table_status["Create_options"])) { $partitioning .= "\nREMOVE PARTITIONING"; } } $message = lang('Table has been altered.'); if ($TABLE == "") { cookie("adminer_engine", $row["Engine"]); $message = lang('Table has been created.'); } $name = trim($row["name"]); queries_redirect(ME . (support("table") ? "table=" : "select=") . urlencode($name), $message, alter_table( $TABLE, $name, (JUSH == "sqlite" && ($use_all_fields || $foreign) ? $all_fields : $fields), $foreign, ($row["Comment"] != $table_status["Comment"] ? $row["Comment"] : null), ($row["Engine"] && $row["Engine"] != $table_status["Engine"] ? $row["Engine"] : ""), ($row["Collation"] && $row["Collation"] != $table_status["Collation"] ? $row["Collation"] : ""), ($row["Auto_increment"] != "" ? number($row["Auto_increment"]) : ""), $partitioning )); } } page_header(($TABLE != "" ? lang('Alter table') : lang('Create table')), $error, array("table" => $TABLE), h($TABLE)); if (!$_POST) { $types = $driver->types(); $row = array( "Engine" => $_COOKIE["adminer_engine"], "fields" => array(array("field" => "", "type" => (isset($types["int"]) ? "int" : (isset($types["integer"]) ? "integer" : "")), "on_update" => "")), "partition_names" => array(""), ); if ($TABLE != "") { $row = $table_status; $row["name"] = $TABLE; $row["fields"] = array(); if (!$_GET["auto_increment"]) { // don't prefill by original Auto_increment for the sake of performance and not reusing deleted ids $row["Auto_increment"] = ""; } foreach ($orig_fields as $field) { $field["generated"] = $field["generated"] ?: (isset($field["default"]) ? "DEFAULT" : ""); $row["fields"][] = $field; } if (support("partitioning")) { $row += get_partitions_info($TABLE); $row["partition_names"][] = ""; $row["partition_values"][] = ""; } } } $collations = collations(); $engines = engines(); // case of engine may differ foreach ($engines as $engine) { if (!strcasecmp($engine, $row["Engine"])) { $row["Engine"] = $engine; break; } } ?>

: data-maxlength="64" value="" autocapitalize="off"> " . optionlist(array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) . "" . on_help("getTarget(event).value", 1) . script("qsl('select').onchange = helpClose;") : ""); ?> "(" . lang('collation') . ")") + $collations, $row["Collation"]) : ""); ?>

: "> " . h($row["Comment"]) . "" : '' ) : '') ; ?>

" . optionlist(array("" => "") + $partition_by, $row["partition_by"]) . "" . on_help("getTarget(event).value.replace(/./, 'PARTITION BY \$&')", 1) . script("qsl('select').onchange = partitionByChange;"); ?> (">) : " value=""> > $val) { echo ''; echo '