From 517d2d1c2f1cc60f5ac051200634261308120d43 Mon Sep 17 00:00:00 2001 From: Jakub Vrana Date: Fri, 7 Mar 2025 06:42:27 +0100 Subject: [PATCH] MS SQL: Support computed columns --- adminer/drivers/mssql.inc.php | 13 +++++++++++-- adminer/include/editing.inc.php | 5 ++--- changes.txt | 1 + 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/adminer/drivers/mssql.inc.php b/adminer/drivers/mssql.inc.php index d564207c..ea7067bd 100644 --- a/adminer/drivers/mssql.inc.php +++ b/adminer/drivers/mssql.inc.php @@ -202,6 +202,7 @@ if (isset($_GET["mssql"])) { var $functions = array("len", "lower", "round", "upper"); var $grouping = array("avg", "count", "count distinct", "max", "min", "sum"); var $onActions = "NO ACTION|CASCADE|SET NULL|SET DEFAULT"; + var $generated = array("PERSISTED", "VIRTUAL"); function __construct($connection) { parent::__construct($connection); @@ -358,17 +359,18 @@ WHERE schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND type IN ('S', 'U', 'V') } function fields($table) { + global $connection; $comments = get_key_vals("SELECT objname, cast(value as varchar(max)) FROM fn_listextendedproperty('MS_DESCRIPTION', 'schema', " . q(get_schema()) . ", 'table', " . q($table) . ", 'column', NULL)"); $return = array(); + $table_id = $connection->result("SELECT object_id FROM sys.all_objects WHERE schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND type IN ('S', 'U', 'V') AND name = " . q($table)); foreach ( get_rows("SELECT c.max_length, c.precision, c.scale, c.name, c.is_nullable, c.is_identity, c.collation_name, t.name type, CAST(d.definition as text) [default], d.name default_constraint, i.is_primary_key FROM sys.all_columns c -JOIN sys.all_objects o ON c.object_id = o.object_id JOIN sys.types t ON c.user_type_id = t.user_type_id LEFT JOIN sys.default_constraints d ON c.default_object_id = d.object_id LEFT JOIN sys.index_columns ic ON c.object_id = ic.object_id AND c.column_id = ic.column_id LEFT JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id -WHERE o.schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND o.type IN ('S', 'U', 'V') AND o.name = " . q($table)) as $row +WHERE c.object_id = " . q($table_id)) as $row ) { $type = $row["type"]; $length = (preg_match("~char|binary~", $type) @@ -390,6 +392,10 @@ WHERE o.schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND o.type IN ('S', 'U', "comment" => $comments[$row["name"]], ); } + foreach (get_rows("SELECT * FROM sys.computed_columns WHERE object_id = " . q($table_id)) as $row) { + $return[$row["name"]]["generated"] = ($row["is_persisted"] ? "PERSISTED" : "VIRTUAL"); + $return[$row["name"]]["default"] = $row["definition"]; + } return $return; } @@ -467,6 +473,9 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table), $connection2) as $row $val[1] = preg_replace("~( COLLATE )'(\\w+)'~", '\1\2', $val[1]); $comments[$field[0]] = $val[5]; unset($val[5]); + if (preg_match('~ AS ~', $val[3])) { + unset($val[1], $val[2]); + } if ($field[0] == "") { $alter["ADD"][] = "\n " . implode("", $val) . ($table == "" ? substr($foreign[$val[0]], 16 + strlen($val[0])) : ""); // 16 - strlen(" FOREIGN KEY ()") } else { diff --git a/adminer/include/editing.inc.php b/adminer/include/editing.inc.php index 40fac53d..334835d8 100644 --- a/adminer/include/editing.inc.php +++ b/adminer/include/editing.inc.php @@ -305,9 +305,8 @@ function default_value($field) { global $driver; $default = $field["default"]; $generated = $field["generated"]; - return ( - $default === null ? "" - : (in_array($generated, $driver->generated) ? " GENERATED ALWAYS AS ($default) $generated" + return ($default === null ? "" : (in_array($generated, $driver->generated) + ? (JUSH == "mssql" ? " AS ($default)" . ($generated == "VIRTUAL" ? "" : " $generated") . "" : " GENERATED ALWAYS AS ($default) $generated") : " DEFAULT " . (!preg_match('~^GENERATED ~i', $default) && (preg_match('~char|binary|text|enum|set~', $field["type"]) || preg_match('~^(?![a-z])~i', $default)) ? q($default) : str_ireplace("current_timestamp()", "CURRENT_TIMESTAMP", (JUSH == "sqlite" ? "($default)" : $default)) diff --git a/changes.txt b/changes.txt index e707dd7a..aa011024 100644 --- a/changes.txt +++ b/changes.txt @@ -21,6 +21,7 @@ SQLite: Display all rows of variable values SQLite: Remove support for SQLite version 2 MS SQL: Support export (bug #480) MS SQL: Display foreign keys ON UPDATE and ON DELETE +MS SQL: Support computed columns MS SQL: Fix CSV import (bug #859) MS SQL: Fix altering foreign key MS SQL PDO: Support offset