Skip to content

Commit

Permalink
MySQL frontend connector based on Vitess
Browse files Browse the repository at this point in the history
  • Loading branch information
avelanarius committed Jan 29, 2025
1 parent e675cdc commit f3995f3
Show file tree
Hide file tree
Showing 13 changed files with 486 additions and 35 deletions.
2 changes: 1 addition & 1 deletion ci/e2e-data-generator/go.mod
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module quesma/e2e-data-generator

go 1.23.2
go 1.23.5
2 changes: 1 addition & 1 deletion ci/it/go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module quesma.com/its

go 1.23.2
go 1.23.5

require (
github.com/ClickHouse/clickhouse-go/v2 v2.20.0
Expand Down
13 changes: 6 additions & 7 deletions quesma/backend_connectors/basic_sql_backend_connector.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ import (
quesma_api "github.com/QuesmaOrg/quesma/quesma/v2/core"
)

type SqlBackendConnector interface {
GetDB() *sql.DB
}

type BasicSqlBackendConnector struct {
connection *sql.DB
}
Expand All @@ -33,13 +37,8 @@ func (p *SqlRows) Err() error {
return p.rows.Err()
}

func (p *BasicSqlBackendConnector) Open() error {
conn, err := initDBConnection()
if err != nil {
return err
}
p.connection = conn
return nil
func (p *BasicSqlBackendConnector) GetDB() *sql.DB {
return p.connection
}

func (p *BasicSqlBackendConnector) Close() error {
Expand Down
6 changes: 6 additions & 0 deletions quesma/backend_connectors/mysql_backend_connector.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,9 @@ func (p *MySqlBackendConnector) Open() error {
p.connection = conn
return nil
}

func NewMySqlBackendConnector(endpoint string) *MySqlBackendConnector {
return &MySqlBackendConnector{
Endpoint: endpoint,
}
}
6 changes: 6 additions & 0 deletions quesma/backend_connectors/postgres_backend_connector.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,9 @@ func (p *PostgresBackendConnector) Open() error {
p.connection = conn
return nil
}

func NewPostgresBackendConnector(endpoint string) *PostgresBackendConnector {
return &PostgresBackendConnector{
Endpoint: endpoint,
}
}
11 changes: 6 additions & 5 deletions quesma/frontend_connectors/tcp_mysql_connection_handler.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// Copyright Quesma, licensed under the Elastic License 2.0.
// SPDX-License-Identifier: Elastic-2.0

// Experimental alpha frontend for MySQL protocol

package frontend_connectors
Expand All @@ -13,13 +14,13 @@ import (
"net"
)

type TcpMysqlConnectionHandler struct {
type TcpMySqlConnectionHandler struct {
processors []quesma_api.Processor
}

var ErrInvalidPacket = fmt.Errorf("invalid packet")

func ReadMysqlPacket(conn net.Conn) ([]byte, error) {
func ReadMySqlPacket(conn net.Conn) ([]byte, error) {
// MySQL wire protocol packet format (see https://dev.mysql.com/doc/dev/mysql-server/8.4.3/PAGE_PROTOCOL.html):
// - 3 bytes: length of the packet (= LEN)
// - 1 byte: sequence ID
Expand Down Expand Up @@ -59,7 +60,7 @@ func ReadMysqlPacket(conn net.Conn) ([]byte, error) {
return fullPacketBytes, nil
}

func (p *TcpMysqlConnectionHandler) HandleConnection(conn net.Conn) error {
func (p *TcpMySqlConnectionHandler) HandleConnection(conn net.Conn) error {
dispatcher := quesma_api.Dispatcher{}
metadata := make(map[string]interface{})

Expand All @@ -81,7 +82,7 @@ func (p *TcpMysqlConnectionHandler) HandleConnection(conn net.Conn) error {
for {
var message any

fullPacketBytes, err := ReadMysqlPacket(conn)
fullPacketBytes, err := ReadMySqlPacket(conn)
if err == io.EOF {
break
}
Expand All @@ -103,6 +104,6 @@ func (p *TcpMysqlConnectionHandler) HandleConnection(conn net.Conn) error {
return nil
}

func (h *TcpMysqlConnectionHandler) SetHandlers(processors []quesma_api.Processor) {
func (h *TcpMySqlConnectionHandler) SetHandlers(processors []quesma_api.Processor) {
h.processors = processors
}
166 changes: 166 additions & 0 deletions quesma/frontend_connectors/vitess_mysql_connector.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
// Copyright Quesma, licensed under the Elastic License 2.0.
// SPDX-License-Identifier: Elastic-2.0

// Experimental alpha processor for MySQL protocol

package frontend_connectors

import (
"context"
"errors"
"time"
"vitess.io/vitess/go/mysql"
"vitess.io/vitess/go/mysql/replication"
"vitess.io/vitess/go/sqltypes"
"vitess.io/vitess/go/vt/proto/query"
"vitess.io/vitess/go/vt/vtenv"

"github.com/QuesmaOrg/quesma/quesma/logger"
"github.com/QuesmaOrg/quesma/quesma/quesma/recovery"
quesma_api "github.com/QuesmaOrg/quesma/quesma/v2/core"
)

type VitessMySqlConnector struct {
processors []quesma_api.Processor
listener *mysql.Listener
endpoint string
}

func NewVitessMySqlConnector(endpoint string) (*VitessMySqlConnector, error) {
connector := VitessMySqlConnector{
endpoint: endpoint,
}

// FIXME: the parameter values below should be tweaked, in particular (list not exhaustive):
// - timeouts, delays are set to time.Second * 0
// - authServer is set to mysql.NewAuthServerNone(), meaning no authentication
// - TLS is not set up
listener, err := mysql.NewListener("tcp", endpoint, mysql.NewAuthServerNone(), &connector, time.Second*0, time.Second*0, false, false, time.Second*0, time.Second*0)
if err != nil {
return nil, err
}
connector.listener = listener

return &connector, nil
}

func (t *VitessMySqlConnector) Listen() error {
go func() {
defer recovery.LogPanic()
t.listener.Accept()
}()
return nil
}

// Implementation of Vitess mysql.Handler interface:

type ComQueryMessage struct {
Conn *mysql.Conn
Query string
}

func (t *VitessMySqlConnector) NewConnection(c *mysql.Conn) {
// TODO: should we do something here?
}

func (t *VitessMySqlConnector) ConnectionReady(c *mysql.Conn) {
// TODO: should we do something here?
}

func (t *VitessMySqlConnector) ConnectionClosed(c *mysql.Conn) {
// TODO: should we do something here?
}

func (t *VitessMySqlConnector) ComQuery(c *mysql.Conn, query string, callback func(*sqltypes.Result) error) error {
metadata := make(map[string]interface{})
var message any = ComQueryMessage{
Conn: c,
Query: query,
}

dispatcher := quesma_api.Dispatcher{}
_, result := dispatcher.Dispatch(t.processors, metadata, message)
switch result := result.(type) {
case *sqltypes.Result:
err := callback(result)
if err != nil {
return err
}
return nil
case error:
return result
default:
logger.Error().Msgf("Unexpected ComQuery result type received from the processor: %T", result)
return nil
}
}

func (t *VitessMySqlConnector) ComPrepare(c *mysql.Conn, query string, bindVars map[string]*query.BindVariable) ([]*query.Field, error) {
// TODO implement ComPrepare
logger.Error().Msg("ComPrepare not implemented")
return nil, errors.New("ComPrepare not implemented")
}

func (t *VitessMySqlConnector) ComStmtExecute(c *mysql.Conn, prepare *mysql.PrepareData, callback func(*sqltypes.Result) error) error {
// TODO implement ComStmtExecute
logger.Error().Msg("ComStmtExecute not implemented")
return errors.New("ComStmtExecute not implemented")
}

func (t *VitessMySqlConnector) ComRegisterReplica(c *mysql.Conn, replicaHost string, replicaPort uint16, replicaUser string, replicaPassword string) error {
// TODO implement ComRegisterReplica
logger.Error().Msg("ComRegisterReplica not implemented")
return errors.New("ComRegisterReplica not implemented")
}

func (t *VitessMySqlConnector) ComBinlogDump(c *mysql.Conn, logFile string, binlogPos uint32) error {
// TODO implement ComBinlogDump
logger.Error().Msg("ComBinlogDump not implemented")
return errors.New("ComBinlogDump not implemented")
}

func (t *VitessMySqlConnector) ComBinlogDumpGTID(c *mysql.Conn, logFile string, logPos uint64, gtidSet replication.GTIDSet) error {
// TODO implement ComBinlogDumpGTID
logger.Error().Msg("ComBinlogDumpGTID not implemented")
return errors.New("ComBinlogDumpGTID not implemented")
}

func (t *VitessMySqlConnector) WarningCount(c *mysql.Conn) uint16 {
return 0
}

func (t *VitessMySqlConnector) ComResetConnection(c *mysql.Conn) {
// TODO implement ComResetConnection
logger.Error().Msg("ComResetConnection not implemented")
}

func (t *VitessMySqlConnector) Env() *vtenv.Environment {
env, err := vtenv.New(vtenv.Options{
MySQLServerVersion: "", // will use Vitess's default version
TruncateUILen: 512,
TruncateErrLen: 512,
})
if err != nil {
logger.Error().Msgf("failed to create environment: %v", err)
return nil
}

return env
}

func (t *VitessMySqlConnector) InstanceName() string {
return "VitessMySqlConnector"
}

func (t *VitessMySqlConnector) GetEndpoint() string {
return t.endpoint
}

func (t *VitessMySqlConnector) Stop(ctx context.Context) error {
t.listener.Shutdown()
return nil
}

func (t *VitessMySqlConnector) SetHandlers(processors []quesma_api.Processor) {
t.processors = processors
}
11 changes: 10 additions & 1 deletion quesma/go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module github.com/QuesmaOrg/quesma/quesma

go 1.23.2
go 1.23.5

require (
github.com/ClickHouse/clickhouse-go/v2 v2.30.1
Expand Down Expand Up @@ -34,11 +34,14 @@ require (
github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8
golang.org/x/oauth2 v0.25.0
vitess.io/vitess v0.21.2
)

require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 // indirect
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
github.com/golang/glog v1.2.4 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
Expand All @@ -47,12 +50,18 @@ require (
github.com/knadh/koanf/maps v0.1.1 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/pires/go-proxyproto v0.7.0 // indirect
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/tidwall/gjson v1.18.0 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.1 // indirect
golang.org/x/crypto v0.32.0 // indirect
golang.org/x/sync v0.10.0 // indirect
golang.org/x/text v0.21.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect
google.golang.org/grpc v1.66.2 // indirect
google.golang.org/protobuf v1.34.2 // indirect
)

require (
Expand Down
22 changes: 22 additions & 0 deletions quesma/go.sum
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk=
github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=
github.com/ClickHouse/ch-go v0.63.1 h1:s2JyZvWLTCSAGdtjMBBmAgQQHMco6pawLJMOXi0FODM=
github.com/ClickHouse/ch-go v0.63.1/go.mod h1:I1kJJCL3WJcBMGe1m+HVK0+nREaG+JOYYBWjrDrF3R0=
github.com/ClickHouse/clickhouse-go/v2 v2.30.1 h1:Dy0n0l+cMbPXs8hFkeeWGaPKrB+MDByUNQBSmRO3W6k=
Expand Down Expand Up @@ -40,6 +42,8 @@ github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang/glog v1.2.4 h1:CNNw5U8lSiiBk7druxtSHHTsRWcxKoac6kZKm2peBBc=
github.com/golang/glog v1.2.4/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
Expand Down Expand Up @@ -117,8 +121,12 @@ github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/En
github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY=
github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU=
github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pires/go-proxyproto v0.7.0 h1:IukmRewDQFWC7kfnb66CSomk2q/seBuilHBYFwyq0Hs=
github.com/pires/go-proxyproto v0.7.0/go.mod h1:Vz/1JPY/OACxWGQNIRY2BeyDmpoaWmEP40O9LbuiFR4=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
Expand All @@ -139,6 +147,8 @@ github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU=
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
Expand Down Expand Up @@ -179,6 +189,8 @@ go.opentelemetry.io/otel v1.33.0 h1:/FerN9bax5LoK51X/sI0SVYrjSE0/yUL7DpxW4K3FWw=
go.opentelemetry.io/otel v1.33.0/go.mod h1:SUUkR6csvUQl+yjReHu5uM3EtVV7MBm5FHKRlNx4I8I=
go.opentelemetry.io/otel/trace v1.33.0 h1:cCJuF7LRjUFso9LPnEAHJDB2pqzp+hbO8eu1qqW2d/s=
go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
Expand All @@ -194,6 +206,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70=
golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
Expand Down Expand Up @@ -231,12 +245,20 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
google.golang.org/grpc v1.66.2 h1:3QdXkuq3Bkh7w+ywLdLvM56cmGvQHUMZpiCzt6Rqaoo=
google.golang.org/grpc v1.66.2/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
vitess.io/vitess v0.21.2 h1:SbMdGngyhYurvh2KTZ92VkR5DH5taib+HH4xTkftUWU=
vitess.io/vitess v0.21.2/go.mod h1:n37n5rmIBHYWnoPZod9umrtExlUR/9SbR3VGmanYNMU=
Loading

0 comments on commit f3995f3

Please sign in to comment.