This is an automated email from the ASF dual-hosted git repository.
twice pushed a commit to branch unstable
in repository https://gitbox.apache.org/repos/asf/kvrocks.git
The following commit(s) were added to refs/heads/unstable by this push:
new 173ce0cd9 fix(search): convert query tag to lowercase if case
insensitive (#3118)
173ce0cd9 is described below
commit 173ce0cd9ed76ada49323af46bd1b05a629e0e75
Author: zhenghaoz <[email protected]>
AuthorDate: Sat Aug 16 16:38:17 2025 +0800
fix(search): convert query tag to lowercase if case insensitive (#3118)
Co-authored-by: Twice <[email protected]>
---
src/search/passes/index_selection.h | 3 +++
tests/gocase/unit/search/search_test.go | 13 +++++++++++++
2 files changed, 16 insertions(+)
diff --git a/src/search/passes/index_selection.h
b/src/search/passes/index_selection.h
index 60690ff0a..c7cde7faf 100644
--- a/src/search/passes/index_selection.h
+++ b/src/search/passes/index_selection.h
@@ -146,6 +146,9 @@ struct IndexSelection : Visitor {
std::unique_ptr<PlanOperator> VisitExpr(TagContainExpr *node) const {
if (node->field->info->HasIndex()) {
+ if
(!node->field->info->MetadataAs<redis::TagFieldMetadata>()->case_sensitive) {
+ return
std::make_unique<TagFieldScan>(node->field->CloneAs<FieldRef>(),
util::ToLower(node->tag->val));
+ }
return std::make_unique<TagFieldScan>(node->field->CloneAs<FieldRef>(),
node->tag->val);
}
diff --git a/tests/gocase/unit/search/search_test.go
b/tests/gocase/unit/search/search_test.go
index 184bf3152..fef82260f 100644
--- a/tests/gocase/unit/search/search_test.go
+++ b/tests/gocase/unit/search/search_test.go
@@ -273,4 +273,17 @@ func TestSearchTag(t *testing.T) {
require.Equal(t, int64(1), res.Val().([]interface{})[0])
require.Equal(t, "testidx_escape:k2",
res.Val().([]interface{})[1])
})
+
+ t.Run("FT.SEARCH with case insensitive tags", func(t *testing.T) {
+ require.NoError(t, rdb.Do(ctx, "FT.CREATE",
"testidx_case_insensitive", "ON", "HASH", "PREFIX", "1",
"testidx_case_insensitive:", "SCHEMA", "a", "TAG").Err())
+ require.NoError(t, rdb.Do(ctx, "HSET",
"testidx_case_insensitive:k1", "a", "Aa").Err())
+ require.NoError(t, rdb.Do(ctx, "HSET",
"testidx_case_insensitive:k2", "a", "Ab").Err())
+
+ res := rdb.Do(ctx, "FT.SEARCH", "testidx_case_insensitive",
`@a:{Ab}`)
+ require.NoError(t, res.Err())
+ // result should be [1 testidx_case_insensitive:k2 [a Ab]]
+ require.Equal(t, 3, len(res.Val().([]interface{})))
+ require.Equal(t, int64(1), res.Val().([]interface{})[0])
+ require.Equal(t, "testidx_case_insensitive:k2",
res.Val().([]interface{})[1])
+ })
}