From 8290bc64fb8bd769713f32ca2ab65b0d29d52a20 Mon Sep 17 00:00:00 2001 From: Max Neunhoeffer Date: Mon, 11 Aug 2014 13:47:23 +0200 Subject: [PATCH] Make iterator [*] internal variables need no register. --- arangod/Aql/Ast.cpp | 6 ++++-- arangod/Aql/ExecutionBlock.h | 3 +++ arangod/Aql/Variable.h | 13 ++++++++++++- arangod/Aql/grammar.y | 2 +- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/arangod/Aql/Ast.cpp b/arangod/Aql/Ast.cpp index 76ad2b693c..0999a264ac 100644 --- a/arangod/Aql/Ast.cpp +++ b/arangod/Aql/Ast.cpp @@ -886,8 +886,10 @@ std::unordered_set Ast::getReferencedVariables (AstNode const* node) THROW_ARANGO_EXCEPTION(TRI_ERROR_OUT_OF_MEMORY); } - auto result = static_cast*>(data); - result->insert(variable); + if (variable->needsRegister()) { + auto result = static_cast*>(data); + result->insert(variable); + } } }; diff --git a/arangod/Aql/ExecutionBlock.h b/arangod/Aql/ExecutionBlock.h index 553d9b1783..93aa20f282 100644 --- a/arangod/Aql/ExecutionBlock.h +++ b/arangod/Aql/ExecutionBlock.h @@ -1426,6 +1426,9 @@ namespace triagens { auto en = static_cast(getPlanNode()); std::unordered_set inVars = _expression->variables(); + for (auto it : inVars) { + std::cout << it->name << ":" << it->id << std::endl; + } for (auto it = inVars.begin(); it != inVars.end(); ++it) { _inVars.push_back(*it); diff --git a/arangod/Aql/Variable.h b/arangod/Aql/Variable.h index e8135045c3..b9a8830509 100644 --- a/arangod/Aql/Variable.h +++ b/arangod/Aql/Variable.h @@ -109,10 +109,21 @@ namespace triagens { inline bool isUserDefined () const { char const c = name[0]; - // variables starting with a number are user-defined + // variables starting with a number are not user-defined return (c < '0' || c > '9'); } +//////////////////////////////////////////////////////////////////////////////// +/// @brief whether or not the variable needs a register assigned +//////////////////////////////////////////////////////////////////////////////// + + inline bool needsRegister () const { + char const cf = name[0]; + char const cb = name.back(); + // variables starting with a number are not user-defined + return (cf < '0' || cf > '9') || cb != '_'; + } + //////////////////////////////////////////////////////////////////////////////// /// @brief return a JSON representation of the variable //////////////////////////////////////////////////////////////////////////////// diff --git a/arangod/Aql/grammar.y b/arangod/Aql/grammar.y index 3b4c5ee7b1..2410c1f16d 100644 --- a/arangod/Aql/grammar.y +++ b/arangod/Aql/grammar.y @@ -689,7 +689,7 @@ reference: // expanded variable access, e.g. variable[*] // create a temporary iterator variable - std::string const nextName = parser->ast()->variables()->nextName(); + std::string const nextName = parser->ast()->variables()->nextName() + "_"; char const* iteratorName = nextName.c_str(); auto iterator = parser->ast()->createNodeIterator(iteratorName, $1);