Bläddra i källkod

correctly handle null varint value

Alexander Inozemtsev 9 år sedan
förälder
incheckning
ffa9aca0da
3 ändrade filer med 28 tillägg och 1 borttagningar
  1. 22 0
      cassandra_test.go
  2. 1 1
      marshal.go
  3. 5 0
      marshal_test.go

+ 22 - 0
cassandra_test.go

@@ -1363,6 +1363,28 @@ func TestVarint(t *testing.T) {
 		t.Errorf("Expected -1, was %d", result)
 	}
 
+	if err := session.Query(`INSERT INTO varint_test (id, test) VALUES (?, ?)`, "id", nil).Exec(); err != nil {
+		t.Fatalf("insert varint: %v", err)
+	}
+
+	if err := session.Query("SELECT test FROM varint_test").Scan(&result); err != nil {
+		t.Fatalf("select from varint_test failed: %v", err)
+	}
+
+	if result != 0 {
+		t.Errorf("Expected 0, was %d", result)
+	}
+
+	var nullableResult *int
+
+	if err := session.Query("SELECT test FROM varint_test").Scan(&nullableResult); err != nil {
+		t.Fatalf("select from varint_test failed: %v", err)
+	}
+
+	if nullableResult != nil {
+		t.Errorf("Expected nil, was %d", nullableResult)
+	}
+
 	if err := session.Query(`INSERT INTO varint_test (id, test) VALUES (?, ?)`, "id", int64(math.MaxInt32)+1).Exec(); err != nil {
 		t.Fatalf("insert varint: %v", err)
 	}

+ 1 - 1
marshal.go

@@ -432,7 +432,7 @@ func unmarshalVarint(info TypeInfo, data []byte, value interface{}) error {
 	}
 
 	int64Val := bytesToInt64(data)
-	if len(data) < 8 && data[0]&0x80 > 0 {
+	if len(data) > 0 && len(data) < 8 && data[0]&0x80 > 0 {
 		int64Val -= (1 << uint(len(data)*8))
 	}
 	return unmarshalIntlike(info, int64Val, data, value)

+ 5 - 0
marshal_test.go

@@ -340,6 +340,11 @@ var marshalTests = []struct {
 		[]byte("f\x1e\xfd\xf2\xe3\xb1\x9f|\x04_\x15"),
 		bigintize("123456789123456789123456789"), // From the datastax/python-driver test suite
 	},
+	{
+		NativeType{proto: 2, typ: TypeVarint},
+		[]byte(nil),
+		nil,
+	},
 	{
 		NativeType{proto: 2, typ: TypeInet},
 		[]byte("\x7F\x00\x00\x01"),