diff --git a/arangod/Aql/ModificationBlocks.cpp b/arangod/Aql/ModificationBlocks.cpp index 581aea5196..7ff9e14cfe 100644 --- a/arangod/Aql/ModificationBlocks.cpp +++ b/arangod/Aql/ModificationBlocks.cpp @@ -622,11 +622,20 @@ AqlItemBlock* UpsertBlock::work(std::vector& blocks) { AqlValue const& insertDoc = res->getValueReference(i, insertRegisterId); if (insertDoc.isObject()) { - OperationResult opRes = _trx->insert(_collection->name, insertDoc.slice(), options); - errorCode = opRes.code; + VPackSlice toInsert = insertDoc.slice(); + LOG(INFO) << _isDBServer << " t " << !_usesDefaultSharding << " f " << toInsert.hasKey(TRI_VOC_ATTRIBUTE_KEY); - if (producesOutput && errorCode == TRI_ERROR_NO_ERROR) { - result->setValue(dstRow, _outRegNew, AqlValue(opRes.slice().get("new"))); + if (_isDBServer && !_usesDefaultSharding && + toInsert.hasKey(TRI_VOC_ATTRIBUTE_KEY)) { + errorCode = TRI_ERROR_CLUSTER_MUST_NOT_SPECIFY_KEY; + } else { + + OperationResult opRes = _trx->insert(_collection->name, toInsert, options); + errorCode = opRes.code; + + if (producesOutput && errorCode == TRI_ERROR_NO_ERROR) { + result->setValue(dstRow, _outRegNew, AqlValue(opRes.slice().get("new"))); + } } } else { errorCode = TRI_ERROR_ARANGO_DOCUMENT_TYPE_INVALID; diff --git a/js/server/tests/aql/aql-modify-cluster.js b/js/server/tests/aql/aql-modify-cluster.js index 5ae9bcefa4..746d672ca9 100644 --- a/js/server/tests/aql/aql-modify-cluster.js +++ b/js/server/tests/aql/aql-modify-cluster.js @@ -910,7 +910,7 @@ function ahuacatlInsertSuite () { db._drop("UnitTestsAhuacatlEdge"); var edge = db._createEdgeCollection("UnitTestsAhuacatlEdge"); - assertQueryError(errors.ERROR_ARANGO_DOCUMENT_HANDLE_BAD.code, "FOR i IN 1..50 INSERT { } INTO @@cn", { "@cn": edge.name() }); + assertQueryError(errors.ERROR_ARANGO_INVALID_EDGE_ATTRIBUTE.code, "FOR i IN 1..50 INSERT { } INTO @@cn", { "@cn": edge.name() }); assertEqual(0, edge.count()); db._drop("UnitTestsAhuacatlEdge"); @@ -924,7 +924,7 @@ function ahuacatlInsertSuite () { db._drop("UnitTestsAhuacatlEdge"); var edge = db._createEdgeCollection("UnitTestsAhuacatlEdge"); - assertQueryError(errors.ERROR_ARANGO_DOCUMENT_HANDLE_BAD.code, "FOR i IN 1..50 INSERT { _to: CONCAT('UnitTestsAhuacatlInsert1/', i) } INTO @@cn", { "@cn": edge.name() }); + assertQueryError(errors.ERROR_ARANGO_INVALID_EDGE_ATTRIBUTE.code, "FOR i IN 1..50 INSERT { _to: CONCAT('UnitTestsAhuacatlInsert1/', i) } INTO @@cn", { "@cn": edge.name() }); assertEqual(0, edge.count()); db._drop("UnitTestsAhuacatlEdge"); @@ -938,7 +938,7 @@ function ahuacatlInsertSuite () { db._drop("UnitTestsAhuacatlEdge"); var edge = db._createEdgeCollection("UnitTestsAhuacatlEdge"); - assertQueryError(errors.ERROR_ARANGO_DOCUMENT_HANDLE_BAD.code, "FOR i IN 1..50 INSERT { _from: CONCAT('UnitTestsAhuacatlInsert1/', i) } INTO @@cn", { "@cn": edge.name() }); + assertQueryError(errors.ERROR_ARANGO_INVALID_EDGE_ATTRIBUTE.code, "FOR i IN 1..50 INSERT { _from: CONCAT('UnitTestsAhuacatlInsert1/', i) } INTO @@cn", { "@cn": edge.name() }); assertEqual(0, edge.count()); db._drop("UnitTestsAhuacatlEdge");