Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initial version of MySQL frontend connector (based on Vitess) #1212

Merged
merged 2 commits into from
Jan 29, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
avelanarius marked this conversation as resolved.
Show resolved Hide resolved
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
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Vitess library requires 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
Loading