mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-10 01:25:21 +00:00
Merge pull request #41763 from zhangjmruc/fix/disable_mergetree_table_with_lwd_virtual_column
Disable merge tree table with lightweight delete virtual column name _row_exists
This commit is contained in:
commit
1719e000ea
@ -766,6 +766,16 @@ void InterpreterCreateQuery::validateTableStructure(const ASTCreateQuery & creat
|
||||
throw Exception("Column " + backQuoteIfNeed(column.name) + " already exists", ErrorCodes::DUPLICATE_COLUMN);
|
||||
}
|
||||
|
||||
/// Check if _row_exists for lightweight delete column in column_lists for merge tree family.
|
||||
if (create.storage && create.storage->engine && endsWith(create.storage->engine->name, "MergeTree"))
|
||||
{
|
||||
auto search = all_columns.find(LightweightDeleteDescription::FILTER_COLUMN.name);
|
||||
if (search != all_columns.end())
|
||||
throw Exception("Cannot create table with column '" + LightweightDeleteDescription::FILTER_COLUMN.name + "' "
|
||||
"for *MergeTree engines because it is reserved for lightweight delete feature",
|
||||
ErrorCodes::ILLEGAL_COLUMN);
|
||||
}
|
||||
|
||||
const auto & settings = getContext()->getSettingsRef();
|
||||
|
||||
/// Check low cardinality types in creating table if it was not allowed in setting
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include <Storages/AlterCommands.h>
|
||||
#include <Storages/IStorage.h>
|
||||
#include <Storages/LightweightDeleteDescription.h>
|
||||
#include <Storages/MergeTree/MergeTreeData.h>
|
||||
#include <Common/typeid_cast.h>
|
||||
#include <Common/randomSeed.h>
|
||||
|
||||
@ -1056,6 +1057,10 @@ void AlterCommands::validate(const StoragePtr & table, ContextPtr context) const
|
||||
throw Exception{"Data type have to be specified for column " + backQuote(column_name) + " to add",
|
||||
ErrorCodes::BAD_ARGUMENTS};
|
||||
|
||||
if (column_name == LightweightDeleteDescription::FILTER_COLUMN.name && std::dynamic_pointer_cast<MergeTreeData>(table))
|
||||
throw Exception{"Cannot add column " + backQuote(column_name) + ": this column name is reserved for lightweight delete feature",
|
||||
ErrorCodes::ILLEGAL_COLUMN};
|
||||
|
||||
if (command.codec)
|
||||
CompressionCodecFactory::instance().validateCodecAndGetPreprocessedAST(command.codec, command.data_type, !context->getSettingsRef().allow_suspicious_codecs, context->getSettingsRef().allow_experimental_codecs);
|
||||
|
||||
@ -1240,6 +1245,10 @@ void AlterCommands::validate(const StoragePtr & table, ContextPtr context) const
|
||||
throw Exception{"Cannot rename to " + backQuote(command.rename_to) + ": column with this name already exists",
|
||||
ErrorCodes::DUPLICATE_COLUMN};
|
||||
|
||||
if (command.rename_to == LightweightDeleteDescription::FILTER_COLUMN.name && std::dynamic_pointer_cast<MergeTreeData>(table))
|
||||
throw Exception{"Cannot rename to " + backQuote(command.rename_to) + ": this column name is reserved for lightweight delete feature",
|
||||
ErrorCodes::ILLEGAL_COLUMN};
|
||||
|
||||
if (modified_columns.contains(column_name))
|
||||
throw Exception{"Cannot rename and modify the same column " + backQuote(column_name) + " in a single ALTER query",
|
||||
ErrorCodes::NOT_IMPLEMENTED};
|
||||
|
@ -0,0 +1 @@
|
||||
1 1
|
@ -0,0 +1,21 @@
|
||||
drop table if exists t_row_exists;
|
||||
|
||||
create table t_row_exists(a int, _row_exists int) engine=MergeTree order by a; --{serverError 44}
|
||||
|
||||
create table t_row_exists(a int, b int) engine=MergeTree order by a;
|
||||
alter table t_row_exists add column _row_exists int; --{serverError ILLEGAL_COLUMN}
|
||||
alter table t_row_exists rename column b to _row_exists; --{serverError ILLEGAL_COLUMN}
|
||||
alter table t_row_exists rename column _row_exists to c; --{serverError NOT_FOUND_COLUMN_IN_BLOCK}
|
||||
alter table t_row_exists drop column _row_exists; --{serverError NOT_FOUND_COLUMN_IN_BLOCK}
|
||||
alter table t_row_exists drop column unknown_column; --{serverError NOT_FOUND_COLUMN_IN_BLOCK}
|
||||
drop table t_row_exists;
|
||||
|
||||
create table t_row_exists(a int, _row_exists int) engine=Memory;
|
||||
insert into t_row_exists values(1,1);
|
||||
select * from t_row_exists;
|
||||
drop table t_row_exists;
|
||||
|
||||
create table t_row_exists(a int, b int) engine=Memory;
|
||||
alter table t_row_exists add column _row_exists int; --{serverError NOT_IMPLEMENTED}
|
||||
alter table t_row_exists rename column b to _row_exists; --{serverError NOT_IMPLEMENTED}
|
||||
drop table t_row_exists;
|
Loading…
Reference in New Issue
Block a user