diff --git a/src/graph/optimizer/rule/TopNRule.cpp b/src/graph/optimizer/rule/TopNRule.cpp index 194ec2788bd..17171fc4872 100644 --- a/src/graph/optimizer/rule/TopNRule.cpp +++ b/src/graph/optimizer/rule/TopNRule.cpp @@ -4,6 +4,7 @@ */ #include "graph/optimizer/rule/TopNRule.h" + #include "graph/optimizer/OptContext.h" #include "graph/optimizer/OptGroup.h" #include "graph/planner/plan/PlanNode.h" diff --git a/src/graph/util/ExpressionUtils.cpp b/src/graph/util/ExpressionUtils.cpp index aff0c9f14ce..ee3c7913ad0 100644 --- a/src/graph/util/ExpressionUtils.cpp +++ b/src/graph/util/ExpressionUtils.cpp @@ -63,6 +63,16 @@ std::vector ExpressionUtils::collectAll( return std::move(visitor).results(); } +bool ExpressionUtils::checkVarExprIfExist(const Expression *expr) { + auto vars = ExpressionUtils::collectAll(expr, {Expression::Kind::kVar}); + for (auto *var : vars) { + if (!static_cast(var)->isInner()) { + return true; + } + } + return false; +} + std::vector ExpressionUtils::findAllStorage(const Expression *expr) { return collectAll(expr, {Expression::Kind::kTagProperty, diff --git a/src/graph/util/ExpressionUtils.h b/src/graph/util/ExpressionUtils.h index 484f2db4127..c6d1fa5b87b 100644 --- a/src/graph/util/ExpressionUtils.h +++ b/src/graph/util/ExpressionUtils.h @@ -44,6 +44,8 @@ class ExpressionUtils { static std::vector collectAll( const Expression* self, const std::unordered_set& expected); + static bool checkVarExprIfExist(const Expression* expr); + static std::vector findAllStorage(const Expression* expr); static std::vector findAllInputVariableProp(const Expression* expr); diff --git a/src/parser/parser.yy b/src/parser/parser.yy index a656f3aa0d3..a30907dd26e 100644 --- a/src/parser/parser.yy +++ b/src/parser/parser.yy @@ -1444,9 +1444,16 @@ yield_column delete $3; } | expression { + if (graph::ExpressionUtils::checkVarExprIfExist($1)) { + throw nebula::GraphParser::syntax_error(@1, "Direct output of variable is prohibited"); + } $$ = new YieldColumn($1); } | expression KW_AS name_label { + if (graph::ExpressionUtils::checkVarExprIfExist($1)) { + delete $3; + throw nebula::GraphParser::syntax_error(@1, "Direct output of variable is prohibited"); + } $$ = new YieldColumn($1, *$3); delete $3; } diff --git a/tests/tck/features/bugfix/VariableExpression.feature b/tests/tck/features/bugfix/VariableExpression.feature new file mode 100644 index 00000000000..d95560d681f --- /dev/null +++ b/tests/tck/features/bugfix/VariableExpression.feature @@ -0,0 +1,26 @@ +# Copyright (c) 2021 vesoft inc. All rights reserved. +# +# This source code is licensed under Apache 2.0 License, +# attached with Common Clause Condition 1.0, found in the LICENSES directory. +Feature: Variable usage + + Background: + Given a graph with space named "nba" + + Scenario: disable yield $var + When executing query: + """ + $var = yield 1;$var2 = yield 3;yield $var1 + $var2 + """ + Then a SyntaxError should be raised at runtime: Direct output of variable is prohibited near `$var1 + $var2' + When executing query: + """ + $var=go from "Tim Duncan" over like yield like._dst as dst;yield $var + """ + Then a SyntaxError should be raised at runtime: Direct output of variable is prohibited near `$var' + Then drop the used space + When executing query: + """ + $var=go from "Tim Duncan" over like yield like._dst as dst;yield $var[0][0] + """ + Then a SyntaxError should be raised at runtime: Direct output of variable is prohibited near `$var[0][0]' diff --git a/tests/tck/features/go/GroupbyLimit.IntVid.feature b/tests/tck/features/go/GroupbyLimit.IntVid.feature index 86e457460f6..384c12928a8 100644 --- a/tests/tck/features/go/GroupbyLimit.IntVid.feature +++ b/tests/tck/features/go/GroupbyLimit.IntVid.feature @@ -15,7 +15,7 @@ Feature: Groupby & limit Sentence """ GO FROM hash("Marco Belinelli") OVER serve YIELD $$.team.name AS name | GROUP BY $-.start_year YIELD COUNT($var) """ - Then a SemanticError should be raised at runtime: + Then a SyntaxError should be raised at runtime: Scenario: Syntax test4 When executing query: diff --git a/tests/tck/features/go/GroupbyLimit.feature b/tests/tck/features/go/GroupbyLimit.feature index 2a282a2b7b0..7706c27c6b2 100644 --- a/tests/tck/features/go/GroupbyLimit.feature +++ b/tests/tck/features/go/GroupbyLimit.feature @@ -22,7 +22,7 @@ Feature: Groupby & limit Sentence """ GO FROM "Marco Belinelli" OVER serve YIELD $$.team.name AS name | GROUP BY $-.start_year YIELD COUNT($var) """ - Then a SemanticError should be raised at runtime: + Then a SyntaxError should be raised at runtime: Scenario: Syntax test4 When executing query: