mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-23 16:12:01 +00:00
Simple validation for partition id before drop partition
This commit is contained in:
parent
bb77342606
commit
21599ffefc
@ -3214,7 +3214,11 @@ String MergeTreeData::getPartitionIDFromQuery(const ASTPtr & ast, ContextPtr loc
|
|||||||
const auto & partition_ast = ast->as<ASTPartition &>();
|
const auto & partition_ast = ast->as<ASTPartition &>();
|
||||||
|
|
||||||
if (!partition_ast.value)
|
if (!partition_ast.value)
|
||||||
|
{
|
||||||
|
if (!MergeTreePartInfo::validatePartitionID(partition_ast.id, format_version))
|
||||||
|
throw Exception("Invalid partition format: " + partition_ast.id, ErrorCodes::INVALID_PARTITION_VALUE);
|
||||||
return partition_ast.id;
|
return partition_ast.id;
|
||||||
|
}
|
||||||
|
|
||||||
if (format_version < MERGE_TREE_DATA_MIN_FORMAT_VERSION_WITH_CUSTOM_PARTITIONING)
|
if (format_version < MERGE_TREE_DATA_MIN_FORMAT_VERSION_WITH_CUSTOM_PARTITIONING)
|
||||||
{
|
{
|
||||||
|
@ -21,6 +21,40 @@ MergeTreePartInfo MergeTreePartInfo::fromPartName(const String & part_name, Merg
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool MergeTreePartInfo::validatePartitionID(const String & partition_id, MergeTreeDataFormatVersion format_version)
|
||||||
|
{
|
||||||
|
if (partition_id.empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ReadBufferFromString in(partition_id);
|
||||||
|
|
||||||
|
if (format_version < MERGE_TREE_DATA_MIN_FORMAT_VERSION_WITH_CUSTOM_PARTITIONING)
|
||||||
|
{
|
||||||
|
UInt32 min_yyyymmdd = 0;
|
||||||
|
UInt32 max_yyyymmdd = 0;
|
||||||
|
if (!tryReadIntText(min_yyyymmdd, in)
|
||||||
|
|| !checkChar('_', in)
|
||||||
|
|| !tryReadIntText(max_yyyymmdd, in)
|
||||||
|
|| !checkChar('_', in))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (!in.eof())
|
||||||
|
{
|
||||||
|
char c;
|
||||||
|
readChar(c, in);
|
||||||
|
|
||||||
|
if (c == '_')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return in.eof();
|
||||||
|
}
|
||||||
|
|
||||||
bool MergeTreePartInfo::tryParsePartName(const String & part_name, MergeTreePartInfo * part_info, MergeTreeDataFormatVersion format_version)
|
bool MergeTreePartInfo::tryParsePartName(const String & part_name, MergeTreePartInfo * part_info, MergeTreeDataFormatVersion format_version)
|
||||||
{
|
{
|
||||||
ReadBufferFromString in(part_name);
|
ReadBufferFromString in(part_name);
|
||||||
|
@ -86,6 +86,9 @@ struct MergeTreePartInfo
|
|||||||
return static_cast<UInt64>(max_block - min_block + 1);
|
return static_cast<UInt64>(max_block - min_block + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Simple sanity check for partition ID. Checking that it's not too long or too short, doesn't contain a lot of '_'.
|
||||||
|
static bool validatePartitionID(const String & partition_id, MergeTreeDataFormatVersion format_version);
|
||||||
|
|
||||||
static MergeTreePartInfo fromPartName(const String & part_name, MergeTreeDataFormatVersion format_version); // -V1071
|
static MergeTreePartInfo fromPartName(const String & part_name, MergeTreeDataFormatVersion format_version); // -V1071
|
||||||
|
|
||||||
static bool tryParsePartName(const String & part_name, MergeTreePartInfo * part_info, MergeTreeDataFormatVersion format_version);
|
static bool tryParsePartName(const String & part_name, MergeTreePartInfo * part_info, MergeTreeDataFormatVersion format_version);
|
||||||
|
@ -9,8 +9,8 @@ ENGINE = ReplicatedMergeTree('/clickhouse/test_01925_{database}/rmt', 'r1')
|
|||||||
ORDER BY tuple()
|
ORDER BY tuple()
|
||||||
PARTITION BY date;
|
PARTITION BY date;
|
||||||
|
|
||||||
ALTER TABLE broken_partition DROP PARTITION ID '20210325_0_13241_6_12747';
|
ALTER TABLE broken_partition DROP PARTITION ID '20210325_0_13241_6_12747'; --{serverError 248}
|
||||||
|
|
||||||
ALTER TABLE broken_partition DROP PARTITION ID '20210325_0_13241_6_12747';
|
ALTER TABLE broken_partition DROP PARTITION ID '20210325_0_13241_6_12747'; --{serverError 248}
|
||||||
|
|
||||||
DROP TABLE IF EXISTS broken_partition;
|
DROP TABLE IF EXISTS broken_partition;
|
||||||
|
Loading…
Reference in New Issue
Block a user