Merge 'cnch_dev_fix_partial_update_default_expr' into 'cnch-dev'

fix(clickhousech@m-5371058578): fix partial update default expression

See merge request: !25758
This commit is contained in:
勾王敏浩 2024-10-16 13:16:03 +00:00 committed by Fred Wang
parent 65a5f0115b
commit 07ec6bd1ac
3 changed files with 44 additions and 3 deletions

View File

@ -1119,6 +1119,7 @@ std::vector<Block> MergeTreeDataDeduper::restoreBlockFromNewParts(const IMergeTr
{ {
auto metadata_snapshot = data.getInMemoryMetadataPtr(); auto metadata_snapshot = data.getInMemoryMetadataPtr();
auto sample_block = metadata_snapshot->getSampleBlock(); auto sample_block = metadata_snapshot->getSampleBlock();
auto default_columns = metadata_snapshot->getColumns().getDefaults();
Names column_names = sample_block.getNames(); Names column_names = sample_block.getNames();
NameSet name_set = sample_block.getNameSet(); NameSet name_set = sample_block.getNameSet();
@ -1159,7 +1160,10 @@ std::vector<Block> MergeTreeDataDeduper::restoreBlockFromNewParts(const IMergeTr
LOG_DEBUG(log, "Same update columns: {}, txn id: {}, part name: {}", same_update_columns, dedup_task->txn_id, part->name); LOG_DEBUG(log, "Same update columns: {}, txn id: {}, part name: {}", same_update_columns, dedup_task->txn_id, part->name);
if (size == 0) if (size == 0)
{
columns_read = column_names; columns_read = column_names;
update_column_set_list[part_id] = {columns_read.begin(), columns_read.end()};
}
else else
{ {
/// Restore update columns must use part columns instead of storage columns /// Restore update columns must use part columns instead of storage columns
@ -1194,6 +1198,11 @@ std::vector<Block> MergeTreeDataDeduper::restoreBlockFromNewParts(const IMergeTr
if (data.merging_params.hasExplicitVersionColumn()) if (data.merging_params.hasExplicitVersionColumn())
columns_read_set.insert(data.merging_params.version_column); columns_read_set.insert(data.merging_params.version_column);
update_column_set_list[part_id] = {columns_read_set.begin(), columns_read_set.end()};
/// We need to read out the columns containing the default expression
for (const auto & default_column : default_columns)
columns_read_set.insert(default_column.first);
columns_read = {columns_read_set.begin(), columns_read_set.end()}; columns_read = {columns_read_set.begin(), columns_read_set.end()};
} }
} }
@ -1203,9 +1212,6 @@ std::vector<Block> MergeTreeDataDeduper::restoreBlockFromNewParts(const IMergeTr
columns_read = column_names; columns_read = column_names;
} }
if (optimize_for_same_update_columns_atomic)
update_column_set_list[part_id] = {columns_read.begin(), columns_read.end()};
size_t total_size = update_columns->size(); size_t total_size = update_columns->size();
to_block.insert( to_block.insert(
ColumnWithTypeAndName{std::move(update_columns), std::make_shared<DataTypeString>(), StorageInMemoryMetadata::UPDATE_COLUMNS}); ColumnWithTypeAndName{std::move(update_columns), std::make_shared<DataTypeString>(), StorageInMemoryMetadata::UPDATE_COLUMNS});

View File

@ -0,0 +1,5 @@
2023-01-01 1001 20 c1 e1
2023-01-01 1002 21 c2 e2
2023-01-01 1003 22 c3 e3
2023-01-02 1004 23 d1 e4
2023-01-02 1005 0 d1 d1test

View File

@ -0,0 +1,30 @@
DROP TABLE IF EXISTS unique_partial_update_with_default;
CREATE TABLE unique_partial_update_with_default
(
`p_date` Date,
`id` UInt32,
`number` UInt32,
`content` String,
`extra` String DEFAULT concat(content, 'test')
)
ENGINE = CnchMergeTree()
PARTITION BY p_date
ORDER BY id
UNIQUE KEY id
SETTINGS enable_unique_partial_update = 1;
SYSTEM STOP DEDUP WORKER unique_partial_update_with_default;
SET enable_staging_area_for_write=0, enable_unique_partial_update=0;
INSERT INTO unique_partial_update_with_default VALUES ('2023-01-01', 1001, 20, 'c1', 'e1');
INSERT INTO unique_partial_update_with_default VALUES ('2023-01-01', 1002, 21, 'c2', 'e2');
INSERT INTO unique_partial_update_with_default VALUES ('2023-01-01', 1003, 22, 'c3', 'e3');
INSERT INTO unique_partial_update_with_default VALUES ('2023-01-02', 1004, 23, 'c4', 'e4');
SET enable_staging_area_for_write=0, enable_unique_partial_update=1;
-- data for unique key 1004: 2023-01-02, 1004, 23, d1, e4
-- data for unique key 1005: 2023-01-02, 1005, 0, d1, d1test
INSERT INTO unique_partial_update_with_default (p_date, id, content) values ('2023-01-02', 1004, 'd1'), ('2023-01-02', 1005, 'd1');
SELECT * FROM unique_partial_update_with_default ORDER BY id;
DROP TABLE IF EXISTS unique_partial_update_with_default;