```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".

if (num_streams > 1)
    {
        
        if (sum_marks < num_streams * min_marks_for_concurrent_read && parts.size() < num_streams)
            num_streams = std::max((sum_marks + min_marks_for_concurrent_read - 1) / min_marks_for_concurrent_read, parts.size());
    }
    auto plan = std::make_unique<QueryPlan>();
    auto step = std::make_unique<ReadFromMergeTree>(
        data,
        metadata_snapshot,
        query_id,
        column_names,
        std::move(parts),
        std::move(index_stats),
        query_info.projection ? query_info.projection->prewhere_info : query_info.prewhere_info,
        virt_columns,
        step_settings,
        num_streams,
        ReadFromMergeTree::ReadType::Default);
    plan->addStep(std::move(step));
    return plan;
}
static ActionsDAGPtr createProjection(const Block & header)
{
    auto projection = std::make_shared<ActionsDAG>(header.getNamesAndTypesList());
    projection->removeUnusedActions(header.getNames());
    projection->projectInput();
    return projection;
}
QueryPlanPtr MergeTreeDataSelectExecutor::spreadMarkRangesAmongStreamsWithOrder(