Procházet zdrojové kódy

Handle nil value conversion in scan

Gary Burd před 6 roky
rodič
revize
4632c21b4f
2 změnil soubory, kde provedl 15 přidání a 0 odebrání
  1. 12 0
      redis/scan.go
  2. 3 0
      redis/scan_test.go

+ 12 - 0
redis/scan.go

@@ -52,6 +52,16 @@ func cannotConvert(d reflect.Value, s interface{}) error {
 	return fmt.Errorf("cannot convert from %s to %s", sname, d.Type())
 }
 
+func convertAssignNil(d reflect.Value) (err error) {
+	switch d.Type().Kind() {
+	case reflect.Slice, reflect.Interface:
+		d.Set(reflect.Zero(d.Type()))
+	default:
+		err = cannotConvert(d, nil)
+	}
+	return err
+}
+
 func convertAssignError(d reflect.Value, s Error) (err error) {
 	if d.Kind() == reflect.String {
 		d.SetString(string(s))
@@ -159,6 +169,8 @@ func convertAssignValue(d reflect.Value, s interface{}) (err error) {
 	}
 
 	switch s := s.(type) {
+	case nil:
+		err = convertAssignNil(d)
 	case []byte:
 		err = convertAssignBulkString(d, s)
 	case int64:

+ 3 - 0
redis/scan_test.go

@@ -95,6 +95,9 @@ var scanConversionTests = []struct {
 	{[]interface{}{"1"}, []byte{1}},
 	{[]interface{}{"1"}, []bool{true}},
 
+	{[]interface{}{nil, "2"}, []interface{}{nil, "2"}},
+	{[]interface{}{nil, []byte("2")}, [][]byte{nil, []byte("2")}},
+
 	{[]interface{}{redis.Error("e1")}, []interface{}{redis.Error("e1")}},
 	{[]interface{}{redis.Error("e2")}, [][]byte{[]byte("e2")}},
 	{[]interface{}{redis.Error("e3")}, []string{"e3"}},