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

.preferred_block_size_bytes = settings.preferred_block_size_bytes,
                .preferred_max_column_in_block_size_bytes = settings.preferred_max_column_in_block_size_bytes,
                .min_marks_for_concurrent_read = 0, 
                .use_uncompressed_cache = use_uncompressed_cache,
                .reader_settings = reader_settings,
                .backoff_settings = MergeTreeReadPool::BackoffSettings(settings),
            };
            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,
                ReadFromMergeTree::ReadType::InOrder);
            plan->addStep(std::move(step));
            
            if (!out_projection)
                out_projection = createProjection(plan->getCurrentDataStream().header);
        }
        auto expression_step = std::make_unique<ExpressionStep>(
            plan->getCurrentDataStream(),
            metadata_snapshot->getSortingKey().expression->getActionsDAG().clone());
        expression_step->setStepDescription("Calculate sorting key expression");
        plan->addStep(std::move(expression_step));