diff --git a/arangod/Aql/Types.h b/arangod/Aql/Types.h index 5dc9854cf6..6eabea2af5 100644 --- a/arangod/Aql/Types.h +++ b/arangod/Aql/Types.h @@ -249,8 +249,9 @@ namespace triagens { TRI_EXTRACT_SHAPED_JSON_MARKER(l, _marker); TRI_EXTRACT_SHAPED_JSON_MARKER(r, right._marker); - return TRI_CompareShapeTypes(nullptr, nullptr, &l, nullptr, nullptr, &r, - collection->getShaper()); + return TRI_CompareShapeTypes( + nullptr, nullptr, &l, collection->getShaper(), + nullptr, nullptr, &r, collection->getShaper()); } case DOCVEC: { return 0; diff --git a/arangod/SkipLists/skiplistIndex.cpp b/arangod/SkipLists/skiplistIndex.cpp index 18b4b184ef..c8049b1615 100644 --- a/arangod/SkipLists/skiplistIndex.cpp +++ b/arangod/SkipLists/skiplistIndex.cpp @@ -75,6 +75,7 @@ static int CompareKeyElement (TRI_shaped_json_t const* left, result = TRI_CompareShapeTypes(nullptr, nullptr, left, + shaper, right->_document->getShapedJsonPtr(), &right->_subObjects[rightPosition], nullptr, @@ -112,6 +113,7 @@ static int CompareElementElement (TRI_skiplist_index_element_t* left, int result = TRI_CompareShapeTypes(left->_document->getShapedJsonPtr(), &left->_subObjects[leftPosition], nullptr, + shaper, right->_document->getShapedJsonPtr(), &right->_subObjects[rightPosition], nullptr, diff --git a/arangod/VocBase/voc-shaper.cpp b/arangod/VocBase/voc-shaper.cpp index 4e107810c6..a1c0b8fed7 100644 --- a/arangod/VocBase/voc-shaper.cpp +++ b/arangod/VocBase/voc-shaper.cpp @@ -1131,10 +1131,11 @@ static void DestroyAttributesVector (TRI_vector_t* vector) { int TRI_CompareShapeTypes (char const* leftDocument, TRI_shaped_sub_t* leftObject, TRI_shaped_json_t const* leftShaped, + TRI_shaper_t* leftShaper, char const* rightDocument, TRI_shaped_sub_t* rightObject, TRI_shaped_json_t const* rightShaped, - TRI_shaper_t* shaper) { + TRI_shaper_t* rightShaper) { TRI_shape_t const* leftShape; TRI_shape_t const* rightShape; @@ -1167,14 +1168,14 @@ int TRI_CompareShapeTypes (char const* leftDocument, } // get shape and type - if (left._sid == right._sid) { + if (leftShaper == rightShaper && left._sid == right._sid) { // identical collection and shape - leftShape = rightShape = shaper->lookupShapeId(shaper, left._sid); + leftShape = rightShape = leftShaper->lookupShapeId(leftShaper, left._sid); } else { // different shapes - leftShape = shaper->lookupShapeId(shaper, left._sid); - rightShape = shaper->lookupShapeId(shaper, right._sid); + leftShape = leftShaper->lookupShapeId(leftShaper, left._sid); + rightShape = rightShaper->lookupShapeId(rightShaper, right._sid); } if (leftShape == nullptr || rightShape == nullptr) { @@ -1424,10 +1425,11 @@ int TRI_CompareShapeTypes (char const* leftDocument, result = TRI_CompareShapeTypes(nullptr, nullptr, &leftElement, + leftShaper, nullptr, nullptr, &rightElement, - shaper); + rightShaper); if (result != 0) { return result; @@ -1483,11 +1485,11 @@ int TRI_CompareShapeTypes (char const* leftDocument, TRI_vector_t rightSorted; bool error = false; - if (FillAttributesVector(&leftSorted, &left, leftShape, shaper) != TRI_ERROR_NO_ERROR) { + if (FillAttributesVector(&leftSorted, &left, leftShape, leftShaper) != TRI_ERROR_NO_ERROR) { error = true; } - if (FillAttributesVector(&rightSorted, &right, rightShape, shaper) != TRI_ERROR_NO_ERROR) { + if (FillAttributesVector(&rightSorted, &right, rightShape, rightShaper) != TRI_ERROR_NO_ERROR) { error = true; } @@ -1510,10 +1512,11 @@ int TRI_CompareShapeTypes (char const* leftDocument, result = TRI_CompareShapeTypes(nullptr, nullptr, &l->_value, + leftShaper, nullptr, nullptr, &r->_value, - shaper); + rightShaper); if (result != 0) { break; diff --git a/arangod/VocBase/voc-shaper.h b/arangod/VocBase/voc-shaper.h index f85afb7f8b..30914299af 100644 --- a/arangod/VocBase/voc-shaper.h +++ b/arangod/VocBase/voc-shaper.h @@ -128,10 +128,11 @@ bool TRI_ExtractShapedJsonVocShaper (TRI_shaper_t* s, int TRI_CompareShapeTypes (char const* leftDocument, TRI_shaped_sub_t* leftObject, TRI_shaped_json_t const* leftShaped, + TRI_shaper_t* leftShaper, char const* rightDocument, TRI_shaped_sub_t* rightObject, TRI_shaped_json_t const* rightShaped, - TRI_shaper_t* shaper); + TRI_shaper_t* rightShaper); //////////////////////////////////////////////////////////////////////////////// /// @brief extracts the shape identifier pointer from a marker