```sql
DROP TABLE IF EXISTS tp;

create table tp (d1 Int32, d2 Int32, eventcnt Int64,
projection p (select sum(eventcnt), d1 group by d1)) 
engine = SummingMergeTree order by (d1, d2);

set allow_experimental_projection_optimization = 1, force_optimize_projection = 1;

select sum(eventcnt) eventcnt, d1
from tp
group by d1;

DB::Exception: No projection is used when allow_experimental_projection_optimization = 1.

```

The exception message is also incorrect, should be "when force_optimize_projection = 1".

auto read_type = input_order_info->direction == 1
                       ? ReadFromMergeTree::ReadType::InOrder
                       : ReadFromMergeTree::ReadType::InReverseOrder;
        auto plan = std::make_unique<QueryPlan>();
        auto step = std::make_unique<ReadFromMergeTree>(
            data,
            metadata_snapshot,
            query_id,
            column_names,
            std::move(new_parts),
            std::move(index_stats),
            query_info.projection ? query_info.projection->prewhere_info : query_info.prewhere_info,
            virt_columns,
            step_settings,
            num_streams,
            read_type);
        plan->addStep(std::move(step));
        plans.emplace_back(std::move(plan));
    }
    if (need_preliminary_merge)
    {
        SortDescription sort_description;
        for (size_t j = 0; j < input_order_info->order_key_prefix_descr.size(); ++j)
            sort_description.emplace_back(metadata_snapshot->getSortingKey().column_names[j],
                                          input_order_info->direction, 1);
        for (auto & plan : plans)
        {
            
            out_projection = createProjection(plan->getCurrentDataStream().header);
            auto expression_step = std::make_unique<ExpressionStep>(