diff --git a/arangod/FulltextIndex/fulltext-handles.cpp b/arangod/FulltextIndex/fulltext-handles.cpp index 826a7ac563..82eda03e49 100644 --- a/arangod/FulltextIndex/fulltext-handles.cpp +++ b/arangod/FulltextIndex/fulltext-handles.cpp @@ -331,6 +331,7 @@ TRI_fulltext_handle_t TRI_InsertHandleFulltextIndex( // fill in document slot->_documents[slotPosition] = document; + slot->_deleted[slotPosition] = 0; slot->_numUsed++; // no need to fill in deleted flag as it is initialized to false diff --git a/arangod/FulltextIndex/fulltext-index.cpp b/arangod/FulltextIndex/fulltext-index.cpp index 7bb734078c..de2bb254b1 100644 --- a/arangod/FulltextIndex/fulltext-index.cpp +++ b/arangod/FulltextIndex/fulltext-index.cpp @@ -1114,6 +1114,7 @@ static TRI_fulltext_result_t* MakeListResult(index__t* const idx, TRI_fulltext_result_t* result; TRI_fulltext_list_entry_t* listEntries; uint32_t numResults; + uint32_t originalNumResults; uint32_t i, pos; if (list == nullptr) { @@ -1123,6 +1124,7 @@ static TRI_fulltext_result_t* MakeListResult(index__t* const idx, // we have a list of handles // now turn the handles into documents and exclude deleted ones on the fly numResults = TRI_NumEntriesListFulltextIndex(list); + originalNumResults = numResults; if (static_cast(numResults) > maxResults && maxResults > 0) { // cap the number of results numResults = static_cast(maxResults); @@ -1136,7 +1138,7 @@ static TRI_fulltext_result_t* MakeListResult(index__t* const idx, pos = 0; listEntries = TRI_StartListFulltextIndex(list); - for (i = 0; i < numResults; ++i) { + for (i = 0; i < originalNumResults; ++i) { TRI_fulltext_handle_t handle; TRI_fulltext_doc_t doc; @@ -1149,6 +1151,9 @@ static TRI_fulltext_result_t* MakeListResult(index__t* const idx, } result->_documents[pos++] = doc; + if (pos >= numResults) { + break; + } } result->_numDocuments = pos; @@ -1591,8 +1596,6 @@ TRI_fulltext_result_t* TRI_QueryFulltextIndex(TRI_fts_index_t* const ftx, } } - TRI_ReadUnlockReadWriteLock(&idx->_lock); - TRI_FreeQueryFulltextIndex(query); if (result == nullptr) { @@ -1602,7 +1605,10 @@ TRI_fulltext_result_t* TRI_QueryFulltextIndex(TRI_fts_index_t* const ftx, // now convert the handle list into a result (this will also filter out // deleted documents) - return MakeListResult(idx, result, maxResults); + TRI_fulltext_result_t* r = MakeListResult(idx, result, maxResults); + TRI_ReadUnlockReadWriteLock(&idx->_lock); + + return r; } ////////////////////////////////////////////////////////////////////////////////