Skip to content

Commit a7c2a17

Browse files
authored
Initial version of MySQL frontend connector (based on Vitess) (#1212)
In #1211, an initial (experimental) version of (TCP) passthrough MySQL processor was introduced. That processor/frontend was merely a minimally invasive TCP proxy, which snooped on the traffic, was able to recognize Query packets and potentially modify some packets. That processor/frontend required us to always have a real MySQL instance running and it was not easy for the processor to use a different SQL DB as a backend (such as Postgres). The components in this PR are MySQL frontend connector (based on Vitess) and MySQL processor (paired with MySQL Vitess frontend connector). They try to emulate a MySQL instance and don't require having a real MySQL instance running. A disadvantage of this approach is that we have to manually construct MySQL responses (abstracted by Vitess structures). This is still an experimental frontend/processor (alpha) and it's only a base code, on which we will further experiment.
1 parent e675cdc commit a7c2a17

File tree

13 files changed

+484
-35
lines changed

13 files changed

+484
-35
lines changed

ci/e2e-data-generator/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module quesma/e2e-data-generator
22

3-
go 1.23.2
3+
go 1.23.5

ci/it/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module quesma.com/its
22

3-
go 1.23.2
3+
go 1.23.5
44

55
require (
66
github.com/ClickHouse/clickhouse-go/v2 v2.20.0

quesma/backend_connectors/basic_sql_backend_connector.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ import (
99
quesma_api "github.com/QuesmaOrg/quesma/quesma/v2/core"
1010
)
1111

12+
type SqlBackendConnector interface {
13+
GetDB() *sql.DB
14+
}
15+
1216
type BasicSqlBackendConnector struct {
1317
connection *sql.DB
1418
}
@@ -33,13 +37,8 @@ func (p *SqlRows) Err() error {
3337
return p.rows.Err()
3438
}
3539

36-
func (p *BasicSqlBackendConnector) Open() error {
37-
conn, err := initDBConnection()
38-
if err != nil {
39-
return err
40-
}
41-
p.connection = conn
42-
return nil
40+
func (p *BasicSqlBackendConnector) GetDB() *sql.DB {
41+
return p.connection
4342
}
4443

4544
func (p *BasicSqlBackendConnector) Close() error {

quesma/backend_connectors/mysql_backend_connector.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,9 @@ func (p *MySqlBackendConnector) Open() error {
3434
p.connection = conn
3535
return nil
3636
}
37+
38+
func NewMySqlBackendConnector(endpoint string) *MySqlBackendConnector {
39+
return &MySqlBackendConnector{
40+
Endpoint: endpoint,
41+
}
42+
}

quesma/backend_connectors/postgres_backend_connector.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,9 @@ func (p *PostgresBackendConnector) Open() error {
3737
p.connection = conn
3838
return nil
3939
}
40+
41+
func NewPostgresBackendConnector(endpoint string) *PostgresBackendConnector {
42+
return &PostgresBackendConnector{
43+
Endpoint: endpoint,
44+
}
45+
}

quesma/frontend_connectors/tcp_mysql_connection_handler.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// Copyright Quesma, licensed under the Elastic License 2.0.
22
// SPDX-License-Identifier: Elastic-2.0
3+
34
// Experimental alpha frontend for MySQL protocol
45

56
package frontend_connectors
@@ -13,13 +14,13 @@ import (
1314
"net"
1415
)
1516

16-
type TcpMysqlConnectionHandler struct {
17+
type TcpMySqlConnectionHandler struct {
1718
processors []quesma_api.Processor
1819
}
1920

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

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

62-
func (p *TcpMysqlConnectionHandler) HandleConnection(conn net.Conn) error {
63+
func (p *TcpMySqlConnectionHandler) HandleConnection(conn net.Conn) error {
6364
dispatcher := quesma_api.Dispatcher{}
6465
metadata := make(map[string]interface{})
6566

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

84-
fullPacketBytes, err := ReadMysqlPacket(conn)
85+
fullPacketBytes, err := ReadMySqlPacket(conn)
8586
if err == io.EOF {
8687
break
8788
}
@@ -103,6 +104,6 @@ func (p *TcpMysqlConnectionHandler) HandleConnection(conn net.Conn) error {
103104
return nil
104105
}
105106

106-
func (h *TcpMysqlConnectionHandler) SetHandlers(processors []quesma_api.Processor) {
107+
func (h *TcpMySqlConnectionHandler) SetHandlers(processors []quesma_api.Processor) {
107108
h.processors = processors
108109
}
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
// Copyright Quesma, licensed under the Elastic License 2.0.
2+
// SPDX-License-Identifier: Elastic-2.0
3+
4+
// Experimental alpha processor for MySQL protocol
5+
6+
package frontend_connectors
7+
8+
import (
9+
"context"
10+
"errors"
11+
"time"
12+
"vitess.io/vitess/go/mysql"
13+
"vitess.io/vitess/go/mysql/replication"
14+
"vitess.io/vitess/go/sqltypes"
15+
"vitess.io/vitess/go/vt/proto/query"
16+
"vitess.io/vitess/go/vt/vtenv"
17+
18+
"github.com/QuesmaOrg/quesma/quesma/logger"
19+
"github.com/QuesmaOrg/quesma/quesma/quesma/recovery"
20+
quesma_api "github.com/QuesmaOrg/quesma/quesma/v2/core"
21+
)
22+
23+
type VitessMySqlConnector struct {
24+
processors []quesma_api.Processor
25+
listener *mysql.Listener
26+
endpoint string
27+
}
28+
29+
func NewVitessMySqlConnector(endpoint string) (*VitessMySqlConnector, error) {
30+
connector := VitessMySqlConnector{
31+
endpoint: endpoint,
32+
}
33+
34+
// FIXME: the parameter values below should be tweaked, in particular (list not exhaustive):
35+
// - timeouts, delays are set to time.Second * 0
36+
// - authServer is set to mysql.NewAuthServerNone(), meaning no authentication
37+
// - TLS is not set up
38+
listener, err := mysql.NewListener("tcp", endpoint, mysql.NewAuthServerNone(), &connector, time.Second*0, time.Second*0, false, false, time.Second*0, time.Second*0)
39+
if err != nil {
40+
return nil, err
41+
}
42+
connector.listener = listener
43+
44+
return &connector, nil
45+
}
46+
47+
func (t *VitessMySqlConnector) Listen() error {
48+
go func() {
49+
defer recovery.LogPanic()
50+
t.listener.Accept()
51+
}()
52+
return nil
53+
}
54+
55+
// Implementation of Vitess mysql.Handler interface:
56+
57+
type ComQueryMessage struct {
58+
Query string
59+
}
60+
61+
func (t *VitessMySqlConnector) NewConnection(c *mysql.Conn) {
62+
// TODO: should we do something here?
63+
}
64+
65+
func (t *VitessMySqlConnector) ConnectionReady(c *mysql.Conn) {
66+
// TODO: should we do something here?
67+
}
68+
69+
func (t *VitessMySqlConnector) ConnectionClosed(c *mysql.Conn) {
70+
// TODO: should we do something here?
71+
}
72+
73+
func (t *VitessMySqlConnector) ComQuery(c *mysql.Conn, query string, callback func(*sqltypes.Result) error) error {
74+
metadata := make(map[string]interface{})
75+
var message any = ComQueryMessage{
76+
Query: query,
77+
}
78+
79+
dispatcher := quesma_api.Dispatcher{}
80+
_, result := dispatcher.Dispatch(t.processors, metadata, message)
81+
switch result := result.(type) {
82+
case *sqltypes.Result:
83+
err := callback(result)
84+
if err != nil {
85+
return err
86+
}
87+
return nil
88+
case error:
89+
return result
90+
default:
91+
logger.Error().Msgf("Unexpected ComQuery result type received from the processor: %T", result)
92+
return nil
93+
}
94+
}
95+
96+
func (t *VitessMySqlConnector) ComPrepare(c *mysql.Conn, query string, bindVars map[string]*query.BindVariable) ([]*query.Field, error) {
97+
// TODO implement ComPrepare
98+
logger.Error().Msg("ComPrepare not implemented")
99+
return nil, errors.New("ComPrepare not implemented")
100+
}
101+
102+
func (t *VitessMySqlConnector) ComStmtExecute(c *mysql.Conn, prepare *mysql.PrepareData, callback func(*sqltypes.Result) error) error {
103+
// TODO implement ComStmtExecute
104+
logger.Error().Msg("ComStmtExecute not implemented")
105+
return errors.New("ComStmtExecute not implemented")
106+
}
107+
108+
func (t *VitessMySqlConnector) ComRegisterReplica(c *mysql.Conn, replicaHost string, replicaPort uint16, replicaUser string, replicaPassword string) error {
109+
// TODO implement ComRegisterReplica
110+
logger.Error().Msg("ComRegisterReplica not implemented")
111+
return errors.New("ComRegisterReplica not implemented")
112+
}
113+
114+
func (t *VitessMySqlConnector) ComBinlogDump(c *mysql.Conn, logFile string, binlogPos uint32) error {
115+
// TODO implement ComBinlogDump
116+
logger.Error().Msg("ComBinlogDump not implemented")
117+
return errors.New("ComBinlogDump not implemented")
118+
}
119+
120+
func (t *VitessMySqlConnector) ComBinlogDumpGTID(c *mysql.Conn, logFile string, logPos uint64, gtidSet replication.GTIDSet) error {
121+
// TODO implement ComBinlogDumpGTID
122+
logger.Error().Msg("ComBinlogDumpGTID not implemented")
123+
return errors.New("ComBinlogDumpGTID not implemented")
124+
}
125+
126+
func (t *VitessMySqlConnector) WarningCount(c *mysql.Conn) uint16 {
127+
return 0
128+
}
129+
130+
func (t *VitessMySqlConnector) ComResetConnection(c *mysql.Conn) {
131+
// TODO implement ComResetConnection
132+
logger.Error().Msg("ComResetConnection not implemented")
133+
}
134+
135+
func (t *VitessMySqlConnector) Env() *vtenv.Environment {
136+
env, err := vtenv.New(vtenv.Options{
137+
MySQLServerVersion: "", // will use Vitess's default version
138+
TruncateUILen: 512,
139+
TruncateErrLen: 512,
140+
})
141+
if err != nil {
142+
logger.Error().Msgf("failed to create environment: %v", err)
143+
return nil
144+
}
145+
146+
return env
147+
}
148+
149+
func (t *VitessMySqlConnector) InstanceName() string {
150+
return "VitessMySqlConnector"
151+
}
152+
153+
func (t *VitessMySqlConnector) GetEndpoint() string {
154+
return t.endpoint
155+
}
156+
157+
func (t *VitessMySqlConnector) Stop(ctx context.Context) error {
158+
t.listener.Shutdown()
159+
return nil
160+
}
161+
162+
func (t *VitessMySqlConnector) SetHandlers(processors []quesma_api.Processor) {
163+
t.processors = processors
164+
}

quesma/go.mod

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/QuesmaOrg/quesma/quesma
22

3-
go 1.23.2
3+
go 1.23.5
44

55
require (
66
github.com/ClickHouse/clickhouse-go/v2 v2.30.1
@@ -34,11 +34,14 @@ require (
3434
github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb
3535
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8
3636
golang.org/x/oauth2 v0.25.0
37+
vitess.io/vitess v0.21.2
3738
)
3839

3940
require (
4041
filippo.io/edwards25519 v1.1.0 // indirect
42+
github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 // indirect
4143
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
44+
github.com/golang/glog v1.2.4 // indirect
4245
github.com/hashicorp/errwrap v1.1.0 // indirect
4346
github.com/jackc/pgpassfile v1.0.0 // indirect
4447
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
@@ -47,12 +50,18 @@ require (
4750
github.com/knadh/koanf/maps v0.1.1 // indirect
4851
github.com/mitchellh/copystructure v1.2.0 // indirect
4952
github.com/mitchellh/reflectwalk v1.0.2 // indirect
53+
github.com/pires/go-proxyproto v0.7.0 // indirect
54+
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
55+
github.com/spf13/pflag v1.0.5 // indirect
5056
github.com/tidwall/gjson v1.18.0 // indirect
5157
github.com/tidwall/match v1.1.1 // indirect
5258
github.com/tidwall/pretty v1.2.1 // indirect
5359
golang.org/x/crypto v0.32.0 // indirect
5460
golang.org/x/sync v0.10.0 // indirect
5561
golang.org/x/text v0.21.0 // indirect
62+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect
63+
google.golang.org/grpc v1.66.2 // indirect
64+
google.golang.org/protobuf v1.34.2 // indirect
5665
)
5766

5867
require (

quesma/go.sum

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

0 commit comments

Comments
 (0)