mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 08:40:50 +00:00
check dynamic columns of part before its commit
This commit is contained in:
parent
0c13870eb1
commit
8ca602a148
@ -3393,6 +3393,28 @@ void MergeTreeData::checkPartDuplicate(MutableDataPartPtr & part, Transaction &
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MergeTreeData::checkPartDynamicColumns(MutableDataPartPtr & part, DataPartsLock & /*lock*/) const
|
||||||
|
{
|
||||||
|
auto metadata_snapshot = getInMemoryMetadataPtr();
|
||||||
|
const auto & columns = metadata_snapshot->getColumns();
|
||||||
|
|
||||||
|
if (!hasDynamicSubcolumns(columns))
|
||||||
|
return;
|
||||||
|
|
||||||
|
const auto & part_columns = part->getColumns();
|
||||||
|
for (const auto & part_column : part_columns)
|
||||||
|
{
|
||||||
|
auto storage_column = columns.getPhysical(part_column.name);
|
||||||
|
if (!storage_column.type->hasDynamicSubcolumns())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
auto concrete_storage_column = object_columns.getPhysical(part_column.name);
|
||||||
|
|
||||||
|
/// It will throw if types are incompatible.
|
||||||
|
getLeastCommonTypeForDynamicColumns(storage_column.type, {concrete_storage_column.type, part_column.type}, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MergeTreeData::preparePartForCommit(MutableDataPartPtr & part, Transaction & out_transaction, bool need_rename)
|
void MergeTreeData::preparePartForCommit(MutableDataPartPtr & part, Transaction & out_transaction, bool need_rename)
|
||||||
{
|
{
|
||||||
part->is_temp = false;
|
part->is_temp = false;
|
||||||
@ -3427,6 +3449,7 @@ bool MergeTreeData::addTempPart(
|
|||||||
|
|
||||||
checkPartPartition(part, lock);
|
checkPartPartition(part, lock);
|
||||||
checkPartDuplicate(part, out_transaction, lock);
|
checkPartDuplicate(part, out_transaction, lock);
|
||||||
|
checkPartDynamicColumns(part, lock);
|
||||||
|
|
||||||
DataPartPtr covering_part;
|
DataPartPtr covering_part;
|
||||||
DataPartsVector covered_parts = getActivePartsToReplace(part->info, part->name, covering_part, lock);
|
DataPartsVector covered_parts = getActivePartsToReplace(part->info, part->name, covering_part, lock);
|
||||||
@ -3467,6 +3490,7 @@ bool MergeTreeData::renameTempPartAndReplaceImpl(
|
|||||||
part->assertState({DataPartState::Temporary});
|
part->assertState({DataPartState::Temporary});
|
||||||
checkPartPartition(part, lock);
|
checkPartPartition(part, lock);
|
||||||
checkPartDuplicate(part, out_transaction, lock);
|
checkPartDuplicate(part, out_transaction, lock);
|
||||||
|
checkPartDynamicColumns(part, lock);
|
||||||
|
|
||||||
PartHierarchy hierarchy = getPartHierarchy(part->info, DataPartState::Active, lock);
|
PartHierarchy hierarchy = getPartHierarchy(part->info, DataPartState::Active, lock);
|
||||||
|
|
||||||
|
@ -1417,6 +1417,7 @@ private:
|
|||||||
/// Checking that candidate part doesn't break invariants: correct partition
|
/// Checking that candidate part doesn't break invariants: correct partition
|
||||||
void checkPartPartition(MutableDataPartPtr & part, DataPartsLock & lock) const;
|
void checkPartPartition(MutableDataPartPtr & part, DataPartsLock & lock) const;
|
||||||
void checkPartDuplicate(MutableDataPartPtr & part, Transaction & transaction, DataPartsLock & lock) const;
|
void checkPartDuplicate(MutableDataPartPtr & part, Transaction & transaction, DataPartsLock & lock) const;
|
||||||
|
void checkPartDynamicColumns(MutableDataPartPtr & part, DataPartsLock & lock) const;
|
||||||
|
|
||||||
/// Preparing itself to be committed in memory: fill some fields inside part, add it to data_parts_indexes
|
/// Preparing itself to be committed in memory: fill some fields inside part, add it to data_parts_indexes
|
||||||
/// in precommitted state and to transaction
|
/// in precommitted state and to transaction
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
{"b":"1","c":{"k1":[1,2]}}
|
@ -0,0 +1,14 @@
|
|||||||
|
SET allow_experimental_object_type = 1;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS t_json_attach_partition;
|
||||||
|
|
||||||
|
CREATE TABLE t_json_attach_partition(b UInt64, c JSON) ENGINE = MergeTree ORDER BY tuple();
|
||||||
|
|
||||||
|
INSERT INTO t_json_attach_partition FORMAT JSONEachRow {"b": 1, "c" : {"k1": 1}};
|
||||||
|
ALTER TABLE t_json_attach_partition DETACH PARTITION tuple();
|
||||||
|
INSERT INTO t_json_attach_partition FORMAT JSONEachRow {"b": 1, "c" : {"k1": [1, 2]}};
|
||||||
|
|
||||||
|
ALTER TABLE t_json_attach_partition ATTACH PARTITION tuple(); -- { serverError TYPE_MISMATCH }
|
||||||
|
SELECT * FROM t_json_attach_partition FORMAT JSONEachRow;
|
||||||
|
|
||||||
|
DROP TABLE t_json_attach_partition;
|
Loading…
Reference in New Issue
Block a user