1
0
Fork 0

bug-fix-3.3/double-modification-bug (#5981)

This commit is contained in:
Jan Christoph Uhde 2018-07-25 18:26:02 +02:00 committed by Jan
parent e266efdf96
commit 7c63c0e2fc
3 changed files with 317 additions and 295 deletions

File diff suppressed because it is too large Load Diff

View File

@ -129,7 +129,7 @@ void distributeInClusterRule(Optimizer*, std::unique_ptr<ExecutionPlan>,
OptimizerRule const*);
#ifdef USE_ENTERPRISE
void distributeInClusterRuleSmartEdgeCollection(
ExecutionNode* distributeInClusterRuleSmartEdgeCollection(
ExecutionPlan*,
SubqueryNode* snode,
ExecutionNode* node,
@ -209,7 +209,7 @@ void patchUpdateStatementsRule(Optimizer*, std::unique_ptr<ExecutionPlan>,
/// merges filter nodes into graph traversal nodes
void optimizeTraversalsRule(Optimizer* opt, std::unique_ptr<ExecutionPlan> plan,
OptimizerRule const* rule);
/// @brief removes filter nodes already covered by the traversal and removes unused variables
void removeFiltersCoveredByTraversal(Optimizer* opt, std::unique_ptr<ExecutionPlan> plan,
OptimizerRule const* rule);
@ -225,10 +225,10 @@ void prepareTraversalsRule(Optimizer* opt, std::unique_ptr<ExecutionPlan> plan,
/// @brief moves simple subqueries one level higher
void inlineSubqueriesRule(Optimizer*, std::unique_ptr<ExecutionPlan>, OptimizerRule const*);
/// @brief replace FILTER and SORT containing DISTANCE function
void geoIndexRule(aql::Optimizer* opt, std::unique_ptr<aql::ExecutionPlan> plan, aql::OptimizerRule const* rule);
/// @brief replace FULLTEXT function
void fulltextIndexRule(aql::Optimizer* opt, std::unique_ptr<aql::ExecutionPlan> plan, aql::OptimizerRule const* rule);

View File

@ -160,7 +160,7 @@ function ahuacatlRemoveSuite () {
var expected = { writesExecuted: 0, writesIgnored: 0 };
let query = "FOR d IN " + cn1 + " FILTER d.value1 < 0 REMOVE d IN " + cn1;
var actual = getModifyQueryResults(query);
assertEqual(100, c1.count());
assertEqual(expected, sanitizeStats(actual));
@ -222,7 +222,7 @@ function ahuacatlRemoveSuite () {
assertEqual(0, c1.count());
assertEqual(expected, sanitizeStats(actual.stats));
actual.json = actual.json.sort(function(l, r) {
return l.value1 - r.value1;
});
@ -445,7 +445,7 @@ function ahuacatlRemoveSuite () {
testRemoveEdge : function () {
db._drop("UnitTestsAhuacatlEdge");
var edge = db._createEdgeCollection("UnitTestsAhuacatlEdge");
var edge = db._createEdgeCollection("UnitTestsAhuacatlEdge");
for (var i = 0; i < 100; ++i) {
edge.save("UnitTestsAhuacatlRemove1/foo" + i, "UnitTestsAhuacatlRemove2/bar", { what: i, _key: "test" + i });
@ -511,6 +511,27 @@ function ahuacatlInsertSuite () {
c3 = null;
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test insert
////////////////////////////////////////////////////////////////////////////////
testInsertDouble : function () {
c1.truncate();
c2.truncate();
var expected = { writesExecuted: 0, writesIgnored: 0 };
const query = `LET dog = {name:'ulf'}
LET pussy = {name : 'uschi'}
INSERT dog IN @@hunde
INSERT pussy IN @@kartzen
RETURN $NEW`;
const bind = { "@hunde" : cn1, "@kartzen" : cn2 };
const options = {optimizer : { rules : ["+restrict-to-single-shard","-optimize-cluster-single-document-operations", "-remove-unnecessary-remote-scatter"] } };
db._query(query, bind, options);
assertEqual(1, c1.count());
assertEqual(1, c2.count());
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test insert
////////////////////////////////////////////////////////////////////////////////
@ -518,7 +539,7 @@ function ahuacatlInsertSuite () {
testInsertNothing : function () {
var expected = { writesExecuted: 0, writesIgnored: 0 };
var actual = getModifyQueryResults("FOR d IN " + cn1 + " FILTER d.value1 < 0 INSERT { foxx: true } IN " + cn1);
assertEqual(100, c1.count());
assertEqual(expected, sanitizeStats(actual));
},
@ -767,7 +788,7 @@ function ahuacatlInsertSuite () {
assertEqual(100, c3.count());
assertEqual(expected, sanitizeStats(actual));
var docs = db._query("FOR doc IN @@cn FILTER doc.bar >= 0 SORT doc.bar RETURN doc", { "@cn" : cn3 }).toArray();
for (var i = 0; i < 100; ++i) {
@ -776,7 +797,7 @@ function ahuacatlInsertSuite () {
assertEqual(i, doc.bar);
assertEqual(i, doc.a);
assertEqual(i, doc.b);
var doc2 = c3.document(doc._key);
assertEqual(doc._key, doc2._key);
assertEqual(doc._rev, doc2._rev);
@ -796,7 +817,7 @@ function ahuacatlInsertSuite () {
assertEqual(100, c3.count());
assertEqual(expected, sanitizeStats(actual));
var docs = db._query("FOR doc IN @@cn FILTER doc.bar >= 0 SORT doc.bar RETURN doc", { "@cn" : cn3 }).toArray();
for (var i = 0; i < 100; ++i) {
@ -804,7 +825,7 @@ function ahuacatlInsertSuite () {
assertMatch(/^\d+$/, doc._key);
assertEqual(i, doc.bar);
assertEqual(i, doc.a);
var doc2 = c3.document(doc._key);
assertEqual(doc._key, doc2._key);
assertEqual(doc._rev, doc2._rev);
@ -929,7 +950,7 @@ function ahuacatlInsertSuite () {
testInsertEdgeInvalid : function () {
db._drop("UnitTestsAhuacatlEdge");
var edge = db._createEdgeCollection("UnitTestsAhuacatlEdge");
var edge = db._createEdgeCollection("UnitTestsAhuacatlEdge");
assertQueryError(errors.ERROR_ARANGO_INVALID_EDGE_ATTRIBUTE.code, "FOR i IN 1..50 INSERT { } INTO @@cn", { "@cn": edge.name() });
assertEqual(0, edge.count());
@ -943,7 +964,7 @@ function ahuacatlInsertSuite () {
testInsertEdgeNoFrom : function () {
db._drop("UnitTestsAhuacatlEdge");
var edge = db._createEdgeCollection("UnitTestsAhuacatlEdge");
var edge = db._createEdgeCollection("UnitTestsAhuacatlEdge");
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());
@ -957,7 +978,7 @@ function ahuacatlInsertSuite () {
testInsertEdgeNoTo : function () {
db._drop("UnitTestsAhuacatlEdge");
var edge = db._createEdgeCollection("UnitTestsAhuacatlEdge");
var edge = db._createEdgeCollection("UnitTestsAhuacatlEdge");
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());
@ -971,7 +992,7 @@ function ahuacatlInsertSuite () {
testInsertEdge : function () {
db._drop("UnitTestsAhuacatlEdge");
var edge = db._createEdgeCollection("UnitTestsAhuacatlEdge");
var edge = db._createEdgeCollection("UnitTestsAhuacatlEdge");
var expected = { writesExecuted: 50, writesIgnored: 0 };
var actual = getModifyQueryResults("FOR i IN 1..50 INSERT { _key: CONCAT('test', i), _from: CONCAT('UnitTestsAhuacatlInsert1/', i), _to: CONCAT('UnitTestsAhuacatlInsert2/', i), value: [ i ], sub: { foo: 'bar' } } INTO @@cn", { "@cn": edge.name() });
@ -995,14 +1016,14 @@ function ahuacatlInsertSuite () {
testInsertEdgeReturn : function () {
db._drop("UnitTestsAhuacatlEdge");
var edge = db._createEdgeCollection("UnitTestsAhuacatlEdge");
var edge = db._createEdgeCollection("UnitTestsAhuacatlEdge");
var expected = { writesExecuted: 50, writesIgnored: 0 };
var actual = AQL_EXECUTE("FOR i IN 0..49 INSERT { _key: CONCAT('test', i), _from: CONCAT('UnitTestsAhuacatlInsert1/', i), _to: CONCAT('UnitTestsAhuacatlInsert2/', i), value: [ i ], sub: { foo: 'bar' } } INTO @@cn LET result = NEW RETURN result", { "@cn": edge.name() });
assertEqual(expected, sanitizeStats(actual.stats));
assertEqual(50, edge.count());
actual.json = actual.json.sort(function(l, r) {
return l.value[0] - r.value[0];
});
@ -1097,7 +1118,7 @@ function ahuacatlUpdateSuite () {
testUpdateNothing : function () {
var expected = { writesExecuted: 0, writesIgnored: 0 };
var actual = getModifyQueryResults("FOR d IN " + cn1 + " FILTER d.value1 < 0 UPDATE { foxx: true } IN " + cn1);
assertEqual(expected, sanitizeStats(actual));
},
@ -1420,7 +1441,7 @@ function ahuacatlUpdateSuite () {
assertEqual(100, c1.count());
assertEqual(expected, sanitizeStats(actual.stats));
actual.json = actual.json.sort(function(l, r) {
return l.value1 - r.value1;
});
@ -1450,7 +1471,7 @@ function ahuacatlUpdateSuite () {
assertEqual(100, c1.count());
assertEqual(expected, sanitizeStats(actual.stats));
actual.json = actual.json.sort(function(l, r) {
return l.value1 - r.value1;
});
@ -1549,7 +1570,7 @@ function ahuacatlUpdateSuite () {
assertEqual(100, c1.count());
assertEqual(expected, sanitizeStats(actual.stats));
actual.json = actual.json.sort(function(l, r) {
return l.value1 - r.value1;
});
@ -1579,7 +1600,7 @@ function ahuacatlUpdateSuite () {
assertEqual(100, c1.count());
assertEqual(expected, sanitizeStats(actual.stats));
actual.json = actual.json.sort(function(l, r) {
return l.value3 - r.value3;
});