mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-19 16:20:50 +00:00
Merge 4f77893c79
into f4038e3153
This commit is contained in:
commit
43c9ad695f
@ -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.
|
||||
|
@ -108,6 +108,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(
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
|
||||
@ -53,6 +63,9 @@ 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);
|
||||
|
||||
|
@ -0,0 +1,4 @@
|
||||
200
|
||||
200
|
||||
100
|
||||
100
|
@ -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;
|
Loading…
Reference in New Issue
Block a user