From 5a5ae580f2a82de9775cae743e446d3a177552ec Mon Sep 17 00:00:00 2001 From: Pavel Rochnyack Date: Tue, 2 Aug 2016 13:35:52 +0100 Subject: [PATCH] Partitions editor: Allow to edit partition names; Add 'COLUMNS Partitioning' support. + Add 'COLUMNS Partitioning' support + Allow to edit partition names * Do not show duplicate partition names in 'Partition maintenance' snippet on 'Operations' tab. Caused by subpartitions presence. * Optimize Partition::getPartitionMethod() - need only one row, so use 'LIMIT 1' in query to avoid much data transfer from database. * Change HTML-code of partition comment textarea to avoid extra spaces added to value. * Added missing htmlspecialchars() on subpartitions comment. Signed-off-by: Pavel Rochnyack --- libraries/Partition.php | 3 ++- .../table/TableStructureController.php | 14 ++++++++++---- libraries/create_addfield.lib.php | 9 ++++----- libraries/operations.lib.php | 6 +++++- libraries/tbl_partition_definition.inc.php | 12 ++++++++---- po/ru.po | 2 +- .../columns_definitions/partitions.phtml | 19 +++++++++++-------- .../table/structure/display_partitions.phtml | 4 ++-- .../table/structure/display_structure.phtml | 4 +++- 9 files changed, 46 insertions(+), 27 deletions(-) diff --git a/libraries/Partition.php b/libraries/Partition.php index 92c35ef753..c5488e8af7 100644 --- a/libraries/Partition.php +++ b/libraries/Partition.php @@ -193,7 +193,7 @@ class Partition extends SubPartition { if (Partition::havePartitioning()) { return $GLOBALS['dbi']->fetchResult( - "SELECT `PARTITION_NAME` FROM `information_schema`.`PARTITIONS`" + "SELECT DISTINCT `PARTITION_NAME` FROM `information_schema`.`PARTITIONS`" . " WHERE `TABLE_SCHEMA` = '" . Util::sqlAddSlashes($db) . "' AND `TABLE_NAME` = '" . Util::sqlAddSlashes($table) . "'" ); @@ -217,6 +217,7 @@ class Partition extends SubPartition "SELECT `PARTITION_METHOD` FROM `information_schema`.`PARTITIONS`" . " WHERE `TABLE_SCHEMA` = '" . Util::sqlAddSlashes($db) . "'" . " AND `TABLE_NAME` = '" . Util::sqlAddSlashes($table) . "'" + . " LIMIT 1" ); if (! empty($partition_method)) { return $partition_method[0]; diff --git a/libraries/controllers/table/TableStructureController.php b/libraries/controllers/table/TableStructureController.php index 65e0ff0c10..96d9d59358 100644 --- a/libraries/controllers/table/TableStructureController.php +++ b/libraries/controllers/table/TableStructureController.php @@ -602,12 +602,16 @@ class TableStructureController extends TableController $partitionDetails['can_have_subpartitions'] = $partitionDetails['partition_count'] > 1 && ($partitionDetails['partition_by'] == 'RANGE' - || $partitionDetails['partition_by'] == 'LIST'); + || $partitionDetails['partition_by'] == 'RANGE COLUMNS' + || $partitionDetails['partition_by'] == 'LIST' + || $partitionDetails['partition_by'] == 'LIST COLUMNS'); // Values are specified only for LIST and RANGE type partitions $partitionDetails['value_enabled'] = isset($partitionDetails['partition_by']) && ($partitionDetails['partition_by'] == 'RANGE' - || $partitionDetails['partition_by'] == 'LIST'); + || $partitionDetails['partition_by'] == 'RANGE COLUMNS' + || $partitionDetails['partition_by'] == 'LIST' + || $partitionDetails['partition_by'] == 'LIST COLUMNS'); $partitionDetails['partitions'] = array(); @@ -615,6 +619,7 @@ class TableStructureController extends TableController if (! isset($stmt->partitions[$i])) { $partitionDetails['partitions'][$i] = array( + 'name' => 'p' . $i, 'value_type' => '', 'value' => '', 'engine' => '', @@ -635,6 +640,7 @@ class TableStructureController extends TableController $expr = ''; } $partitionDetails['partitions'][$i] = array( + 'name' => $p->name, 'value_type' => $type, 'value' => $expr, 'engine' => $p->options->has('ENGINE', true), @@ -649,7 +655,6 @@ class TableStructureController extends TableController } $partition =& $partitionDetails['partitions'][$i]; - $partition['name'] = 'p' . $i; $partition['prefix'] = 'partitions[' . $i . ']'; if ($partitionDetails['subpartition_count'] > 1) { @@ -659,6 +664,7 @@ class TableStructureController extends TableController for ($j = 0; $j < intval($partitionDetails['subpartition_count']); $j++) { if (! isset($stmt->partitions[$i]->subpartitions[$j])) { $partition['subpartitions'][$j] = array( + 'name' => $partition['name'] . '_s' . $j, 'engine' => '', 'comment' => '', 'data_directory' => '', @@ -671,6 +677,7 @@ class TableStructureController extends TableController } else { $sp = $stmt->partitions[$i]->subpartitions[$j]; $partition['subpartitions'][$j] = array( + 'name' => $sp->name, 'engine' => $sp->options->has('ENGINE', true), 'comment' => trim($sp->options->has('COMMENT', true), "'"), 'data_directory' => trim($sp->options->has('DATA DIRECTORY', true), "'"), @@ -683,7 +690,6 @@ class TableStructureController extends TableController } $subpartition =& $partition['subpartitions'][$j]; - $subpartition['name'] = 'p' . $i . 's' . $j; $subpartition['prefix'] = 'partitions[' . $i . ']' . '[subpartitions][' . $j . ']'; } diff --git a/libraries/create_addfield.lib.php b/libraries/create_addfield.lib.php index 04820e8760..511ad3bcf5 100644 --- a/libraries/create_addfield.lib.php +++ b/libraries/create_addfield.lib.php @@ -322,7 +322,7 @@ function PMA_getPartitionsDefinition() $i = 0; $partitions = array(); foreach ($_REQUEST['partitions'] as $partition) { - $partitions[] = PMA_getPartitionDefinition('p' . $i, $partition); + $partitions[] = PMA_getPartitionDefinition($partition); $i++; } $sql_query .= " (" . implode(", ", $partitions) . ")"; @@ -334,15 +334,15 @@ function PMA_getPartitionsDefinition() /** * Returns the definition of a partition/subpartition * - * @param string $name name of the partition/subpartition * @param array $partition array of partition/subpartition detiails * @param boolean $isSubPartition whether a subpartition * * @return string partition/subpartition definition */ -function PMA_getPartitionDefinition($name, $partition, $isSubPartition = false) +function PMA_getPartitionDefinition($partition, $isSubPartition = false) { - $sql_query = " " . ($isSubPartition ? "SUB" : "") . "PARTITION " . $name; + $sql_query = " " . ($isSubPartition ? "SUB" : "") . "PARTITION "; + $sql_query .= $partition['name']; if (! empty($partition['value_type'])) { $sql_query .= " VALUES " . $partition['value_type']; @@ -382,7 +382,6 @@ function PMA_getPartitionDefinition($name, $partition, $isSubPartition = false) $subpartitions = array(); foreach ($partition['subpartitions'] as $subpartition) { $subpartitions[] = PMA_getPartitionDefinition( - $name . 's' . $j, $subpartition, true ); diff --git a/libraries/operations.lib.php b/libraries/operations.lib.php index 662c15260e..34100514fb 100644 --- a/libraries/operations.lib.php +++ b/libraries/operations.lib.php @@ -1588,7 +1588,11 @@ function PMA_getHtmlForPartitionMaintenance($partition_names, $url_params) $GLOBALS['db'], $GLOBALS['table'] ); // add COALESCE or DROP option to choices array depeding on Partition method - if ($partition_method == 'RANGE' || $partition_method == 'LIST') { + if ($partition_method == 'RANGE' + || $partition_method == 'RANGE COLUMNS' + || $partition_method == 'LIST' + || $partition_method == 'LIST COLUMNS' + ) { $choices['DROP'] = __('Drop'); } else { $choices['COALESCE'] = __('Coalesce'); diff --git a/libraries/tbl_partition_definition.inc.php b/libraries/tbl_partition_definition.inc.php index 7eaf5b37b4..3f7602bb05 100644 --- a/libraries/tbl_partition_definition.inc.php +++ b/libraries/tbl_partition_definition.inc.php @@ -27,12 +27,16 @@ if (!isset($partitionDetails)) { && $_REQUEST['partition_count'] > 1 && isset($_REQUEST['partition_by']) && ($_REQUEST['partition_by'] == 'RANGE' - || $_REQUEST['partition_by'] == 'LIST'); + || $_REQUEST['partition_by'] == 'RANGE COLUMNS' + || $_REQUEST['partition_by'] == 'LIST' + || $_REQUEST['partition_by'] == 'LIST COLUMNS'); // Values are specified only for LIST and RANGE type partitions $partitionDetails['value_enabled'] = isset($_REQUEST['partition_by']) && ($_REQUEST['partition_by'] == 'RANGE' - || $_REQUEST['partition_by'] == 'LIST'); + || $_REQUEST['partition_by'] == 'RANGE COLUMNS' + || $_REQUEST['partition_by'] == 'LIST' + || $_REQUEST['partition_by'] == 'LIST COLUMNS'); if (PMA_isValid($_REQUEST['partition_count'], 'numeric') && $_REQUEST['partition_count'] > 1 @@ -48,6 +52,7 @@ if (!isset($partitionDetails)) { for ($i = 0; $i < $_REQUEST['partition_count']; $i++) { if (! isset($partitions[$i])) { // Newly added partition $partitions[$i] = array( + 'name' => 'p' . $i, 'value_type' => '', 'value' => '', 'engine' => '', @@ -62,7 +67,6 @@ if (!isset($partitionDetails)) { } $partition =& $partitions[$i]; - $partition['name'] = 'p' . $i; $partition['prefix'] = 'partitions[' . $i . ']'; // Changing from HASH/KEY to RANGE/LIST @@ -99,6 +103,7 @@ if (!isset($partitionDetails)) { for ($j = 0; $j < $_REQUEST['subpartition_count']; $j++) { if (! isset($subpartitions[$j])) { // Newly added subpartition $subpartitions[$j] = array( + 'name' => $partition['name'] . '_s' . $j, 'engine' => '', 'comment' => '', 'data_directory' => '', @@ -111,7 +116,6 @@ if (!isset($partitionDetails)) { } $subpartition =& $subpartitions[$j]; - $subpartition['name'] = 'p' . $i . 's' . $j; $subpartition['prefix'] = 'partitions[' . $i . ']' . '[subpartitions][' . $j . ']'; } diff --git a/po/ru.po b/po/ru.po index f3960f516f..c54d475705 100644 --- a/po/ru.po +++ b/po/ru.po @@ -15553,7 +15553,7 @@ msgstr "Длина индекса" #: templates/table/structure/display_partitions.phtml:135 msgid "Partition table" -msgstr "Разбить таблицу" +msgstr "Создать разбиение" #: templates/table/structure/display_partitions.phtml:138 #: templates/table/structure/partition_definition_form.phtml:7 diff --git a/templates/columns_definitions/partitions.phtml b/templates/columns_definitions/partitions.phtml index 3e08e0c752..e0dedddb67 100644 --- a/templates/columns_definitions/partitions.phtml +++ b/templates/columns_definitions/partitions.phtml @@ -1,5 +1,5 @@ @@ -88,9 +88,10 @@ $valueTypeOptions = array('', 'LESS THAN', 'LESS THAN MAXVALUE', 'IN'); - - - + + + + - + + # - + @@ -115,7 +115,7 @@ use PMA\libraries\Util; ?> - getComment(); ?> + getComment()); ?> diff --git a/templates/table/structure/display_structure.phtml b/templates/table/structure/display_structure.phtml index ceece39f02..7e824f2da9 100644 --- a/templates/table/structure/display_structure.phtml +++ b/templates/table/structure/display_structure.phtml @@ -160,7 +160,9 @@ $rownum = 0; $odd_row = true; ?> $partitions = Partition::getPartitions($db, $table); $firstPartition = $partitions[0]; $rangeOrList = $firstPartition->getMethod() == 'RANGE' - || $firstPartition->getMethod() == 'LIST'; + || $firstPartition->getMethod() == 'RANGE COLUMNS' + || $firstPartition->getMethod() == 'LIST' + || $firstPartition->getMethod() == 'LIST COLUMNS'; $subParitions = $firstPartition->getSubPartitions(); $hasSubPartitions = $firstPartition->hasSubPartitions(); if ($hasSubPartitions) {