From afaabc796413094e9659247a1224332860c7d3da Mon Sep 17 00:00:00 2001 From: Max Neunhoeffer Date: Tue, 12 Aug 2014 16:49:00 +0200 Subject: [PATCH 1/3] Fix bug in skipSome of EnumerateCollectionBlock. --- arangod/Aql/ExecutionBlock.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arangod/Aql/ExecutionBlock.h b/arangod/Aql/ExecutionBlock.h index 3d833eb25b..aa1b3a0226 100644 --- a/arangod/Aql/ExecutionBlock.h +++ b/arangod/Aql/ExecutionBlock.h @@ -1085,7 +1085,7 @@ namespace triagens { // if we get here, then _buffer.front() exists AqlItemBlock* cur = _buffer.front(); - if (atMost > _documents.size() - _posInAllDocs) { + if (atMost >= skipped + _documents.size() - _posInAllDocs) { skipped += _documents.size() - _posInAllDocs; _posInAllDocs = 0; @@ -1101,8 +1101,8 @@ namespace triagens { } } else { + _posInAllDocs += atMost - skipped; skipped = atMost; - _posInAllDocs += atMost; } } return skipped; From 14e136f6d4c7d55e22fa30bf85e0a26e537b368e Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Tue, 12 Aug 2014 16:53:58 +0200 Subject: [PATCH 2/3] fixed enumeration over empty docvec --- arangod/Aql/ExecutionBlock.h | 23 +++++++++++++++++------ arangod/Aql/Types.h | 9 +++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/arangod/Aql/ExecutionBlock.h b/arangod/Aql/ExecutionBlock.h index 3d833eb25b..b91ee51921 100644 --- a/arangod/Aql/ExecutionBlock.h +++ b/arangod/Aql/ExecutionBlock.h @@ -1183,8 +1183,8 @@ namespace triagens { // get the inVariable register id . . . // staticAnalysis has been run, so _varOverview is set up - auto it = _varOverview->varInfo.find(en->_inVariable->id); + if (it == _varOverview->varInfo.end()){ THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_INTERNAL, "variable not found"); } @@ -1224,7 +1224,7 @@ namespace triagens { } AqlItemBlock* res; - + do { // repeatedly try to get more stuff from upstream // note that the value of the variable we have to loop over @@ -1257,25 +1257,36 @@ namespace triagens { sizeInVar = inVarReg._json->size(); break; } + case AqlValue::RANGE: { - sizeInVar = inVarReg._range->_high - inVarReg._range->_low + 1; + sizeInVar = inVarReg._range->size(); break; } + case AqlValue::DOCVEC: { if( _index == 0) { // this is a (maybe) new DOCVEC _DOCVECsize = 0; //we require the total number of items + for (size_t i = 0; i < inVarReg._vector->size(); i++) { _DOCVECsize += inVarReg._vector->at(i)->size(); } - collection = inVarReg._vector->at(0)->getDocumentCollection(0); } sizeInVar = _DOCVECsize; + if (sizeInVar > 0) { + collection = inVarReg._vector->at(0)->getDocumentCollection(0); + } break; } - default: { + + case AqlValue::SHAPED: { THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_INTERNAL, - "EnumerateListBlock: unexpected type in register"); + "EnumerateListBlock: cannot iterate over shaped value"); + } + + case AqlValue::EMPTY: { + THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_INTERNAL, + "EnumerateListBlock: cannot iterate over empty value"); } } diff --git a/arangod/Aql/Types.h b/arangod/Aql/Types.h index 3ec4ee9191..099eb96f3e 100644 --- a/arangod/Aql/Types.h +++ b/arangod/Aql/Types.h @@ -49,6 +49,15 @@ namespace triagens { : _low(low), _high(high) { } + + size_t size () const { + if (_low <= _high) { + // e.g. 1..1, 1..10 etc. + return _high - _low + 1; + } + // e.g. 10..1 + return _low - _high + 1; + } int64_t const _low; int64_t const _high; From d06dd817b02a86fbc6a37afda75af22d0de9b866 Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Tue, 12 Aug 2014 17:03:06 +0200 Subject: [PATCH 3/3] removed some default cases --- arangod/Aql/ExecutionBlock.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/arangod/Aql/ExecutionBlock.h b/arangod/Aql/ExecutionBlock.h index a1aa0dd16b..605729f34d 100644 --- a/arangod/Aql/ExecutionBlock.h +++ b/arangod/Aql/ExecutionBlock.h @@ -1439,10 +1439,15 @@ namespace triagens { } return out; } - default: { - THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_INTERNAL, "unexpected value in variable to iterate over"); + + case AqlValue::SHAPED: + case AqlValue::EMPTY: { + // error + break; } } + + THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_INTERNAL, "unexpected value in variable to iterate over"); } ////////////////////////////////////////////////////////////////////////////////