summaryrefslogtreecommitdiff
path: root/jstests/core/query/explain/explain_delete.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/core/query/explain/explain_delete.js')
-rw-r--r--jstests/core/query/explain/explain_delete.js75
1 files changed, 75 insertions, 0 deletions
diff --git a/jstests/core/query/explain/explain_delete.js b/jstests/core/query/explain/explain_delete.js
new file mode 100644
index 00000000000..2b2d7933531
--- /dev/null
+++ b/jstests/core/query/explain/explain_delete.js
@@ -0,0 +1,75 @@
+/**
+ * Tests for explaining the delete command.
+ *
+ * @tags: [
+ * no_selinux,
+ * requires_fastcount,
+ * requires_fcv_61,
+ * requires_non_retryable_writes,
+ * ]
+ */
+
+(function() {
+"use strict";
+
+var collName = "jstests_explain_delete";
+var t = db[collName];
+t.drop();
+
+var explain;
+
+/**
+ * Verify that the explain command output 'explain' shows a BATCHED_DELETE stage with an
+ * nWouldDelete value equal to 'nWouldDelete'.
+ */
+function checkNWouldDelete(explain, nWouldDelete) {
+ assert.commandWorked(explain);
+ assert("executionStats" in explain);
+ var executionStats = explain.executionStats;
+ assert("executionStages" in executionStats);
+
+ // If passed through mongos, then BATCHED_DELETE stage(s) should be below the SHARD_WRITE
+ // mongos stage. Otherwise the BATCHED_DELETE stage is the root stage.
+ var execStages = executionStats.executionStages;
+ if ("SHARD_WRITE" === execStages.stage) {
+ let totalToBeDeletedAcrossAllShards = 0;
+ execStages.shards.forEach(function(shardExplain) {
+ const rootStageName = shardExplain.executionStages.stage;
+ assert(rootStageName === "BATCHED_DELETE", tojson(execStages));
+ totalToBeDeletedAcrossAllShards += shardExplain.executionStages.nWouldDelete;
+ });
+ assert.eq(totalToBeDeletedAcrossAllShards, nWouldDelete, explain);
+ } else {
+ assert(execStages.stage === "BATCHED_DELETE", explain);
+ assert.eq(execStages.nWouldDelete, nWouldDelete, explain);
+ }
+}
+
+// Explain delete against an empty collection.
+assert.commandWorked(db.createCollection(t.getName()));
+explain = db.runCommand({explain: {delete: collName, deletes: [{q: {a: 1}, limit: 0}]}});
+checkNWouldDelete(explain, 0);
+
+// Add an index but no data, and check that the explain still works.
+t.createIndex({a: 1});
+explain = db.runCommand({explain: {delete: collName, deletes: [{q: {a: 1}, limit: 0}]}});
+checkNWouldDelete(explain, 0);
+
+// Add some copies of the same document.
+for (var i = 0; i < 10; i++) {
+ t.insert({a: 1});
+}
+assert.eq(10, t.count());
+
+// Run an explain which shows that all 10 documents *would* be deleted.
+explain = db.runCommand({explain: {delete: collName, deletes: [{q: {a: 1}, limit: 0}]}});
+checkNWouldDelete(explain, 10);
+
+// Make sure all 10 documents are still there.
+assert.eq(10, t.count());
+
+// If we run the same thing without the explain, then all 10 docs should be deleted.
+var deleteResult = db.runCommand({delete: collName, deletes: [{q: {a: 1}, limit: 0}]});
+assert.commandWorked(deleteResult);
+assert.eq(0, t.count());
+}());