Browse Source

Fix readLengthEncodedString() returned []byte had wrong capacity (#766)

fixes #765
INADA Naoki 7 years ago
parent
commit
1a676ac6e4
2 changed files with 29 additions and 1 deletions
  1. 28 0
      driver_test.go
  2. 1 1
      utils.go

+ 28 - 0
driver_test.go

@@ -499,6 +499,34 @@ func TestString(t *testing.T) {
 	})
 }
 
+func TestRawBytes(t *testing.T) {
+	runTests(t, dsn, func(dbt *DBTest) {
+		v1 := []byte("aaa")
+		v2 := []byte("bbb")
+		rows := dbt.mustQuery("SELECT ?, ?", v1, v2)
+		if rows.Next() {
+			var o1, o2 sql.RawBytes
+			if err := rows.Scan(&o1, &o2); err != nil {
+				dbt.Errorf("Got error: %v", err)
+			}
+			if !bytes.Equal(v1, o1) {
+				dbt.Errorf("expected %v, got %v", v1, o1)
+			}
+			if !bytes.Equal(v2, o2) {
+				dbt.Errorf("expected %v, got %v", v2, o2)
+			}
+			// https://github.com/go-sql-driver/mysql/issues/765
+			// Appending to RawBytes shouldn't overwrite next RawBytes.
+			o1 = append(o1, "xyzzy"...)
+			if !bytes.Equal(v2, o2) {
+				dbt.Errorf("expected %v, got %v", v2, o2)
+			}
+		} else {
+			dbt.Errorf("no data")
+		}
+	})
+}
+
 type testValuer struct {
 	value string
 }

+ 1 - 1
utils.go

@@ -537,7 +537,7 @@ func readLengthEncodedString(b []byte) ([]byte, bool, int, error) {
 
 	// Check data length
 	if len(b) >= n {
-		return b[n-int(num) : n], false, n, nil
+		return b[n-int(num) : n : n], false, n, nil
 	}
 	return nil, false, n, io.EOF
 }