From ddecc740e66b2bf321c8053cae32aade74ea2d12 Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Thu, 28 Jul 2016 17:10:04 +0200 Subject: [PATCH] fixed issue in `INTERSECTION` AQL function with duplicate elements in the source arrays --- CHANGELOG | 3 +++ arangod/Aql/Functions.cpp | 7 +++-- js/server/tests/aql/aql-functions.js | 40 ++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index a68de4264a..c0e8024510 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -36,6 +36,9 @@ devel v3.0.4 (XXXX-XX-XX) ------------------- +* fixed issue in `INTERSECTION` AQL function with duplicate elements + in the source arrays + * fixed issue #1970 * fixed issue #1967 diff --git a/arangod/Aql/Functions.cpp b/arangod/Aql/Functions.cpp index ce158fd7b1..71427e8bcb 100644 --- a/arangod/Aql/Functions.cpp +++ b/arangod/Aql/Functions.cpp @@ -2079,8 +2079,11 @@ AqlValue Functions::Intersection(arangodb::aql::Query* query, auto found = values.find(it); if (found != values.end()) { // already seen - TRI_ASSERT((*found).second > 0); - ++(found->second); + if ((*found).second < i) { + (*found).second = 0; + } else { + (*found).second = i + 1; + } } } } diff --git a/js/server/tests/aql/aql-functions.js b/js/server/tests/aql/aql-functions.js index 9c24c5071e..a3b055f7e6 100644 --- a/js/server/tests/aql/aql-functions.js +++ b/js/server/tests/aql/aql-functions.js @@ -2439,6 +2439,26 @@ function ahuacatlFunctionsTestSuite () { assertEqual(expected, actual[0].sort()); }, +//////////////////////////////////////////////////////////////////////////////// +/// @brief test intersect function +//////////////////////////////////////////////////////////////////////////////// + + testIntersection11 : function () { + var expected = [ 1, 3 ]; + var actual = getQueryResults("RETURN INTERSECTION([ 1, 1, 2, 2, 3, 3, 3 ], [ 1, 1, 3 ])"); + assertEqual(expected, actual[0].sort()); + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief test intersect function +//////////////////////////////////////////////////////////////////////////////// + + testIntersection12 : function () { + var expected = [ 3 ]; + var actual = getQueryResults("RETURN INTERSECTION([ 1, 1, 3 ], [ 2, 2, 3 ])"); + assertEqual(expected, actual[0].sort()); + }, + //////////////////////////////////////////////////////////////////////////////// /// @brief test intersection function //////////////////////////////////////////////////////////////////////////////// @@ -2539,6 +2559,26 @@ function ahuacatlFunctionsTestSuite () { assertEqual(expected, actual[0].sort()); }, +//////////////////////////////////////////////////////////////////////////////// +/// @brief test intersect function +//////////////////////////////////////////////////////////////////////////////// + + testIntersectionCxx11 : function () { + var expected = [ 1, 3 ]; + var actual = getQueryResults("RETURN NOOPT(INTERSECTION([ 1, 1, 2, 2, 3, 3, 3 ], [ 1, 1, 3 ]))"); + assertEqual(expected, actual[0].sort()); + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief test intersect function +//////////////////////////////////////////////////////////////////////////////// + + testIntersectionCxx12 : function () { + var expected = [ 3 ]; + var actual = getQueryResults("RETURN NOOPT(INTERSECTION([ 1, 1, 3 ], [ 2, 2, 3 ]))"); + assertEqual(expected, actual[0].sort()); + }, + testIntersectionAllDocuments : function () { // Insert 10 elements for (var i = 0; i < 10; ++i) {