diff --git a/server/script.go b/server/script.go index d15dfbd..8e6b14f 100644 --- a/server/script.go +++ b/server/script.go @@ -84,8 +84,25 @@ func (w *luaWriter) writeSliceArray(lst [][]byte) { w.l.CreateTable(len(lst), 0) for i, v := range lst { - w.l.PushString(hack.String(v)) + if v == nil { + w.l.PushBoolean(false) + //TNL: not sure what is "expected" behaviour here. + //Redis returns "false", but may be "nil" is more appropriate? + //For me both variants seems better, then empty string. + // + //w.l.PushNil() + } else { + w.l.PushString(hack.String(v)) + } w.l.RawSeti(-2, i+1) + + /* + //TNL: and instead of push nil we can just skip it + if v != nil { + w.l.PushString(hack.String(v)) + w.l.RawSeti(-2, i+1) + } + */ } } diff --git a/server/script_test.go b/server/script_test.go index 0446bb7..bae27ff 100644 --- a/server/script_test.go +++ b/server/script_test.go @@ -105,6 +105,15 @@ var testScript5 = ` return ledis.call("PING") ` +var testScript6 = ` + ledis.call('hmset', 'zzz', 1, 2, 5, 42) + local a = ledis.call('hmget', 'zzz', 1, 2, 5, 42) + for i = 1, 5 do + a[i] = type(a[i]) + end + return a +` + func TestLuaCall(t *testing.T) { cfg := config.NewConfigDefault() cfg.Addr = ":11188" @@ -187,5 +196,29 @@ func TestLuaCall(t *testing.T) { t.Fatal(fmt.Sprintf("%v %T", v, v)) } + err = app.script.l.DoString(testScript6) + if err != nil { + t.Fatal(err) + } + + v = luaReplyToLedisReply(l) + vv := v.([]interface{}) + expected := []string{ + "string", + "boolean", + "string", + "boolean", + "nil", + } + if len(expected) != len(vv) { + t.Fatalf("length different: %d, %d", len(expected), len(vv)) + } + for i, r := range vv { + s := string(r.([]byte)) + if s != expected[i] { + t.Errorf("reply[%d] expected: %s, actual: %s", i, expected[i], s) + } + } + luaClient.db = nil }