summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffrey Xiao <jeffrey.xiao@mongodb.com>2022-07-07 15:37:21 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-07-07 16:36:50 +0000
commit012183849f1e8a1e2201ca06a1f441998d5494b7 (patch)
tree07204da91bd9b4e4921b83ed4d00a97f3f855c8a
parent7d415dd5702a6d1de1f84aac521bf9cc1a76d106 (diff)
downloadmongo-012183849f1e8a1e2201ca06a1f441998d5494b7.tar.gz
SERVER-63445 Support for hiding columnar indexes
-rw-r--r--jstests/core/hidden_index.js63
1 files changed, 44 insertions, 19 deletions
diff --git a/jstests/core/hidden_index.js b/jstests/core/hidden_index.js
index 1c1d0449407..c548962be68 100644
--- a/jstests/core/hidden_index.js
+++ b/jstests/core/hidden_index.js
@@ -14,31 +14,41 @@ load("jstests/libs/analyze_plan.js"); // For getPlanStages.
load("jstests/libs/collection_drop_recreate.js"); // For assert[Drop|Create]Collection.
load("jstests/libs/fixture_helpers.js"); // For FixtureHelpers.
load("jstests/libs/index_catalog_helpers.js"); // For IndexCatalogHelpers.findByName.
+load("jstests/libs/sbe_util.js"); // For checkSBEEnabled.
+
+const columnstoreEnabled =
+ checkSBEEnabled(db, ["featureFlagColumnstoreIndexes", "featureFlagSbeFull"]);
const collName = "hidden_index";
let coll = assertDropAndRecreateCollection(db, collName);
-function numOfUsedIXSCAN(query) {
- const explain = assert.commandWorked(coll.find(query).explain());
- const ixScans = getPlanStages(getWinningPlan(explain.queryPlanner), "IXSCAN");
- return ixScans.length;
+function numOfUsedIndexes(query, projection) {
+ const explain = assert.commandWorked(coll.find(query, projection).explain());
+ const indexScans = getPlanStages(getWinningPlan(explain.queryPlanner), "IXSCAN");
+ const columnIndexScans = getPlanStages(getWinningPlan(explain.queryPlanner), "COLUMN_SCAN");
+ return indexScans.length + columnIndexScans.length;
}
-function validateHiddenIndexBehaviour(query, index_type, wildcard) {
+function validateHiddenIndexBehaviour(
+ {query = {}, projection = {}, index_type = 1, wildcard = false}) {
let index_name;
if (wildcard)
- index_name = 'a.$**_' + index_type;
+ index_name = "a.$**_" + index_type;
+ else if (index_type === 'columnstore')
+ index_name = "$**_" + index_type;
else
- index_name = 'a_' + index_type;
+ index_name = "a_" + index_type;
if (wildcard)
assert.commandWorked(coll.createIndex({"a.$**": index_type}));
+ else if (index_type === 'columnstore')
+ assert.commandWorked(coll.createIndex({"$**": index_type}));
else
assert.commandWorked(coll.createIndex({"a": index_type}));
let idxSpec = IndexCatalogHelpers.findByName(coll.getIndexes(), index_name);
assert.eq(idxSpec.hidden, undefined);
- assert.gt(numOfUsedIXSCAN(query), 0);
+ assert.gt(numOfUsedIndexes(query, projection), 0);
assert.commandWorked(coll.hideIndex(index_name));
idxSpec = IndexCatalogHelpers.findByName(coll.getIndexes(), index_name);
@@ -48,45 +58,60 @@ function validateHiddenIndexBehaviour(query, index_type, wildcard) {
assert.commandWorked(coll.dropIndexes());
return;
}
- assert.eq(numOfUsedIXSCAN(query), 0);
+ assert.eq(numOfUsedIndexes(query, projection), 0);
assert.commandWorked(coll.unhideIndex(index_name));
idxSpec = IndexCatalogHelpers.findByName(coll.getIndexes(), index_name);
assert.eq(idxSpec.hidden, undefined);
- assert.gt(numOfUsedIXSCAN(query), 0);
+ assert.gt(numOfUsedIndexes(query, projection), 0);
assert.commandWorked(coll.dropIndex(index_name));
if (wildcard)
assert.commandWorked(coll.createIndex({"a.$**": index_type}, {hidden: true}));
+ else if (index_type === 'columnstore')
+ assert.commandWorked(coll.createIndex({"$**": index_type}, {hidden: true}));
else
assert.commandWorked(coll.createIndex({"a": index_type}, {hidden: true}));
idxSpec = IndexCatalogHelpers.findByName(coll.getIndexes(), index_name);
assert(idxSpec.hidden);
- assert.eq(numOfUsedIXSCAN(query), 0);
+ assert.eq(numOfUsedIndexes(query, projection), 0);
assert.commandWorked(coll.dropIndexes());
}
// Normal index testing.
-validateHiddenIndexBehaviour({a: 1}, 1);
+validateHiddenIndexBehaviour({query: {a: 1}, index_type: 1});
// GEO index testing.
validateHiddenIndexBehaviour({
- a: {$geoWithin: {$geometry: {type: "Polygon", coordinates: [[[0, 0], [3, 6], [6, 1], [0, 0]]]}}}
-},
- "2dsphere");
+ query: {
+ a: {
+ $geoWithin:
+ {$geometry: {type: "Polygon", coordinates: [[[0, 0], [3, 6], [6, 1], [0, 0]]]}}
+ }
+ },
+ index_type: "2dsphere"
+});
// Fts index.
-validateHiddenIndexBehaviour({$text: {$search: "java"}}, "text");
+validateHiddenIndexBehaviour({query: {$text: {$search: "java"}}, index_type: "text"});
// Wildcard index.
-validateHiddenIndexBehaviour({"a.f": 1}, 1, true);
+validateHiddenIndexBehaviour({query: {"a.f": 1}, index_type: 1, wildcard: true});
+
+// Column Store Index.
+if (columnstoreEnabled) {
+ validateHiddenIndexBehaviour({projection: {a: 1}, index_type: "columnstore"});
+} else {
+ jsTestLog(
+ "Skipping columnstore hidden index validation test since the feature flag is not enabled.");
+}
// Hidden index on capped collection.
if (!FixtureHelpers.isMongos(db)) {
coll = assertDropAndRecreateCollection(db, collName, {capped: true, size: 100});
- validateHiddenIndexBehaviour({a: 1}, 1);
+ validateHiddenIndexBehaviour({query: {a: 1}, index_type: 1});
coll = assertDropAndRecreateCollection(db, collName);
}
// Test that index 'hidden' status can be found in listIndexes command.
@@ -96,7 +121,7 @@ let idxSpec = IndexCatalogHelpers.findByName(res.cursor.firstBatch, "lsIdx_1");
assert.eq(idxSpec.hidden, true);
// Can't hide any index in a system collection.
-const systemColl = db.getSiblingDB('admin').system.version;
+const systemColl = db.getSiblingDB("admin").system.version;
assert.commandWorked(systemColl.createIndex({a: 1}));
// The collMod command throws NoShardingEnabled on DDL coordinator implementation and BadValue on
// old implementation.