fix: Redis命令解析支持引号参数(parseCommandParts替代strings.Fields)\n\nstrings.Fields()会将引号当作参数的一部分,导致HGET带引号查询失败\n新增parseCommandParts()函数支持双引号和单引号包裹的参数

This commit is contained in:
logan committed 2026-05-30 14:47:21 +08:00
1 parent c51f619a7d
commit 430a667455
1 file changed
+43 -1
+43 -1
View File
@@ -663,6 +663,48 @@ func executeSQLQuery(instance *model.Instance, dbName string, sqlStr string, lim
}, nil
}
// parseCommandParts splits a command string into parts, respecting quoted strings.
// e.g. HGET "my key" "my field" => ["HGET", "my key", "my field"]
func parseCommandParts(input string) []string {
var parts []string
var current strings.Builder
inQuote := false
quoteChar := byte(0)
for i := 0; i < len(input); i++ {
ch := input[i]
if inQuote {
if ch == quoteChar {
inQuote = false
quoteChar = 0
} else {
current.WriteByte(ch)
}
} else {
switch ch {
case '"', '\'':
if current.Len() > 0 {
parts = append(parts, current.String())
current.Reset()
}
inQuote = true
quoteChar = ch
case ' ', '\t', '\n', '\r':
if current.Len() > 0 {
parts = append(parts, current.String())
current.Reset()
}
default:
current.WriteByte(ch)
}
}
}
if current.Len() > 0 {
parts = append(parts, current.String())
}
return parts
}
func executeRedisQuery(instance *model.Instance, dbSelect string, command string, limit int, offset int) (gin.H, error) {
// Parse Redis DB number from dbSelect (e.g. "0", "1")
redisDB := 0
@@ -680,7 +722,7 @@ func executeRedisQuery(instance *model.Instance, dbSelect string, command string
ctx := context.Background()
parts := strings.Fields(command)
parts := parseCommandParts(command)
if len(parts) == 0 {
return nil, fmt.Errorf("empty command")
}