diff --git a/backend/internal/handler/instance_detail.go b/backend/internal/handler/instance_detail.go index 90fd0c1..3ff8106 100644 --- a/backend/internal/handler/instance_detail.go +++ b/backend/internal/handler/instance_detail.go @@ -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") }