mirror of https://gitee.com/bigwinds/arangodb
Improved stability of AQL Traverser. Also added checks for illegal edge cases
This commit is contained in:
parent
ba3fe43a4e
commit
c00d0cbc4d
|
@ -648,6 +648,26 @@ ExecutionNode* ExecutionPlan::fromNodeTraversal (ExecutionNode* previous,
|
||||||
AstNode const* start = node->getMember(1);
|
AstNode const* start = node->getMember(1);
|
||||||
AstNode const* graph = node->getMember(2);
|
AstNode const* graph = node->getMember(2);
|
||||||
|
|
||||||
|
if (start->type == NODE_TYPE_OBJECT &&
|
||||||
|
start->isConstant()) {
|
||||||
|
size_t n = start->numMembers();
|
||||||
|
for (size_t i = 0; i < n; ++i) {
|
||||||
|
auto member = start->getMember(i);
|
||||||
|
if (member->type == NODE_TYPE_OBJECT_ELEMENT &&
|
||||||
|
strncmp(member->getStringValue(), TRI_VOC_ATTRIBUTE_ID, member->getStringLength()) == 0) {
|
||||||
|
start = member->getMember(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (start->type != NODE_TYPE_REFERENCE &&
|
||||||
|
start->type != NODE_TYPE_VALUE) {
|
||||||
|
// operand is some misc expression
|
||||||
|
auto calc = createTemporaryCalculation(start, previous);
|
||||||
|
start = _ast->createNodeReference(getOutVariable(calc));
|
||||||
|
previous = calc;
|
||||||
|
}
|
||||||
// First create the node
|
// First create the node
|
||||||
auto travNode = new TraversalNode(this, nextId(), _ast->query()->vocbase(),
|
auto travNode = new TraversalNode(this, nextId(), _ast->query()->vocbase(),
|
||||||
direction, start, graph);
|
direction, start, graph);
|
||||||
|
|
|
@ -115,7 +115,7 @@ TraversalBlock::TraversalBlock (ExecutionEngine* engine,
|
||||||
_trx,
|
_trx,
|
||||||
_expressions));
|
_expressions));
|
||||||
}
|
}
|
||||||
if (!ep->usesInVariable()) {
|
if (! ep->usesInVariable()) {
|
||||||
_vertexId = ep->getStartVertex();
|
_vertexId = ep->getStartVertex();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -365,12 +365,16 @@ void TraversalBlock::initializePaths (AqlItemBlock const* items) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (in._type == AqlValue::DOCVEC) {
|
else if (in.isString()) {
|
||||||
THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_QUERY_PARSE,
|
_vertexId = in.toString();
|
||||||
std::string("Only one start vertex allowed. Embed it in a FOR loop."));
|
VertexId v = triagens::arango::traverser::IdStringToVertexId (
|
||||||
|
_resolver,
|
||||||
|
_vertexId
|
||||||
|
);
|
||||||
|
_traverser->setStartVertex(v);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
TRI_ASSERT(in.getTypeString() == "");
|
_engine->getQuery()->registerWarning(TRI_ERROR_BAD_PARAMETER, "Invalid input for traversal: Only strings or objects with _id are allowed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -269,7 +269,7 @@ namespace triagens {
|
||||||
: _readDocuments(0),
|
: _readDocuments(0),
|
||||||
_filteredPaths(0),
|
_filteredPaths(0),
|
||||||
_pruneNext(false),
|
_pruneNext(false),
|
||||||
_done(false),
|
_done(true),
|
||||||
_expressions(nullptr) {
|
_expressions(nullptr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -282,7 +282,7 @@ namespace triagens {
|
||||||
: _readDocuments(0),
|
: _readDocuments(0),
|
||||||
_filteredPaths(0),
|
_filteredPaths(0),
|
||||||
_pruneNext(false),
|
_pruneNext(false),
|
||||||
_done(false),
|
_done(true),
|
||||||
_opts(opts),
|
_opts(opts),
|
||||||
_expressions(expressions) {
|
_expressions(expressions) {
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue