8000 Fixed BTS-562 (#14800) · arangodb/arangodb@d91bfd5 · GitHub
[go: up one dir, main page]

Skip to content

Commit d91bfd5

Browse files
authored
Fixed BTS-562 (#14800)
1 parent 25798eb commit d91bfd5

File tree

3 files changed

+49
-4
lines changed

3 files changed

+49
-4
lines changed

CHANGELOG

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
devel
22
-----
33

4+
* Fixed BTS-562: reduce-extraction-to-projection optimization returns null for
5+
one attribute if nested attributes are named the same.
6+
47
* Add `--datatype` startup option to arangoimport, in order to hard-code the
58
datatype (null/boolean/number/string) for certain attributes in the CSV/TSV import.
69
For example, given the following input file:

arangod/Aql/AttributeNamePath.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,10 @@ AttributeNamePath& AttributeNamePath::shortenTo(size_t length) {
133133
size_t numEqual = 0;
134134
size_t commonLength = std::min(lhs.size(), rhs.size());
135135
for (size_t i = 0; i < commonLength; ++i) {
136-
if (lhs[i] == rhs[i]) {
137-
++numEqual;
136+
if (lhs[i] != rhs[i]) {
137+
break;
138138
}
139+
++numEqual;
139140
}
140141
return numEqual;
141142
}

tests/js/server/aql/aql-optimizer-rule-reduce-extraction-to-projection.js

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,49 @@ function optimizerRuleTestSuite () {
274274

275275
assertEqual(2, found);
276276
});
277-
}
278-
277+
},
278+
279+
testBts562 : function () {
280+
c.truncate();
281+
c.insert({ foo: { attr: 1 }, bar: { attr: 2 } });
282+
283+
let result = AQL_EXECUTE(`FOR doc IN @@cn RETURN [ doc.foo.attr, doc.bar.attr ]`, { "@cn" : cn }).json;
284+
assertEqual(1, result.length);
285+
assertEqual([ 1, 2 ], result[0]);
286+
287+
c.truncate();
288+
c.insert({ foo: { attr: 1 }, bar: { attr: 2 }, baz: { attr: 3 } });
289+
290+
result = AQL_EXECUTE(`FOR doc IN @@cn RETURN [ doc.foo.attr, doc.bar.attr, doc.baz.attr ]`, { "@cn" : cn }).json;
291+
assertEqual(1, result.length);
292+
assertEqual([ 1, 2, 3 ], result[0]);
293+
294+
c.truncate();
295+
c.insert({ result: {} });
296+
c.insert({ result: { status: "ok" } });
297+
298+
result = AQL_EXECUTE(`FOR d IN @@cn COLLECT resultStatus = d.result.status, requestStatus = d.request.status WITH COUNT INTO count SORT resultStatus RETURN { resultStatus, requestStatus, count }`, { "@cn": cn }).json;
299+
300+
assertEqual(2, result.length);
301+
assertEqual({ resultStatus: null, requestStatus: null, count: 1 }, result[0]);
302+
assertEqual({ resultStatus: "ok", requestStatus: null, count: 1 }, result[1]);
303+
304+
result = AQL_EXECUTE(`FOR d IN @@cn COLLECT resultStatus = d.result.status, requestOther = d.request.other WITH COUNT INTO count SORT resultStatus RETURN { resultStatus, requestOther, count }`, { "@cn" : cn }).json;
305+
assertEqual(2, result.length);
306+
assertEqual({ resultStatus: null, requestOther: null, count: 1 }, result[0]);
307+
assertEqual({ resultStatus: "ok", requestOther: null, count: 1 }, result[1]);
308+
309+
c.truncate();
310+
c.insert({ result: { status: "ok" }, request: { status: "ok" } });
311+
c.insert({ result: { status: "ok" }, request: { status: "blarg" } });
312+
313+
result = AQL_EXECUTE(`FOR d IN @@cn COLLECT resultStatus = d.result.status, requestStatus = d.request.status WITH COUNT INTO count SORT requestStatus RETURN { resultStatus, requestStatus, count }`, { "@cn" : cn }).json;
314+
315+
assertEqual(2, result.length);
316+
assertEqual({ resultStatus: "ok", requestStatus: "blarg", count: 1 }, result[0]);
317+
assertEqual({ resultStatus: "ok", requestStatus: "ok", count: 1 }, result[1]);
318+
},
319+
279320
};
280321
}
281322

0 commit comments

Comments
 (0)
0