From fecaccf37f75e39acbd3c1ed392ab926fb08975a Mon Sep 17 00:00:00 2001 From: James Date: Thu, 21 Aug 2014 18:40:02 +0200 Subject: [PATCH] fixing comparison of bounds. --- arangod/Aql/ExecutionNode.h | 27 +++++++++++++++++++-------- arangod/Aql/OptimizerRules.cpp | 1 + 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/arangod/Aql/ExecutionNode.h b/arangod/Aql/ExecutionNode.h index a665c6e8bd..06851e71da 100644 --- a/arangod/Aql/ExecutionNode.h +++ b/arangod/Aql/ExecutionNode.h @@ -932,8 +932,10 @@ namespace triagens { // tighter than right, 0 that they are equal, 1 that right is tighter than // left. For example, (x<1) is tighter than (x<=1) and (x>1) is tighter // than (x>=1) . . . + // lowhigh should be -1 if the comparison is of lower bounds, + // and 1 if it is of upper bounds . . . static int CompareRangeInfoBound (RangeInfoBound const* left, - RangeInfoBound const* right) { + RangeInfoBound const* right, int lowhigh) { if (left == nullptr) { return (right == nullptr ? 0 : 1); } @@ -943,9 +945,9 @@ namespace triagens { int cmp = TRI_CompareValuesJson(left->_bound.json(), right->_bound.json()); if (cmp == 0 && (left->_include != right->_include)) { - cmp = (left->_include?1:-1); + return (left->_include?1:-1); } - return cmp; + return cmp * lowhigh; }; //////////////////////////////////////////////////////////////////////////////// @@ -1008,24 +1010,33 @@ namespace triagens { return; } - if(CompareRangeInfoBound(newRange->_low, oldRange->_low) == -1){ + //this case is not covered by those below . . . + if (oldRange->is1ValueRangeInfo() && newRange->is1ValueRangeInfo()) { + if (!TRI_CheckSameValueJson(oldRange->_low->_bound.json(), + newRange->_low->_bound.json())) { + oldRange->_valid = false; + return; + } + } + + if (CompareRangeInfoBound(newRange->_low, oldRange->_low, -1) == -1) { oldRange->_low = newRange->_low; } - if(CompareRangeInfoBound(newRange->_high, oldRange->_high) == -1){ + if (CompareRangeInfoBound(newRange->_high, oldRange->_high, 1) == -1) { oldRange->_high = newRange->_high; } + // check the new range bounds are valid - if( oldRange->_low != nullptr && oldRange->_high != nullptr){ + if (oldRange->_low != nullptr && oldRange->_high != nullptr) { int cmp = TRI_CompareValuesJson(oldRange->_low->_bound.json(), oldRange->_high->_bound.json()); if (cmp == 1 || (cmp == 0 && - !(oldRange->_low->_include == true && oldRange->_high->_include == true ))){ + !(oldRange->_low->_include == true && oldRange->_high->_include == true ))) { // range invalid oldRange->_valid = false; } } - } size_t size () const { diff --git a/arangod/Aql/OptimizerRules.cpp b/arangod/Aql/OptimizerRules.cpp index 19b4b773a5..c249ab43c9 100644 --- a/arangod/Aql/OptimizerRules.cpp +++ b/arangod/Aql/OptimizerRules.cpp @@ -206,6 +206,7 @@ class FilterToEnumCollFinder : public WalkerWorker { auto noRes = new NoResultsNode(newPlan->nextId()); newPlan->registerNode(noRes); newPlan->insertDependency(x, noRes); + _out.push_back(newPlan); } } }