diff --git a/go/vt/vttablet/tabletserver/schema/tracker.go b/go/vt/vttablet/tabletserver/schema/tracker.go index 592547bd463..84f8346ae0b 100644 --- a/go/vt/vttablet/tabletserver/schema/tracker.go +++ b/go/vt/vttablet/tabletserver/schema/tracker.go @@ -22,6 +22,7 @@ import ( "sync" "time" + "vitess.io/vitess/go/bytes2" "vitess.io/vitess/go/constants/sidecar" "vitess.io/vitess/go/mysql/replication" "vitess.io/vitess/go/sqltypes" @@ -230,10 +231,15 @@ func (tr *Tracker) saveCurrentSchemaToDb(ctx context.Context, gtid, ddl string, } defer conn.Recycle() + // We serialize a blob here, encodeString is for strings only + // and should not be used for binary data. + blobVal := sqltypes.MakeTrusted(sqltypes.VarBinary, blob) + buf := bytes2.Buffer{} + blobVal.EncodeSQLBytes2(&buf) query := sqlparser.BuildParsedQuery("insert into %s.schema_version "+ "(pos, ddl, schemax, time_updated) "+ "values (%s, %s, %s, %d)", sidecar.GetIdentifier(), encodeString(gtid), - encodeString(ddl), encodeString(string(blob)), timestamp).Query + encodeString(ddl), buf.String(), timestamp).Query _, err = conn.Conn.Exec(ctx, query, 1, false) if err != nil { return err diff --git a/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go b/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go index 5282b5f372d..7281be1d60c 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go @@ -32,6 +32,7 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" + "vitess.io/vitess/go/bytes2" "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/sqltypes" @@ -371,9 +372,15 @@ func TestVersion(t *testing.T) { } blob, _ := dbSchema.MarshalVT() gtid := "MariaDB/0-41983-20" + // We serialize a blob here, encodeString is for strings only + // and should not be used for binary data. + blobVal := sqltypes.MakeTrusted(sqltypes.VarBinary, blob) + buf := bytes2.Buffer{} + blobVal.EncodeSQLBytes2(&buf) + testcases := []testcase{{ input: []string{ - fmt.Sprintf("insert into _vt.schema_version values(1, '%s', 123, 'create table t1', %v)", gtid, encodeString(string(blob))), + fmt.Sprintf("insert into _vt.schema_version values(1, '%s', 123, 'create table t1', %v)", gtid, buf.String()), }, // External table events don't get sent. output: [][]string{{