Fix alter table drop projection if exists

This commit is contained in:
Amos Bird 2021-05-28 21:27:36 +08:00
parent 9edfc1641a
commit edd23d06ad
No known key found for this signature in database
GPG Key ID: 80D430DCBECFEDB4
6 changed files with 19 additions and 4 deletions

View File

@ -542,7 +542,7 @@ void AlterCommand::apply(StorageInMemoryMetadata & metadata, ContextPtr context)
else if (type == DROP_PROJECTION)
{
if (!partition && !clear)
metadata.projections.remove(projection_name);
metadata.projections.remove(projection_name, if_exists);
}
else if (type == MODIFY_TTL)
{

View File

@ -265,11 +265,15 @@ void ProjectionsDescription::add(ProjectionDescription && projection, const Stri
map[it->name] = it;
}
void ProjectionsDescription::remove(const String & projection_name)
void ProjectionsDescription::remove(const String & projection_name, bool if_exists)
{
auto it = map.find(projection_name);
if (it == map.end())
{
if (if_exists)
return;
throw Exception("There is no projection " + projection_name + " in table.", ErrorCodes::NO_SUCH_PROJECTION_IN_TABLE);
}
projections.erase(it->second);
map.erase(it);

View File

@ -118,7 +118,7 @@ struct ProjectionsDescription
void
add(ProjectionDescription && projection, const String & after_projection = String(), bool first = false, bool if_not_exists = false);
void remove(const String & projection_name);
void remove(const String & projection_name, bool if_exists);
private:
/// Keep the sequence of columns and allow to lookup by name.

View File

@ -4873,7 +4873,7 @@ void StorageReplicatedMergeTree::alter(
zookeeper->get(mutations_path, &mutations_stat);
partition_block_numbers_holder =
allocateBlockNumbersInAffectedPartitions(mutation_entry.commands, query_context, zookeeper);
allocateBlockNumbersInAffectedPartitions(mutation_entry.commands, query_context, zookeeper);
mutation_entry.block_numbers = partition_block_numbers_holder.getBlockNumbers();
mutation_entry.create_time = time(nullptr);

View File

@ -0,0 +1,11 @@
drop table if exists tp;
create table tp (x Int32, y Int32, projection p (select x, y order by x)) engine = MergeTree order by y;
alter table tp drop projection pp; -- { serverError 582 }
alter table tp drop projection if exists pp;
alter table tp drop projection if exists p;
alter table tp drop projection p; -- { serverError 582 }
alter table tp drop projection if exists p;
drop table tp;