summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2018-02-15 17:13:48 +0100
committerSergei Golubchik <serg@mariadb.org>2018-02-23 15:33:21 +0100
commit9f6a7ed2d78af260838658369e7b3308f21d55ec (patch)
tree10f4e8e8a55696b578c959892d1c471acd1c51f1
parent187a163c782fc54225f6a096d4ec2240bde0f145 (diff)
downloadmariadb-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.result15
-rw-r--r--mysql-test/suite/versioning/t/truncate.test13
-rw-r--r--sql/ha_partition.cc15
-rw-r--r--sql/sql_delete.cc8
-rw-r--r--sql/sql_partition.cc2
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: