]> git.joonet.de Git - adminer.git/commitdiff
CockroachDB: Partitioning
authorJakub Vrana <jakub@vrana.cz>
Tue, 15 Apr 2025 05:18:22 +0000 (07:18 +0200)
committerJakub Vrana <jakub@vrana.cz>
Tue, 15 Apr 2025 05:18:22 +0000 (07:18 +0200)
CHANGELOG.md
adminer/drivers/pgsql.inc.php
tests/cockroachdb.html

index 63fb9edc2a08e50e60dbc53a17ade31ee88bc9ba..e0c0cb5e47dd662c3d61b516a3fa600622bd6d7e 100644 (file)
@@ -1,6 +1,6 @@
 ## Adminer dev
 - MySQL: Avoid warning on selecting tables with fulltext indexes (bug #1036)
-- PostgreSQL: Creating partitioned tables (bug #1031)
+- PostgreSQL, CockroachDB: Creating partitioned tables (bug #1031)
 - PostgreSQL: Move partitioned tables from table list to parent table
 - Designs: adminer.css with 'prefers-color-scheme: dark' don't disable dark mode
 - Plugins: Method bodyClass() to add &lt;body class>
index 9512b8cf148992810a47c6bb2de29a87da85e82a..eddd4b871c6657f607b0fb6b3f61f48fba462faa 100644 (file)
@@ -206,7 +206,6 @@ if (isset($_GET["pgsql"])) {
                public $operators = array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "ILIKE", "ILIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"); // no "SQL" to avoid CSRF
                public $functions = array("char_length", "lower", "round", "to_hex", "to_timestamp", "upper");
                public $grouping = array("avg", "count", "count distinct", "max", "min", "sum");
-               public $partitionBy = array("RANGE", "LIST", "HASH");
 
                public string $nsOid = "(SELECT oid FROM pg_namespace WHERE nspname = current_schema())";
 
@@ -255,6 +254,10 @@ if (isset($_GET["pgsql"])) {
                        if (min_version(12, 0, $connection)) {
                                $this->generated = array("STORED");
                        }
+                       $this->partitionBy = array("RANGE", "LIST");
+                       if (!$connection->flavor) {
+                               $this->partitionBy[] = "HASH";
+                       }
                }
 
                function enumLength(array $field) {
@@ -638,6 +641,7 @@ ORDER BY conkey, conname") as $row
                if ($table == "") {
                        $status = "";
                        if ($partitioning) {
+                               $cockroach = (connection()->flavor == 'cockroach');
                                $status = " PARTITION BY $partitioning[partition_by]($partitioning[partition])";
                                if ($partitioning["partition_by"] == 'HASH') {
                                        $partitions = +$partitioning["partitions"];
@@ -648,11 +652,15 @@ ORDER BY conkey, conname") as $row
                                        $prev = "MINVALUE";
                                        foreach ($partitioning["partition_names"] as $i => $val) {
                                                $value = $partitioning["partition_values"][$i];
-                                               $queries[] = "CREATE TABLE " . idf_escape($name . "_$val") . " PARTITION OF " . idf_escape($name) . " FOR VALUES "
-                                                       . ($partitioning["partition_by"] == 'LIST' ? "IN ($value)" : "FROM ($prev) TO ($value)")
-                                               ;
+                                               $partition = " VALUES " . ($partitioning["partition_by"] == 'LIST' ? "IN ($value)" : "FROM ($prev) TO ($value)");
+                                               if ($cockroach) {
+                                                       $status .= ($i ? "," : " (") . "\n  PARTITION " . (preg_match('~^DEFAULT$~i', $val) ? $val : idf_escape($val)) . "$partition";
+                                               } else {
+                                                       $queries[] = "CREATE TABLE " . idf_escape($name . "_$val") . " PARTITION OF " . idf_escape($name) . " FOR$partition";
+                                               }
                                                $prev = $value;
                                        }
+                                       $status .= ($cockroach ? "\n)" : "");
                                }
                        }
                        array_unshift($queries, "CREATE TABLE " . table($name) . " (\n" . implode(",\n", $alter) . "\n)$status");
index f42944a78e2a937bec0a5094f25654c18865df81..bfcfee444eb6bd0654ef5b1b4b1d3500fd2ba133 100644 (file)
 <tr><td>verifyTextPresent</td><td>No tables.</td><td></td></tr>
 </tbody></table>
 
+<table cellpadding="1" cellspacing="1" border="1">
+<thead><tr><td rowspan="1" colspan="3" data-tags="">Partitioning</td></tr></thead>
+<tbody>
+<tr><td>open</td><td>/adminer/?pgsql=localhost:26257&amp;username=ODBC&amp;db=adminer_test&amp;ns=public&amp;create=</td><td></td></tr>
+<tr><td>type</td><td>name=name</td><td>range</td></tr>
+<tr><td>click</td><td>//input[@name='auto_increment_col' and @value='1']</td><td></td></tr>
+<tr><td>click</td><td>link=Partition by</td><td></td></tr>
+<tr><td>select</td><td>name=partition_by</td><td>label=RANGE</td></tr>
+<tr><td>type</td><td>name=partition</td><td>id</td></tr>
+<tr><td>type</td><td>name=partition_names[]</td><td>old</td></tr>
+<tr><td>type</td><td>name=partition_values[]</td><td>10</td></tr>
+<tr><td>type</td><td>xpath=//table[@id='partition-table']/tr/td/input</td><td>new</td></tr>
+<tr><td>type</td><td>xpath=//table[@id='partition-table']/tr/td[2]/input</td><td>MAXVALUE</td></tr>
+<tr><td>click</td><td>//input[@value='Save']</td><td></td></tr>
+<tr><td>verifyTextPresent</td><td>PARTITION BY RANGE(id)</td><td></td></tr>
+<tr><td>verifyTextPresent</td><td>PARTITION "old" VALUES FROM (MINVALUE) TO (10)</td><td></td></tr>
+<tr><td>click</td><td>link=Create table</td><td></td></tr>
+<tr><td>type</td><td>name=name</td><td>list</td></tr>
+<tr><td>click</td><td>//input[@name='auto_increment_col' and @value='1']</td><td></td></tr>
+<tr><td>click</td><td>link=Partition by</td><td></td></tr>
+<tr><td>select</td><td>name=partition_by</td><td>label=LIST</td></tr>
+<tr><td>type</td><td>name=partition</td><td>id</td></tr>
+<tr><td>type</td><td>name=partition_names[]</td><td>odd</td></tr>
+<tr><td>type</td><td>name=partition_values[]</td><td>1,3,5</td></tr>
+<tr><td>click</td><td>xpath=//input[@value='Save']</td><td></td></tr>
+<tr><td>verifyTextPresent</td><td>PARTITION BY LIST(id)</td><td></td></tr>
+<tr><td>verifyTextPresent</td><td>PARTITION "odd" VALUES IN (1,3,5)</td><td></td></tr>
+<tr><td>click</td><td>link=public</td><td></td></tr>
+<tr><td>click</td><td>//input[@name='tables[]' and @value='list']</td><td></td></tr>
+<tr><td>click</td><td>//input[@name='tables[]' and @value='range']</td><td></td></tr>
+<tr><td>chooseOkOnNextConfirmation</td><td>Are you sure?</td><td></td></tr>
+<tr><td>click</td><td>name=drop</td><td></td></tr>
+<tr><td>verifyTextPresent</td><td>No tables.</td><td></td></tr>
+</tbody></table>
+
 <table cellpadding="1" cellspacing="1" border="1">
 <thead><tr><td rowspan="1" colspan="3">Variables</td></tr></thead>
 <tbody>