From 046143cc47ac605723e2e9666b2066103843bb86 Mon Sep 17 00:00:00 2001 From: "kyle.cao" Date: Fri, 30 Jul 2021 17:46:08 +0800 Subject: [PATCH] fix first plan node input var --- src/planner/match/MatchPlanner.cpp | 4 +++- src/planner/match/MatchPlanner.h | 1 + src/validator/YieldValidator.cpp | 26 ++++---------------------- 3 files changed, 8 insertions(+), 23 deletions(-) diff --git a/src/planner/match/MatchPlanner.cpp b/src/planner/match/MatchPlanner.cpp index 4a023ad1d..ccad81301 100644 --- a/src/planner/match/MatchPlanner.cpp +++ b/src/planner/match/MatchPlanner.cpp @@ -67,15 +67,17 @@ StatusOr MatchPlanner::transform(AstContext* astCtx) { } } - auto finalPlan = connectSegments(subplans, matchCtx->clauses); + auto finalPlan = connectSegments(astCtx, subplans, matchCtx->clauses); NG_RETURN_IF_ERROR(finalPlan); return std::move(finalPlan).value(); } StatusOr MatchPlanner::connectSegments( + AstContext* astCtx, std::vector& subplans, std::vector>& clauses) { DCHECK(!subplans.empty()); + subplans.front().tail->setInputVar(astCtx->qctx->vctx()->anonVarGen()->getVar()); if (subplans.size() == 1) { return subplans.front(); } diff --git a/src/planner/match/MatchPlanner.h b/src/planner/match/MatchPlanner.h index 0d97659de..0dfabdef9 100644 --- a/src/planner/match/MatchPlanner.h +++ b/src/planner/match/MatchPlanner.h @@ -24,6 +24,7 @@ class MatchPlanner final : public Planner { private: StatusOr connectSegments( + AstContext* astCtx, std::vector& subplans, std::vector>& clauses); }; diff --git a/src/validator/YieldValidator.cpp b/src/validator/YieldValidator.cpp index 736874e1b..6dc7bf54a 100644 --- a/src/validator/YieldValidator.cpp +++ b/src/validator/YieldValidator.cpp @@ -50,12 +50,6 @@ Status YieldValidator::validateImpl() { return Status::SemanticError("Only one variable allowed to use."); } - if (!groupByValidator_ && exprProps_.inputProps().empty() - && exprProps_.varProps().empty() && inputVarName_.empty()) { - // generate constant expression result into querycontext - genConstantExprValues(); - } - if (!exprProps_.varProps().empty() && !userDefinedVarNameList_.empty()) { // TODO: Support Multiple userDefinedVars if (userDefinedVarNameList_.size() != 1) { @@ -90,20 +84,6 @@ Status YieldValidator::makeOutputColumn(YieldColumn *column) { return Status::OK(); } -void YieldValidator::genConstantExprValues() { - constantExprVar_ = vctx_->anonVarGen()->getVar(); - DataSet ds; - ds.colNames = getOutColNames(); - QueryExpressionContext ctx; - Row row; - for (auto &column : columns_->columns()) { - row.values.emplace_back(Expression::eval(column->expr(), ctx(nullptr))); - } - ds.emplace_back(std::move(row)); - qctx_->ectx()->setResult(constantExprVar_, - ResultBuilder().value(Value(std::move(ds))).finish()); -} - Status YieldValidator::makeImplicitGroupByValidator() { auto* groupSentence = qctx()->objPool()->add( new GroupBySentence( @@ -192,8 +172,10 @@ Status YieldValidator::toPlan() { if (!userDefinedVarName_.empty()) { inputVar = userDefinedVarName_; colNames = qctx_->symTable()->getVar(inputVar)->colNames; - } else if (!constantExprVar_.empty()) { - inputVar = constantExprVar_; + } else if (exprProps_.inputProps().empty() + && exprProps_.varProps().empty() && inputVarName_.empty()) { + // generate constant expression result into querycontext + inputVar = vctx_->anonVarGen()->getVar(); } else { std::transform( inputs_.cbegin(), inputs_.cend(), colNames.begin(), [](auto &col) { return col.name; });