{"record":{"id":"e34391a5b5908e75","repo":"redis/go-redis","slug":"invalid-field-value-format","errorCode":null,"errorMessage":"invalid field value format","messagePattern":"invalid field value format","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"search_commands.go","lineNumber":2678,"sourceCode":"\t\t\tfields, ok := data[i].([]interface{})\n\t\t\tif !ok {\n\t\t\t\tif data[i] == proto.Nil || data[i] == nil {\n\t\t\t\t\tdoc.Error = proto.Nil\n\t\t\t\t\tdoc.Fields = map[string]string{}\n\t\t\t\t\tfields = []interface{}{}\n\t\t\t\t} else {\n\t\t\t\t\treturn FTSearchResult{}, fmt.Errorf(\"invalid document fields format\")\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor j := 0; j < len(fields); j += 2 {\n\t\t\t\tkey, ok := fields[j].(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn FTSearchResult{}, fmt.Errorf(\"invalid field key format\")\n\t\t\t\t}\n\t\t\t\tvalue, ok := fields[j+1].(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn FTSearchResult{}, fmt.Errorf(\"invalid field value format\")\n\t\t\t\t}\n\t\t\t\tdoc.Fields[key] = value\n\t\t\t}\n\t\t\ti++\n\t\t}\n\n\t\tresults = append(results, doc)\n\t}\n\treturn FTSearchResult{\n\t\tTotal: int(total),\n\t\tDocs:  results,\n\t}, nil\n}\n\ntype FTSearchCmd struct {\n\tbaseCmd\n\tval     FTSearchResult\n\toptions *FTSearchOptions","sourceCodeStart":2660,"sourceCodeEnd":2696,"githubUrl":"https://github.com/redis/go-redis/blob/c5cad058c72f58370553b48566302303cf8a2e89/search_commands.go#L2660-L2696","documentation":"Inside the FT.SEARCH fields array, every odd-position element (the field value) must be a string. RediSearch returns field values as bulk strings; any other Go type at that position (int64, nil, nested array) makes the parser abort with this error.","triggerScenarios":"FTSearch reply where a field value decodes to a non-string — e.g. numeric fields returned as RESP integers by a patched/proxied server, nil values, or mocks using non-string values.","commonSituations":"Proxies or middleware altering value encoding; hand-written mocks storing ints/floats for field values; module versions or third-party Redis forks changing field encoding.","solutions":["Inspect the raw reply to find the non-string value","Fix the mock/proxy so all field values are bulk strings","Confirm you're on genuine Redis Stack / RediSearch (not a fork altering encodings)","Upgrade go-redis in case a newer parser handles your server's encoding"],"exampleFix":"// before: mock uses an int field value\nmock := []interface{}{int64(1), \"doc:1\", []interface{}{\"count\", 42}}\n\n// after: values must be strings (as RediSearch sends them)\nmock := []interface{}{int64(1), \"doc:1\", []interface{}{\"count\", \"42\"}}","handlingStrategy":"validation","validationCode":"// All field values in mocks must be strings, mirroring bulk-string encoding\nfor j := 1; j < len(fields); j += 2 {\n\tif _, ok := fields[j].(string); !ok {\n\t\tpanic(\"field values must be strings\")\n\t}\n}","typeGuard":"func isStringValue(v interface{}) bool {\n\t_, ok := v.(string)\n\treturn ok\n}","tryCatchPattern":"res, err := rdb.FTSearch(ctx, \"idx\", q).Result()\nif err != nil {\n\tif strings.Contains(err.Error(), \"invalid field value\") {\n\t\tlog.Printf(\"non-string field value in reply: %v\", err)\n\t\treturn fallbackDocs, nil\n\t}\n\treturn err\n}","preventionTips":["Encode numeric field values as strings in mocks (RediSearch sends bulk strings)","Verify no fork/proxy is returning integer-encoded field values","Upgrade go-redis if a newer parser supports your server's encoding"],"tags":["go-redis","ftsearch","resp-parsing","fields"],"backgroundTag":"resp-reply-parse-failed","analyzedSha":"c5cad058c72f58370553b48566302303cf8a2e89","analyzedAt":"2026-09-01T06:50:53.388Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}