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 84f9a93bd fix(search): support number literal for tag fields (#3096)
84f9a93bd is described below

commit 84f9a93bd8c296638dd5a221502c26cf7d51b7d8
Author: zhenghaoz <[email protected]>
AuthorDate: Thu Aug 7 09:57:51 2025 +0800

    fix(search): support number literal for tag fields (#3096)
    
    Co-authored-by: Twice <[email protected]>
---
 src/search/redis_query_parser.h         |  2 +-
 src/search/redis_query_transformer.h    |  2 ++
 tests/gocase/unit/search/search_test.go | 21 +++++++++++++++++++++
 3 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/src/search/redis_query_parser.h b/src/search/redis_query_parser.h
index 627910a39..b5786950e 100644
--- a/src/search/redis_query_parser.h
+++ b/src/search/redis_query_parser.h
@@ -39,7 +39,7 @@ struct Field : seq<one<'@'>, Identifier> {};
 
 struct Param : seq<one<'$'>, Identifier> {};
 
-struct Tag : sor<Identifier, StringL, Param> {};
+struct Tag : sor<Identifier, StringL, Param, Number> {};
 struct TagList : seq<one<'{'>, WSPad<Tag>, star<seq<one<'|'>, WSPad<Tag>>>, 
one<'}'>> {};
 
 struct NumberOrParam : sor<Number, Param> {};
diff --git a/src/search/redis_query_transformer.h 
b/src/search/redis_query_transformer.h
index 7cc3a9030..4ff0726f4 100644
--- a/src/search/redis_query_transformer.h
+++ b/src/search/redis_query_transformer.h
@@ -99,6 +99,8 @@ struct Transformer : ir::TreeTransformer {
             tag_str = GET_OR_RET(UnescapeString(tag->string()));
           } else if (Is<Param>(tag)) {
             tag_str = GET_OR_RET(GetParam(tag));
+          } else if (Is<Number>(tag)) {
+            tag_str = tag->string();
           } else {
             return {Status::NotOK, "encountered invalid tag"};
           }
diff --git a/tests/gocase/unit/search/search_test.go 
b/tests/gocase/unit/search/search_test.go
index 241cd966f..905094d4e 100644
--- a/tests/gocase/unit/search/search_test.go
+++ b/tests/gocase/unit/search/search_test.go
@@ -233,3 +233,24 @@ func TestSearch(t *testing.T) {
                require.Equal(t, "test_expired:k3", 
res.Val().([]interface{})[1])
        })
 }
+
+func TestSearchTag(t *testing.T) {
+       srv := util.StartServer(t, map[string]string{})
+       defer srv.Close()
+
+       ctx := context.Background()
+       rdb := srv.NewClient()
+       defer func() { require.NoError(t, rdb.Close()) }()
+
+       t.Run("FT.SEARCH with number literal tags", func(t *testing.T) {
+               require.NoError(t, rdb.Do(ctx, "FT.CREATE", "testidx_number", 
"ON", "HASH", "PREFIX", "1", "testidx_number:", "SCHEMA", "a", "TAG").Err())
+               require.NoError(t, rdb.Do(ctx, "HSET", "testidx_number:k1", 
"a", "3.1415926").Err())
+
+               res := rdb.Do(ctx, "FT.SEARCH", "testidx_number", 
`@a:{3.1415926}`)
+               require.NoError(t, res.Err())
+               // result should be [1 testidx_number:k1 [a 3.1415926]]
+               require.Equal(t, 3, len(res.Val().([]interface{})))
+               require.Equal(t, int64(1), res.Val().([]interface{})[0])
+               require.Equal(t, "testidx_number:k1", 
res.Val().([]interface{})[1])
+       })
+}

Reply via email to