From e266efdf966252afce690eb490b162ce314e55e2 Mon Sep 17 00:00:00 2001 From: Jan Date: Wed, 25 Jul 2018 17:33:45 +0200 Subject: [PATCH] fixed issue #5977: Unexpected execution plan when subquery contains COLLECT (#5983) --- CHANGELOG | 2 ++ arangod/Aql/CollectBlock.cpp | 3 +++ js/server/tests/aql/aql-distinct.js | 11 +++++++++++ 3 files changed, 16 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 44ee4a5818..b9191f714a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,8 @@ v3.3.13 (XXXX-XX-XX) -------------------- +* fixed issue #5977: Unexpected execution plan when subquery contains COLLECT + * Bugfix: The AQL syntax variants `UPDATE/REPLACE k WITH d` now correctly take _rev from k instead of d (when ignoreRevs is false) and ignore d._rev. diff --git a/arangod/Aql/CollectBlock.cpp b/arangod/Aql/CollectBlock.cpp index 7a1e794d0d..22e744dfa0 100644 --- a/arangod/Aql/CollectBlock.cpp +++ b/arangod/Aql/CollectBlock.cpp @@ -973,6 +973,9 @@ int DistinctCollectBlock::getOrSkipSome(size_t atLeast, size_t atMost, if (!skipping) { size_t i = 0; for (auto& it : _groupRegisters) { + if (skipped > 0) { + res->copyValuesFromFirstRow(skipped, static_cast(cur->getNrRegs())); + } res->setValue(skipped, it.first, groupValues[i].clone()); ++i; } diff --git a/js/server/tests/aql/aql-distinct.js b/js/server/tests/aql/aql-distinct.js index ac84e7a4de..d23f75f9c9 100644 --- a/js/server/tests/aql/aql-distinct.js +++ b/js/server/tests/aql/aql-distinct.js @@ -207,6 +207,17 @@ function ahuacatlDistinct () { assertEqual(100, integers.length); assertEqual(100, strings.length); }, + + testDistinctInOptimizedAwaySubquery : function () { + let query = "LET values = (FOR i IN " + c.name() + " RETURN DISTINCT i.value1) FOR doc IN values RETURN 42"; + containsDistinct(query); + let result = AQL_EXECUTE(query).json; + + assertEqual(100, result.length); + + let plan = AQL_EXPLAIN(query).plan; + assertNotEqual(-1, plan.rules.indexOf("inline-subqueries")); + }, //////////////////////////////////////////////////////////////////////////////// /// @brief distinct usage