Skip to content
Snippets Groups Projects
Unverified Commit 27f832a1 authored by laura-ding's avatar laura-ding Committed by GitHub
Browse files

Fix failure when all field are constant expressions in yield sentence with filter (#260)


* Fix yield sentence with where in constant expression

* address yee's commnet

Co-authored-by: default avatardutor <440396+dutor@users.noreply.github.com>
parent 801e0aa6
No related branches found
No related tags found
No related merge requests found
......@@ -18,11 +18,15 @@ folly::Future<Status> FilterExecutor::execute() {
SCOPED_TIMER(&execTime_);
auto* filter = asNode<Filter>(node());
auto iter = ectx_->getResult(filter->inputVar()).iter();
if (iter == nullptr) {
LOG(ERROR) << "Internal Error: iterator is nullptr";
return Status::Error("Internal Error: iterator is nullptr");
if (iter == nullptr || iter->isDefaultIter()) {
LOG(ERROR) << "Internal Error: iterator is nullptr or DefaultIter";
return Status::Error("Internal Error: iterator is nullptr or DefaultIter");
}
VLOG(2) << "Get input var: " << filter->inputVar()
<< ", iterator type: " << static_cast<int16_t>(iter->kind())
<< ", input data size: " << iter->size();
ResultBuilder builder;
builder.value(iter->valuePtr());
QueryExpressionContext ctx(ectx_);
......
......@@ -44,6 +44,11 @@ Status YieldValidator::validateImpl() {
NG_RETURN_IF_ERROR(checkAggFunAndBuildGroupItems(yield->yield()));
}
if (exprProps_.inputProps().empty() && exprProps_.varProps().empty()) {
// generate constant expression result into querycontext
genConstantExprValues();
}
return Status::OK();
}
......@@ -110,6 +115,20 @@ Status YieldValidator::makeOutputColumn(YieldColumn *column) {
return Status::OK();
}
void YieldValidator::genConstantExprValues() {
constantExprVar_ = vctx_->anonVarGen()->getVar();
DataSet ds;
ds.colNames = outputColumnNames_;
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::validateYieldAndBuildOutputs(const YieldClause *clause) {
auto columns = clause->columns();
columns_ = qctx_->objPool()->add(new YieldColumns);
......@@ -162,6 +181,7 @@ Status YieldValidator::validateYieldAndBuildOutputs(const YieldClause *clause) {
NG_RETURN_IF_ERROR(makeOutputColumn(column->clone().release()));
}
return Status::OK();
}
......@@ -186,6 +206,9 @@ Status YieldValidator::toPlan() {
std::transform(
inputs_.cbegin(), inputs_.cend(), colNames.begin(), [](auto &in) { return in.first; });
filter->setColNames(std::move(colNames));
if (!constantExprVar_.empty()) {
filter->setInputVar(constantExprVar_);
}
}
SingleInputNode *dedupDep = nullptr;
......@@ -224,3 +247,4 @@ Status YieldValidator::toPlan() {
} // namespace graph
} // namespace nebula
......@@ -41,13 +41,15 @@ private:
Status checkInputProps() const;
Status checkAggFunAndBuildGroupItems(const YieldClause *clause);
Status makeOutputColumn(YieldColumn *column);
void genConstantExprValues();
private:
bool hasAggFun_{false};
YieldColumns *columns_{nullptr};
std::vector<std::string> outputColumnNames_;
std::vector<Aggregate::GroupItem> groupItems_;
ExpressionProps exprProps_;
std::string constantExprVar_;
};
} // namespace graph
......
......@@ -581,3 +581,31 @@ class TestYield(NebulaTestSuite):
resp = self.execute_query(query)
self.check_resp_succeeded(resp)
self.check_result(resp, [['hello']])
def test_constant_expression_with_where(self):
query = 'YIELD 1+1, "Hello world!" WHERE true;'
resp = self.execute_query(query)
self.check_resp_succeeded(resp)
self.check_result(resp, [[2, 'Hello world!']])
query = 'YIELD 1+1, "Hello world!" WHERE NULL;'
resp = self.execute_query(query)
self.check_resp_succeeded(resp)
self.check_empty_result(resp)
query = '''GO FROM "Tim Duncan", "Tim Duncan" OVER serve YIELD $$.team.name AS team
| YIELD 1+1, "Hello world!" WHERE $-.team == "Spurs"'''
resp = self.execute_query(query)
self.check_resp_succeeded(resp)
columns = ['(1+1)', 'Hello world!']
self.check_column_names(resp, columns)
expect_result = [[2, 'Hello world!'], [2, 'Hello world!']]
self.check_out_of_order_result(resp, expect_result)
query = '''GO FROM "Tim Duncan", "Tim Duncan" OVER serve YIELD $$.team.name AS team
| YIELD 1+1, "Hello world!" WHERE $-.team != "Spurs"'''
resp = self.execute_query(query)
self.check_resp_succeeded(resp)
columns = ['(1+1)', 'Hello world!']
self.check_column_names(resp, columns)
self.check_empty_result(resp)
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment