Skip to content

Commit f216afa

Browse files
authored
MONGOCRYPT-895 Add "prefix" and "suffix" query types as aliases for "prefixPreview" and "suffixPreview" (#1146)
1 parent 24417d5 commit f216afa

12 files changed

Lines changed: 144 additions & 47 deletions

src/mc-efc-private.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ typedef enum _supported_query_type_flags {
3030
SUPPORTS_RANGE_PREVIEW_DEPRECATED_QUERIES = 1 << 2,
3131
// Text search preview query supported
3232
SUPPORTS_SUBSTRING_PREVIEW_QUERIES = 1 << 3,
33-
SUPPORTS_SUFFIX_PREVIEW_QUERIES = 1 << 4,
34-
SUPPORTS_PREFIX_PREVIEW_QUERIES = 1 << 5,
33+
SUPPORTS_SUFFIX_QUERIES = 1 << 4,
34+
SUPPORTS_PREFIX_QUERIES = 1 << 5,
3535
} supported_query_type_flags;
3636

3737
typedef struct _mc_EncryptedField_t {

src/mc-efc.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,12 @@ static bool _parse_query_type_string(const char *queryType, supported_query_type
3535
*out = SUPPORTS_RANGE_PREVIEW_DEPRECATED_QUERIES;
3636
} else if (mstr_eq_ignore_case(mstrv_lit(MONGOCRYPT_QUERY_TYPE_SUBSTRINGPREVIEW_STR), qtv)) {
3737
*out = SUPPORTS_SUBSTRING_PREVIEW_QUERIES;
38-
} else if (mstr_eq_ignore_case(mstrv_lit(MONGOCRYPT_QUERY_TYPE_SUFFIXPREVIEW_STR), qtv)) {
39-
*out = SUPPORTS_SUFFIX_PREVIEW_QUERIES;
40-
} else if (mstr_eq_ignore_case(mstrv_lit(MONGOCRYPT_QUERY_TYPE_PREFIXPREVIEW_STR), qtv)) {
41-
*out = SUPPORTS_PREFIX_PREVIEW_QUERIES;
38+
} else if (mstr_eq_ignore_case(mstrv_lit(MONGOCRYPT_QUERY_TYPE_SUFFIXPREVIEW_DEPRECATED_STR), qtv)
39+
|| mstr_eq_ignore_case(mstrv_lit(MONGOCRYPT_QUERY_TYPE_SUFFIX_STR), qtv)) {
40+
*out = SUPPORTS_SUFFIX_QUERIES;
41+
} else if (mstr_eq_ignore_case(mstrv_lit(MONGOCRYPT_QUERY_TYPE_PREFIXPREVIEW_DEPRECATED_STR), qtv)
42+
|| mstr_eq_ignore_case(mstrv_lit(MONGOCRYPT_QUERY_TYPE_PREFIX_STR), qtv)) {
43+
*out = SUPPORTS_PREFIX_QUERIES;
4244
} else {
4345
return false;
4446
}
@@ -240,8 +242,7 @@ bool mc_EncryptedFieldConfig_parse(mc_EncryptedFieldConfig_t *efc,
240242

241243
if (!bson_iter_init_find(&iter, efc_bson, "strEncodeVersion")) {
242244
if (all_supported_queries
243-
& (SUPPORTS_SUBSTRING_PREVIEW_QUERIES | SUPPORTS_SUFFIX_PREVIEW_QUERIES
244-
| SUPPORTS_PREFIX_PREVIEW_QUERIES)) {
245+
& (SUPPORTS_SUBSTRING_PREVIEW_QUERIES | SUPPORTS_SUFFIX_QUERIES | SUPPORTS_PREFIX_QUERIES)) {
245246
// Has at least one text search query type, set to latest by default.
246247
efc->str_encode_version = LATEST_STR_ENCODE_VERSION;
247248
} else {

src/mc-textopts.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -366,11 +366,11 @@ bool mc_TextOpts_to_FLE2TextSearchInsertSpec_for_query(const mc_TextOpts_t *txo,
366366
CLIENT_ERR("Unexpected query type: %s\n", _mongocrypt_query_type_to_string(query_type));
367367
return false;
368368
}
369-
case MONGOCRYPT_QUERY_TYPE_PREFIXPREVIEW: {
369+
case MONGOCRYPT_QUERY_TYPE_PREFIX: {
370370
include_prefix = true;
371371
break;
372372
}
373-
case MONGOCRYPT_QUERY_TYPE_SUFFIXPREVIEW: {
373+
case MONGOCRYPT_QUERY_TYPE_SUFFIX: {
374374
include_suffix = true;
375375
break;
376376
}

src/mongocrypt-ctx-encrypt.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -890,8 +890,8 @@ static moe_result must_omit_encryptionInformation(const char *command_name,
890890
bool has_fields_requiring_ei = false;
891891
for (const mc_EncryptedField_t *ef = efc->fields; ef != NULL; ef = ef->next) {
892892
if (ef->supported_queries
893-
& (SUPPORTS_RANGE_QUERIES | SUPPORTS_SUBSTRING_PREVIEW_QUERIES | SUPPORTS_SUFFIX_PREVIEW_QUERIES
894-
| SUPPORTS_PREFIX_PREVIEW_QUERIES)) {
893+
& (SUPPORTS_RANGE_QUERIES | SUPPORTS_SUBSTRING_PREVIEW_QUERIES | SUPPORTS_SUFFIX_QUERIES
894+
| SUPPORTS_PREFIX_QUERIES)) {
895895
has_fields_requiring_ei = true;
896896
break;
897897
}
@@ -1011,8 +1011,8 @@ static bool _fle2_append_compactionTokens(mongocrypt_t *crypt,
10111011
const _mongocrypt_buffer_t *ecoct_buf = mc_ECOCToken_get(ecoct);
10121012

10131013
if (ptr->supported_queries
1014-
& (SUPPORTS_RANGE_QUERIES | SUPPORTS_SUBSTRING_PREVIEW_QUERIES | SUPPORTS_SUFFIX_PREVIEW_QUERIES
1015-
| SUPPORTS_PREFIX_PREVIEW_QUERIES)) {
1014+
& (SUPPORTS_RANGE_QUERIES | SUPPORTS_SUBSTRING_PREVIEW_QUERIES | SUPPORTS_SUFFIX_QUERIES
1015+
| SUPPORTS_PREFIX_QUERIES)) {
10161016
// Append the document {ecoc: <ECOCToken>, anchorPaddingToken: <AnchorPaddingTokenRoot>}
10171017
esct = mc_ESCToken_new(crypto, cl1t, status);
10181018
if (!esct) {
@@ -1520,8 +1520,8 @@ static bool _fle2_finalize_explicit(mongocrypt_ctx_t *ctx, mongocrypt_binary_t *
15201520
_mongocrypt_ctx_fail_w_msg(ctx, "Cannot use rangePreview query type with Range V2");
15211521
goto fail;
15221522
// fallthrough
1523-
case MONGOCRYPT_QUERY_TYPE_PREFIXPREVIEW:
1524-
case MONGOCRYPT_QUERY_TYPE_SUFFIXPREVIEW:
1523+
case MONGOCRYPT_QUERY_TYPE_SUFFIX:
1524+
case MONGOCRYPT_QUERY_TYPE_PREFIX:
15251525
case MONGOCRYPT_QUERY_TYPE_SUBSTRINGPREVIEW:
15261526
case MONGOCRYPT_QUERY_TYPE_RANGE:
15271527
case MONGOCRYPT_QUERY_TYPE_EQUALITY: marking.u.fle2.type = MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_FIND; break;
@@ -2087,14 +2087,14 @@ static bool explicit_encrypt_init(mongocrypt_ctx_t *ctx, mongocrypt_binary_t *ms
20872087

20882088
if (ctx->opts.query_type.set) {
20892089
const mongocrypt_query_type_t qt = ctx->opts.query_type.value;
2090-
if (qt == MONGOCRYPT_QUERY_TYPE_PREFIXPREVIEW) {
2090+
if (qt == MONGOCRYPT_QUERY_TYPE_PREFIX) {
20912091
if (!(ctx->opts.index_type.set && ctx->opts.index_type.value == MONGOCRYPT_INDEX_TYPE_TEXTPREVIEW)) {
2092-
return _mongocrypt_ctx_fail_w_msg(ctx, "prefixPreview query type requires textPreview index type");
2092+
return _mongocrypt_ctx_fail_w_msg(ctx, "prefix query type requires textPreview index type");
20932093
}
20942094
}
2095-
if (qt == MONGOCRYPT_QUERY_TYPE_SUFFIXPREVIEW) {
2095+
if (qt == MONGOCRYPT_QUERY_TYPE_SUFFIX) {
20962096
if (!(ctx->opts.index_type.set && ctx->opts.index_type.value == MONGOCRYPT_INDEX_TYPE_TEXTPREVIEW)) {
2097-
return _mongocrypt_ctx_fail_w_msg(ctx, "suffixPreview query type requires textPreview index type");
2097+
return _mongocrypt_ctx_fail_w_msg(ctx, "suffix query type requires textPreview index type");
20982098
}
20992099
}
21002100
if (qt == MONGOCRYPT_QUERY_TYPE_SUBSTRINGPREVIEW) {
@@ -2180,8 +2180,8 @@ static bool explicit_encrypt_init(mongocrypt_ctx_t *ctx, mongocrypt_binary_t *ms
21802180
matches = (ctx->opts.index_type.value == MONGOCRYPT_INDEX_TYPE_EQUALITY);
21812181
break;
21822182
// fallthrough
2183-
case MONGOCRYPT_QUERY_TYPE_PREFIXPREVIEW:
2184-
case MONGOCRYPT_QUERY_TYPE_SUFFIXPREVIEW:
2183+
case MONGOCRYPT_QUERY_TYPE_PREFIX:
2184+
case MONGOCRYPT_QUERY_TYPE_SUFFIX:
21852185
case MONGOCRYPT_QUERY_TYPE_SUBSTRINGPREVIEW:
21862186
matches = (ctx->opts.index_type.value == MONGOCRYPT_INDEX_TYPE_TEXTPREVIEW);
21872187
break;

src/mongocrypt-ctx-private.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ typedef enum _mongocrypt_query_type_t {
4444
MONGOCRYPT_QUERY_TYPE_EQUALITY = 1,
4545
MONGOCRYPT_QUERY_TYPE_RANGE = 2,
4646
MONGOCRYPT_QUERY_TYPE_RANGEPREVIEW_DEPRECATED = 3,
47-
MONGOCRYPT_QUERY_TYPE_PREFIXPREVIEW = 4,
48-
MONGOCRYPT_QUERY_TYPE_SUFFIXPREVIEW = 5,
47+
MONGOCRYPT_QUERY_TYPE_PREFIX = 4,
48+
MONGOCRYPT_QUERY_TYPE_SUFFIX = 5,
4949
MONGOCRYPT_QUERY_TYPE_SUBSTRINGPREVIEW = 6,
5050
} mongocrypt_query_type_t;
5151

src/mongocrypt-ctx.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,11 +1021,21 @@ bool mongocrypt_ctx_setopt_query_type(mongocrypt_ctx_t *ctx, const char *query_t
10211021
} else if (mstr_eq_ignore_case(qt_str, mstrv_lit(MONGOCRYPT_QUERY_TYPE_RANGEPREVIEW_DEPRECATED_STR))) {
10221022
_mongocrypt_ctx_fail_w_msg(ctx, "Query type 'rangePreview' is deprecated, please use 'range'");
10231023
return false;
1024-
} else if (mstr_eq_ignore_case(qt_str, mstrv_lit(MONGOCRYPT_QUERY_TYPE_PREFIXPREVIEW_STR))) {
1025-
ctx->opts.query_type.value = MONGOCRYPT_QUERY_TYPE_PREFIXPREVIEW;
1024+
} else if (mstr_eq_ignore_case(qt_str, mstrv_lit(MONGOCRYPT_QUERY_TYPE_PREFIX_STR))) {
1025+
ctx->opts.query_type.value = MONGOCRYPT_QUERY_TYPE_PREFIX;
10261026
ctx->opts.query_type.set = true;
1027-
} else if (mstr_eq_ignore_case(qt_str, mstrv_lit(MONGOCRYPT_QUERY_TYPE_SUFFIXPREVIEW_STR))) {
1028-
ctx->opts.query_type.value = MONGOCRYPT_QUERY_TYPE_SUFFIXPREVIEW;
1027+
} else if (mstr_eq_ignore_case(qt_str, mstrv_lit(MONGOCRYPT_QUERY_TYPE_SUFFIX_STR))) {
1028+
ctx->opts.query_type.value = MONGOCRYPT_QUERY_TYPE_SUFFIX;
1029+
ctx->opts.query_type.set = true;
1030+
} else if (mstr_eq_ignore_case(qt_str, mstrv_lit(MONGOCRYPT_QUERY_TYPE_PREFIXPREVIEW_DEPRECATED_STR))) {
1031+
// TODO: MONGOCRYPT-870 disallow prefixPreview
1032+
// _mongocrypt_ctx_fail_w_msg(ctx, "Query type 'prefixPreview' is deprecated, please use 'prefix'");
1033+
ctx->opts.query_type.value = MONGOCRYPT_QUERY_TYPE_PREFIX;
1034+
ctx->opts.query_type.set = true;
1035+
} else if (mstr_eq_ignore_case(qt_str, mstrv_lit(MONGOCRYPT_QUERY_TYPE_SUFFIXPREVIEW_DEPRECATED_STR))) {
1036+
// TODO: MONGOCRYPT-870 disallow suffixPreview
1037+
// _mongocrypt_ctx_fail_w_msg(ctx, "Query type 'suffixPreview' is deprecated, please use 'suffix'");
1038+
ctx->opts.query_type.value = MONGOCRYPT_QUERY_TYPE_SUFFIX;
10291039
ctx->opts.query_type.set = true;
10301040
} else if (mstr_eq_ignore_case(qt_str, mstrv_lit(MONGOCRYPT_QUERY_TYPE_SUBSTRINGPREVIEW_STR))) {
10311041
ctx->opts.query_type.value = MONGOCRYPT_QUERY_TYPE_SUBSTRINGPREVIEW;
@@ -1058,8 +1068,8 @@ const char *_mongocrypt_query_type_to_string(mongocrypt_query_type_t val) {
10581068
case MONGOCRYPT_QUERY_TYPE_EQUALITY: return "Equality";
10591069
case MONGOCRYPT_QUERY_TYPE_RANGEPREVIEW_DEPRECATED: return "RangePreview";
10601070
case MONGOCRYPT_QUERY_TYPE_RANGE: return "Range";
1061-
case MONGOCRYPT_QUERY_TYPE_PREFIXPREVIEW: return "PrefixPreview";
1062-
case MONGOCRYPT_QUERY_TYPE_SUFFIXPREVIEW: return "SuffixPreview";
1071+
case MONGOCRYPT_QUERY_TYPE_PREFIX: return "Prefix";
1072+
case MONGOCRYPT_QUERY_TYPE_SUFFIX: return "Suffix";
10631073
case MONGOCRYPT_QUERY_TYPE_SUBSTRINGPREVIEW: return "SubstringPreview";
10641074
default: return "Unknown";
10651075
}

src/mongocrypt.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,9 +1599,11 @@ bool mongocrypt_setopt_key_expiration(mongocrypt_t *crypt, uint64_t cache_expira
15991599
#define MONGOCRYPT_QUERY_TYPE_RANGE_STR "range"
16001600
/// NOTE: "substringPreview" is experimental and may be removed in a future non-major release.
16011601
#define MONGOCRYPT_QUERY_TYPE_SUBSTRINGPREVIEW_STR "substringPreview"
1602-
/// NOTE: "suffixPreview" is experimental and may be removed in a future non-major release.
1603-
#define MONGOCRYPT_QUERY_TYPE_SUFFIXPREVIEW_STR "suffixPreview"
1604-
/// NOTE: "prefixPreview" is experimental and may be removed in a future non-major release.
1605-
#define MONGOCRYPT_QUERY_TYPE_PREFIXPREVIEW_STR "prefixPreview"
1602+
/// DEPRECATED: Support for "suffixPreview" has been removed in favor of "suffix"
1603+
#define MONGOCRYPT_QUERY_TYPE_SUFFIXPREVIEW_DEPRECATED_STR "suffixPreview"
1604+
#define MONGOCRYPT_QUERY_TYPE_SUFFIX_STR "suffix"
1605+
/// DEPRECATED: Support for "prefixPreview" has been removed in favor of "suffix"
1606+
#define MONGOCRYPT_QUERY_TYPE_PREFIXPREVIEW_DEPRECATED_STR "prefixPreview"
1607+
#define MONGOCRYPT_QUERY_TYPE_PREFIX_STR "prefix"
16061608

16071609
#endif /* MONGOCRYPT_H */

test/data/efc/efc-textSearchFields.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,30 @@
4242
}
4343
}
4444
]
45+
},
46+
{
47+
"keyId": {
48+
"$binary": {
49+
"base64": "EjRWeBI0mHYSNBI0VqvN7w==",
50+
"subType": "04"
51+
}
52+
},
53+
"path": "middleName",
54+
"bsonType": "string",
55+
"queries": [
56+
{
57+
"queryType": "suffix",
58+
"contention": {
59+
"$numberLong": "0"
60+
}
61+
},
62+
{
63+
"queryType": "prefix",
64+
"contention": {
65+
"$numberLong": "0"
66+
}
67+
}
68+
]
4569
}
4670
]
4771
}

test/test-mc-efc.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@ static void _test_efc(_mongocrypt_tester_t *tester) {
3030
mongocrypt_status_t *status = mongocrypt_status_new();
3131
_mongocrypt_buffer_t expect_keyId1;
3232
_mongocrypt_buffer_t expect_keyId2;
33+
_mongocrypt_buffer_t expect_keyId3;
3334

3435
_mongocrypt_buffer_copy_from_hex(&expect_keyId1, "12345678123498761234123456789012");
3536
_mongocrypt_buffer_copy_from_hex(&expect_keyId2, "abcdefab123498761234123456789012");
37+
_mongocrypt_buffer_copy_from_hex(&expect_keyId3, "12345678123498761234123456abcdef");
3638

3739
{
3840
_load_test_file(tester, "./test/data/efc/efc-oneField.json", &efc_bson);
@@ -110,9 +112,14 @@ static void _test_efc(_mongocrypt_tester_t *tester) {
110112
ASSERT_CMPUINT8(efc.str_encode_version, ==, LATEST_STR_ENCODE_VERSION);
111113
ptr = efc.fields;
112114
ASSERT(ptr);
115+
ASSERT_STREQUAL(ptr->path, "middleName");
116+
ASSERT_CMPBUF(expect_keyId3, ptr->keyId);
117+
ASSERT(ptr->supported_queries == (SUPPORTS_SUFFIX_QUERIES | SUPPORTS_PREFIX_QUERIES));
118+
ASSERT(ptr->next != NULL);
119+
ptr = ptr->next;
113120
ASSERT_STREQUAL(ptr->path, "lastName");
114121
ASSERT_CMPBUF(expect_keyId2, ptr->keyId);
115-
ASSERT(ptr->supported_queries == (SUPPORTS_SUFFIX_PREVIEW_QUERIES | SUPPORTS_PREFIX_PREVIEW_QUERIES));
122+
ASSERT(ptr->supported_queries == (SUPPORTS_SUFFIX_QUERIES | SUPPORTS_PREFIX_QUERIES));
116123
ASSERT(ptr->next != NULL);
117124
ptr = ptr->next;
118125
ASSERT_STREQUAL(ptr->path, "firstName");
@@ -130,7 +137,7 @@ static void _test_efc(_mongocrypt_tester_t *tester) {
130137
ASSERT(ptr);
131138
ASSERT_STREQUAL(ptr->path, "lastName");
132139
ASSERT_CMPBUF(expect_keyId2, ptr->keyId);
133-
ASSERT(ptr->supported_queries == (SUPPORTS_SUFFIX_PREVIEW_QUERIES | SUPPORTS_PREFIX_PREVIEW_QUERIES));
140+
ASSERT(ptr->supported_queries == (SUPPORTS_SUFFIX_QUERIES | SUPPORTS_PREFIX_QUERIES));
134141
ASSERT(ptr->next != NULL);
135142
ptr = ptr->next;
136143
ASSERT_STREQUAL(ptr->path, "firstName");
@@ -158,6 +165,7 @@ static void _test_efc(_mongocrypt_tester_t *tester) {
158165
_mongocrypt_status_reset(status);
159166
}
160167

168+
_mongocrypt_buffer_cleanup(&expect_keyId3);
161169
_mongocrypt_buffer_cleanup(&expect_keyId2);
162170
_mongocrypt_buffer_cleanup(&expect_keyId1);
163171
mongocrypt_status_destroy(status);

test/test-mc-textopts.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ static void test_mc_TextOpts_to_FLE2TextSearchInsertSpec_for_query(_mongocrypt_t
255255
"prefix" : {"strMinQueryLength" : 3, "strMaxQueryLength" : 8}
256256
}),
257257
.v = RAW_STRING({"v" : "test"}),
258-
.qt = MONGOCRYPT_QUERY_TYPE_PREFIXPREVIEW,
258+
.qt = MONGOCRYPT_QUERY_TYPE_PREFIX,
259259
.expect =
260260
RAW_STRING({"v" : {"v" : "test", "casef" : true, "diacf" : false, "prefix" : {"ub" : 8, "lb" : 3}}})},
261261
{.desc = "Works with suffix",
@@ -265,7 +265,7 @@ static void test_mc_TextOpts_to_FLE2TextSearchInsertSpec_for_query(_mongocrypt_t
265265
"suffix" : {"strMinQueryLength" : 3, "strMaxQueryLength" : 8}
266266
}),
267267
.v = RAW_STRING({"v" : "test"}),
268-
.qt = MONGOCRYPT_QUERY_TYPE_SUFFIXPREVIEW,
268+
.qt = MONGOCRYPT_QUERY_TYPE_SUFFIX,
269269
.expect =
270270
RAW_STRING({"v" : {"v" : "test", "casef" : true, "diacf" : false, "suffix" : {"ub" : 8, "lb" : 3}}})},
271271
{.desc = "Works with prefix + suffix when querying prefix",
@@ -276,7 +276,7 @@ static void test_mc_TextOpts_to_FLE2TextSearchInsertSpec_for_query(_mongocrypt_t
276276
"suffix" : {"strMinQueryLength" : 3, "strMaxQueryLength" : 8}
277277
}),
278278
.v = RAW_STRING({"v" : "test"}),
279-
.qt = MONGOCRYPT_QUERY_TYPE_PREFIXPREVIEW,
279+
.qt = MONGOCRYPT_QUERY_TYPE_PREFIX,
280280
.expect =
281281
RAW_STRING({"v" : {"v" : "test", "casef" : true, "diacf" : false, "prefix" : {"ub" : 9, "lb" : 4}}})},
282282
{.desc = "Works with prefix + suffix when querying suffix",
@@ -287,7 +287,7 @@ static void test_mc_TextOpts_to_FLE2TextSearchInsertSpec_for_query(_mongocrypt_t
287287
"suffix" : {"strMinQueryLength" : 3, "strMaxQueryLength" : 8}
288288
}),
289289
.v = RAW_STRING({"v" : "test"}),
290-
.qt = MONGOCRYPT_QUERY_TYPE_SUFFIXPREVIEW,
290+
.qt = MONGOCRYPT_QUERY_TYPE_SUFFIX,
291291
.expect =
292292
RAW_STRING({"v" : {"v" : "test", "casef" : true, "diacf" : false, "suffix" : {"ub" : 8, "lb" : 3}}})},
293293
};

0 commit comments

Comments
 (0)