summaryrefslogtreecommitdiff
path: root/jstests/noPassthrough
diff options
context:
space:
mode:
authorEric Cox <eric.cox@mongodb.com>2022-03-08 21:23:51 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-03-08 23:05:46 +0000
commit0b33ab1e493256033622de35cf0857447b70dbd4 (patch)
treef8d7c15d379d3dfbc893d9a790085d55a5512062 /jstests/noPassthrough
parent8287a153f11a4c3906305512689cac46918022b9 (diff)
downloadmongo-0b33ab1e493256033622de35cf0857447b70dbd4.tar.gz
SERVER-63283 Add query knob to guard HJ plans for $lookup
Diffstat (limited to 'jstests/noPassthrough')
-rw-r--r--jstests/noPassthrough/lookup_pushdown.js24
-rw-r--r--jstests/noPassthrough/query_knobs_validation.js4
-rw-r--r--jstests/noPassthrough/sbe_plan_cache_clear_on_param_change.js1
3 files changed, 29 insertions, 0 deletions
diff --git a/jstests/noPassthrough/lookup_pushdown.js b/jstests/noPassthrough/lookup_pushdown.js
index 22a7806f5d2..0c13dadc16d 100644
--- a/jstests/noPassthrough/lookup_pushdown.js
+++ b/jstests/noPassthrough/lookup_pushdown.js
@@ -378,6 +378,30 @@ MongoRunner.stopMongod(conn);
JoinAlgorithm.HJ,
{allowDiskUse: true});
+ // Setting the 'internalQueryDisableLookupExecutionUsingHashJoin' knob to true will disable
+ // HJ plans from being chosen and since the pipeline is SBE compatible it will fallback to
+ // NLJ.
+ assert.commandWorked(db.adminCommand({
+ setParameter: 1,
+ internalQueryDisableLookupExecutionUsingHashJoin: true,
+ }));
+
+ runTest(lcoll,
+ [{$lookup: {from: fcoll.getName(), localField: "a", foreignField: "a", as: "out"}}],
+ JoinAlgorithm.NLJ,
+ {allowDiskUse: true});
+
+ // Test that we can go back to generating HJ plans.
+ assert.commandWorked(db.adminCommand({
+ setParameter: 1,
+ internalQueryDisableLookupExecutionUsingHashJoin: false,
+ }));
+
+ runTest(lcoll,
+ [{$lookup: {from: fcoll.getName(), localField: "a", foreignField: "a", as: "out"}}],
+ JoinAlgorithm.HJ,
+ {allowDiskUse: true});
+
// Setting the 'internalQueryCollectionMaxNoOfDocumentsToChooseHashJoin' to count - 1 results in
// choosing the NLJ algorithm.
assert.commandWorked(db.adminCommand({
diff --git a/jstests/noPassthrough/query_knobs_validation.js b/jstests/noPassthrough/query_knobs_validation.js
index 671a95d7b84..36db1f286f2 100644
--- a/jstests/noPassthrough/query_knobs_validation.js
+++ b/jstests/noPassthrough/query_knobs_validation.js
@@ -53,6 +53,7 @@ const expectedParamDefaults = {
internalQueryCollectionMaxNoOfDocumentsToChooseHashJoin: 10 * 1000,
internalQueryCollectionMaxDataSizeBytesToChooseHashJoin: 100 * 1024 * 1024,
internalQueryCollectionMaxStorageSizeBytesToChooseHashJoin: 100 * 1024 * 1024,
+ internalQueryDisableLookupExecutionUsingHashJoin: false,
};
function assertDefaultParameterValues() {
@@ -224,5 +225,8 @@ assertSetParameterSucceeds("internalQueryCollectionMaxStorageSizeBytesToChooseHa
assertSetParameterFails("internalQueryCollectionMaxStorageSizeBytesToChooseHashJoin", 0);
assertSetParameterFails("internalQueryCollectionMaxStorageSizeBytesToChooseHashJoin", -1);
+assertSetParameterSucceeds("internalQueryDisableLookupExecutionUsingHashJoin", true);
+assertSetParameterSucceeds("internalQueryDisableLookupExecutionUsingHashJoin", false);
+
MongoRunner.stopMongod(conn);
})();
diff --git a/jstests/noPassthrough/sbe_plan_cache_clear_on_param_change.js b/jstests/noPassthrough/sbe_plan_cache_clear_on_param_change.js
index e1b3e39b417..8a9cc66e4e7 100644
--- a/jstests/noPassthrough/sbe_plan_cache_clear_on_param_change.js
+++ b/jstests/noPassthrough/sbe_plan_cache_clear_on_param_change.js
@@ -34,6 +34,7 @@ const paramList = [
{name: "internalQueryCollectionMaxNoOfDocumentsToChooseHashJoin", value: 1},
{name: "internalQueryCollectionMaxDataSizeBytesToChooseHashJoin", value: 100},
{name: "internalQueryCollectionMaxStorageSizeBytesToChooseHashJoin", value: 100},
+ {name: "internalQueryDisableLookupExecutionUsingHashJoin", value: true},
];
const conn = MongoRunner.runMongod();