feat: add delete from in pastition cmd

This commit is contained in:
sunny19930321 2024-08-05 19:32:45 +08:00
parent 681eafef79
commit e2b74e4176
7 changed files with 59 additions and 1 deletions

View File

@ -10,7 +10,7 @@ title: The Lightweight DELETE Statement
The lightweight `DELETE` statement removes rows from the table `[db.]table` that match the expression `expr`. It is only available for the *MergeTree table engine family.
``` sql
DELETE FROM [db.]table [ON CLUSTER cluster] WHERE expr;
DELETE FROM [db.]table [ON CLUSTER cluster] [IN PARTITION partition_expr] WHERE expr;
```
It is called "lightweight `DELETE`" to contrast it to the [ALTER table DELETE](/en/sql-reference/statements/alter/delete) command, which is a heavyweight process.

View File

@ -79,6 +79,14 @@ BlockIO InterpreterDeleteQuery::execute()
"ALTER TABLE " + table->getStorageID().getFullTableName()
+ (delete_query.cluster.empty() ? "" : " ON CLUSTER " + backQuoteIfNeed(delete_query.cluster))
+ " UPDATE `_row_exists` = 0 WHERE " + serializeAST(*delete_query.predicate);
if (delete_query.partition)
{
alter_query =
"ALTER TABLE " + table->getStorageID().getFullTableName()
+ (delete_query.cluster.empty() ? "" : " ON CLUSTER " + backQuoteIfNeed(delete_query.cluster))
+ " UPDATE `_row_exists` = 0 IN PARTITION " + serializeAST(*delete_query.partition) + " WHERE "
+ serializeAST(*delete_query.predicate);
}
ParserAlterQuery parser;
ASTPtr alter_ast = parseQuery(

View File

@ -45,6 +45,12 @@ void ASTDeleteQuery::formatQueryImpl(const FormatSettings & settings, FormatStat
formatOnCluster(settings);
if (partition)
{
settings.ostr << (settings.hilite ? hilite_keyword : "") << " IN PARTITION " << (settings.hilite ? hilite_none : "");
partition->formatImpl(settings, state, frame);
}
settings.ostr << (settings.hilite ? hilite_keyword : "") << " WHERE " << (settings.hilite ? hilite_none : "");
predicate->formatImpl(settings, state, frame);
}

View File

@ -19,6 +19,11 @@ public:
return removeOnCluster<ASTDeleteQuery>(clone(), params.default_database);
}
/** Used in DROP PARTITION, ATTACH PARTITION FROM, UPDATE, DELETE, DELETE FROM queries.
* The value or ID of the partition is stored here.
*/
ASTPtr partition;
ASTPtr predicate;
protected:

View File

@ -3,6 +3,7 @@
#include <Parsers/parseDatabaseAndTableName.h>
#include <Parsers/ExpressionListParsers.h>
#include <Parsers/ParserSetQuery.h>
#include <Parsers/ParserPartition.h>
namespace DB
@ -15,11 +16,14 @@ bool ParserDeleteQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
ParserKeyword s_delete(Keyword::DELETE);
ParserKeyword s_from(Keyword::FROM);
ParserKeyword s_in_partition(Keyword::IN_PARTITION);
ParserKeyword s_where(Keyword::WHERE);
ParserExpression parser_exp_elem;
ParserKeyword s_settings(Keyword::SETTINGS);
ParserKeyword s_on{Keyword::ON};
ParserPartition parser_partition;
if (s_delete.ignore(pos, expected))
{
if (!s_from.ignore(pos, expected))
@ -36,6 +40,12 @@ bool ParserDeleteQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
query->cluster = cluster_str;
}
if (s_in_partition.ignore(pos, expected))
{
if (!parser_partition.parse(pos, query->partition, expected))
return false;
}
if (!s_where.ignore(pos, expected))
return false;
@ -52,6 +62,8 @@ bool ParserDeleteQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
}
else
return false;
if (query->partition)
query->children.push_back(query->partition);
if (query->predicate)
query->children.push_back(query->predicate);

View File

@ -0,0 +1,4 @@
200
200
100
100

View File

@ -0,0 +1,23 @@
DROP TABLE IF EXISTS t_merge_tree SYNC;
DROP TABLE IF EXISTS t_replicated_merge_tree SYNC;
CREATE TABLE t_merge_tree(time Date, id String , name String) ENGINE = MergeTree() PARTITION BY time ORDER BY id;
CREATE TABLE t_replicated_merge_tree(time Date, id String, name String) ENGINE = ReplicatedMergeTree('/test/02352/{database}/t_rep','1') PARTITION BY time ORDER BY id;
INSERT INTO t_merge_tree select '2024-08-01', '1', toString(number) FROM numbers(100);
INSERT INTO t_merge_tree select '2024-08-02', '2', toString(number) FROM numbers(100);
INSERT INTO t_replicated_merge_tree select '2024-08-01', '1', toString(number) FROM numbers(100);
INSERT INTO t_replicated_merge_tree select '2024-08-02', '2', toString(number) FROM numbers(100);
SELECT COUNT() FROM t_merge_tree;
SELECT COUNT() FROM t_replicated_merge_tree;
DELETE FROM t_merge_tree IN PARTITION '2024-08-01' WHERE id = '1';
DELETE FROM t_replicated_merge_tree IN PARTITION '2024-08-01' WHERE id = '1';
SELECT COUNT() FROM t_merge_tree;
SELECT COUNT() FROM t_replicated_merge_tree;
DROP TABLE t_merge_tree SYNC;
DROP TABLE t_replicated_merge_tree SYNC;