diff --git a/src/query/plan/cost_estimator.hpp b/src/query/plan/cost_estimator.hpp index 04af448a9..ab1a928e8 100644 --- a/src/query/plan/cost_estimator.hpp +++ b/src/query/plan/cost_estimator.hpp @@ -302,13 +302,9 @@ class CostEstimator : public HierarchicalLogicalOperatorVisitor { // Estimate cost on the subquery branch independently, use a copy auto last_scope = scopes_.back(); double subquery_cost = EstimateCostOnBranch(&op.subquery_, last_scope); + subquery_cost = subquery_cost != 0 ? subquery_cost : 1; + cardinality_ *= subquery_cost; - // if the query is a unit subquery, we don't want the cost to be zero but 1xN - double input_cost = cost(); - input_cost = input_cost == 0 ? 1 : input_cost; - subquery_cost = subquery_cost == 0 ? 1 : subquery_cost; - - cardinality_ *= input_cost * subquery_cost; IncrementCost(CostParam::kSubquery); return false; diff --git a/tests/unit/query_cost_estimator.cpp b/tests/unit/query_cost_estimator.cpp index bd1fee60b..d89031b82 100644 --- a/tests/unit/query_cost_estimator.cpp +++ b/tests/unit/query_cost_estimator.cpp @@ -201,7 +201,7 @@ TEST_F(QueryCostEstimator, SubqueryCartesian) { std::shared_ptr input = std::make_shared(std::make_shared(), NextSymbol()); std::shared_ptr subquery = std::make_shared(std::make_shared(), NextSymbol()); MakeOp(input, subquery, true); - EXPECT_COST(CostParam::kSubquery * no_vertices * no_vertices); + EXPECT_COST(CostParam::kSubquery * no_vertices * no_vertices + no_vertices); } TEST_F(QueryCostEstimator, UnitSubquery) {