From 07ec6bd1ac9ae9ca027634c74348e82b56985b6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8B=BE=E7=8E=8B=E6=95=8F=E6=B5=A9?= Date: Wed, 16 Oct 2024 13:16:03 +0000 Subject: [PATCH] Merge 'cnch_dev_fix_partial_update_default_expr' into 'cnch-dev' fix(clickhousech@m-5371058578): fix partial update default expression See merge request: !25758 --- src/MergeTreeCommon/MergeTreeDataDeduper.cpp | 12 ++++++-- ...ekey_partial_update_with_default.reference | 5 ++++ ..._uniquekey_partial_update_with_default.sql | 30 +++++++++++++++++++ 3 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 tests/queries/4_cnch_stateless/10052_uniquekey_partial_update_with_default.reference create mode 100644 tests/queries/4_cnch_stateless/10052_uniquekey_partial_update_with_default.sql diff --git a/src/MergeTreeCommon/MergeTreeDataDeduper.cpp b/src/MergeTreeCommon/MergeTreeDataDeduper.cpp index 4a193d9e1f..abaff8ff52 100644 --- a/src/MergeTreeCommon/MergeTreeDataDeduper.cpp +++ b/src/MergeTreeCommon/MergeTreeDataDeduper.cpp @@ -1119,6 +1119,7 @@ std::vector MergeTreeDataDeduper::restoreBlockFromNewParts(const IMergeTr { auto metadata_snapshot = data.getInMemoryMetadataPtr(); auto sample_block = metadata_snapshot->getSampleBlock(); + auto default_columns = metadata_snapshot->getColumns().getDefaults(); Names column_names = sample_block.getNames(); NameSet name_set = sample_block.getNameSet(); @@ -1159,7 +1160,10 @@ std::vector MergeTreeDataDeduper::restoreBlockFromNewParts(const IMergeTr LOG_DEBUG(log, "Same update columns: {}, txn id: {}, part name: {}", same_update_columns, dedup_task->txn_id, part->name); if (size == 0) + { columns_read = column_names; + update_column_set_list[part_id] = {columns_read.begin(), columns_read.end()}; + } else { /// Restore update columns must use part columns instead of storage columns @@ -1194,6 +1198,11 @@ std::vector MergeTreeDataDeduper::restoreBlockFromNewParts(const IMergeTr if (data.merging_params.hasExplicitVersionColumn()) 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()}; } } @@ -1203,9 +1212,6 @@ std::vector MergeTreeDataDeduper::restoreBlockFromNewParts(const IMergeTr 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(); to_block.insert( ColumnWithTypeAndName{std::move(update_columns), std::make_shared(), StorageInMemoryMetadata::UPDATE_COLUMNS}); diff --git a/tests/queries/4_cnch_stateless/10052_uniquekey_partial_update_with_default.reference b/tests/queries/4_cnch_stateless/10052_uniquekey_partial_update_with_default.reference new file mode 100644 index 0000000000..7dae57e9fb --- /dev/null +++ b/tests/queries/4_cnch_stateless/10052_uniquekey_partial_update_with_default.reference @@ -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 diff --git a/tests/queries/4_cnch_stateless/10052_uniquekey_partial_update_with_default.sql b/tests/queries/4_cnch_stateless/10052_uniquekey_partial_update_with_default.sql new file mode 100644 index 0000000000..9f225aeb54 --- /dev/null +++ b/tests/queries/4_cnch_stateless/10052_uniquekey_partial_update_with_default.sql @@ -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;