diff --git a/CHANGELOG b/CHANGELOG index 7d50666f0f..0eb666db3a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -50,7 +50,20 @@ devel * bug in RAFT implementation of reads. dethroned leader still answered requests in isolation -v3.0.6 (XXXX-XX-XX) + +v3.0.8 (XXXX-XX-XX) +------------------- + +* fixed issue #2039 + + +v3.0.7 (2016-09-05) +------------------- + +* new supervision job handles db server failure during collection creation. + + +v3.0.6 (2016-09-02) ------------------- * fixed issue #2026 diff --git a/arangod/Aql/AstNode.cpp b/arangod/Aql/AstNode.cpp index fb9255baf9..0d684f8f06 100644 --- a/arangod/Aql/AstNode.cpp +++ b/arangod/Aql/AstNode.cpp @@ -2449,6 +2449,15 @@ void AstNode::stringify(arangodb::basics::StringBuffer* buffer, bool verbose, return; } + if (type == NODE_TYPE_OPERATOR_TERNARY) { + getMember(0)->stringify(buffer, verbose, failIfLong); + buffer->appendChar('?'); + getMember(1)->stringify(buffer, verbose, failIfLong); + buffer->appendChar(':'); + getMember(2)->stringify(buffer, verbose, failIfLong); + return; + } + if (type == NODE_TYPE_RANGE) { // not used by V8 TRI_ASSERT(numMembers() == 2); diff --git a/arangod/Aql/OptimizerRules.cpp b/arangod/Aql/OptimizerRules.cpp index 3a0dc08335..5418e9b162 100644 --- a/arangod/Aql/OptimizerRules.cpp +++ b/arangod/Aql/OptimizerRules.cpp @@ -1461,10 +1461,11 @@ void arangodb::aql::removeRedundantCalculationsRule( continue; } - std::string const compareExpression(buffer.c_str(), buffer.length()); + bool const isEqual = (buffer.length() == referenceExpression.size() && + memcmp(buffer.c_str(), referenceExpression.c_str(), buffer.length()) == 0); buffer.reset(); - if (compareExpression == referenceExpression) { + if (isEqual) { // expressions are identical auto outvars = current->getVariablesSetHere(); TRI_ASSERT(outvars.size() == 1); diff --git a/arangod/Aql/SortNode.cpp b/arangod/Aql/SortNode.cpp index cf207682a5..9c563218cf 100644 --- a/arangod/Aql/SortNode.cpp +++ b/arangod/Aql/SortNode.cpp @@ -162,7 +162,12 @@ SortInformation SortNode::getSortInformation( break; } - expression->stringify(buffer); + try { + expression->stringify(buffer); + } catch (...) { + result.isValid = false; + return result; + } result.criteria.emplace_back( std::make_tuple(const_cast(setter), std::string(buffer->c_str(), buffer->length()), (*it).second)); buffer->reset(); diff --git a/js/server/tests/aql/aql-ternary.js b/js/server/tests/aql/aql-ternary.js index afa734f57f..a32c922c3e 100644 --- a/js/server/tests/aql/aql-ternary.js +++ b/js/server/tests/aql/aql-ternary.js @@ -31,10 +31,7 @@ var jsunity = require("jsunity"); var helper = require("@arangodb/aql-helper"); var getQueryResults = helper.getQueryResults; - -//////////////////////////////////////////////////////////////////////////////// -/// @brief test suite -//////////////////////////////////////////////////////////////////////////////// +var db = require("@arangodb").db; function ahuacatlTernaryTestSuite () { @@ -63,6 +60,9 @@ function ahuacatlTernaryTestSuite () { var actual = getQueryResults("RETURN 1 > 0 ? 2 : -1"); assertEqual(expected, actual); + + actual = getQueryResults("RETURN NOOPT(1 > 0 ? 2 : -1)"); + assertEqual(expected, actual); }, //////////////////////////////////////////////////////////////////////////////// @@ -74,6 +74,9 @@ function ahuacatlTernaryTestSuite () { var actual = getQueryResults("RETURN 15 > 15 ? 1 : -1"); assertEqual(expected, actual); + + actual = getQueryResults("RETURN NOOPT(15 > 15 ? 1 : -1)"); + assertEqual(expected, actual); }, //////////////////////////////////////////////////////////////////////////////// @@ -85,6 +88,9 @@ function ahuacatlTernaryTestSuite () { var actual = getQueryResults("RETURN 10 + 5 > 15 ? 1 : -1"); assertEqual(expected, actual); + + actual = getQueryResults("RETURN NOOPT(10 + 5 > 15 ? 1 : -1)"); + assertEqual(expected, actual); }, //////////////////////////////////////////////////////////////////////////////// @@ -96,6 +102,9 @@ function ahuacatlTernaryTestSuite () { var actual = getQueryResults("RETURN true ? true ? true ? 1 : -1 : -2 : 3"); assertEqual(expected, actual); + + actual = getQueryResults("RETURN NOOPT(true ? true ? true ? 1 : -1 : -2 : 3)"); + assertEqual(expected, actual); }, //////////////////////////////////////////////////////////////////////////////// @@ -107,6 +116,9 @@ function ahuacatlTernaryTestSuite () { var actual = getQueryResults("RETURN false ? true ? true ? 1 : -1 : -2 : 3"); assertEqual(expected, actual); + + actual = getQueryResults("RETURN NOOPT(false ? true ? true ? 1 : -1 : -2 : 3)"); + assertEqual(expected, actual); }, //////////////////////////////////////////////////////////////////////////////// @@ -118,6 +130,9 @@ function ahuacatlTernaryTestSuite () { var actual = getQueryResults("RETURN true ? false ? true ? 1 : -1 : -2 : 3"); assertEqual(expected, actual); + + actual = getQueryResults("RETURN NOOPT(true ? false ? true ? 1 : -1 : -2 : 3)"); + assertEqual(expected, actual); }, //////////////////////////////////////////////////////////////////////////////// @@ -129,6 +144,9 @@ function ahuacatlTernaryTestSuite () { var actual = getQueryResults("RETURN true ? true ? false ? 1 : -1 : -2 : 3"); assertEqual(expected, actual); + + actual = getQueryResults("RETURN NOOPT(true ? true ? false ? 1 : -1 : -2 : 3)"); + assertEqual(expected, actual); }, //////////////////////////////////////////////////////////////////////////////// @@ -140,6 +158,9 @@ function ahuacatlTernaryTestSuite () { var actual = getQueryResults("LET a = 1, b = 2, c = 3 RETURN true ? a : b"); assertEqual(expected, actual); + + actual = getQueryResults("LET a = 1, b = 2, c = 3 RETURN NOOPT(true ? a : b)"); + assertEqual(expected, actual); }, //////////////////////////////////////////////////////////////////////////////// @@ -151,6 +172,9 @@ function ahuacatlTernaryTestSuite () { var actual = getQueryResults("LET a = 1, b = 2, c = 3 RETURN false ? a : b"); assertEqual(expected, actual); + + actual = getQueryResults("LET a = 1, b = 2, c = 3 RETURN NOOPT(false ? a : b)"); + assertEqual(expected, actual); }, //////////////////////////////////////////////////////////////////////////////// @@ -162,6 +186,9 @@ function ahuacatlTernaryTestSuite () { var actual = getQueryResults("LET a = 1, b = 2, c = 3 RETURN true ? false ? a : b : c"); assertEqual(expected, actual); + + actual = getQueryResults("LET a = 1, b = 2, c = 3 RETURN NOOPT(true ? false ? a : b : c)"); + assertEqual(expected, actual); }, //////////////////////////////////////////////////////////////////////////////// @@ -181,16 +208,62 @@ function ahuacatlTernaryTestSuite () { assertEqual([ 2 ], getQueryResults("RETURN [ ] ? 2 : 3")); assertEqual([ 2 ], getQueryResults("RETURN [ 0 ] ? 2 : 3")); assertEqual([ 2 ], getQueryResults("RETURN { } ? 2 : 3")); + + assertEqual([ 2 ], getQueryResults("RETURN NOOPT(1 ? 2 : 3)")); + assertEqual([ 3 ], getQueryResults("RETURN NOOPT(0 ? 2 : 3)")); + assertEqual([ 3 ], getQueryResults("RETURN NOOPT(null ? 2 : 3)")); + assertEqual([ 3 ], getQueryResults("RETURN NOOPT(false ? 2 : 3)")); + assertEqual([ 2 ], getQueryResults("RETURN NOOPT(true ? 2 : 3)")); + assertEqual([ 2 ], getQueryResults("RETURN NOOPT((4) ? 2 : 3)")); + assertEqual([ 2 ], getQueryResults("RETURN NOOPT((4 - 3) ? 2 : 3)")); + assertEqual([ 2 ], getQueryResults("RETURN NOOPT(\"true\" ? 2 : 3)")); + assertEqual([ 3 ], getQueryResults("RETURN NOOPT(\"\" ? 2 : 3)")); + assertEqual([ 2 ], getQueryResults("RETURN NOOPT([ ] ? 2 : 3)")); + assertEqual([ 2 ], getQueryResults("RETURN NOOPT([ 0 ] ? 2 : 3)")); + assertEqual([ 2 ], getQueryResults("RETURN NOOPT({ } ? 2 : 3)")); } }; } +//////////////////////////////////////////////////////////////////////////////// +/// @brief test suite +//////////////////////////////////////////////////////////////////////////////// + +function ahuacatlTernaryCollectionTestSuite () { + var c = null; + var cn = "UnittestsAhuacatlTernary"; + + return { + + setUp : function () { + db._drop(cn); + c = db._create(cn); + for (var i = 0; i < 100; ++i) { + c.insert({value:i}); + } + }, + + tearDown : function () { + db._drop(cn); + }, + + testTernarySimple : function () { + // this mainly tests if stringification of the ternary works... + var query = "FOR i IN 1..10 LET v = i == 333 ? 2 : 3 FOR j IN " + cn + " FILTER j._id == v RETURN 1"; + + var actual = getQueryResults(query); + assertEqual([], actual); + } + }; +} + //////////////////////////////////////////////////////////////////////////////// /// @brief executes the test suite //////////////////////////////////////////////////////////////////////////////// jsunity.run(ahuacatlTernaryTestSuite); +jsunity.run(ahuacatlTernaryCollectionTestSuite); return jsunity.done();