summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--buildscripts/resmokeconfig/suites/fle2_high_cardinality.yml2
-rw-r--r--buildscripts/resmokeconfig/suites/fle2_sharding_high_cardinality.yml2
-rw-r--r--src/mongo/crypto/fle_crypto_test.cpp5
-rw-r--r--src/mongo/db/query/fle/encrypted_predicate.cpp11
-rw-r--r--src/mongo/db/query/fle/encrypted_predicate.h2
-rw-r--r--src/mongo/db/query/fle/equality_predicate.cpp26
-rw-r--r--src/mongo/db/query/fle/range_predicate.cpp34
7 files changed, 41 insertions, 41 deletions
diff --git a/buildscripts/resmokeconfig/suites/fle2_high_cardinality.yml b/buildscripts/resmokeconfig/suites/fle2_high_cardinality.yml
index e92728bda93..d9176f718b8 100644
--- a/buildscripts/resmokeconfig/suites/fle2_high_cardinality.yml
+++ b/buildscripts/resmokeconfig/suites/fle2_high_cardinality.yml
@@ -6,7 +6,7 @@ selector:
exclude_with_any_tags:
# Not compatible with tests the expect fle to always using $in in queries,
# i.e. verify explain output
- - requires_fle_in_always
+ - requires_fle2_in_always
executor:
archive:
diff --git a/buildscripts/resmokeconfig/suites/fle2_sharding_high_cardinality.yml b/buildscripts/resmokeconfig/suites/fle2_sharding_high_cardinality.yml
index 43feeb03b00..8760caa26bc 100644
--- a/buildscripts/resmokeconfig/suites/fle2_sharding_high_cardinality.yml
+++ b/buildscripts/resmokeconfig/suites/fle2_sharding_high_cardinality.yml
@@ -6,7 +6,7 @@ selector:
exclude_with_any_tags:
# Not compatible with tests the expect fle to always using $in in queries,
# i.e. verify explain output
- - requires_fle_in_always
+ - requires_fle2_in_always
executor:
archive:
diff --git a/src/mongo/crypto/fle_crypto_test.cpp b/src/mongo/crypto/fle_crypto_test.cpp
index cfd311ac712..e0509db2e9a 100644
--- a/src/mongo/crypto/fle_crypto_test.cpp
+++ b/src/mongo/crypto/fle_crypto_test.cpp
@@ -2571,11 +2571,6 @@ void assertMinCoverResult(A lb,
vals.elems(elems);
auto spec = FLE2RangeFindSpec(elems[0], lbIncluded, elems[1], ubIncluded, elems[2], elems[3]);
auto result = getMinCover(spec, sparsity);
- if (expected.size() == 0 && result.size() != 0) {
- for (auto& res : result) {
- std::cout << "DAVISDEBUG " << res << std::endl;
- }
- }
ASSERT_EQ(result.size(), expected.size());
for (size_t i = 0; i < result.size(); i++) {
ASSERT_EQ(result[i], expected[i]) << spec.toBSON();
diff --git a/src/mongo/db/query/fle/encrypted_predicate.cpp b/src/mongo/db/query/fle/encrypted_predicate.cpp
index c23e1a2a5ae..aeed43cc884 100644
--- a/src/mongo/db/query/fle/encrypted_predicate.cpp
+++ b/src/mongo/db/query/fle/encrypted_predicate.cpp
@@ -46,6 +46,17 @@ void logTagsExceeded(const ExceptionFor<ErrorCodes::FLEMaxTagLimitExceeded>& ex)
6672410, 2, "FLE Max tag limit hit during query rewrite", "__error__"_attr = ex.what());
}
+std::unique_ptr<MatchExpression> makeTagDisjunction(BSONArray&& tagArray) {
+ auto tagElems = std::vector<BSONElement>();
+ tagArray.elems(tagElems);
+
+ auto newExpr = std::make_unique<InMatchExpression>(kSafeContent);
+ newExpr->setBackingBSON(std::move(tagArray));
+ uassertStatusOK(newExpr->setEqualities(std::move(tagElems)));
+
+ return newExpr;
+}
+
BSONArray toBSONArray(std::vector<PrfBlock>&& vec) {
auto bab = BSONArrayBuilder();
for (auto& elt : vec) {
diff --git a/src/mongo/db/query/fle/encrypted_predicate.h b/src/mongo/db/query/fle/encrypted_predicate.h
index b2797fd1eb9..ac4d55b811a 100644
--- a/src/mongo/db/query/fle/encrypted_predicate.h
+++ b/src/mongo/db/query/fle/encrypted_predicate.h
@@ -82,6 +82,8 @@ BSONArray toBSONArray(std::vector<PrfBlock>&& vec);
*/
std::vector<Value> toValues(std::vector<PrfBlock>&& vec);
+std::unique_ptr<MatchExpression> makeTagDisjunction(BSONArray&& tagArray);
+
void logTagsExceeded(const ExceptionFor<ErrorCodes::FLEMaxTagLimitExceeded>& ex);
/**
* Interface for implementing a server rewrite for an encrypted index. Each type of predicate
diff --git a/src/mongo/db/query/fle/equality_predicate.cpp b/src/mongo/db/query/fle/equality_predicate.cpp
index fc46bcbfe3a..a349962145b 100644
--- a/src/mongo/db/query/fle/equality_predicate.cpp
+++ b/src/mongo/db/query/fle/equality_predicate.cpp
@@ -29,6 +29,7 @@
#include "equality_predicate.h"
+#include "mongo/bson/bsontypes.h"
#include "mongo/crypto/fle_crypto.h"
#include "mongo/crypto/fle_tags.h"
#include "mongo/db/matcher/expression_expr.h"
@@ -63,16 +64,7 @@ std::unique_ptr<MatchExpression> EqualityPredicate::rewriteToTagDisjunction(
if (!isPayload(payload)) {
return nullptr;
}
- auto obj = toBSONArray(generateTags(payload));
-
- auto tags = std::vector<BSONElement>();
- obj.elems(tags);
-
- auto inExpr = std::make_unique<InMatchExpression>(kSafeContent);
- inExpr->setBackingBSON(std::move(obj));
- auto status = inExpr->setEqualities(std::move(tags));
- uassertStatusOK(status);
- return inExpr;
+ return makeTagDisjunction(toBSONArray(generateTags(payload)));
}
case MatchExpression::MATCH_IN: {
auto inExpr = static_cast<InMatchExpression*>(expr);
@@ -93,22 +85,14 @@ std::unique_ptr<MatchExpression> EqualityPredicate::rewriteToTagDisjunction(
auto backingBSONBuilder = BSONArrayBuilder();
for (auto& eq : inExpr->getEqualities()) {
- auto obj = toBSONArray(generateTags(eq));
+ auto obj = generateTags(eq);
for (auto&& elt : obj) {
- backingBSONBuilder.append(elt);
+ backingBSONBuilder.appendBinData(elt.size(), BinDataGeneral, elt.data());
}
}
auto backingBSON = backingBSONBuilder.arr();
- auto allTags = std::vector<BSONElement>();
- backingBSON.elems(allTags);
-
- auto newExpr = std::make_unique<InMatchExpression>(kSafeContent);
- newExpr->setBackingBSON(std::move(backingBSON));
- auto status = newExpr->setEqualities(std::move(allTags));
- uassertStatusOK(status);
-
- return newExpr;
+ return makeTagDisjunction(std::move(backingBSON));
}
default:
MONGO_UNREACHABLE_TASSERT(6911300);
diff --git a/src/mongo/db/query/fle/range_predicate.cpp b/src/mongo/db/query/fle/range_predicate.cpp
index 7c9be5c90fa..0ebf33790fc 100644
--- a/src/mongo/db/query/fle/range_predicate.cpp
+++ b/src/mongo/db/query/fle/range_predicate.cpp
@@ -29,7 +29,11 @@
#include "range_predicate.h"
+#include <iterator>
+
#include "mongo/crypto/encryption_fields_gen.h"
+#include "mongo/crypto/fle_crypto.h"
+#include "mongo/crypto/fle_tags.h"
#include "mongo/db/matcher/expression_leaf.h"
#include "mongo/db/query/fle/encrypted_predicate.h"
@@ -39,29 +43,33 @@ REGISTER_ENCRYPTED_MATCH_PREDICATE_REWRITE_WITH_FLAG(BETWEEN,
RangePredicate,
gFeatureFlagFLE2Range);
-// TODO: SERVER-67206 Generate tags for range payload.
std::vector<PrfBlock> RangePredicate::generateTags(BSONValue payload) const {
- return {};
+ auto parsedPayload = parseFindPayload<ParsedFindRangePayload>(payload);
+ std::vector<PrfBlock> tags;
+ for (auto& edge : parsedPayload.edges) {
+ auto tagsForEdge = readTags(*_rewriter->getEscReader(),
+ *_rewriter->getEccReader(),
+ edge.esc,
+ edge.ecc,
+ edge.edc,
+ parsedPayload.maxCounter);
+ tags.insert(tags.end(),
+ std::make_move_iterator(tagsForEdge.begin()),
+ std::make_move_iterator(tagsForEdge.end()));
+ }
+ return tags;
}
std::unique_ptr<MatchExpression> RangePredicate::rewriteToTagDisjunction(
MatchExpression* expr) const {
invariant(expr->matchType() == MatchExpression::BETWEEN);
auto betExpr = static_cast<BetweenMatchExpression*>(expr);
- auto ffp = betExpr->rhs();
+ auto payload = betExpr->rhs();
- if (!isPayload(ffp)) {
+ if (!isPayload(payload)) {
return nullptr;
}
-
- auto obj = toBSONArray(generateTags(ffp));
- auto tags = std::vector<BSONElement>();
- obj.elems(tags);
- auto inExpr = std::make_unique<InMatchExpression>(kSafeContent);
- inExpr->setBackingBSON(std::move(obj));
- auto status = inExpr->setEqualities(std::move(tags));
- uassertStatusOK(status);
- return inExpr;
+ return makeTagDisjunction(toBSONArray(generateTags(payload)));
}
// TODO: SERVER-67209 Server-side rewrite for agg expressions with $between.