Skip to content

Commit

Permalink
fix bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
heroicNeZha committed Dec 30, 2021
1 parent 7f850c9 commit 641581f
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 32 deletions.
60 changes: 31 additions & 29 deletions src/graph/util/ExpressionUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -987,14 +987,14 @@ bool ExpressionUtils::isGeoIndexAcceleratedPredicate(const Expression *expr) {
}

bool ExpressionUtils::checkExprDepth(const Expression *expr) {
std::queue<const Expression *> expr_queue;
expr_queue.emplace(expr);
std::queue<const Expression *> exprQueue;
exprQueue.emplace(expr);
int depth = 0;
while (!expr_queue.empty()) {
int size = expr_queue.size();
while (!exprQueue.empty()) {
int size = exprQueue.size();
while (size > 0) {
const Expression *cur = expr_queue.front();
expr_queue.pop();
const Expression *cur = exprQueue.front();
exprQueue.pop();
switch (cur->kind()) {
case Expression::Kind::kConstant:
case Expression::Kind::kVar: {
Expand All @@ -1006,8 +1006,8 @@ bool ExpressionUtils::checkExprDepth(const Expression *expr) {
case Expression::Kind::kDivision:
case Expression::Kind::kMod: {
auto *ariExpr = static_cast<const ArithmeticExpression *>(cur);
expr_queue.emplace(ariExpr->left());
expr_queue.emplace(ariExpr->right());
exprQueue.emplace(ariExpr->left());
exprQueue.emplace(ariExpr->right());
break;
}
case Expression::Kind::kIsNull:
Expand All @@ -1020,7 +1020,7 @@ bool ExpressionUtils::checkExprDepth(const Expression *expr) {
case Expression::Kind::kUnaryIncr:
case Expression::Kind::kUnaryDecr: {
auto *unaExpr = static_cast<const UnaryExpression *>(cur);
expr_queue.emplace(unaExpr->operand());
exprQueue.emplace(unaExpr->operand());
break;
}
case Expression::Kind::kRelEQ:
Expand All @@ -1039,87 +1039,89 @@ bool ExpressionUtils::checkExprDepth(const Expression *expr) {
case Expression::Kind::kRelNotIn:
case Expression::Kind::kRelIn: {
auto *relExpr = static_cast<const RelationalExpression *>(cur);
expr_queue.emplace(relExpr->left());
expr_queue.emplace(relExpr->right());
exprQueue.emplace(relExpr->left());
exprQueue.emplace(relExpr->right());
break;
}
case Expression::Kind::kList: {
auto *listExpr = static_cast<const ListExpression *>(cur);
for (auto &item : listExpr->items()) {
expr_queue.emplace(item);
exprQueue.emplace(item);
}
break;
}
case Expression::Kind::kSet: {
auto *setExpr = static_cast<const SetExpression *>(cur);
for (auto &item : setExpr->items()) {
expr_queue.emplace(item);
exprQueue.emplace(item);
}
break;
}
case Expression::Kind::kMap: {
auto *mapExpr = static_cast<const MapExpression *>(cur);
for (auto &item : mapExpr->items()) {
expr_queue.emplace(item.second);
exprQueue.emplace(item.second);
}
break;
}
case Expression::Kind::kCase: {
auto *caseExpr = static_cast<const CaseExpression *>(cur);
if (caseExpr->hasCondition()) {
expr_queue.emplace(caseExpr->condition());
exprQueue.emplace(caseExpr->condition());
}
if (caseExpr->hasDefault()) {
expr_queue.emplace(caseExpr->defaultResult());
exprQueue.emplace(caseExpr->defaultResult());
}
for (auto &whenThen : caseExpr->cases()) {
expr_queue.emplace(whenThen.when);
expr_queue.emplace(whenThen.then);
exprQueue.emplace(whenThen.when);
exprQueue.emplace(whenThen.then);
}
break;
}
case Expression::Kind::kListComprehension: {
auto *lcExpr = static_cast<const ListComprehensionExpression *>(cur);
expr_queue.emplace(lcExpr->collection());
exprQueue.emplace(lcExpr->collection());
if (lcExpr->hasFilter()) {
expr_queue.emplace(lcExpr->filter());
exprQueue.emplace(lcExpr->filter());
}
if (lcExpr->hasMapping()) {
expr_queue.emplace(lcExpr->mapping());
exprQueue.emplace(lcExpr->mapping());
}
break;
}
case Expression::Kind::kPredicate: {
auto *predExpr = static_cast<const PredicateExpression *>(cur);
expr_queue.emplace(predExpr->collection());
expr_queue.emplace(predExpr->filter());
exprQueue.emplace(predExpr->collection());
if (predExpr->hasFilter()) {
exprQueue.emplace(predExpr->filter());
}
break;
}
case Expression::Kind::kReduce: {
auto *reduceExpr = static_cast<const ReduceExpression *>(cur);
expr_queue.emplace(reduceExpr->collection());
expr_queue.emplace(reduceExpr->mapping());
exprQueue.emplace(reduceExpr->collection());
exprQueue.emplace(reduceExpr->mapping());
break;
}
case Expression::Kind::kLogicalAnd:
case Expression::Kind::kLogicalOr:
case Expression::Kind::kLogicalXor: {
auto *logExpr = static_cast<const LogicalExpression *>(cur);
for (auto &op : logExpr->operands()) {
expr_queue.emplace(op);
exprQueue.emplace(op);
}
break;
}
case Expression::Kind::kTypeCasting: {
auto *typExpr = static_cast<const TypeCastingExpression *>(cur);
expr_queue.emplace(typExpr->operand());
exprQueue.emplace(typExpr->operand());
break;
}
case Expression::Kind::kFunctionCall: {
auto *funExpr = static_cast<const FunctionCallExpression *>(cur);
auto &args = funExpr->args()->args();
for (auto iter = args.begin(); iter < args.end(); ++iter) {
expr_queue.emplace(*iter);
exprQueue.emplace(*iter);
}
break;
}
Expand Down Expand Up @@ -1156,7 +1158,7 @@ bool ExpressionUtils::checkExprDepth(const Expression *expr) {
}
depth += 1;
}
return depth < ExpressionUtils::MAX_DEPTH;
return depth < ExpressionUtils::kMaxDepth;
} // namespace graph

} // namespace graph
Expand Down
2 changes: 1 addition & 1 deletion src/graph/util/ExpressionUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ class ExpressionUtils {
static bool checkExprDepth(const Expression* expr);

private:
static constexpr int32_t MAX_DEPTH = 512;
static constexpr int32_t kMaxDepth = 512;
};

} // namespace graph
Expand Down
2 changes: 1 addition & 1 deletion src/parser/parser.yy
Original file line number Diff line number Diff line change
Expand Up @@ -558,7 +558,7 @@ expression
: expression_internal {
$$ = $1;
if(!graph::ExpressionUtils::checkExprDepth($$)){
throw nebula::GraphParser::syntax_error(@1, "The above expression's depth exceeds the maximum depth!");
throw nebula::GraphParser::syntax_error(@1, "The above expression's depth exceeds the maximum depth:512!");
}
}
;
Expand Down
63 changes: 62 additions & 1 deletion src/parser/test/ParserBenchmark.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ auto simpleQuery = "USE myspace";
auto complexQuery =
"GO 2 STEPS FROM 123456789 OVER myedge "
"WHERE alias.prop1 + alias.prop2 * alias.prop3 > alias.prop4 AND "
"alias.prop5 == alias.prop6 YIELD 1 AS first, 2 AS second";
"alias.prop5 == alias.prop6 YIELD 1+1+1+1+1+1+1+1 AS first, 2 AS second";

auto qctx = std::make_unique<nebula::graph::QueryContext>();

Expand Down Expand Up @@ -142,3 +142,64 @@ ComplexQuery(32_thread) 60.09% 8.58us 116.60K
ComplexQuery(48_thread) 44.15% 11.67us 85.67K
============================================================================
*/

/* Intel(R) Xeon(R) CPU E5-2690 v2 @ 3.00GHz, 64core 128thread
Short Expression without depth-check
============================================================================
ParserBenchmark.cpp relative time/iter iters/s
============================================================================
SimpleQuery(1_thread) 14.27us 70.08K
SimpleQuery(2_thread) 99.87% 14.29us 69.99K
SimpleQuery(4_thread) 99.97% 14.27us 70.06K
SimpleQuery(8_thread) 99.04% 14.41us 69.40K
SimpleQuery(16_thread) 99.79% 14.30us 69.93K
SimpleQuery(32_thread) 93.93% 15.19us 65.82K
SimpleQuery(48_thread) 83.38% 17.12us 58.43K
----------------------------------------------------------------------------
ComplexQuery(1_thread) 58.73us 17.03K
ComplexQuery(2_thread) 91.71% 64.04us 15.62K
ComplexQuery(4_thread) 76.31% 76.96us 12.99K
ComplexQuery(8_thread) 34.66% 169.48us 5.90K
ComplexQuery(16_thread) 13.28% 442.11us 2.26K
ComplexQuery(32_thread) 4.06% 1.45ms 690.60
ComplexQuery(48_thread) 2.64% 2.22ms 450.27
============================================================================
Long Expression without depth-check
============================================================================
ParserBenchmark.cpp relative time/iter iters/s
============================================================================
SimpleQuery(1_thread) 14.26us 70.15K
SimpleQuery(2_thread) 99.78% 14.29us 70.00K
SimpleQuery(4_thread) 99.36% 14.35us 69.70K
SimpleQuery(8_thread) 99.39% 14.34us 69.73K
SimpleQuery(16_thread) 97.04% 14.69us 68.07K
SimpleQuery(32_thread) 86.41% 16.50us 60.61K
SimpleQuery(48_thread) 76.56% 18.62us 53.71K
----------------------------------------------------------------------------
ComplexQuery(1_thread) 70.21us 14.24K
ComplexQuery(2_thread) 91.32% 76.89us 13.01K
ComplexQuery(4_thread) 73.01% 96.17us 10.40K
ComplexQuery(8_thread) 28.98% 242.26us 4.13K
ComplexQuery(16_thread) 10.12% 693.63us 1.44K
Long Expression with depth-check
============================================================================
ParserBenchmark.cpp relative time/iter iters/s
============================================================================
SimpleQuery(1_thread) 14.28us 70.04K
SimpleQuery(2_thread) 100.08% 14.27us 70.10K
SimpleQuery(4_thread) 100.04% 14.27us 70.07K
SimpleQuery(8_thread) 99.66% 14.33us 69.80K
SimpleQuery(16_thread) 99.36% 14.37us 69.59K
SimpleQuery(32_thread) 91.71% 15.57us 64.23K
SimpleQuery(48_thread) 84.16% 16.96us 58.95K
----------------------------------------------------------------------------
ComplexQuery(1_thread) 73.13us 13.67K
ComplexQuery(2_thread) 86.52% 84.53us 11.83K
ComplexQuery(4_thread) 77.40% 94.48us 10.58K
ComplexQuery(8_thread) 25.52% 286.61us 3.49K
ComplexQuery(16_thread) 10.70% 683.78us 1.46K
ComplexQuery(32_thread) 3.50% 2.09ms 478.55
Killed
*/

0 comments on commit 641581f

Please sign in to comment.