@@ -216,7 +216,8 @@ Status LakeDataSource::init_unused_output_columns(const std::vector<std::string>
216216 return Status::OK ();
217217}
218218
219- Status LakeDataSource::init_scanner_columns (std::vector<uint32_t >& scanner_columns) {
219+ Status LakeDataSource::init_scanner_columns (std::vector<uint32_t >& scanner_columns,
220+ std::vector<uint32_t >& reader_columns) {
220221 for (auto slot : *_slots) {
221222 DCHECK (slot->is_materialized ());
222223 int32_t index = _tablet_schema->field_index (slot->col_name ());
@@ -237,6 +238,23 @@ Status LakeDataSource::init_scanner_columns(std::vector<uint32_t>& scanner_colum
237238 if (scanner_columns.empty ()) {
238239 return Status::InternalError (" failed to build storage scanner, no materialized slot!" );
239240 }
241+
242+ // Return columns
243+ if (_params.skip_aggregation ) {
244+ reader_columns = scanner_columns;
245+ } else {
246+ for (size_t i = 0 ; i < _tablet_schema->num_key_columns (); i++) {
247+ reader_columns.push_back (i);
248+ }
249+ for (auto index : scanner_columns) {
250+ if (!_tablet_schema->column (index).is_key ()) {
251+ reader_columns.push_back (index);
252+ }
253+ }
254+ }
255+ // Actually only the key columns need to be sorted by id, here we check all
256+ // for simplicity.
257+ DCHECK (std::is_sorted (reader_columns.begin (), reader_columns.end ()));
240258 return Status::OK ();
241259}
242260
@@ -249,9 +267,7 @@ void LakeDataSource::decide_chunk_size(bool has_predicate) {
249267 }
250268}
251269
252- Status LakeDataSource::init_reader_params (const std::vector<OlapScanRange*>& key_ranges,
253- const std::vector<uint32_t >& scanner_columns,
254- std::vector<uint32_t >& reader_columns) {
270+ Status LakeDataSource::init_reader_params (const std::vector<OlapScanRange*>& key_ranges) {
255271 const TLakeScanNode& thrift_lake_scan_node = _provider->_t_lake_scan_node ;
256272 bool skip_aggregation = thrift_lake_scan_node.is_preaggregation ;
257273 auto parser = _obj_pool.add (new OlapPredicateParser (_tablet_schema));
@@ -282,6 +298,23 @@ Status LakeDataSource::init_reader_params(const std::vector<OlapScanRange*>& key
282298 _params.pred_tree = PredicateTree::create (std::move (pushdown_pred_root));
283299 _non_pushdown_pred_tree = PredicateTree::create (std::move (non_pushdown_pred_root));
284300
301+ for (const auto & cid : _non_pushdown_pred_tree.column_ids ()) {
302+ _unused_output_column_ids.erase (cid);
303+ }
304+
305+ std::vector<ExprContext*> not_pushdown_conjuncts;
306+ _conjuncts_manager->get_not_push_down_conjuncts (¬_pushdown_conjuncts);
307+ std::unordered_set<SlotId> conjuncts_slot_ids;
308+ for (auto * expr : not_pushdown_conjuncts) {
309+ expr->root ()->for_each_slot_id ([&conjuncts_slot_ids](SlotId id) { conjuncts_slot_ids.insert (id); });
310+ }
311+ for (auto & slot : *_slots) {
312+ if (conjuncts_slot_ids.contains (slot->id ())) {
313+ int32_t fid = _tablet_schema->field_index (slot->col_name ());
314+ _unused_output_column_ids.erase (fid);
315+ }
316+ }
317+
285318 {
286319 GlobalDictPredicatesRewriter not_pushdown_predicate_rewriter (*_params.global_dictmaps );
287320 RETURN_IF_ERROR (not_pushdown_predicate_rewriter.rewrite_predicate (&_obj_pool, _non_pushdown_pred_tree));
@@ -302,22 +335,6 @@ Status LakeDataSource::init_reader_params(const std::vector<OlapScanRange*>& key
302335 _params.end_key .push_back (key_range->end_scan_range );
303336 }
304337
305- // Return columns
306- if (skip_aggregation) {
307- reader_columns = scanner_columns;
308- } else {
309- for (size_t i = 0 ; i < _tablet_schema->num_key_columns (); i++) {
310- reader_columns.push_back (i);
311- }
312- for (auto index : scanner_columns) {
313- if (!_tablet_schema->column (index).is_key ()) {
314- reader_columns.push_back (index);
315- }
316- }
317- }
318- // Actually only the key columns need to be sorted by id, here we check all
319- // for simplicity.
320- DCHECK (std::is_sorted (reader_columns.begin (), reader_columns.end ()));
321338 return Status::OK ();
322339}
323340
@@ -331,8 +348,8 @@ Status LakeDataSource::init_tablet_reader(RuntimeState* runtime_state) {
331348 RETURN_IF_ERROR (get_tablet (_scan_range));
332349 RETURN_IF_ERROR (init_global_dicts (&_params));
333350 RETURN_IF_ERROR (init_unused_output_columns (thrift_lake_scan_node.unused_output_column_name ));
334- RETURN_IF_ERROR (init_scanner_columns (scanner_columns));
335- RETURN_IF_ERROR (init_reader_params (_scanner_ranges, scanner_columns, reader_columns ));
351+ RETURN_IF_ERROR (init_scanner_columns (scanner_columns, reader_columns ));
352+ RETURN_IF_ERROR (init_reader_params (_scanner_ranges));
336353
337354 if (_split_context != nullptr ) {
338355 auto split_context = down_cast<const pipeline::LakeSplitContext*>(_split_context);
0 commit comments