summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jstests/core/system_js_drop.js37
-rw-r--r--src/mongo/db/catalog/database_impl.cpp3
-rw-r--r--src/mongo/db/op_observer/op_observer_impl.cpp3
3 files changed, 42 insertions, 1 deletions
diff --git a/jstests/core/system_js_drop.js b/jstests/core/system_js_drop.js
new file mode 100644
index 00000000000..49a59c14ed5
--- /dev/null
+++ b/jstests/core/system_js_drop.js
@@ -0,0 +1,37 @@
+/**
+ * Tests dropping the system.js collection.
+ *
+ * @tags: [
+ * assumes_read_preference_unchanged,
+ * assumes_unsharded_collection,
+ * requires_fcv_62,
+ * requires_non_retryable_writes,
+ * ]
+ */
+(function() {
+'use strict';
+
+const testDB = db.getSiblingDB(jsTestName());
+assert.commandWorked(testDB.dropDatabase());
+
+const coll = testDB.coll;
+const systemJs = testDB.system.js;
+
+assert.commandWorked(coll.insert([{name: 'Alice', age: 20}, {name: 'Bob', age: 18}]));
+
+assert.commandWorked(systemJs.insert({
+ _id: "isTeenager",
+ value: function(age) {
+ return age >= 13 && age <= 19;
+ },
+}));
+
+assert.commandWorked(
+ testDB.runCommand({find: coll.getName(), filter: {$where: "isTeenager(this.age)"}}));
+
+assert(systemJs.drop());
+
+assert.commandFailedWithCode(
+ testDB.runCommand({find: coll.getName(), filter: {$where: "isTeenager(this.age)"}}),
+ ErrorCodes.JSInterpreterFailure);
+})();
diff --git a/src/mongo/db/catalog/database_impl.cpp b/src/mongo/db/catalog/database_impl.cpp
index dfa0d846762..28c3fa2e8cb 100644
--- a/src/mongo/db/catalog/database_impl.cpp
+++ b/src/mongo/db/catalog/database_impl.cpp
@@ -423,7 +423,8 @@ Status DatabaseImpl::dropCollection(OperationContext* opCtx,
nss == NamespaceString::kKeysCollectionNamespace ||
nss.isTemporaryReshardingCollection() || nss.isTimeseriesBucketsCollection() ||
nss.isChangeStreamPreImagesCollection() ||
- nss == NamespaceString::kConfigsvrRestoreNamespace || nss.isChangeCollection();
+ nss == NamespaceString::kConfigsvrRestoreNamespace || nss.isChangeCollection() ||
+ nss.isSystemDotJavascript();
};
if (nss.isSystem()) {
diff --git a/src/mongo/db/op_observer/op_observer_impl.cpp b/src/mongo/db/op_observer/op_observer_impl.cpp
index 00f0ddc253d..7350a487db8 100644
--- a/src/mongo/db/op_observer/op_observer_impl.cpp
+++ b/src/mongo/db/op_observer/op_observer_impl.cpp
@@ -1357,6 +1357,9 @@ repl::OpTime OpObserverImpl::onDropCollection(OperationContext* opCtx,
ReadWriteConcernDefaults::get(opCtx).invalidate();
} else if (collectionName.isTimeseriesBucketsCollection()) {
BucketCatalog::get(opCtx).clear(collectionName.getTimeseriesViewNamespace());
+ } else if (collectionName.isSystemDotJavascript()) {
+ // Inform the JavaScript engine of the change to system.js.
+ Scope::storedFuncMod(opCtx);
}
return {};