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 <zhangzheng...@hotmail.com> AuthorDate: Sat Aug 16 16:38:17 2025 +0800 fix(search): convert query tag to lowercase if case insensitive (#3118) Co-authored-by: Twice <twice.m...@gmail.com> --- 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]) + }) }