فهرست منبع

Merge pull request #684 from vecmezoni/null-varint

Correctly handle null value for varint type
Chris Bannister 9 سال پیش
والد
کامیت
ec04c133f5
5فایلهای تغییر یافته به همراه32 افزوده شده و 3 حذف شده
  1. 2 1
      .gitignore
  2. 2 1
      AUTHORS
  3. 22 0
      cassandra_test.go
  4. 1 1
      marshal.go
  5. 5 0
      marshal_test.go

+ 2 - 1
.gitignore

@@ -1,4 +1,5 @@
 gocql-fuzz
 gocql-fuzz
 fuzz-corpus
 fuzz-corpus
 fuzz-work
 fuzz-work
-gocql.test
+gocql.test
+.idea

+ 2 - 1
AUTHORS

@@ -64,4 +64,5 @@ Artem Chernyshev <artem.0xD2@gmail.com>
 Ference Fu <fym201@msn.com>
 Ference Fu <fym201@msn.com>
 LOVOO <opensource@lovoo.com>
 LOVOO <opensource@lovoo.com>
 nikandfor <nikandfor@gmail.com>
 nikandfor <nikandfor@gmail.com>
-Anthony Woods <awoods@raintank.io>
+Anthony Woods <awoods@raintank.io>
+Alexander Inozemtsev <alexander.inozemtsev@gmail.com>

+ 22 - 0
cassandra_test.go

@@ -1363,6 +1363,28 @@ func TestVarint(t *testing.T) {
 		t.Errorf("Expected -1, was %d", result)
 		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 {
 	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)
 		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)
 	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))
 		int64Val -= (1 << uint(len(data)*8))
 	}
 	}
 	return unmarshalIntlike(info, int64Val, data, value)
 	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"),
 		[]byte("f\x1e\xfd\xf2\xe3\xb1\x9f|\x04_\x15"),
 		bigintize("123456789123456789123456789"), // From the datastax/python-driver test suite
 		bigintize("123456789123456789123456789"), // From the datastax/python-driver test suite
 	},
 	},
+	{
+		NativeType{proto: 2, typ: TypeVarint},
+		[]byte(nil),
+		nil,
+	},
 	{
 	{
 		NativeType{proto: 2, typ: TypeInet},
 		NativeType{proto: 2, typ: TypeInet},
 		[]byte("\x7F\x00\x00\x01"),
 		[]byte("\x7F\x00\x00\x01"),