@@ -1512,6 +1512,7 @@ std::unique_ptr<VectorizedOperator> QueryExecutor::build_vectorized_plan(
15121512 auto thread_pool = std::make_shared<executor::ThreadPool>(std::thread::hardware_concurrency ());
15131513 std::unique_ptr<VectorizedOperator> current_root =
15141514 std::make_unique<VectorizedSeqScanOperator>(base_table_name, col_table, thread_pool);
1515+ VectorizedSeqScanOperator* base_scan = static_cast <VectorizedSeqScanOperator*>(current_root.get ());
15151516
15161517 // Track estimated output rows for join reordering decisions
15171518 uint64_t current_est_rows = optimizer::RowEstimator::estimate_scan_rows (*base_table_meta);
@@ -1720,20 +1721,27 @@ std::unique_ptr<VectorizedOperator> QueryExecutor::build_vectorized_plan(
17201721 }
17211722
17221723 executor::Schema output_schema;
1724+ std::vector<size_t > required_col_indices;
17231725 for (const auto & gb : stmt.group_by ()) {
17241726 const auto & gb_name = gb->to_string ();
17251727 size_t idx = current_root->output_schema ().find_column (gb_name);
17261728 if (idx != static_cast <size_t >(-1 )) {
17271729 output_schema.add_column (current_root->output_schema ().get_column (idx).name (),
17281730 current_root->output_schema ().get_column (idx).type (),
17291731 current_root->output_schema ().get_column (idx).nullable ());
1732+ required_col_indices.push_back (idx);
17301733 }
17311734 }
17321735 for (size_t i = 0 ; i < agg_infos.size (); ++i) {
17331736 output_schema.add_column (" agg_" + std::to_string (i), common::ValueType::TYPE_FLOAT64 ,
17341737 false );
1738+ if (agg_infos[i].input_col_idx >= 0 ) {
1739+ required_col_indices.push_back (static_cast <size_t >(agg_infos[i].input_col_idx ));
1740+ }
17351741 }
17361742
1743+ base_scan->set_required_columns (required_col_indices, output_schema);
1744+
17371745 auto agg_op = std::make_unique<VectorizedGroupByOperator>(
17381746 std::move (current_root), std::move (group_by), std::move (agg_infos), output_schema,
17391747 thread_pool);
0 commit comments