Skip to content

Commit

Permalink
Fix unit test and optimize code
Browse files Browse the repository at this point in the history
Signed-off-by: Matt Lord <mattalord@gmail.com>
  • Loading branch information
mattlord committed Apr 16, 2024
1 parent 2200fcc commit 0fee7d4
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 27 deletions.
Expand Up @@ -1598,7 +1598,7 @@ func TestPlayerTypes(t *testing.T) {
},
}, {
input: "insert into vitess_strings values('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'a', 'a,b')",
output: "insert into vitess_strings(vb,c,vc,b,tb,bl,ttx,tx,en,s) values ('a','b','c','d\\0\\0\\0\\0','e','f','g','h',1,'3')",
output: "insert into vitess_strings(vb,c,vc,b,tb,bl,ttx,tx,en,s) values ('a','b','c','d\\0\\0\\0\\0','e','f','g','h','a','a,b')",
table: "vitess_strings",
data: [][]string{
{"a", "b", "c", "d\000\000\000\000", "e", "f", "g", "h", "a", "a,b"},
Expand Down
10 changes: 5 additions & 5 deletions go/vt/vttablet/tabletserver/vstreamer/main_test.go
Expand Up @@ -25,19 +25,19 @@ import (
"testing"
"time"

"vitess.io/vitess/go/mysql/replication"
"vitess.io/vitess/go/vt/log"
binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata"
"vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/throttlerapp"

"github.com/stretchr/testify/require"

_flag "vitess.io/vitess/go/internal/flag"
"vitess.io/vitess/go/mysql"
"vitess.io/vitess/go/mysql/replication"
"vitess.io/vitess/go/vt/dbconfigs"
"vitess.io/vitess/go/vt/log"
"vitess.io/vitess/go/vt/vtenv"
"vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv"
"vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/throttlerapp"
"vitess.io/vitess/go/vt/vttablet/tabletserver/vstreamer/testenv"

binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata"
)

var (
Expand Down
34 changes: 18 additions & 16 deletions go/vt/vttablet/tabletserver/vstreamer/vstreamer.go
Expand Up @@ -19,9 +19,9 @@ package vstreamer
import (
"bytes"
"context"
"encoding/binary"
"fmt"
"io"
"strconv"
"strings"
"time"

Expand Down Expand Up @@ -1080,27 +1080,29 @@ func (vs *vstreamer) extractRowAndFilter(plan *streamerPlan, data []byte, dataCo
if plan.Table.Fields[colNum].Type == querypb.Type_SET {
val := bytes.Buffer{}
// A SET column can have 64 unique values: https://dev.mysql.com/doc/refman/en/set.html
// For this reason the binlog event contains the values encoded as a 64-bit integer.
// This value can then be converted to a binary / base 2 integer where it becomes
// a bitmap of the values specified.
bv, err := value.ToUint64()
// For this reason the binlog event contains the values encoded as an unsigned 64-bit
// integer. This value can then be converted to a binary / base 2 integer where it
// becomes a bitmap of the values specified.
iv, err := value.ToUint64()
if err != nil {
log.Errorf("extractRowAndFilter: %s, table: %s, colNum: %d, fields: %+v, current values: %+v",
err, plan.Table.Name, colNum, plan.Table.Fields, values)
return false, nil, false, err
}
// Convert it to a base2 integer / binary value. Finally, strconv converts this to a
// string of 1s and 0s and we can then loop through the bytes. Note that this map is
// in reverse order as this was a little endian integer.
valMap := strconv.FormatUint(bv, 2)
valLen := len(valMap)
for i := 0; i < valLen; i++ {
if valMap[i] == '1' {
strVal := plan.EnumValuesMap[colNum][valLen-i]
if val.Len() > 0 {
val.WriteByte(',')
// Convert the uint64 to bytes.
bv := make([]byte, 8)
binary.LittleEndian.PutUint64(bv, iv)
numVals := len(plan.EnumValuesMap[colNum])
for i := len(bv) - 1; i >= 0; i-- { // Examine each byte
for j := 7; j >= 0; j-- { // And each bit in the byte
bm := byte(1 << uint(j)) // Bit mask
if bv[i]&bm > 0 {
strVal := plan.EnumValuesMap[colNum][numVals-(i+j)]
if val.Len() > 0 {
val.WriteByte(',')
}
val.WriteString(strVal)
}
val.WriteString(strVal)
}
}
value = sqltypes.MakeTrusted(plan.Table.Fields[colNum].Type, val.Bytes())
Expand Down
17 changes: 12 additions & 5 deletions go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go
Expand Up @@ -125,9 +125,16 @@ func TestSetAndEnum(t *testing.T) {
ts.Init()
ts.tests = [][]*TestQuery{{
{"begin", nil},
{"insert into t1 values (1, 'aaa', 'red,blue', 'S')", nil},
{"insert into t1 values (2, 'bbb', 'green', 'M')", nil},
{"insert into t1 values (3, 'ccc', 'red,blue,green', 'L')", nil},
{"insert into t1 values (1, 'aaa', 'red,blue', 'S')", []TestRowEvent{
{event: "type:FIELD field_event:{table_name:\"t1\" fields:{name:\"id\" type:INT32 table:\"t1\" org_table:\"t1\" database:\"vttest\" org_name:\"id\" column_length:11 charset:63 column_type:\"int\"} fields:{name:\"val\" type:BINARY table:\"t1\" org_table:\"t1\" database:\"vttest\" org_name:\"val\" column_length:4 charset:63 column_type:\"binary(4)\"} fields:{name:\"color\" type:SET table:\"t1\" org_table:\"t1\" database:\"vttest\" org_name:\"color\" column_length:56 charset:255 column_type:\"set('red','green','blue')\"} fields:{name:\"size\" type:ENUM table:\"t1\" org_table:\"t1\" database:\"vttest\" org_name:\"size\" column_length:4 charset:255 column_type:\"enum('S','M','L')\"}}"},
{event: "type:ROW row_event:{table_name:\"t1\" row_changes:{after:{lengths:1 lengths:4 lengths:8 lengths:1 values:\"1aaa\\x00red,blueS\"}}}"},
}},
{"insert into t1 values (2, 'bbb', 'green', 'M')", []TestRowEvent{
{event: "type:ROW row_event:{table_name:\"t1\" row_changes:{after:{lengths:1 lengths:4 lengths:5 lengths:1 values:\"2bbb\\x00greenM\"}}}"},
}},
{"insert into t1 values (3, 'ccc', 'red,blue,green', 'L')", []TestRowEvent{
{event: "type:ROW row_event:{table_name:\"t1\" row_changes:{after:{lengths:1 lengths:4 lengths:14 lengths:1 values:\"3ccc\\x00red,green,blueL\"}}}"},
}},
{"commit", nil},
}}
ts.Run()
Expand Down Expand Up @@ -1550,8 +1557,8 @@ func TestTypes(t *testing.T) {
output: [][]string{{
`begin`,
fmt.Sprintf(`type:FIELD field_event:{table_name:"vitess_strings" fields:{name:"vb" type:VARBINARY table:"vitess_strings" org_table:"vitess_strings" database:"vttest" org_name:"vb" column_length:16 charset:63 column_type:"varbinary(16)"} fields:{name:"c" type:CHAR table:"vitess_strings" org_table:"vitess_strings" database:"vttest" org_name:"c" column_length:64 charset:%d column_type:"char(16)"} fields:{name:"vc" type:VARCHAR table:"vitess_strings" org_table:"vitess_strings" database:"vttest" org_name:"vc" column_length:64 charset:%d column_type:"varchar(16)"} fields:{name:"b" type:BINARY table:"vitess_strings" org_table:"vitess_strings" database:"vttest" org_name:"b" column_length:4 charset:63 column_type:"binary(4)"} fields:{name:"tb" type:BLOB table:"vitess_strings" org_table:"vitess_strings" database:"vttest" org_name:"tb" column_length:255 charset:63 column_type:"tinyblob"} fields:{name:"bl" type:BLOB table:"vitess_strings" org_table:"vitess_strings" database:"vttest" org_name:"bl" column_length:65535 charset:63 column_type:"blob"} fields:{name:"ttx" type:TEXT table:"vitess_strings" org_table:"vitess_strings" database:"vttest" org_name:"ttx" column_length:1020 charset:%d column_type:"tinytext"} fields:{name:"tx" type:TEXT table:"vitess_strings" org_table:"vitess_strings" database:"vttest" org_name:"tx" column_length:262140 charset:%d column_type:"text"} fields:{name:"en" type:ENUM table:"vitess_strings" org_table:"vitess_strings" database:"vttest" org_name:"en" column_length:4 charset:%d column_type:"enum('a','b')"} fields:{name:"s" type:SET table:"vitess_strings" org_table:"vitess_strings" database:"vttest" org_name:"s" column_length:12 charset:%d column_type:"set('a','b')"}}`, testenv.DefaultCollationID, testenv.DefaultCollationID, testenv.DefaultCollationID, testenv.DefaultCollationID, testenv.DefaultCollationID, testenv.DefaultCollationID),
`type:ROW row_event:{table_name:"vitess_strings" row_changes:{after:{lengths:1 lengths:1 lengths:1 lengths:4 lengths:1 lengths:1 lengths:1 lengths:1 lengths:1 lengths:1 ` +
`values:"abcd\x00\x00\x00efgh13"}}}`,
`type:ROW row_event:{table_name:"vitess_strings" row_changes:{after:{lengths:1 lengths:1 lengths:1 lengths:4 lengths:1 lengths:1 lengths:1 lengths:1 lengths:1 lengths:3 ` +
`values:"abcd\x00\x00\x00efghaa,b"}}}`,
`gtid`,
`commit`,
}},
Expand Down

0 comments on commit 0fee7d4

Please sign in to comment.