浏览代码

Merge pull request #758 from penberg/fix-unmarshal-udt

marshal: Fix unmarshalUDT for less values than UDT fields
Chris Bannister 9 年之前
父节点
当前提交
0b08419acd
共有 3 个文件被更改,包括 46 次插入0 次删除
  1. 1 0
      AUTHORS
  2. 6 0
      marshal.go
  3. 39 0
      udt_test.go

+ 1 - 0
AUTHORS

@@ -73,3 +73,4 @@ Michael Highstead <highstead@gmail.com>
 Sarah Brown <esbie.is@gmail.com>
 Sarah Brown <esbie.is@gmail.com>
 Caleb Doxsey <caleb@datadoghq.com>
 Caleb Doxsey <caleb@datadoghq.com>
 Frederic Hemery <frederic.hemery@datadoghq.com>
 Frederic Hemery <frederic.hemery@datadoghq.com>
+Pekka Enberg <penberg@scylladb.com>

+ 6 - 0
marshal.go

@@ -1651,6 +1651,9 @@ func unmarshalUDT(info TypeInfo, data []byte, value interface{}) error {
 		udt := info.(UDTTypeInfo)
 		udt := info.(UDTTypeInfo)
 
 
 		for _, e := range udt.Elements {
 		for _, e := range udt.Elements {
+			if len(data) == 0 {
+				return nil
+			}
 			size := readInt(data[:4])
 			size := readInt(data[:4])
 			data = data[4:]
 			data = data[4:]
 
 
@@ -1689,6 +1692,9 @@ func unmarshalUDT(info TypeInfo, data []byte, value interface{}) error {
 		m := *v
 		m := *v
 
 
 		for _, e := range udt.Elements {
 		for _, e := range udt.Elements {
+			if len(data) == 0 {
+				return nil
+			}
 			size := readInt(data[:4])
 			size := readInt(data[:4])
 			data = data[4:]
 			data = data[4:]
 
 

+ 39 - 0
udt_test.go

@@ -503,3 +503,42 @@ func TestUDT_UpdateField(t *testing.T) {
 		t.Errorf("expected %+v: got %+v", *writeCol, *readCol)
 		t.Errorf("expected %+v: got %+v", *writeCol, *readCol)
 	}
 	}
 }
 }
+
+func TestUDT_ScanNullUDT(t *testing.T) {
+	if *flagProto < protoVersion3 {
+		t.Skip("UDT are only available on protocol >= 3")
+	}
+
+	session := createSession(t)
+	defer session.Close()
+
+	err := createTable(session, `CREATE TYPE gocql_test.scan_null_udt_position(
+		lat int,
+		lon int,
+		padding text);`)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	err = createTable(session, `CREATE TABLE gocql_test.scan_null_udt_houses(
+		id int,
+		name text,
+		loc frozen<position>,
+		primary key(id)
+	);`)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	err = session.Query("INSERT INTO scan_null_udt_houses(id, name) VALUES(?, ?)", 1, "test" ).Exec()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	pos := &position{}
+
+	err = session.Query("SELECT loc FROM scan_null_udt_houses WHERE id = ?", 1).Scan(pos)
+	if err != nil {
+		t.Fatal(err)
+	}
+}