diff options
author | Sergei Golubchik <serg@mariadb.org> | 2018-02-15 17:13:48 +0100 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2018-02-23 15:33:21 +0100 |
commit | 9f6a7ed2d78af260838658369e7b3308f21d55ec (patch) | |
tree | 10f4e8e8a55696b578c959892d1c471acd1c51f1 | |
parent | 187a163c782fc54225f6a096d4ec2240bde0f145 (diff) | |
download | mariadb-git-9f6a7ed2d78af260838658369e7b3308f21d55ec.tar.gz |
SQL: Truncate history of partitioned table [fixes #399, closes #403]
also, don't rotate versioning partitions for DELETE HISTORY
originally by: Aleksey Midenkov
-rw-r--r-- | mysql-test/suite/versioning/r/truncate.result | 15 | ||||
-rw-r--r-- | mysql-test/suite/versioning/t/truncate.test | 13 | ||||
-rw-r--r-- | sql/ha_partition.cc | 15 | ||||
-rw-r--r-- | sql/sql_delete.cc | 8 | ||||
-rw-r--r-- | sql/sql_partition.cc | 2 |
5 files changed, 33 insertions, 20 deletions
diff --git a/mysql-test/suite/versioning/r/truncate.result b/mysql-test/suite/versioning/r/truncate.result index 48b7fbbcf55..68f37aaf4ef 100644 --- a/mysql-test/suite/versioning/r/truncate.result +++ b/mysql-test/suite/versioning/r/truncate.result @@ -45,15 +45,24 @@ call truncate_sp; select * from t for system_time all; a drop procedure truncate_sp; -### Issue #399, truncate partitioned table is now unimplemented +# Truncate partitioned create or replace table t (a int) with system versioning engine myisam -partition by system_time ( +partition by system_time limit 1 ( partition p0 history, +partition p1 history, partition pn current); +insert into t values (1); +update t set a= 2; +update t set a= 3; +Warnings: +Note 4114 Versioned table `test`.`t`: switching from partition `p0` to `p1` delete history from t; -ERROR 42000: The used command is not allowed with this MariaDB version +select * from t for system_time all; +a +3 +# VIEW create or replace table t (i int) with system versioning; delete history from t; create or replace view v as select * from t; diff --git a/mysql-test/suite/versioning/t/truncate.test b/mysql-test/suite/versioning/t/truncate.test index 0f9e7052511..7376a15ca0f 100644 --- a/mysql-test/suite/versioning/t/truncate.test +++ b/mysql-test/suite/versioning/t/truncate.test @@ -41,18 +41,21 @@ select * from t for system_time all; drop procedure truncate_sp; ---echo ### Issue #399, truncate partitioned table is now unimplemented - +--echo # Truncate partitioned create or replace table t (a int) with system versioning engine myisam -partition by system_time ( +partition by system_time limit 1 ( partition p0 history, + partition p1 history, partition pn current); - ---error ER_NOT_ALLOWED_COMMAND +insert into t values (1); +update t set a= 2; +update t set a= 3; delete history from t; +select * from t for system_time all; +--echo # VIEW create or replace table t (i int) with system versioning; delete history from t; create or replace view v as select * from t; diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index cc0ec90bff9..a0b4abf77fb 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -4474,11 +4474,18 @@ int ha_partition::delete_row(const uchar *buf) Notice that HA_READ_BEFORE_WRITE_REMOVAL does not require this protocol, so this is not supported for this engine. + + For partitions by system_time, get_part_for_buf() is always either current + or last historical partition, but DELETE HISTORY can delete from any + historical partition. So, skip the check in this case. */ - uint32 part_id; - error= get_part_for_buf(buf, m_rec0, m_part_info, &part_id); - DBUG_ASSERT(!error); - DBUG_ASSERT(part_id == m_last_part); + if (!thd->lex->vers_conditions) // if not DELETE HISTORY + { + uint32 part_id; + error= get_part_for_buf(buf, m_rec0, m_part_info, &part_id); + DBUG_ASSERT(!error); + DBUG_ASSERT(part_id == m_last_part); + } DBUG_ASSERT(bitmap_is_set(&(m_part_info->read_partitions), m_last_part)); DBUG_ASSERT(bitmap_is_set(&(m_part_info->lock_partitions), m_last_part)); #endif diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 48619b9d4fc..59af16ff525 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -317,14 +317,6 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, TABLE *table= table_list->table; DBUG_ASSERT(table); -#ifdef WITH_PARTITION_STORAGE_ENGINE - if (table->part_info) - { - my_error(ER_NOT_ALLOWED_COMMAND, MYF(0)); - DBUG_RETURN(true); - } -#endif - DBUG_ASSERT(!conds || thd->stmt_arena->is_stmt_execute()); if (select_lex->vers_setup_conds(thd, table_list, &conds)) DBUG_RETURN(TRUE); diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index e8e4b85f140..0839268a0ab 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -3112,6 +3112,8 @@ int vers_get_partition_id(partition_info *part_info, switch (thd->lex->sql_command) { case SQLCOM_DELETE: + if (thd->lex->vers_conditions) + break; // DELETE HISTORY case SQLCOM_DELETE_MULTI: case SQLCOM_UPDATE: case SQLCOM_UPDATE_MULTI: |