]> git.joonet.de Git - adminer.git/commitdiff
MS SQL: Support computed columns
authorJakub Vrana <jakub@vrana.cz>
Fri, 7 Mar 2025 05:42:27 +0000 (06:42 +0100)
committerJakub Vrana <jakub@vrana.cz>
Fri, 7 Mar 2025 05:42:27 +0000 (06:42 +0100)
adminer/drivers/mssql.inc.php
adminer/include/editing.inc.php
changes.txt

index d564207cb0b57a10cb61ed239479998eb0cbdd7c..ea7067bdcedc28f9f3d6a28977f1729e57b4769c 100644 (file)
@@ -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 {
index 40fac53d65c9f23e8c3a5cb091226ed97b38e721..334835d83e175b70b67d7ce1eaf34c50c17e96e5 100644 (file)
@@ -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))
index e707dd7a48d4f35cd7101a0681df66d56c0080bd..aa0110240f04cafa9cae443968622f19d2891b75 100644 (file)
@@ -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