mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 15:12:02 +00:00
fix partition id validation
This commit is contained in:
parent
658ce5258f
commit
5e2bfd5ba1
@ -3213,8 +3213,7 @@ String MergeTreeData::getPartitionIDFromQuery(const ASTPtr & ast, ContextPtr loc
|
|||||||
|
|
||||||
if (!partition_ast.value)
|
if (!partition_ast.value)
|
||||||
{
|
{
|
||||||
if (!MergeTreePartInfo::validatePartitionID(partition_ast.id, format_version))
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3225,10 +3224,7 @@ String MergeTreeData::getPartitionIDFromQuery(const ASTPtr & ast, ContextPtr loc
|
|||||||
if (partition_lit && partition_lit->value.getType() == Field::Types::String)
|
if (partition_lit && partition_lit->value.getType() == Field::Types::String)
|
||||||
{
|
{
|
||||||
String partition_id = partition_lit->value.get<String>();
|
String partition_id = partition_lit->value.get<String>();
|
||||||
if (partition_id.size() != 6 || !std::all_of(partition_id.begin(), partition_id.end(), isNumericASCII))
|
MergeTreePartInfo::validatePartitionID(partition_id, format_version);
|
||||||
throw Exception(
|
|
||||||
"Invalid partition format: " + partition_id + ". Partition should consist of 6 digits: YYYYMM",
|
|
||||||
ErrorCodes::INVALID_PARTITION_VALUE);
|
|
||||||
return partition_id;
|
return partition_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ namespace DB
|
|||||||
namespace ErrorCodes
|
namespace ErrorCodes
|
||||||
{
|
{
|
||||||
extern const int BAD_DATA_PART_NAME;
|
extern const int BAD_DATA_PART_NAME;
|
||||||
|
extern const int INVALID_PARTITION_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -21,38 +22,25 @@ MergeTreePartInfo MergeTreePartInfo::fromPartName(const String & part_name, Merg
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool MergeTreePartInfo::validatePartitionID(const String & partition_id, MergeTreeDataFormatVersion format_version)
|
void MergeTreePartInfo::validatePartitionID(const String & partition_id, MergeTreeDataFormatVersion format_version)
|
||||||
{
|
{
|
||||||
if (partition_id.empty())
|
if (partition_id.empty())
|
||||||
return false;
|
throw Exception(ErrorCodes::INVALID_PARTITION_VALUE, "Partition id is empty");
|
||||||
|
|
||||||
ReadBufferFromString in(partition_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)
|
||||||
{
|
{
|
||||||
UInt32 min_yyyymmdd = 0;
|
if (partition_id.size() != 6 || !std::all_of(partition_id.begin(), partition_id.end(), isNumericASCII))
|
||||||
UInt32 max_yyyymmdd = 0;
|
throw Exception(ErrorCodes::INVALID_PARTITION_VALUE,
|
||||||
if (!tryReadIntText(min_yyyymmdd, in)
|
"Invalid partition format: {}. Partition should consist of 6 digits: YYYYMM",
|
||||||
|| !checkChar('_', in)
|
partition_id);
|
||||||
|| !tryReadIntText(max_yyyymmdd, in)
|
|
||||||
|| !checkChar('_', in))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
while (!in.eof())
|
auto is_valid_char = [](char c) { return c == '-' || isAlphaNumericASCII(c); };
|
||||||
{
|
if (!std::all_of(partition_id.begin(), partition_id.end(), is_valid_char))
|
||||||
char c;
|
throw Exception(ErrorCodes::INVALID_PARTITION_VALUE, "Invalid partition format: {}", partition_id);
|
||||||
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)
|
||||||
|
@ -88,7 +88,7 @@ struct MergeTreePartInfo
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Simple sanity check for partition ID. Checking that it's not too long or too short, doesn't contain a lot of '_'.
|
/// 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 void 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
|
||||||
|
|
||||||
|
@ -14,3 +14,13 @@ ALTER TABLE broken_partition DROP PARTITION ID '20210325_0_13241_6_12747'; --{se
|
|||||||
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'; --{serverError 248}
|
||||||
|
|
||||||
DROP TABLE IF EXISTS broken_partition;
|
DROP TABLE IF EXISTS broken_partition;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS old_partition_key;
|
||||||
|
|
||||||
|
CREATE TABLE old_partition_key (sd Date, dh UInt64, ak UInt32, ed Date) ENGINE=MergeTree(sd, dh, (ak, ed, dh), 8192);
|
||||||
|
|
||||||
|
ALTER TABLE old_partition_key DROP PARTITION ID '20210325_0_13241_6_12747'; --{serverError 248}
|
||||||
|
|
||||||
|
ALTER TABLE old_partition_key DROP PARTITION ID '202103';
|
||||||
|
|
||||||
|
DROP TABLE old_partition_key;
|
||||||
|
Loading…
Reference in New Issue
Block a user