diff options
author | Jeffrey Xiao <jeffrey.xiao@mongodb.com> | 2022-07-07 15:37:21 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-07-07 16:36:50 +0000 |
commit | 012183849f1e8a1e2201ca06a1f441998d5494b7 (patch) | |
tree | 07204da91bd9b4e4921b83ed4d00a97f3f855c8a | |
parent | 7d415dd5702a6d1de1f84aac521bf9cc1a76d106 (diff) | |
download | mongo-012183849f1e8a1e2201ca06a1f441998d5494b7.tar.gz |
SERVER-63445 Support for hiding columnar indexes
-rw-r--r-- | jstests/core/hidden_index.js | 63 |
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. |