summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjames.wahlin@10gen.com <james.wahlin@10gen.com>2015-03-18 15:45:05 -0400
committerDavid Storch <david.storch@10gen.com>2015-03-19 16:59:02 -0400
commit879f306b22daec81a9a2388304539e21b3df0483 (patch)
tree067c3de03d24621ed182fabbe0cded28416c7a09 /src
parent2c6ab1eaae38caeee322f0c9afc4ef973fb667ea (diff)
downloadmongo-879f306b22daec81a9a2388304539e21b3df0483.tar.gz
SERVER-17158 add delimiter to planCacheKey for sort args
Closes #938 Signed-off-by: David Storch <david.storch@10gen.com>
Diffstat (limited to 'src')
-rw-r--r--src/mongo/db/commands/plan_cache_commands_test.cpp18
-rw-r--r--src/mongo/db/query/canonical_query.cpp5
2 files changed, 20 insertions, 3 deletions
diff --git a/src/mongo/db/commands/plan_cache_commands_test.cpp b/src/mongo/db/commands/plan_cache_commands_test.cpp
index 3ed53afc8f8..8f1be2d9623 100644
--- a/src/mongo/db/commands/plan_cache_commands_test.cpp
+++ b/src/mongo/db/commands/plan_cache_commands_test.cpp
@@ -205,9 +205,21 @@ namespace {
// Sort query should generate different key from unsorted query.
ASSERT_OK(PlanCacheCommand::canonicalize(&txn, ns,
- fromjson("{query: {a: 1, b: 1}, sort: {a: 1}}"), &cqRaw));
- scoped_ptr<CanonicalQuery> sortQuery(cqRaw);
- ASSERT_NOT_EQUALS(query->getPlanCacheKey(), sortQuery->getPlanCacheKey());
+ fromjson("{query: {a: 1, b: 1}, sort: {a: 1, b: 1}}"), &cqRaw));
+ scoped_ptr<CanonicalQuery> sortQuery1(cqRaw);
+ ASSERT_NOT_EQUALS(query->getPlanCacheKey(), sortQuery1->getPlanCacheKey());
+
+ // Confirm sort arguments are properly delimited (SERVER-17158)
+ ASSERT_OK(PlanCacheCommand::canonicalize(&txn, ns,
+ fromjson("{query: {a: 1, b: 1}, sort: {aab: 1}}"), &cqRaw));
+ scoped_ptr<CanonicalQuery> sortQuery2(cqRaw);
+ ASSERT_NOT_EQUALS(sortQuery1->getPlanCacheKey(), sortQuery2->getPlanCacheKey());
+
+ // Changing order and/or value of predicates should not change key
+ ASSERT_OK(PlanCacheCommand::canonicalize(&txn, ns,
+ fromjson("{query: {b: 3, a: 3}, sort: {a: 1, b: 1}}"), &cqRaw));
+ scoped_ptr<CanonicalQuery> sortQuery3(cqRaw);
+ ASSERT_EQUALS(sortQuery1->getPlanCacheKey(), sortQuery3->getPlanCacheKey());
// Projected query should generate different key from unprojected query.
ASSERT_OK(PlanCacheCommand::canonicalize(&txn, ns,
diff --git a/src/mongo/db/query/canonical_query.cpp b/src/mongo/db/query/canonical_query.cpp
index 7a1bc7a11f1..c3b2442113c 100644
--- a/src/mongo/db/query/canonical_query.cpp
+++ b/src/mongo/db/query/canonical_query.cpp
@@ -275,6 +275,11 @@ namespace {
*os << "d";
}
encodeUserString(elt.fieldName(), os);
+
+ // Sort argument separator
+ if (it.more()) {
+ *os << ",";
+ }
}
}