@@ -90,12 +90,6 @@ size_t countPartitions(const RangesInDataParts & parts_with_ranges)
9090 return countPartitions (parts_with_ranges, get_partition_id);
9191}
9292
93- size_t countPartitions (const MergeTreeData::DataPartsVector & prepared_parts)
94- {
95- auto get_partition_id = [](const MergeTreeData::DataPartPtr data_part) { return data_part->info .getPartitionId (); };
96- return countPartitions (prepared_parts, get_partition_id);
97- }
98-
9993bool restoreDAGInputs (ActionsDAG & dag, const NameSet & inputs)
10094{
10195 std::unordered_set<const ActionsDAG::Node *> outputs (dag.getOutputs ().begin (), dag.getOutputs ().end ());
@@ -336,7 +330,7 @@ void ReadFromMergeTree::AnalysisResult::checkLimits(const Settings & settings, c
336330}
337331
338332ReadFromMergeTree::ReadFromMergeTree (
339- MergeTreeData::DataPartsVector parts_,
333+ RangesInDataParts parts_,
340334 MergeTreeData::MutationsSnapshotPtr mutations_,
341335 Names all_column_names_,
342336 const MergeTreeData & data_,
@@ -1245,7 +1239,8 @@ Pipe ReadFromMergeTree::spreadMarkRangesAmongStreamsWithOrder(
12451239 }
12461240
12471241 ranges_to_get_from_part = split_ranges (ranges_to_get_from_part, input_order_info->direction );
1248- new_parts.emplace_back (part.data_part , part.part_index_in_query , std::move (ranges_to_get_from_part));
1242+ new_parts.emplace_back (
1243+ part.data_part , part.part_index_in_query , part.part_starting_offset_in_query , std::move (ranges_to_get_from_part));
12491244 }
12501245
12511246 split_parts_and_ranges.emplace_back (std::move (new_parts));
@@ -1488,7 +1483,8 @@ Pipe ReadFromMergeTree::spreadMarkRangesAmongStreamsFinal(
14881483 RangesInDataParts new_parts;
14891484
14901485 for (auto part_it = parts_to_merge_ranges[range_index]; part_it != parts_to_merge_ranges[range_index + 1 ]; ++part_it)
1491- new_parts.emplace_back (part_it->data_part , part_it->part_index_in_query , part_it->ranges );
1486+ new_parts.emplace_back (
1487+ part_it->data_part , part_it->part_index_in_query , part_it->part_starting_offset_in_query , part_it->ranges );
14921488
14931489 if (new_parts.empty ())
14941490 continue ;
@@ -1631,7 +1627,7 @@ ReadFromMergeTree::AnalysisResultPtr ReadFromMergeTree::selectRangesToRead(bool
16311627 return selectRangesToRead (prepared_parts, find_exact_ranges);
16321628}
16331629
1634- ReadFromMergeTree::AnalysisResultPtr ReadFromMergeTree::selectRangesToRead (MergeTreeData::DataPartsVector parts, bool find_exact_ranges) const
1630+ ReadFromMergeTree::AnalysisResultPtr ReadFromMergeTree::selectRangesToRead (RangesInDataParts parts, bool find_exact_ranges) const
16351631{
16361632 return selectRangesToRead (
16371633 std::move (parts),
@@ -1653,7 +1649,7 @@ static void buildIndexes(
16531649 std::optional<ReadFromMergeTree::Indexes> & indexes,
16541650 const ActionsDAG * filter_actions_dag,
16551651 const MergeTreeData & data,
1656- const MergeTreeData::DataPartsVector & parts,
1652+ const RangesInDataParts & parts,
16571653 const MergeTreeData::MutationsSnapshotPtr & mutations_snapshot,
16581654 [[maybe_unused]] const std::optional<VectorSearchParameters> & vector_search_parameters,
16591655 const ContextPtr & context,
@@ -1684,8 +1680,15 @@ static void buildIndexes(
16841680 indexes->partition_pruner .emplace (metadata_snapshot, filter_dag, context, false /* strict */ );
16851681 }
16861682
1687- indexes->part_values = MergeTreeDataSelectExecutor::filterPartsByVirtualColumns (metadata_snapshot, data, parts, filter_dag.predicate , context);
1688- MergeTreeDataSelectExecutor::buildKeyConditionFromPartOffset (indexes->part_offset_condition , filter_dag.predicate , context);
1683+ indexes->part_values
1684+ = MergeTreeDataSelectExecutor::filterPartsByVirtualColumns (metadata_snapshot, data, parts, filter_dag.predicate , context);
1685+
1686+ // / Perform virtual column key analysis only when no corresponding physical columns exist.
1687+ const auto & columns = metadata_snapshot->getColumns ();
1688+ if (!columns.has (" _part_offset" ) && !columns.has (" _part" ))
1689+ MergeTreeDataSelectExecutor::buildKeyConditionFromPartOffset (indexes->part_offset_condition , filter_dag.predicate , context);
1690+ if (!columns.has (" _part_offset" ) && !columns.has (" _part_starting_offset" ))
1691+ MergeTreeDataSelectExecutor::buildKeyConditionFromTotalOffset (indexes->total_offset_condition , filter_dag.predicate , context);
16891692
16901693 indexes->use_skip_indexes = settings[Setting::use_skip_indexes];
16911694 if (query_info.isFinal () && !settings[Setting::use_skip_indexes_if_final])
@@ -1834,7 +1837,7 @@ void ReadFromMergeTree::applyFilters(ActionDAGNodes added_filter_nodes)
18341837}
18351838
18361839ReadFromMergeTree::AnalysisResultPtr ReadFromMergeTree::selectRangesToRead (
1837- MergeTreeData::DataPartsVector parts,
1840+ RangesInDataParts parts,
18381841 MergeTreeData::MutationsSnapshotPtr mutations_snapshot,
18391842 const std::optional<VectorSearchParameters> & vector_search_parameters,
18401843 const StorageMetadataPtr & metadata_snapshot,
@@ -1867,7 +1870,17 @@ ReadFromMergeTree::AnalysisResultPtr ReadFromMergeTree::selectRangesToRead(
18671870 const Names & primary_key_column_names = primary_key.column_names ;
18681871
18691872 if (!indexes)
1870- buildIndexes (indexes, query_info_.filter_actions_dag .get (), data, parts, mutations_snapshot, vector_search_parameters, context_, query_info_, metadata_snapshot, log);
1873+ buildIndexes (
1874+ indexes,
1875+ query_info_.filter_actions_dag .get (),
1876+ data,
1877+ parts,
1878+ mutations_snapshot,
1879+ vector_search_parameters,
1880+ context_,
1881+ query_info_,
1882+ metadata_snapshot,
1883+ log);
18711884
18721885 if (indexes->part_values && indexes->part_values ->empty ())
18731886 return std::make_shared<AnalysisResult>(std::move (result));
@@ -1890,6 +1903,9 @@ ReadFromMergeTree::AnalysisResultPtr ReadFromMergeTree::selectRangesToRead(
18901903 if (indexes->part_offset_condition )
18911904 LOG_DEBUG (log, " Part offset condition: {}" , indexes->part_offset_condition ->toString ());
18921905
1906+ if (indexes->total_offset_condition )
1907+ LOG_DEBUG (log, " Total offset condition: {}" , indexes->total_offset_condition ->toString ());
1908+
18931909 if (indexes->key_condition .alwaysFalse ())
18941910 return std::make_shared<AnalysisResult>(std::move (result));
18951911
@@ -1924,7 +1940,7 @@ ReadFromMergeTree::AnalysisResultPtr ReadFromMergeTree::selectRangesToRead(
19241940 return std::make_shared<AnalysisResult>(std::move (result));
19251941
19261942 for (const auto & part : parts)
1927- total_marks_pk += part->index_granularity ->getMarksCountWithoutFinal ();
1943+ total_marks_pk += part. data_part ->index_granularity ->getMarksCountWithoutFinal ();
19281944 parts_before_pk = parts.size ();
19291945
19301946 auto reader_settings = getMergeTreeReaderSettings (context_, query_info_);
@@ -1934,6 +1950,7 @@ ReadFromMergeTree::AnalysisResultPtr ReadFromMergeTree::selectRangesToRead(
19341950 context_,
19351951 indexes->key_condition ,
19361952 indexes->part_offset_condition ,
1953+ indexes->total_offset_condition ,
19371954 indexes->skip_indexes ,
19381955 reader_settings,
19391956 log,
@@ -1945,12 +1962,11 @@ ReadFromMergeTree::AnalysisResultPtr ReadFromMergeTree::selectRangesToRead(
19451962
19461963 MergeTreeDataSelectExecutor::filterPartsByQueryConditionCache (result.parts_with_ranges , query_info_, context_, log);
19471964
1948- if (indexes->use_skip_indexes && !indexes->skip_indexes .useful_indices .empty () && query_info_.isFinal () && settings[Setting::use_skip_indexes_if_final_exact_mode])
1965+ if (indexes->use_skip_indexes && !indexes->skip_indexes .useful_indices .empty () && query_info_.isFinal ()
1966+ && settings[Setting::use_skip_indexes_if_final_exact_mode])
19491967 {
1950- result.parts_with_ranges = findPKRangesForFinalAfterSkipIndex (primary_key,
1951- metadata_snapshot->getSortingKey (),
1952- result.parts_with_ranges ,
1953- log);
1968+ result.parts_with_ranges
1969+ = findPKRangesForFinalAfterSkipIndex (primary_key, metadata_snapshot->getSortingKey (), result.parts_with_ranges , log);
19541970 add_index_stat_row_for_pk_expand = true ;
19551971 }
19561972 }
@@ -2135,7 +2151,7 @@ bool ReadFromMergeTree::requestOutputEachPartitionThroughSeparatePort()
21352151 {
21362152 std::unordered_map<String, size_t > partition_rows;
21372153 for (const auto & part : prepared_parts)
2138- partition_rows[part->info .getPartitionId ()] += part->rows_count ;
2154+ partition_rows[part. data_part ->info .getPartitionId ()] += part. data_part ->rows_count ;
21392155 size_t sum_rows = 0 ;
21402156 size_t max_rows = 0 ;
21412157 for (const auto & [_, rows] : partition_rows)
0 commit comments