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])
+       })
 }

Reply via email to