提交 4523e993 编写于 作者: martianzhang's avatar martianzhang

update vendor daily

上级 e6c4f137
......@@ -10,18 +10,18 @@
## SOAR
SOAR(SQL Optimizer And Rewriter)是一个对SQL进行优化和改写的自动化工具。 由小米人工智能与云平台的数据库团队开发与维护。
SOAR(SQL Optimizer And Rewriter) 是一个对 SQL 进行优化和改写的自动化工具。 由小米人工智能与云平台的数据库团队开发与维护。
## 功能特点
* 跨平台支持(支持Linux, Mac环境,Windows环境理论上也支持,不过未全面测试)
* 目前只支持 MySQL 语法族协议的SQL优化
* 跨平台支持(支持 Linux, Mac 环境,Windows 环境理论上也支持,不过未全面测试)
* 目前只支持 MySQL 语法族协议的 SQL 优化
* 支持基于启发式算法的语句优化
* 支持复杂查询的多列索引优化(UPDATE, INSERT, DELETE, SELECT)
* 支持EXPLAIN信息丰富解读
* 支持SQL指纹、压缩和美化
* 支持同一张表多条ALTER请求合并
* 支持自定义规则的SQL改写
* 支持 EXPLAIN 信息丰富解读
* 支持 SQL 指纹、压缩和美化
* 支持同一张表多条 ALTER 请求合并
* 支持自定义规则的 SQL 改写
## 快速入门
......@@ -34,8 +34,8 @@ SOAR(SQL Optimizer And Rewriter)是一个对SQL进行优化和改写的自动化
## 交流与反馈
* 欢迎通过Github Issues提交问题报告与建议
* QQ群: 779359816(满) 758940447(新)
* 欢迎通过 Github Issues 提交问题报告与建议
* QQ 群:779359816(满) 758940447(新)
* [Gitter](https://gitter.im/xiaomi-dba/soar) 推荐
![xiaomi_sa](https://raw.githubusercontent.com/XiaoMi/soar/master/doc/images/xiaomi_sa.png)
......
......@@ -1409,6 +1409,35 @@ const (
LockTypeExclusive
)
// AlterAlgorithm is the algorithm of the DDL operations.
// See https://dev.mysql.com/doc/refman/8.0/en/alter-table.html#alter-table-performance.
type AlterAlgorithm byte
// DDL alter algorithms.
// For now, TiDB only supported inplace and instance algorithms. If the user specify `copy`,
// will get an error.
const (
AlterAlgorithmDefault AlterAlgorithm = iota
AlterAlgorithmCopy
AlterAlgorithmInplace
AlterAlgorithmInstant
)
func (a AlterAlgorithm) String() string {
switch a {
case AlterAlgorithmDefault:
return "DEFAULT"
case AlterAlgorithmCopy:
return "COPY"
case AlterAlgorithmInplace:
return "INPLACE"
case AlterAlgorithmInstant:
return "INSTANT"
default:
return "DEFAULT"
}
}
// AlterTableSpec represents alter table specification.
type AlterTableSpec struct {
node
......@@ -1422,6 +1451,7 @@ type AlterTableSpec struct {
OldColumnName *ColumnName
Position *ColumnPosition
LockType LockType
Algorithm AlterAlgorithm
Comment string
FromKey model.CIStr
ToKey model.CIStr
......@@ -1543,11 +1573,9 @@ func (n *AlterTableSpec) Restore(ctx *RestoreCtx) error {
ctx.WritePlain("= ")
ctx.WriteKeyWord(n.LockType.String())
case AlterTableAlgorithm:
// TODO: not support
ctx.WriteKeyWord("ALGORITHM ")
ctx.WritePlain("= ")
ctx.WriteKeyWord("DEFAULT")
ctx.WritePlain(" /* AlterTableAlgorithm is not supported */ ")
ctx.WriteKeyWord(n.Algorithm.String())
case AlterTableRenameIndex:
ctx.WriteKeyWord("RENAME INDEX ")
ctx.WriteName(n.FromKey.O)
......
......@@ -1755,6 +1755,8 @@ const (
ShowPrivileges
ShowErrors
ShowBindings
ShowPumpStatus
ShowDrainerStatus
)
// ShowStmt is a statement to provide information about databases, tables, columns and so on.
......@@ -1937,6 +1939,10 @@ func (n *ShowStmt) Restore(ctx *RestoreCtx) error {
ctx.WriteKeyWord("SESSION ")
}
ctx.WriteKeyWord("BINDINGS")
case ShowPumpStatus:
ctx.WriteKeyWord("PUMP STATUS")
case ShowDrainerStatus:
ctx.WriteKeyWord("DRAINER STATUS")
default:
return errors.New("Unknown ShowStmt type")
}
......
......@@ -725,6 +725,7 @@ func (n *SetPwdStmt) Accept(v Visitor) (Node, bool) {
type UserSpec struct {
User *auth.UserIdentity
AuthOpt *AuthOption
IsRole bool
}
// Restore implements Node interface.
......
......@@ -33,6 +33,11 @@ type UserIdentity struct {
AuthHostname string // Match in privs system (i.e. could be a wildcard)
}
type RoleIdentity struct {
Username string
Hostname string
}
// Restore implements Node interface.
func (user *UserIdentity) Restore(ctx *RestoreCtx) error {
if user.CurrentUser {
......
......@@ -11,14 +11,19 @@ github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-20181031085051-9002847aa142/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cznic/golex v0.0.0-20181122101858-9c343928389c h1:G8zTsaqyVfIHpgMFcGgdbhHSFhlNc77rAKkhVbQ9kQg=
github.com/cznic/golex v0.0.0-20181122101858-9c343928389c/go.mod h1:+bmmJDNmKlhWNG+gwWCkaBoTy39Fs+bzRxVBzoTQbIc=
github.com/cznic/mathutil v0.0.0-20181021201202-eba54fb065b7/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM=
github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 h1:iwZdTE0PVqJCos1vaoKsclOGD3ADKpshg3SRtYBbwso=
github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM=
github.com/cznic/parser v0.0.0-20160622100904-31edd927e5b1 h1:uWcWCkSP+E1w1z8r082miT+c+9vzg+5UdrgGCo15lMo=
github.com/cznic/parser v0.0.0-20160622100904-31edd927e5b1/go.mod h1:2B43mz36vGZNZEwkWi8ayRSSUXLfjL8OkbzwW4NcPMM=
github.com/cznic/sortutil v0.0.0-20150617083342-4c7342852e65/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ=
github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8 h1:LpMLYGyy67BoAFGda1NeOBQwqlv7nUXpm+rIVHGxZZ4=
github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ=
github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186 h1:0rkFMAbn5KBKNpJyHQ6Prb95vIKanmAe62KxsrN+sqA=
github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc=
github.com/cznic/y v0.0.0-20170802143616-045f81c6662a h1:N2rDAvHuM46OGscJkGX4Dw4BBqZgg6mGNGLYs5utVVo=
github.com/cznic/y v0.0.0-20170802143616-045f81c6662a/go.mod h1:1rk5VM7oSnA4vjp+hrLQ3HWHa+Y4yPCa3/CsJrcNnvs=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
......
......@@ -234,6 +234,7 @@ var tokenMap = map[string]int{
"DIV": div,
"DO": do,
"DOUBLE": doubleType,
"DRAINER": drainer,
"DROP": drop,
"DUAL": dual,
"DUPLICATE": duplicate,
......@@ -250,6 +251,7 @@ var tokenMap = map[string]int{
"EVENT": event,
"EVENTS": events,
"EXCLUSIVE": exclusive,
"EXCEPT": except,
"EXECUTE": execute,
"EXISTS": exists,
"EXPLAIN": explain,
......@@ -292,6 +294,7 @@ var tokenMap = map[string]int{
"INFILE": infile,
"INNER": inner,
"INPLACE": inplace,
"INSTANT": instant,
"INSERT": insert,
"INT": intType,
"INT1": int1Type,
......@@ -390,6 +393,7 @@ var tokenMap = map[string]int{
"PROCESS": process,
"PROCESSLIST": processlist,
"PROFILES": profiles,
"PUMP": pump,
"QUARTER": quarter,
"QUERY": query,
"QUERIES": queries,
......@@ -416,6 +420,7 @@ var tokenMap = map[string]int{
"REVOKE": revoke,
"RIGHT": right,
"RLIKE": rlike,
"ROLE": role,
"ROLLBACK": rollback,
"ROUTINE": routine,
"ROW": row,
......
......@@ -119,6 +119,7 @@ import (
escaped "ESCAPED"
exists "EXISTS"
explain "EXPLAIN"
except "EXCEPT"
falseKwd "FALSE"
firstValue "FIRST_VALUE"
floatType "FLOAT"
......@@ -379,6 +380,7 @@ import (
respect "RESPECT"
replication "REPLICATION"
reverse "REVERSE"
role "ROLE"
rollback "ROLLBACK"
routine "ROUTINE"
rowCount "ROW_COUNT"
......@@ -447,6 +449,7 @@ import (
groupConcat "GROUP_CONCAT"
next_row_id "NEXT_ROW_ID"
inplace "INPLACE"
instant "INSTANT"
internal "INTERNAL"
min "MIN"
max "MAX"
......@@ -474,8 +477,10 @@ import (
buckets "BUCKETS"
cancel "CANCEL"
ddl "DDL"
drainer "DRAINER"
jobs "JOBS"
job "JOB"
pump "PUMP"
stats "STATS"
statsMeta "STATS_META"
statsHistograms "STATS_HISTOGRAMS"
......@@ -574,6 +579,7 @@ import (
CreateTableStmt "CREATE TABLE statement"
CreateViewStmt "CREATE VIEW stetement"
CreateUserStmt "CREATE User statement"
CreateRoleStmt "CREATE Role statement"
CreateDatabaseStmt "Create Database Statement"
CreateIndexStmt "CREATE INDEX statement"
CreateBindingStmt "CREATE BINDING statement"
......@@ -583,6 +589,7 @@ import (
DropStatsStmt "DROP STATS statement"
DropTableStmt "DROP TABLE statement"
DropUserStmt "DROP USER"
DropRoleStmt "DROP ROLE"
DropViewStmt "DROP VIEW statement"
DropBindingStmt "DROP BINDING statement"
DeallocateStmt "Deallocate prepared statement"
......@@ -593,6 +600,7 @@ import (
ExplainableStmt "explainable statement"
FlushStmt "Flush statement"
GrantStmt "Grant statement"
GrantRoleStmt "Grant role statement"
InsertIntoStmt "INSERT INTO statement"
KillStmt "Kill statement"
LoadDataStmt "Load data statement"
......@@ -603,8 +611,11 @@ import (
RenameTableStmt "rename table statement"
ReplaceIntoStmt "REPLACE INTO statement"
RevokeStmt "Revoke statement"
RevokeRoleStmt "Revoke role statement"
RollbackStmt "ROLLBACK statement"
SetStmt "Set variable statement"
SetRoleStmt "Set active role statement"
SetDefaultRoleStmt "Set default statement for some user"
ShowStmt "Show engines/databases/tables/user/columns/warnings/status statement"
Statement "statement"
TraceStmt "TRACE statement"
......@@ -617,7 +628,8 @@ import (
%type <item>
AdminShowSlow "Admin Show Slow statement"
AlterTableOptionListOpt "alter table option list opt"
AlterAlgorithm "Alter table algorithm"
AlterTableOptionListOpt "Alter table option list opt"
AlterTableSpec "Alter table specification"
AlterTableSpecList "Alter table specification list"
AnyOrAll "Any or All for subquery"
......@@ -748,6 +760,11 @@ import (
OnUpdateOpt "optional ON UPDATE clause"
OptGConcatSeparator "optional GROUP_CONCAT SEPARATOR"
ReferOpt "reference option"
Rolename "Rolename"
RolenameList "RolenameList"
RoleSpec "Rolename and auth option"
RoleSpecList "Rolename and auth option list"
RoleNameString "role name string"
RowFormat "Row format option"
RowValue "Row value"
SelectLockOpt "FOR UPDATE or LOCK IN SHARE MODE,"
......@@ -761,6 +778,8 @@ import (
SelectStmtFromDualTable "SELECT statement from dual table"
SelectStmtFromTable "SELECT statement from table"
SelectStmtGroup "SELECT statement optional GROUP BY clause"
SetRoleOpt "Set role options"
SetDefaultRoleOpt "Set default role options"
ShowTargetFilterable "Show target that can be filtered by WHERE or LIKE"
ShowDatabaseNameOpt "Show tables/columns statement database name option"
ShowTableAliasOpt "Show table alias option"
......@@ -1201,6 +1220,7 @@ AlterTableSpec:
// Parse it and ignore it. Just for compatibility.
$$ = &ast.AlterTableSpec{
Tp: ast.AlterTableAlgorithm,
Algorithm: $3.(ast.AlterAlgorithm),
}
}
| "FORCE"
......@@ -1213,7 +1233,23 @@ AlterTableSpec:
AlterAlgorithm:
"DEFAULT" | "INPLACE" | "COPY"
"DEFAULT"
{
$$ = ast.AlterAlgorithmDefault
}
| "COPY"
{
$$ = ast.AlterAlgorithmCopy
}
| "INPLACE"
{
$$ = ast.AlterAlgorithmInplace
}
| "INSTANT"
{
$$ = ast.AlterAlgorithmInstant
}
LockClauseOpt:
{}
......@@ -2392,6 +2428,14 @@ DropUserStmt:
$$ = &ast.DropUserStmt{IfExists: true, UserList: $5.([]*auth.UserIdentity)}
}
DropRoleStmt:
"DROP" "ROLE" RolenameList
{
}
| "DROP" "ROLE" "IF" "EXISTS" RolenameList
{
}
DropStatsStmt:
"DROP" "STATS" TableName
{
......@@ -2990,7 +3034,7 @@ UnReservedKeyword:
| "COLUMNS" | "COMMIT" | "COMPACT" | "COMPRESSED" | "CONSISTENT" | "CURRENT" | "DATA" | "DATE" %prec lowerThanStringLitToken| "DATETIME" | "DAY" | "DEALLOCATE" | "DO" | "DUPLICATE"
| "DYNAMIC"| "END" | "ENGINE" | "ENGINES" | "ENUM" | "ERRORS" | "ESCAPE" | "EXECUTE" | "FIELDS" | "FIRST" | "FIXED" | "FLUSH" | "FOLLOWING" | "FORMAT" | "FULL" |"GLOBAL"
| "HASH" | "HOUR" | "LESS" | "LOCAL" | "LAST" | "NAMES" | "OFFSET" | "PASSWORD" %prec lowerThanEq | "PREPARE" | "QUICK" | "REDUNDANT"
| "ROLLBACK" | "SESSION" | "SIGNED" | "SNAPSHOT" | "START" | "STATUS" | "SUBPARTITIONS" | "SUBPARTITION" | "TABLES" | "TABLESPACE" | "TEXT" | "THAN" | "TIME" %prec lowerThanStringLitToken
| "ROLE" |"ROLLBACK" | "SESSION" | "SIGNED" | "SNAPSHOT" | "START" | "STATUS" | "SUBPARTITIONS" | "SUBPARTITION" | "TABLES" | "TABLESPACE" | "TEXT" | "THAN" | "TIME" %prec lowerThanStringLitToken
| "TIMESTAMP" %prec lowerThanStringLitToken | "TRACE" | "TRANSACTION" | "TRUNCATE" | "UNBOUNDED" | "UNKNOWN" | "VALUE" | "WARNINGS" | "YEAR" | "MODE" | "WEEK" | "ANY" | "SOME" | "USER" | "IDENTIFIED"
| "COLLATION" | "COMMENT" | "AVG_ROW_LENGTH" | "CONNECTION" | "CHECKSUM" | "COMPRESSION" | "KEY_BLOCK_SIZE" | "MASTER" | "MAX_ROWS"
| "MIN_ROWS" | "NATIONAL" | "ROW_FORMAT" | "QUARTER" | "GRANTS" | "TRIGGERS" | "DELAY_KEY_WRITE" | "ISOLATION" | "JSON"
......@@ -3003,11 +3047,11 @@ UnReservedKeyword:
TiDBKeyword:
"ADMIN" | "BUCKETS" | "CANCEL" | "DDL" | "JOBS" | "JOB" | "STATS" | "STATS_META" | "STATS_HISTOGRAMS" | "STATS_BUCKETS" | "STATS_HEALTHY" | "TIDB" | "TIDB_HJ" | "TIDB_SMJ" | "TIDB_INLJ" | "RESTORE"
"ADMIN" | "BUCKETS" | "CANCEL" | "DDL" | "DRAINER" | "JOBS" | "JOB" | "PUMP" | "STATS" | "STATS_META" | "STATS_HISTOGRAMS" | "STATS_BUCKETS" | "STATS_HEALTHY" | "TIDB" | "TIDB_HJ" | "TIDB_SMJ" | "TIDB_INLJ" | "RESTORE"
NotKeywordToken:
"ADDDATE" | "BIT_AND" | "BIT_OR" | "BIT_XOR" | "CAST" | "COPY" | "COUNT" | "CURTIME" | "DATE_ADD" | "DATE_SUB" | "EXTRACT" | "GET_FORMAT" | "GROUP_CONCAT"
| "INPLACE" | "INTERNAL" |"MIN" | "MAX" | "MAX_EXECUTION_TIME" | "NOW" | "RECENT" | "POSITION" | "SUBDATE" | "SUBSTRING" | "SUM"
| "INPLACE" | "INSTANT" | "INTERNAL" |"MIN" | "MAX" | "MAX_EXECUTION_TIME" | "NOW" | "RECENT" | "POSITION" | "SUBDATE" | "SUBSTRING" | "SUM"
| "STD" | "STDDEV" | "STDDEV_POP" | "STDDEV_SAMP" | "VARIANCE" | "VAR_POP" | "VAR_SAMP"
| "TIMESTAMPADD" | "TIMESTAMPDIFF" | "TOP" | "TRIM" | "NEXT_ROW_ID"
......@@ -5500,6 +5544,39 @@ SetStmt:
$$ = &ast.SetStmt{Variables: assigns}
}
SetRoleStmt:
"SET" "ROLE" SetRoleOpt
{
}
SetDefaultRoleStmt:
"SET" "DEFAULT" "ROLE" SetDefaultRoleOpt "TO" UsernameList
{
}
SetDefaultRoleOpt:
"NONE"
{
}
| "ALL"
{
}
| RolenameList
{
}
SetRoleOpt:
"ALL" "EXCEPT" RolenameList
{
}
| SetDefaultRoleOpt
{
}
| "DEFAULT"
{
}
TransactionChars:
TransactionChar
{
......@@ -5739,6 +5816,41 @@ AuthString:
$$ = $1
}
RoleNameString:
stringLit
{
$$ = $1
}
| identifier
{
$$ = $1
}
Rolename:
RoleNameString
{
$$ = &auth.RoleIdentity{Username: $1.(string), Hostname: "%"}
}
| StringName '@' StringName
{
$$ = &auth.RoleIdentity{Username: $1.(string), Hostname: $3.(string)}
}
| StringName singleAtIdentifier
{
$$ = &auth.RoleIdentity{Username: $1.(string), Hostname: strings.TrimPrefix($2, "@")}
}
RolenameList:
Rolename
{
$$ = []*auth.RoleIdentity{$1.(*auth.RoleIdentity)}
}
| RolenameList ',' Rolename
{
$$ = append($1.([]*auth.RoleIdentity), $3.(*auth.RoleIdentity))
}
/****************************Admin Statement*******************************/
AdminStmt:
"ADMIN" "SHOW" "DDL"
......@@ -6172,6 +6284,18 @@ ShowTargetFilterable:
Tp: ast.ShowProcedureStatus,
}
}
| "PUMP" "STATUS"
{
$$ = &ast.ShowStmt {
Tp: ast.ShowPumpStatus,
}
}
| "DRAINER" "STATUS"
{
$$ = &ast.ShowStmt {
Tp: ast.ShowDrainerStatus,
}
}
| "FUNCTION" "STATUS"
{
// This statement is similar to SHOW PROCEDURE STATUS but for stored functions.
......@@ -6345,6 +6469,7 @@ Statement:
| CreateTableStmt
| CreateViewStmt
| CreateUserStmt
| CreateRoleStmt
| CreateBindingStmt
| DoStmt
| DropDatabaseStmt
......@@ -6352,10 +6477,12 @@ Statement:
| DropTableStmt
| DropViewStmt
| DropUserStmt
| DropRoleStmt
| DropStatsStmt
| DropBindingStmt
| FlushStmt
| GrantStmt
| GrantRoleStmt
| InsertIntoStmt
| KillStmt
| LoadDataStmt
......@@ -6365,9 +6492,12 @@ Statement:
| RenameTableStmt
| ReplaceIntoStmt
| RevokeStmt
| RevokeRoleStmt
| SelectStmt
| UnionStmt
| SetStmt
| SetRoleStmt
| SetDefaultRoleStmt
| ShowStmt
| SubSelect
{
......@@ -7271,6 +7401,11 @@ CreateUserStmt:
}
}
CreateRoleStmt:
"CREATE" "ROLE" IfNotExists RoleSpecList
{
}
/* See http://dev.mysql.com/doc/refman/5.7/en/alter-user.html */
AlterUserStmt:
"ALTER" "USER" IfExists UserSpecList
......@@ -7355,6 +7490,30 @@ HashString:
$$ = $1
}
RoleSpec:
Rolename
{
role := $1.(*auth.RoleIdentity)
roleSpec := &ast.UserSpec{
User: &auth.UserIdentity {
Username: role.Username,
Hostname: role.Hostname,
},
IsRole: true,
}
$$ = roleSpec
}
RoleSpecList:
RoleSpec
{
$$ = []*ast.UserSpec{$1.(*ast.UserSpec)}
}
| RoleSpecList ',' RoleSpec
{
$$ = append($1.([]*ast.UserSpec), $3.(*ast.UserSpec))
}
/*******************************************************************
*
* Create Binding Statement
......@@ -7420,6 +7579,11 @@ GrantStmt:
}
}
GrantRoleStmt:
"GRANT" RolenameList "TO" UsernameList
{
}
WithGrantOptionOpt:
{
$$ = false
......@@ -7647,6 +7811,11 @@ RevokeStmt:
}
}
RevokeRoleStmt:
"REVOKE" RolenameList "FROM" UsernameList
{
}
/**************************************LoadDataStmt*****************************************
* See https://dev.mysql.com/doc/refman/5.7/en/load-data.html
*******************************************************************************************/
......
......@@ -15,10 +15,13 @@ package execdetails
import (
"fmt"
"sort"
"strings"
"sync"
"sync/atomic"
"time"
"github.com/pingcap/tipb/go-tipb"
)
// CommitDetailCtxKey presents CommitDetail info key in context.
......@@ -26,6 +29,7 @@ const CommitDetailCtxKey = "commitDetail"
// ExecDetails contains execution detail information.
type ExecDetails struct {
CalleeAddress string
ProcessTime time.Duration
WaitTime time.Duration
BackoffTime time.Duration
......@@ -108,10 +112,58 @@ func (d ExecDetails) String() string {
return strings.Join(parts, " ")
}
// CopRuntimeStats collects cop tasks' execution info.
type CopRuntimeStats struct {
sync.Mutex
// stats stores the runtime statistics of coprocessor tasks.
// The key of the map is the tikv-server address. Because a tikv-server can
// have many region leaders, several coprocessor tasks can be sent to the
// same tikv-server instance. We have to use a list to maintain all tasks
// executed on each instance.
stats map[string][]*RuntimeStats
}
// RecordOneCopTask records a specific cop tasks's execution detail.
func (crs *CopRuntimeStats) RecordOneCopTask(address string, summary *tipb.ExecutorExecutionSummary) {
crs.Lock()
defer crs.Unlock()
crs.stats[address] = append(crs.stats[address],
&RuntimeStats{int32(*summary.NumIterations), int64(*summary.TimeProcessedNs), int64(*summary.NumProducedRows)})
}
func (crs *CopRuntimeStats) String() string {
if len(crs.stats) == 0 {
return ""
}
var totalRows, totalTasks int64
var totalIters int32
procTimes := make([]time.Duration, 0, 32)
for _, instanceStats := range crs.stats {
for _, stat := range instanceStats {
procTimes = append(procTimes, time.Duration(stat.consume)*time.Nanosecond)
totalRows += stat.rows
totalIters += stat.loop
totalTasks++
}
}
if totalTasks == 1 {
return fmt.Sprintf("time:%v, loops:%d, rows:%d", procTimes[0], totalIters, totalRows)
}
n := len(procTimes)
sort.Slice(procTimes, func(i, j int) bool { return procTimes[i] < procTimes[j] })
return fmt.Sprintf("proc max:%v, min:%v, p80:%v, p95:%v, rows:%v, iters:%v, tasks:%v",
procTimes[n-1], procTimes[0], procTimes[n*4/5], procTimes[n*19/20], totalRows, totalIters, totalTasks)
}
// RuntimeStatsColl collects executors's execution info.
type RuntimeStatsColl struct {
mu sync.Mutex
stats map[string]*RuntimeStats
mu sync.Mutex
rootStats map[string]*RuntimeStats
copStats map[string]*CopRuntimeStats
}
// RuntimeStats collects one executor's execution info.
......@@ -126,26 +178,53 @@ type RuntimeStats struct {
// NewRuntimeStatsColl creates new executor collector.
func NewRuntimeStatsColl() *RuntimeStatsColl {
return &RuntimeStatsColl{stats: make(map[string]*RuntimeStats)}
return &RuntimeStatsColl{rootStats: make(map[string]*RuntimeStats),
copStats: make(map[string]*CopRuntimeStats)}
}
// Get gets execStat for a executor.
func (e *RuntimeStatsColl) Get(planID string) *RuntimeStats {
// GetRootStats gets execStat for a executor.
func (e *RuntimeStatsColl) GetRootStats(planID string) *RuntimeStats {
e.mu.Lock()
defer e.mu.Unlock()
runtimeStats, exists := e.stats[planID]
runtimeStats, exists := e.rootStats[planID]
if !exists {
runtimeStats = &RuntimeStats{}
e.stats[planID] = runtimeStats
e.rootStats[planID] = runtimeStats
}
return runtimeStats
}
// Exists checks if the planID exists in the stats collection.
func (e *RuntimeStatsColl) Exists(planID string) bool {
// GetCopStats gets the CopRuntimeStats specified by planID.
func (e *RuntimeStatsColl) GetCopStats(planID string) *CopRuntimeStats {
e.mu.Lock()
defer e.mu.Unlock()
copStats, ok := e.copStats[planID]
if !ok {
copStats = &CopRuntimeStats{stats: make(map[string][]*RuntimeStats)}
e.copStats[planID] = copStats
}
return copStats
}
// RecordOneCopTask records a specific cop tasks's execution detail.
func (e *RuntimeStatsColl) RecordOneCopTask(planID, address string, summary *tipb.ExecutorExecutionSummary) {
copStats := e.GetCopStats(planID)
copStats.RecordOneCopTask(address, summary)
}
// ExistsRootStats checks if the planID exists in the rootStats collection.
func (e *RuntimeStatsColl) ExistsRootStats(planID string) bool {
e.mu.Lock()
defer e.mu.Unlock()
_, exists := e.rootStats[planID]
return exists
}
// ExistsCopStats checks if the planID exists in the copStats collection.
func (e *RuntimeStatsColl) ExistsCopStats(planID string) bool {
e.mu.Lock()
defer e.mu.Unlock()
_, exists := e.stats[planID]
_, exists := e.copStats[planID]
return exists
}
......
......@@ -34,6 +34,7 @@
Aggregation
TopN
Limit
ExecutorExecutionSummary
FieldType
Expr
ByItem
......@@ -53,12 +54,10 @@ package tipb
import (
"fmt"
proto "github.com/golang/protobuf/proto"
io "io"
math "math"
io "io"
proto "github.com/golang/protobuf/proto"
)
// Reference imports to suppress errors if they are not otherwise used.
......
......@@ -5,12 +5,10 @@ package tipb
import (
"fmt"
proto "github.com/golang/protobuf/proto"
io "io"
math "math"
io "io"
proto "github.com/golang/protobuf/proto"
)
// Reference imports to suppress errors if they are not otherwise used.
......
......@@ -5,12 +5,10 @@ package tipb
import (
"fmt"
proto "github.com/golang/protobuf/proto"
io "io"
math "math"
io "io"
proto "github.com/golang/protobuf/proto"
)
// Reference imports to suppress errors if they are not otherwise used.
......@@ -339,6 +337,42 @@ func (m *Limit) GetLimit() uint64 {
return 0
}
type ExecutorExecutionSummary struct {
// Total time cost in this executor. Includes self time cost and children time cost.
TimeProcessedNs *uint64 `protobuf:"varint,1,opt,name=time_processed_ns,json=timeProcessedNs" json:"time_processed_ns,omitempty"`
// How many rows this executor produced totally.
NumProducedRows *uint64 `protobuf:"varint,2,opt,name=num_produced_rows,json=numProducedRows" json:"num_produced_rows,omitempty"`
// How many times executor's `next()` is called.
NumIterations *uint64 `protobuf:"varint,3,opt,name=num_iterations,json=numIterations" json:"num_iterations,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (m *ExecutorExecutionSummary) Reset() { *m = ExecutorExecutionSummary{} }
func (m *ExecutorExecutionSummary) String() string { return proto.CompactTextString(m) }
func (*ExecutorExecutionSummary) ProtoMessage() {}
func (*ExecutorExecutionSummary) Descriptor() ([]byte, []int) { return fileDescriptorExecutor, []int{8} }
func (m *ExecutorExecutionSummary) GetTimeProcessedNs() uint64 {
if m != nil && m.TimeProcessedNs != nil {
return *m.TimeProcessedNs
}
return 0
}
func (m *ExecutorExecutionSummary) GetNumProducedRows() uint64 {
if m != nil && m.NumProducedRows != nil {
return *m.NumProducedRows
}
return 0
}
func (m *ExecutorExecutionSummary) GetNumIterations() uint64 {
if m != nil && m.NumIterations != nil {
return *m.NumIterations
}
return 0
}
func init() {
proto.RegisterType((*Executor)(nil), "tipb.Executor")
proto.RegisterType((*TableScan)(nil), "tipb.TableScan")
......@@ -348,6 +382,7 @@ func init() {
proto.RegisterType((*Aggregation)(nil), "tipb.Aggregation")
proto.RegisterType((*TopN)(nil), "tipb.TopN")
proto.RegisterType((*Limit)(nil), "tipb.Limit")
proto.RegisterType((*ExecutorExecutionSummary)(nil), "tipb.ExecutorExecutionSummary")
proto.RegisterEnum("tipb.ExecType", ExecType_name, ExecType_value)
}
func (m *Executor) Marshal() (dAtA []byte, err error) {
......@@ -724,6 +759,42 @@ func (m *Limit) MarshalTo(dAtA []byte) (int, error) {
return i, nil
}
func (m *ExecutorExecutionSummary) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA)
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *ExecutorExecutionSummary) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if m.TimeProcessedNs != nil {
dAtA[i] = 0x8
i++
i = encodeVarintExecutor(dAtA, i, uint64(*m.TimeProcessedNs))
}
if m.NumProducedRows != nil {
dAtA[i] = 0x10
i++
i = encodeVarintExecutor(dAtA, i, uint64(*m.NumProducedRows))
}
if m.NumIterations != nil {
dAtA[i] = 0x18
i++
i = encodeVarintExecutor(dAtA, i, uint64(*m.NumIterations))
}
if m.XXX_unrecognized != nil {
i += copy(dAtA[i:], m.XXX_unrecognized)
}
return i, nil
}
func encodeVarintExecutor(dAtA []byte, offset int, v uint64) int {
for v >= 1<<7 {
dAtA[offset] = uint8(v&0x7f | 0x80)
......@@ -887,6 +958,24 @@ func (m *Limit) Size() (n int) {
return n
}
func (m *ExecutorExecutionSummary) Size() (n int) {
var l int
_ = l
if m.TimeProcessedNs != nil {
n += 1 + sovExecutor(uint64(*m.TimeProcessedNs))
}
if m.NumProducedRows != nil {
n += 1 + sovExecutor(uint64(*m.NumProducedRows))
}
if m.NumIterations != nil {
n += 1 + sovExecutor(uint64(*m.NumIterations))
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
return n
}
func sovExecutor(x uint64) (n int) {
for {
n++
......@@ -1951,6 +2040,117 @@ func (m *Limit) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *ExecutorExecutionSummary) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowExecutor
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: ExecutorExecutionSummary: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: ExecutorExecutionSummary: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field TimeProcessedNs", wireType)
}
var v uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowExecutor
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
m.TimeProcessedNs = &v
case 2:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field NumProducedRows", wireType)
}
var v uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowExecutor
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
m.NumProducedRows = &v
case 3:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field NumIterations", wireType)
}
var v uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowExecutor
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
m.NumIterations = &v
default:
iNdEx = preIndex
skippy, err := skipExecutor(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthExecutor
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func skipExecutor(dAtA []byte) (n int, err error) {
l := len(dAtA)
iNdEx := 0
......@@ -2059,45 +2259,50 @@ var (
func init() { proto.RegisterFile("executor.proto", fileDescriptorExecutor) }
var fileDescriptorExecutor = []byte{
// 630 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xcd, 0x6e, 0xd3, 0x40,
0x10, 0xc7, 0x6b, 0xc7, 0x69, 0x9c, 0x49, 0x3f, 0xdc, 0xe5, 0x43, 0x56, 0x0f, 0x69, 0x30, 0x20,
0x4a, 0x24, 0x02, 0x2a, 0x07, 0xce, 0x0d, 0x02, 0x29, 0x02, 0x55, 0x95, 0xdb, 0x7b, 0xe4, 0xac,
0xb7, 0xcb, 0xa2, 0x64, 0x77, 0xb1, 0xd7, 0x52, 0x72, 0xe0, 0xce, 0x23, 0xf0, 0x0e, 0xbc, 0x48,
0x8f, 0x3c, 0x01, 0x82, 0xf2, 0x22, 0x68, 0x77, 0x6d, 0xc7, 0x85, 0x22, 0x38, 0xed, 0xce, 0x7f,
0x7e, 0x33, 0x3b, 0x9a, 0x99, 0x85, 0x1d, 0xb2, 0x24, 0xb8, 0x50, 0x22, 0x1b, 0xc9, 0x4c, 0x28,
0x81, 0x3c, 0xc5, 0xe4, 0x6c, 0x3f, 0x20, 0x4b, 0x99, 0x91, 0x3c, 0x67, 0x82, 0x5b, 0x7d, 0x7f,
0x2b, 0xc7, 0xef, 0xc8, 0x22, 0x29, 0xad, 0xdb, 0x54, 0x50, 0x61, 0xae, 0x4f, 0xf5, 0xcd, 0xaa,
0xd1, 0x0f, 0x17, 0xfc, 0x57, 0x65, 0x3a, 0xf4, 0x00, 0x5c, 0x25, 0x43, 0x67, 0xe0, 0x1c, 0xee,
0x1c, 0xed, 0x8c, 0x74, 0xd6, 0x91, 0xf6, 0x9d, 0xaf, 0x24, 0x19, 0x7b, 0x97, 0xdf, 0x0e, 0x36,
0x62, 0x57, 0x49, 0x34, 0x04, 0x5f, 0xcd, 0xe6, 0xd3, 0x1c, 0x27, 0x3c, 0x74, 0x07, 0xce, 0x61,
0xef, 0x68, 0xd7, 0xb2, 0xe7, 0xc9, 0x6c, 0x4e, 0xce, 0x70, 0xc2, 0xe3, 0x8e, 0x9a, 0xcd, 0xf5,
0x45, 0xb3, 0x2c, 0x5d, 0x5a, 0xb6, 0xd5, 0x64, 0x27, 0x3c, 0x25, 0x4b, 0xcb, 0xb2, 0xd4, 0x5c,
0xd0, 0x13, 0xe8, 0xe6, 0x64, 0x4e, 0xb0, 0x62, 0x82, 0x87, 0x5e, 0x13, 0x3e, 0xab, 0xe4, 0x78,
0x4d, 0xa0, 0xe7, 0xd0, 0x4b, 0x28, 0xcd, 0x08, 0x4d, 0x4c, 0x40, 0xdb, 0x04, 0xec, 0xd9, 0x80,
0xe3, 0xb5, 0x23, 0x6e, 0x52, 0xa8, 0x0f, 0x9e, 0x12, 0xf2, 0x24, 0xdc, 0x34, 0x34, 0x94, 0x75,
0x0b, 0x79, 0x12, 0x1b, 0x1d, 0xdd, 0x83, 0xf6, 0x9c, 0x2d, 0x98, 0x0a, 0x3b, 0x06, 0xe8, 0x59,
0xe0, 0xad, 0x96, 0x62, 0xeb, 0x41, 0xcf, 0x00, 0x72, 0x95, 0x91, 0x64, 0x31, 0x4d, 0x28, 0x0d,
0xfd, 0xbf, 0x3d, 0xdb, 0xb5, 0xd0, 0x31, 0xa5, 0x51, 0x06, 0xdd, 0xba, 0x35, 0xe8, 0x00, 0x7c,
0xa5, 0x8d, 0x29, 0x4b, 0x4d, 0xa7, 0x5b, 0x65, 0x67, 0x3b, 0x46, 0x9d, 0xa4, 0x68, 0x08, 0x1d,
0x2c, 0xe6, 0xc5, 0x82, 0xe7, 0xa1, 0x3b, 0x68, 0x1d, 0xf6, 0x8e, 0x02, 0x9b, 0xfc, 0xa5, 0x11,
0x27, 0xfc, 0x42, 0xc4, 0x15, 0x80, 0x42, 0xf0, 0x52, 0x92, 0x63, 0xd3, 0x5a, 0xbf, 0x4c, 0x64,
0x94, 0xe8, 0x8b, 0x03, 0xdd, 0xba, 0xc7, 0xff, 0x7e, 0xf4, 0x00, 0x7c, 0xa6, 0x69, 0x0d, 0xb8,
0x4d, 0xc0, 0xa8, 0xd7, 0xab, 0x6a, 0xfd, 0x6f, 0x55, 0xde, 0xef, 0x55, 0xa1, 0xbb, 0xb0, 0x59,
0x70, 0xf6, 0xa1, 0x20, 0x66, 0x5c, 0x7e, 0x5c, 0x5a, 0xd1, 0x0b, 0xe8, 0xd6, 0x33, 0x46, 0x43,
0x00, 0x2c, 0x78, 0xca, 0xb4, 0x91, 0x87, 0x8e, 0x79, 0x0d, 0xaa, 0x6d, 0x94, 0x59, 0xdc, 0xf0,
0x46, 0x23, 0x80, 0xd3, 0x4c, 0xbc, 0x2f, 0x23, 0x07, 0xd0, 0xd6, 0x9f, 0xe0, 0xa6, 0x20, 0xeb,
0x88, 0x3e, 0x42, 0xaf, 0x31, 0x24, 0xf4, 0x10, 0x7c, 0x9a, 0x89, 0x42, 0x4e, 0x67, 0xab, 0x1b,
0x62, 0x3a, 0xc6, 0x37, 0x5e, 0x69, 0x2c, 0xa1, 0x74, 0x7a, 0x51, 0x70, 0x5c, 0xce, 0xe4, 0x1a,
0x96, 0x50, 0xfa, 0xba, 0xe0, 0x18, 0x0d, 0xc0, 0xb7, 0x43, 0x27, 0xe9, 0xb5, 0x89, 0xd4, 0x6a,
0xf4, 0x06, 0x3c, 0xbd, 0x6c, 0xe8, 0x11, 0xf8, 0x22, 0x4b, 0x49, 0xb6, 0x7e, 0x77, 0xcb, 0x26,
0x1c, 0xaf, 0x26, 0x8a, 0x2c, 0xe2, 0x8e, 0xf1, 0x8e, 0x57, 0x68, 0xbf, 0xda, 0x47, 0x3d, 0x14,
0xaf, 0xcc, 0x67, 0xa5, 0xe8, 0x3e, 0xb4, 0xcd, 0x62, 0xae, 0x21, 0xe7, 0x0f, 0x68, 0xf8, 0xc9,
0xb1, 0xff, 0x5b, 0xff, 0x61, 0xb4, 0x07, 0xdb, 0xfa, 0xac, 0x97, 0x31, 0xd8, 0xa8, 0xa4, 0x7a,
0x55, 0x02, 0xa7, 0x92, 0xea, 0x81, 0x04, 0x2e, 0xba, 0x05, 0xbb, 0x5a, 0x6a, 0xb4, 0x2e, 0x68,
0xa1, 0x2d, 0xf0, 0x4d, 0x36, 0x21, 0x4f, 0x02, 0x0f, 0x6d, 0x43, 0x57, 0x5b, 0xa6, 0xa2, 0xa0,
0x5d, 0x27, 0xa9, 0x3e, 0x41, 0xb0, 0x39, 0x7e, 0x7c, 0x79, 0xd5, 0x77, 0xbe, 0x5e, 0xf5, 0x9d,
0xef, 0x57, 0x7d, 0xe7, 0xf3, 0xcf, 0xfe, 0x06, 0xdc, 0xc1, 0x62, 0x31, 0x92, 0x8c, 0x53, 0x9c,
0xc8, 0x91, 0x62, 0xe9, 0xcc, 0x34, 0xe1, 0xd4, 0xf9, 0x15, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x05,
0x10, 0x17, 0xe2, 0x04, 0x00, 0x00,
// 718 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x94, 0xcf, 0x6e, 0xdb, 0x38,
0x10, 0xc6, 0x23, 0x5b, 0x8e, 0xe5, 0x71, 0x62, 0x2b, 0xdc, 0x3f, 0x10, 0x72, 0x70, 0xbc, 0xda,
0x0d, 0xd6, 0x6b, 0x60, 0xbd, 0x8b, 0xf4, 0xd0, 0x73, 0x5c, 0xb4, 0x80, 0xd1, 0xc2, 0x30, 0x94,
0xdc, 0x05, 0x59, 0x62, 0x58, 0x16, 0x16, 0xa9, 0x52, 0x14, 0x62, 0x1f, 0x7a, 0xef, 0x23, 0xb4,
0xcf, 0xd0, 0x17, 0xc9, 0xb1, 0x4f, 0x50, 0xb4, 0xe9, 0x8b, 0x14, 0x24, 0x25, 0xd9, 0x69, 0x53,
0xb4, 0x27, 0x91, 0xdf, 0xfc, 0x66, 0x48, 0xcc, 0x37, 0x14, 0xf4, 0xf0, 0x1a, 0xc7, 0x85, 0xe4,
0x62, 0x92, 0x09, 0x2e, 0x39, 0xb2, 0x25, 0xcd, 0x96, 0xc7, 0x2e, 0x5e, 0x67, 0x02, 0xe7, 0x39,
0xe5, 0xcc, 0xe8, 0xc7, 0x07, 0x79, 0xfc, 0x1c, 0xa7, 0x51, 0xb9, 0xfb, 0x95, 0x70, 0xc2, 0xf5,
0xf2, 0x3f, 0xb5, 0x32, 0xaa, 0xff, 0xa9, 0x01, 0xce, 0xe3, 0xb2, 0x1c, 0xfa, 0x0b, 0x1a, 0x32,
0xf3, 0xac, 0xa1, 0x35, 0xea, 0x9d, 0xf5, 0x26, 0xaa, 0xea, 0x44, 0xc5, 0x2e, 0x37, 0x19, 0x9e,
0xda, 0x37, 0x1f, 0x4e, 0xf6, 0x82, 0x86, 0xcc, 0xd0, 0x18, 0x1c, 0xb9, 0x5c, 0x85, 0x79, 0x1c,
0x31, 0xaf, 0x31, 0xb4, 0x46, 0xdd, 0xb3, 0xbe, 0x61, 0x2f, 0xa3, 0xe5, 0x0a, 0x5f, 0xc4, 0x11,
0x0b, 0xda, 0x72, 0xb9, 0x52, 0x0b, 0xc5, 0xd2, 0x64, 0x6d, 0xd8, 0xe6, 0x2e, 0x3b, 0x63, 0x09,
0x5e, 0x1b, 0x96, 0x26, 0x7a, 0x81, 0xfe, 0x85, 0x4e, 0x8e, 0x57, 0x38, 0x96, 0x94, 0x33, 0xcf,
0xde, 0x85, 0x2f, 0x2a, 0x39, 0xd8, 0x12, 0xe8, 0x01, 0x74, 0x23, 0x42, 0x04, 0x26, 0x91, 0x4e,
0x68, 0xe9, 0x84, 0x23, 0x93, 0x70, 0xbe, 0x0d, 0x04, 0xbb, 0x14, 0x1a, 0x80, 0x2d, 0x79, 0x36,
0xf7, 0xf6, 0x35, 0x0d, 0xe5, 0xbd, 0x79, 0x36, 0x0f, 0xb4, 0x8e, 0xfe, 0x80, 0xd6, 0x8a, 0xa6,
0x54, 0x7a, 0x6d, 0x0d, 0x74, 0x0d, 0xf0, 0x4c, 0x49, 0x81, 0x89, 0xa0, 0xff, 0x01, 0x72, 0x29,
0x70, 0x94, 0x86, 0x11, 0x21, 0x9e, 0xf3, 0xbd, 0x63, 0x3b, 0x06, 0x3a, 0x27, 0xc4, 0x17, 0xd0,
0xa9, 0x5b, 0x83, 0x4e, 0xc0, 0x91, 0x6a, 0x13, 0xd2, 0x44, 0x77, 0xba, 0x59, 0x76, 0xb6, 0xad,
0xd5, 0x59, 0x82, 0xc6, 0xd0, 0x8e, 0xf9, 0xaa, 0x48, 0x59, 0xee, 0x35, 0x86, 0xcd, 0x51, 0xf7,
0xcc, 0x35, 0xc5, 0x1f, 0x69, 0x71, 0xc6, 0xae, 0x78, 0x50, 0x01, 0xc8, 0x03, 0x3b, 0xc1, 0x79,
0xac, 0x5b, 0xeb, 0x94, 0x85, 0xb4, 0xe2, 0xbf, 0xb3, 0xa0, 0x53, 0xf7, 0xf8, 0xc7, 0x87, 0x9e,
0x80, 0x43, 0x15, 0xad, 0x80, 0xc6, 0x2e, 0xa0, 0xd5, 0xbb, 0xb7, 0x6a, 0xfe, 0xec, 0xad, 0xec,
0xaf, 0x6f, 0x85, 0x7e, 0x87, 0xfd, 0x82, 0xd1, 0x97, 0x05, 0xd6, 0x76, 0x39, 0x41, 0xb9, 0xf3,
0x1f, 0x42, 0xa7, 0xf6, 0x18, 0x8d, 0x01, 0x62, 0xce, 0x12, 0xaa, 0x36, 0xb9, 0x67, 0xe9, 0xd3,
0xa0, 0x9a, 0xc6, 0x4c, 0x04, 0x3b, 0x51, 0x7f, 0x02, 0xb0, 0x10, 0xfc, 0x45, 0x99, 0x39, 0x84,
0x96, 0x7a, 0x04, 0xf7, 0x25, 0x99, 0x80, 0xff, 0x0a, 0xba, 0x3b, 0x26, 0xa1, 0x53, 0x70, 0x88,
0xe0, 0x45, 0x16, 0x2e, 0x37, 0xf7, 0xe4, 0xb4, 0x75, 0x6c, 0xba, 0x51, 0x58, 0x44, 0x48, 0x78,
0x55, 0xb0, 0xb8, 0xf4, 0xe4, 0x0e, 0x16, 0x11, 0xf2, 0xa4, 0x60, 0x31, 0x1a, 0x82, 0x63, 0x4c,
0xc7, 0xc9, 0x1d, 0x47, 0x6a, 0xd5, 0x7f, 0x0a, 0xb6, 0x1a, 0x36, 0xf4, 0x37, 0x38, 0x5c, 0x24,
0x58, 0x6c, 0xcf, 0x3d, 0x30, 0x05, 0xa7, 0x9b, 0x99, 0xc4, 0x69, 0xd0, 0xd6, 0xd1, 0xe9, 0x06,
0x1d, 0x57, 0xf3, 0xa8, 0x4c, 0xb1, 0xcb, 0x7a, 0x46, 0xf2, 0xff, 0x84, 0x96, 0x1e, 0xcc, 0x2d,
0x64, 0x7d, 0x0b, 0xbd, 0xb5, 0xc0, 0xab, 0xde, 0xb7, 0xf9, 0x52, 0xce, 0x2e, 0x8a, 0x34, 0x8d,
0xc4, 0x06, 0x8d, 0xe1, 0x48, 0xd2, 0x14, 0x87, 0x99, 0xe0, 0x31, 0xce, 0x73, 0x9c, 0x84, 0xba,
0xe1, 0xd6, 0xc8, 0x0e, 0xfa, 0x2a, 0xb0, 0xa8, 0xf4, 0x79, 0xae, 0x58, 0x56, 0xa4, 0x0a, 0x4d,
0x8a, 0x18, 0x27, 0xa1, 0xe0, 0xd7, 0xb9, 0xb9, 0x55, 0xd0, 0x67, 0x45, 0xba, 0x28, 0xf5, 0x80,
0x5f, 0xe7, 0xe8, 0x14, 0x7a, 0x8a, 0xa5, 0x12, 0x8b, 0xc8, 0xb8, 0xd8, 0xd4, 0xe0, 0x21, 0x2b,
0xd2, 0x59, 0x2d, 0x8e, 0x5f, 0x5b, 0xe6, 0xdf, 0xa3, 0xfe, 0x2f, 0xe8, 0x08, 0x0e, 0xd5, 0xb7,
0x7e, 0x28, 0xee, 0x5e, 0x25, 0xd5, 0x63, 0xec, 0x5a, 0x95, 0x54, 0x0f, 0x8b, 0xdb, 0x40, 0xbf,
0x40, 0x5f, 0x49, 0x3b, 0xb6, 0xba, 0x4d, 0x74, 0x00, 0x8e, 0xae, 0xc6, 0xb3, 0xb9, 0x6b, 0xa3,
0x43, 0xe8, 0xa8, 0x9d, 0xee, 0x96, 0xdb, 0xaa, 0x8b, 0x54, 0x0f, 0xd4, 0xdd, 0x9f, 0xfe, 0x73,
0x73, 0x3b, 0xb0, 0xde, 0xdf, 0x0e, 0xac, 0x8f, 0xb7, 0x03, 0xeb, 0xcd, 0xe7, 0xc1, 0x1e, 0xfc,
0x16, 0xf3, 0x74, 0x92, 0x51, 0x46, 0xe2, 0x28, 0x9b, 0x48, 0x9a, 0x2c, 0xb5, 0x41, 0x0b, 0xeb,
0x4b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x99, 0xfc, 0xf8, 0x28, 0x7e, 0x05, 0x00, 0x00,
}
......@@ -5,12 +5,10 @@ package tipb
import (
"fmt"
proto "github.com/golang/protobuf/proto"
io "io"
math "math"
io "io"
proto "github.com/golang/protobuf/proto"
)
// Reference imports to suppress errors if they are not otherwise used.
......
......@@ -5,14 +5,11 @@ package tipb
import (
"fmt"
proto "github.com/golang/protobuf/proto"
io "io"
math "math"
proto "github.com/golang/protobuf/proto"
github_com_pingcap_tipb_sharedbytes "github.com/pingcap/tipb/sharedbytes"
io "io"
)
// Reference imports to suppress errors if they are not otherwise used.
......@@ -112,12 +109,14 @@ type SelectResponse struct {
Rows []*Row `protobuf:"bytes,2,rep,name=rows" json:"rows,omitempty"`
// Use multiple chunks to reduce memory allocation and
// avoid allocating large contiguous memory.
Chunks []Chunk `protobuf:"bytes,3,rep,name=chunks" json:"chunks"`
Warnings []*Error `protobuf:"bytes,4,rep,name=warnings" json:"warnings,omitempty"`
OutputCounts []int64 `protobuf:"varint,5,rep,name=output_counts,json=outputCounts" json:"output_counts,omitempty"`
WarningCount *int64 `protobuf:"varint,6,opt,name=warning_count,json=warningCount" json:"warning_count,omitempty"`
RowBatchData github_com_pingcap_tipb_sharedbytes.SharedBytes `protobuf:"bytes,7,opt,name=row_batch_data,json=rowBatchData,customtype=github.com/pingcap/tipb/sharedbytes.SharedBytes" json:"row_batch_data"`
XXX_unrecognized []byte `json:"-"`
Chunks []Chunk `protobuf:"bytes,3,rep,name=chunks" json:"chunks"`
Warnings []*Error `protobuf:"bytes,4,rep,name=warnings" json:"warnings,omitempty"`
OutputCounts []int64 `protobuf:"varint,5,rep,name=output_counts,json=outputCounts" json:"output_counts,omitempty"`
WarningCount *int64 `protobuf:"varint,6,opt,name=warning_count,json=warningCount" json:"warning_count,omitempty"`
RowBatchData github_com_pingcap_tipb_sharedbytes.SharedBytes `protobuf:"bytes,7,opt,name=row_batch_data,json=rowBatchData,customtype=github.com/pingcap/tipb/sharedbytes.SharedBytes" json:"row_batch_data"`
// The execution summary of each executor, in the order in request.
ExecutionSummaries []*ExecutorExecutionSummary `protobuf:"bytes,8,rep,name=execution_summaries,json=executionSummaries" json:"execution_summaries,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (m *SelectResponse) Reset() { *m = SelectResponse{} }
......@@ -167,6 +166,13 @@ func (m *SelectResponse) GetWarningCount() int64 {
return 0
}
func (m *SelectResponse) GetExecutionSummaries() []*ExecutorExecutionSummary {
if m != nil {
return m.ExecutionSummaries
}
return nil
}
// Chunk contains multiple rows data and rows meta.
type Chunk struct {
// Data for all rows in the chunk.
......@@ -241,11 +247,13 @@ type DAGRequest struct {
EncodeType EncodeType `protobuf:"varint,8,opt,name=encode_type,json=encodeType,enum=tipb.EncodeType" json:"encode_type"`
// It indicates the sql_mode.
SqlMode *uint64 `protobuf:"varint,9,opt,name=sql_mode,json=sqlMode" json:"sql_mode,omitempty"`
// It indicates whether the sql mode is strict.
IsStrictSqlMode *bool `protobuf:"varint,10,opt,name=is_strict_sql_mode,json=isStrictSqlMode" json:"is_strict_sql_mode,omitempty"`
// supply offset is not enough since we have daylight saving time present in some regions
TimeZoneName string `protobuf:"bytes,11,opt,name=time_zone_name,json=timeZoneName" json:"time_zone_name"`
XXX_unrecognized []byte `json:"-"`
TimeZoneName string `protobuf:"bytes,11,opt,name=time_zone_name,json=timeZoneName" json:"time_zone_name"`
// It represents whether or not TiKV should collect execution summaries.
// Execution summaries will be collected into `execution_summaries` field
// in the response.
CollectExecutionSummaries *bool `protobuf:"varint,12,opt,name=collect_execution_summaries,json=collectExecutionSummaries" json:"collect_execution_summaries,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (m *DAGRequest) Reset() { *m = DAGRequest{} }
......@@ -316,13 +324,6 @@ func (m *DAGRequest) GetSqlMode() uint64 {
return 0
}
func (m *DAGRequest) GetIsStrictSqlMode() bool {
if m != nil && m.IsStrictSqlMode != nil {
return *m.IsStrictSqlMode
}
return false
}
func (m *DAGRequest) GetTimeZoneName() string {
if m != nil {
return m.TimeZoneName
......@@ -330,6 +331,13 @@ func (m *DAGRequest) GetTimeZoneName() string {
return ""
}
func (m *DAGRequest) GetCollectExecutionSummaries() bool {
if m != nil && m.CollectExecutionSummaries != nil {
return *m.CollectExecutionSummaries
}
return false
}
type StreamResponse struct {
Error *Error `protobuf:"bytes,1,opt,name=error" json:"error,omitempty"`
// Data for all rows
......@@ -526,6 +534,18 @@ func (m *SelectResponse) MarshalTo(dAtA []byte) (int, error) {
return 0, err
}
i += n2
if len(m.ExecutionSummaries) > 0 {
for _, msg := range m.ExecutionSummaries {
dAtA[i] = 0x42
i++
i = encodeVarintSelect(dAtA, i, uint64(msg.Size()))
n, err := msg.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n
}
}
if m.XXX_unrecognized != nil {
i += copy(dAtA[i:], m.XXX_unrecognized)
}
......@@ -666,20 +686,20 @@ func (m *DAGRequest) MarshalTo(dAtA []byte) (int, error) {
i++
i = encodeVarintSelect(dAtA, i, uint64(*m.SqlMode))
}
if m.IsStrictSqlMode != nil {
dAtA[i] = 0x50
dAtA[i] = 0x5a
i++
i = encodeVarintSelect(dAtA, i, uint64(len(m.TimeZoneName)))
i += copy(dAtA[i:], m.TimeZoneName)
if m.CollectExecutionSummaries != nil {
dAtA[i] = 0x60
i++
if *m.IsStrictSqlMode {
if *m.CollectExecutionSummaries {
dAtA[i] = 1
} else {
dAtA[i] = 0
}
i++
}
dAtA[i] = 0x5a
i++
i = encodeVarintSelect(dAtA, i, uint64(len(m.TimeZoneName)))
i += copy(dAtA[i:], m.TimeZoneName)
if m.XXX_unrecognized != nil {
i += copy(dAtA[i:], m.XXX_unrecognized)
}
......@@ -822,6 +842,12 @@ func (m *SelectResponse) Size() (n int) {
}
l = m.RowBatchData.Size()
n += 1 + l + sovSelect(uint64(l))
if len(m.ExecutionSummaries) > 0 {
for _, e := range m.ExecutionSummaries {
l = e.Size()
n += 1 + l + sovSelect(uint64(l))
}
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
......@@ -883,11 +909,11 @@ func (m *DAGRequest) Size() (n int) {
if m.SqlMode != nil {
n += 1 + sovSelect(uint64(*m.SqlMode))
}
if m.IsStrictSqlMode != nil {
n += 2
}
l = len(m.TimeZoneName)
n += 1 + l + sovSelect(uint64(l))
if m.CollectExecutionSummaries != nil {
n += 2
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
......@@ -1415,6 +1441,37 @@ func (m *SelectResponse) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 8:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field ExecutionSummaries", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowSelect
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthSelect
}
postIndex := iNdEx + msglen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.ExecutionSummaries = append(m.ExecutionSummaries, &ExecutorExecutionSummary{})
if err := m.ExecutionSummaries[len(m.ExecutionSummaries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipSelect(dAtA[iNdEx:])
......@@ -1897,27 +1954,6 @@ func (m *DAGRequest) Unmarshal(dAtA []byte) error {
}
}
m.SqlMode = &v
case 10:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field IsStrictSqlMode", wireType)
}
var v int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowSelect
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
b := bool(v != 0)
m.IsStrictSqlMode = &b
case 11:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field TimeZoneName", wireType)
......@@ -1947,6 +1983,27 @@ func (m *DAGRequest) Unmarshal(dAtA []byte) error {
}
m.TimeZoneName = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 12:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field CollectExecutionSummaries", wireType)
}
var v int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowSelect
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
b := bool(v != 0)
m.CollectExecutionSummaries = &b
default:
iNdEx = preIndex
skippy, err := skipSelect(dAtA[iNdEx:])
......@@ -2304,52 +2361,55 @@ var (
func init() { proto.RegisterFile("select.proto", fileDescriptorSelect) }
var fileDescriptorSelect = []byte{
// 748 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x54, 0xcd, 0x4e, 0xdb, 0x4a,
0x18, 0xc5, 0xd8, 0xf9, 0xfb, 0x92, 0x98, 0xdc, 0x11, 0x17, 0xf9, 0x22, 0x6e, 0xc8, 0xcd, 0x55,
0xd5, 0x40, 0x91, 0x43, 0xd9, 0xa0, 0x2e, 0x09, 0xa0, 0x2e, 0x2a, 0xda, 0xca, 0x41, 0xaa, 0x54,
0xa9, 0xb2, 0x26, 0xce, 0xc4, 0xb1, 0x6a, 0x7b, 0xcc, 0xcc, 0x58, 0x81, 0xbe, 0x44, 0xb7, 0x7d,
0x24, 0x76, 0xed, 0xb6, 0x5d, 0xa0, 0x8a, 0x3e, 0x42, 0x5f, 0xa0, 0x9a, 0xf1, 0x24, 0x81, 0x65,
0xc5, 0xa2, 0xab, 0x4c, 0xce, 0x39, 0x73, 0xbe, 0xcf, 0xdf, 0x9c, 0x19, 0x68, 0x70, 0x12, 0x93,
0x40, 0xb8, 0x19, 0xa3, 0x82, 0x22, 0x4b, 0x44, 0xd9, 0x68, 0xd3, 0x26, 0x97, 0x24, 0xc8, 0x05,
0x65, 0x05, 0xba, 0xb9, 0x1e, 0xd2, 0x90, 0xaa, 0x65, 0x5f, 0xae, 0x0a, 0xb4, 0xfb, 0x14, 0x4c,
0x8f, 0xce, 0xd0, 0x06, 0x94, 0xa7, 0x38, 0x1d, 0xc7, 0xc4, 0x31, 0x3a, 0x46, 0xaf, 0xe1, 0xe9,
0x7f, 0x08, 0x81, 0x35, 0xc6, 0x02, 0x3b, 0xab, 0x0a, 0x55, 0xeb, 0xee, 0x33, 0x28, 0x9d, 0x32,
0x46, 0x19, 0x72, 0xc0, 0x0a, 0xe8, 0xb8, 0xd8, 0x52, 0x1a, 0x58, 0xd7, 0x37, 0xdb, 0x2b, 0x9e,
0x42, 0xd0, 0x06, 0x98, 0x09, 0x0f, 0xd5, 0xae, 0x9a, 0x26, 0x24, 0xd0, 0xfd, 0xbc, 0x0a, 0xf6,
0x50, 0xb5, 0xea, 0x11, 0x9e, 0xd1, 0x94, 0x13, 0xf4, 0x1f, 0x94, 0x88, 0x74, 0x53, 0x2e, 0xf5,
0x83, 0xba, 0x2b, 0x9b, 0x77, 0x55, 0x01, 0xaf, 0x60, 0xd0, 0xbf, 0x60, 0x31, 0x3a, 0xe3, 0xce,
0x6a, 0xc7, 0xec, 0xd5, 0x0f, 0x6a, 0x85, 0xc2, 0xa3, 0x33, 0x4f, 0xc1, 0x68, 0x07, 0xca, 0xc1,
0x34, 0x4f, 0xdf, 0x73, 0xc7, 0x54, 0x02, 0x6d, 0x71, 0x2c, 0x31, 0x5d, 0x5c, 0x0b, 0xd0, 0x63,
0xa8, 0xce, 0x30, 0x4b, 0xa3, 0x34, 0xe4, 0x8e, 0x75, 0x57, 0x5c, 0xd4, 0x5b, 0x90, 0xe8, 0x7f,
0x68, 0xd2, 0x5c, 0x64, 0xb9, 0xf0, 0x03, 0x9a, 0xa7, 0x82, 0x3b, 0xa5, 0x8e, 0xd9, 0x33, 0xbd,
0x46, 0x01, 0x1e, 0x2b, 0x4c, 0x8a, 0xf4, 0x86, 0x42, 0xe5, 0x94, 0x3b, 0x86, 0x14, 0x69, 0x50,
0xa9, 0xd0, 0x3b, 0xb0, 0x19, 0x9d, 0xf9, 0x23, 0x2c, 0x82, 0xa9, 0xaf, 0x66, 0x59, 0x91, 0xb3,
0x1c, 0x1c, 0xca, 0xc6, 0xbe, 0xdd, 0x6c, 0xf7, 0xc3, 0x48, 0x4c, 0xf3, 0x91, 0x1b, 0xd0, 0xa4,
0x9f, 0x45, 0x69, 0x18, 0xe0, 0xac, 0x2f, 0x5b, 0xea, 0xf3, 0x29, 0x66, 0x64, 0x3c, 0xba, 0x12,
0x84, 0xbb, 0x43, 0xb5, 0x1e, 0xc8, 0xb5, 0xd7, 0x60, 0x74, 0x36, 0x90, 0x6e, 0x27, 0xf2, 0x30,
0x3e, 0x1a, 0x50, 0x52, 0x5f, 0x8a, 0xce, 0xa1, 0x26, 0xc7, 0x51, 0xd4, 0x30, 0x1f, 0x56, 0xa3,
0x2a, 0x9d, 0xa4, 0x3f, 0xda, 0xd7, 0xae, 0x09, 0x11, 0x58, 0x8f, 0xac, 0xb9, 0x38, 0x80, 0x33,
0x22, 0xb0, 0x9e, 0xb0, 0xda, 0x21, 0xff, 0x77, 0x4f, 0xa1, 0xa2, 0x29, 0xb4, 0x75, 0x2f, 0x55,
0xe6, 0xfc, 0x30, 0x74, 0xb6, 0xb6, 0xa0, 0x1c, 0x93, 0x34, 0x14, 0x53, 0x95, 0x93, 0x05, 0x5b,
0x60, 0xdd, 0xaf, 0x26, 0xc0, 0xc9, 0xd1, 0x73, 0x8f, 0x5c, 0xe4, 0x84, 0x0b, 0xb4, 0x0d, 0x55,
0x2e, 0x30, 0x13, 0xbe, 0xe0, 0xca, 0xcc, 0xd2, 0xf2, 0x8a, 0x42, 0xcf, 0x39, 0xda, 0x83, 0xda,
0x3c, 0xf0, 0xf3, 0xa4, 0xd8, 0xfa, 0x6c, 0x35, 0xec, 0x2d, 0x05, 0xc8, 0x85, 0x96, 0x88, 0x12,
0xe2, 0x7f, 0xa0, 0x29, 0xf1, 0xe9, 0x64, 0xc2, 0x89, 0x50, 0x33, 0x9b, 0x77, 0x61, 0x4b, 0xf6,
0x2d, 0x4d, 0xc9, 0x2b, 0xc5, 0xa1, 0x4d, 0x28, 0x4d, 0x62, 0xac, 0x52, 0xb3, 0xac, 0x5d, 0x40,
0xe8, 0x11, 0xd8, 0x3a, 0x2b, 0x85, 0x51, 0x11, 0x96, 0xa6, 0xa7, 0x13, 0x54, 0x38, 0x70, 0xb4,
0x0f, 0xeb, 0x01, 0x8d, 0x65, 0xf6, 0x7d, 0x86, 0xd3, 0x90, 0xcc, 0x93, 0x25, 0x43, 0x53, 0xf5,
0x90, 0xe6, 0x3c, 0x49, 0xe9, 0x7c, 0xed, 0xc2, 0x5f, 0x09, 0xbe, 0xf4, 0xef, 0x67, 0x4c, 0xa6,
0xc7, 0xf2, 0xd6, 0x12, 0x7c, 0xf9, 0xe6, 0x6e, 0xcc, 0x0e, 0xa1, 0x4e, 0x52, 0x79, 0xf7, 0x7c,
0x71, 0x95, 0x11, 0xa7, 0xda, 0x31, 0x7a, 0xf6, 0x41, 0x4b, 0x0f, 0x40, 0x11, 0xe7, 0x57, 0x19,
0xd1, 0x8d, 0x03, 0x59, 0x20, 0xe8, 0x1f, 0xa8, 0xf2, 0x8b, 0xd8, 0x4f, 0xe4, 0x45, 0xae, 0x29,
0xef, 0x0a, 0xbf, 0x88, 0xcf, 0xe4, 0x2d, 0x7e, 0x02, 0x28, 0xe2, 0x3e, 0x17, 0x2c, 0x0a, 0x84,
0xbf, 0x10, 0x81, 0xea, 0x77, 0x2d, 0xe2, 0x43, 0x45, 0x0c, 0xb5, 0x78, 0x17, 0xec, 0xe5, 0x44,
0x53, 0x9c, 0x10, 0xa7, 0x7e, 0xe7, 0xf6, 0x37, 0xe6, 0xf3, 0x7c, 0x89, 0x13, 0xd2, 0xfd, 0x69,
0x80, 0x3d, 0x14, 0x8c, 0xe0, 0xe4, 0x77, 0x9e, 0x81, 0x17, 0xfa, 0x2d, 0x7a, 0x60, 0xb6, 0x95,
0xc9, 0x1f, 0x78, 0x09, 0x76, 0xf7, 0x00, 0x96, 0x27, 0x81, 0xd6, 0xa0, 0x2e, 0x7f, 0x4f, 0xc8,
0x04, 0xe7, 0xb1, 0x68, 0xad, 0xa0, 0x26, 0xd4, 0x24, 0x70, 0xc4, 0x18, 0x9d, 0xb5, 0x8c, 0xc1,
0xce, 0xf5, 0x6d, 0xdb, 0xf8, 0x72, 0xdb, 0x36, 0xbe, 0xdf, 0xb6, 0x8d, 0x4f, 0x3f, 0xda, 0x2b,
0xf0, 0x77, 0x40, 0x13, 0x57, 0x7f, 0xa2, 0x2b, 0xa2, 0xf1, 0x48, 0x35, 0xfc, 0xda, 0xf8, 0x15,
0x00, 0x00, 0xff, 0xff, 0x04, 0xb1, 0xa6, 0x66, 0xfe, 0x05, 0x00, 0x00,
// 785 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x54, 0xcf, 0x6f, 0xe3, 0x44,
0x14, 0xae, 0xd7, 0xce, 0xaf, 0x97, 0xc4, 0x1b, 0x86, 0x65, 0xe5, 0x2d, 0x4b, 0x1a, 0x82, 0x10,
0xd9, 0x6a, 0xe5, 0x2c, 0xbd, 0xac, 0xb8, 0x20, 0x35, 0x6d, 0xc4, 0x01, 0x95, 0xa2, 0x49, 0x25,
0x24, 0x24, 0x64, 0x4d, 0x9c, 0x89, 0x63, 0x61, 0x7b, 0xdc, 0x99, 0xb1, 0xd2, 0xf0, 0x4f, 0x70,
0xe5, 0xc8, 0x9f, 0xd3, 0x23, 0x67, 0x0e, 0x15, 0x2a, 0x57, 0x6e, 0xfc, 0x03, 0x68, 0xc6, 0xe3,
0xa4, 0x11, 0x5c, 0x50, 0x0f, 0x7b, 0xf2, 0xf8, 0x7b, 0xdf, 0x7c, 0xf3, 0xe6, 0xbd, 0x6f, 0x1e,
0x74, 0x04, 0x4d, 0x68, 0x28, 0xfd, 0x9c, 0x33, 0xc9, 0x90, 0x23, 0xe3, 0x7c, 0x7e, 0xe8, 0xd2,
0x1b, 0x1a, 0x16, 0x92, 0xf1, 0x12, 0x3d, 0x7c, 0x16, 0xb1, 0x88, 0xe9, 0xe5, 0x58, 0xad, 0x4a,
0x74, 0xf8, 0x39, 0xd8, 0x98, 0xad, 0xd1, 0x73, 0xa8, 0xaf, 0x48, 0xb6, 0x48, 0xa8, 0x67, 0x0d,
0xac, 0x51, 0x07, 0x9b, 0x3f, 0x84, 0xc0, 0x59, 0x10, 0x49, 0xbc, 0x27, 0x1a, 0xd5, 0xeb, 0xe1,
0x17, 0x50, 0x9b, 0x72, 0xce, 0x38, 0xf2, 0xc0, 0x09, 0xd9, 0xa2, 0xdc, 0x52, 0x9b, 0x38, 0xb7,
0x77, 0x47, 0x07, 0x58, 0x23, 0xe8, 0x39, 0xd8, 0xa9, 0x88, 0xf4, 0xae, 0x96, 0x09, 0x28, 0x60,
0xf8, 0xab, 0x0d, 0xee, 0x4c, 0xa7, 0x8a, 0xa9, 0xc8, 0x59, 0x26, 0x28, 0xfa, 0x18, 0x6a, 0x54,
0xa9, 0x69, 0x95, 0xf6, 0x49, 0xdb, 0x57, 0xc9, 0xfb, 0xfa, 0x00, 0x5c, 0x46, 0xd0, 0x47, 0xe0,
0x70, 0xb6, 0x16, 0xde, 0x93, 0x81, 0x3d, 0x6a, 0x9f, 0xb4, 0x4a, 0x06, 0x66, 0x6b, 0xac, 0x61,
0xf4, 0x0a, 0xea, 0xe1, 0xaa, 0xc8, 0x7e, 0x14, 0x9e, 0xad, 0x09, 0x46, 0xe2, 0x4c, 0x61, 0xe6,
0x70, 0x43, 0x40, 0x9f, 0x41, 0x73, 0x4d, 0x78, 0x16, 0x67, 0x91, 0xf0, 0x9c, 0x87, 0xe4, 0xf2,
0xbc, 0x6d, 0x10, 0x7d, 0x02, 0x5d, 0x56, 0xc8, 0xbc, 0x90, 0x41, 0xc8, 0x8a, 0x4c, 0x0a, 0xaf,
0x36, 0xb0, 0x47, 0x36, 0xee, 0x94, 0xe0, 0x99, 0xc6, 0x14, 0xc9, 0x6c, 0x28, 0x59, 0x5e, 0x7d,
0x60, 0x29, 0x92, 0x01, 0x35, 0x0b, 0xfd, 0x00, 0x2e, 0x67, 0xeb, 0x60, 0x4e, 0x64, 0xb8, 0x0a,
0x74, 0x2d, 0x1b, 0xaa, 0x96, 0x93, 0xb7, 0x2a, 0xb1, 0xdf, 0xef, 0x8e, 0xc6, 0x51, 0x2c, 0x57,
0xc5, 0xdc, 0x0f, 0x59, 0x3a, 0xce, 0xe3, 0x2c, 0x0a, 0x49, 0x3e, 0x56, 0x29, 0x8d, 0xc5, 0x8a,
0x70, 0xba, 0x98, 0x6f, 0x24, 0x15, 0xfe, 0x4c, 0xaf, 0x27, 0x6a, 0x8d, 0x3b, 0x9c, 0xad, 0x27,
0x4a, 0xed, 0x9c, 0x48, 0x82, 0x2e, 0xe1, 0xfd, 0xb2, 0xcf, 0x31, 0xcb, 0x02, 0x51, 0xa4, 0x29,
0xe1, 0x31, 0x15, 0x5e, 0x53, 0x5f, 0xae, 0x6f, 0x2e, 0x67, 0x8c, 0x30, 0xad, 0x88, 0x33, 0xcd,
0xdb, 0x60, 0x44, 0xf7, 0x91, 0x98, 0x8a, 0xe1, 0xcf, 0x16, 0xd4, 0x74, 0xe9, 0xd0, 0x15, 0xb4,
0x54, 0x7d, 0xcb, 0xa4, 0xed, 0xc7, 0x25, 0xdd, 0x54, 0x4a, 0x3a, 0xe1, 0x37, 0x46, 0x35, 0xa5,
0x92, 0x98, 0x1e, 0x74, 0xb7, 0x1d, 0xbd, 0xa0, 0x92, 0x98, 0x96, 0xe9, 0x1d, 0xea, 0x7f, 0x38,
0x85, 0x86, 0x09, 0xa1, 0x97, 0x7b, 0x36, 0xb5, 0xab, 0xee, 0x1a, 0xb3, 0xbe, 0x84, 0x7a, 0x42,
0xb3, 0x48, 0xae, 0xb4, 0xf1, 0xb6, 0xd1, 0x12, 0x1b, 0xfe, 0x65, 0x03, 0x9c, 0x9f, 0x7e, 0x85,
0xe9, 0x75, 0x41, 0x85, 0x44, 0x47, 0xd0, 0x14, 0x92, 0x70, 0x19, 0x48, 0xa1, 0xc5, 0x1c, 0x43,
0x6f, 0x68, 0xf4, 0x4a, 0xa0, 0xd7, 0xd0, 0xaa, 0x5e, 0x50, 0x65, 0x3d, 0x77, 0xbf, 0x9e, 0x78,
0x47, 0x40, 0x3e, 0xf4, 0x64, 0x9c, 0xd2, 0xe0, 0x27, 0x96, 0xd1, 0x80, 0x2d, 0x97, 0x82, 0x4a,
0x5d, 0xb3, 0x2a, 0x0b, 0x57, 0x45, 0xbf, 0x67, 0x19, 0xbd, 0xd4, 0x31, 0x74, 0x08, 0xb5, 0x65,
0x42, 0xb4, 0x0d, 0x77, 0x67, 0x97, 0x10, 0xfa, 0x14, 0x5c, 0x63, 0xbe, 0x52, 0xa8, 0x74, 0x5f,
0x17, 0x1b, 0x4b, 0x96, 0x0a, 0x02, 0xbd, 0x81, 0x67, 0x21, 0x4b, 0xd4, 0x63, 0x0a, 0x38, 0xc9,
0x22, 0x5a, 0x59, 0x55, 0xb9, 0xb0, 0x89, 0x91, 0x89, 0x61, 0x15, 0x32, 0x86, 0x3d, 0x86, 0xf7,
0x52, 0x72, 0x13, 0xec, 0x9b, 0x56, 0xd9, 0xd1, 0xc1, 0x4f, 0x53, 0x72, 0xf3, 0xdd, 0x43, 0xdf,
0xbe, 0x85, 0x36, 0xcd, 0xd4, 0x63, 0x0e, 0xe4, 0x26, 0xa7, 0x5e, 0x73, 0x60, 0x8d, 0xdc, 0x93,
0x9e, 0x29, 0x80, 0x0e, 0x5c, 0x6d, 0x72, 0x6a, 0x12, 0x07, 0xba, 0x45, 0xd0, 0x0b, 0x68, 0x8a,
0xeb, 0x24, 0x48, 0xd5, 0x64, 0x68, 0x69, 0xed, 0x86, 0xb8, 0x4e, 0x2e, 0xd4, 0x58, 0x38, 0x06,
0x77, 0x57, 0xa4, 0x8c, 0xa4, 0xd4, 0x6b, 0x3f, 0x98, 0x10, 0x9d, 0xaa, 0x44, 0xdf, 0x90, 0x94,
0xa2, 0x2f, 0xe1, 0xc3, 0xea, 0x76, 0xff, 0x65, 0xf0, 0x8e, 0xbe, 0xe4, 0x0b, 0x43, 0x99, 0xfe,
0xdb, 0xc7, 0x7f, 0x5b, 0xe0, 0xce, 0x24, 0xa7, 0x24, 0xfd, 0x3f, 0xa3, 0xe6, 0x6b, 0x33, 0xef,
0x1e, 0x69, 0x77, 0x2d, 0xf2, 0x0e, 0xa6, 0xcd, 0xf1, 0x6b, 0x80, 0x5d, 0x73, 0xd0, 0x53, 0x68,
0xab, 0xef, 0x39, 0x5d, 0x92, 0x22, 0x91, 0xbd, 0x03, 0xd4, 0x85, 0x96, 0x02, 0x4e, 0x39, 0x67,
0xeb, 0x9e, 0x35, 0x79, 0x75, 0x7b, 0xdf, 0xb7, 0x7e, 0xbb, 0xef, 0x5b, 0x7f, 0xdc, 0xf7, 0xad,
0x5f, 0xfe, 0xec, 0x1f, 0xc0, 0x07, 0x21, 0x4b, 0x7d, 0x73, 0x45, 0x5f, 0xc6, 0x8b, 0xb9, 0x4e,
0xf8, 0x5b, 0xeb, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, 0x9c, 0xdb, 0x62, 0x06, 0x00,
0x00,
}
......@@ -111,118 +111,118 @@
"revisionTime": "2018-10-24T15:10:47Z"
},
{
"checksumSHA1": "zdNB/SusrolFBEotWrfqZ08+MCk=",
"checksumSHA1": "SEiIj/X95cyoI8/a0z2XBpzE+CI=",
"path": "github.com/pingcap/parser",
"revision": "64957c596663a56fe176881aadea6baa4890f710",
"revisionTime": "2019-02-19T02:02:13Z"
"revision": "f7d75264dcc6bc53a720eeffeb47ab8db9fb3801",
"revisionTime": "2019-02-21T06:24:14Z"
},
{
"checksumSHA1": "JdLK0084PE81bjMLcH+qUZFq10M=",
"checksumSHA1": "saYDWHgFCkZAYZeOGfowg2TEAss=",
"path": "github.com/pingcap/parser/ast",
"revision": "64957c596663a56fe176881aadea6baa4890f710",
"revisionTime": "2019-02-19T02:02:13Z"
"revision": "f7d75264dcc6bc53a720eeffeb47ab8db9fb3801",
"revisionTime": "2019-02-21T06:24:14Z"
},
{
"checksumSHA1": "npMzF75Vg7tO28nM3MNFq7ciqRY=",
"checksumSHA1": "40q2uTuOqgcdXxoauVNVO+FCxe8=",
"path": "github.com/pingcap/parser/auth",
"revision": "64957c596663a56fe176881aadea6baa4890f710",
"revisionTime": "2019-02-19T02:02:13Z"
"revision": "f7d75264dcc6bc53a720eeffeb47ab8db9fb3801",
"revisionTime": "2019-02-21T06:24:14Z"
},
{
"checksumSHA1": "t4UHo966WzU9Z0IJkyGHRp0loOk=",
"path": "github.com/pingcap/parser/charset",
"revision": "64957c596663a56fe176881aadea6baa4890f710",
"revisionTime": "2019-02-19T02:02:13Z"
"revision": "f7d75264dcc6bc53a720eeffeb47ab8db9fb3801",
"revisionTime": "2019-02-21T06:24:14Z"
},
{
"checksumSHA1": "ohLJW2u9NJEzYIJL/AjOqcuKfMY=",
"path": "github.com/pingcap/parser/format",
"revision": "64957c596663a56fe176881aadea6baa4890f710",
"revisionTime": "2019-02-19T02:02:13Z"
"revision": "f7d75264dcc6bc53a720eeffeb47ab8db9fb3801",
"revisionTime": "2019-02-21T06:24:14Z"
},
{
"checksumSHA1": "AqNgtzIGY8g7Ojd9ofE8EtKW2mk=",
"path": "github.com/pingcap/parser/model",
"revision": "64957c596663a56fe176881aadea6baa4890f710",
"revisionTime": "2019-02-19T02:02:13Z"
"revision": "f7d75264dcc6bc53a720eeffeb47ab8db9fb3801",
"revisionTime": "2019-02-21T06:24:14Z"
},
{
"checksumSHA1": "SrliCbNvJrQExC1gULpw7FAiE6s=",
"path": "github.com/pingcap/parser/mysql",
"revision": "64957c596663a56fe176881aadea6baa4890f710",
"revisionTime": "2019-02-19T02:02:13Z"
"revision": "f7d75264dcc6bc53a720eeffeb47ab8db9fb3801",
"revisionTime": "2019-02-21T06:24:14Z"
},
{
"checksumSHA1": "olapD16WCMBU9vrA5PtlERGFfXw=",
"path": "github.com/pingcap/parser/opcode",
"revision": "64957c596663a56fe176881aadea6baa4890f710",
"revisionTime": "2019-02-19T02:02:13Z"
"revision": "f7d75264dcc6bc53a720eeffeb47ab8db9fb3801",
"revisionTime": "2019-02-21T06:24:14Z"
},
{
"checksumSHA1": "TF2rMYy9ewgZpFsJb+jaGXXqZqc=",
"path": "github.com/pingcap/parser/terror",
"revision": "64957c596663a56fe176881aadea6baa4890f710",
"revisionTime": "2019-02-19T02:02:13Z"
"revision": "f7d75264dcc6bc53a720eeffeb47ab8db9fb3801",
"revisionTime": "2019-02-21T06:24:14Z"
},
{
"checksumSHA1": "dxjAHfRcmXkQdf0HeueDrUO+BcM=",
"path": "github.com/pingcap/parser/types",
"revision": "64957c596663a56fe176881aadea6baa4890f710",
"revisionTime": "2019-02-19T02:02:13Z"
"revision": "f7d75264dcc6bc53a720eeffeb47ab8db9fb3801",
"revisionTime": "2019-02-21T06:24:14Z"
},
{
"checksumSHA1": "uOrWw9c47zwN6COxonFJ0t2IMcM=",
"path": "github.com/pingcap/tidb/sessionctx/stmtctx",
"revision": "ed7bb004170311e73664c280e77298760de74425",
"revisionTime": "2019-02-19T02:02:46Z"
"revision": "38a453d29c8cb6644c6bfd28be4efe243e10c161",
"revisionTime": "2019-02-21T13:18:03Z"
},
{
"checksumSHA1": "IJSv0YocnSmIZRpgQJ1pLtHL8vY=",
"path": "github.com/pingcap/tidb/types",
"revision": "ed7bb004170311e73664c280e77298760de74425",
"revisionTime": "2019-02-19T02:02:46Z"
"revision": "38a453d29c8cb6644c6bfd28be4efe243e10c161",
"revisionTime": "2019-02-21T13:18:03Z"
},
{
"checksumSHA1": "fPdBwAtPVKOr7YAyOMnRxyHixoM=",
"path": "github.com/pingcap/tidb/types/json",
"revision": "ed7bb004170311e73664c280e77298760de74425",
"revisionTime": "2019-02-19T02:02:46Z"
"revision": "38a453d29c8cb6644c6bfd28be4efe243e10c161",
"revisionTime": "2019-02-21T13:18:03Z"
},
{
"checksumSHA1": "tY4KSNzuTGm+dgV6ByZEGa6mv5E=",
"path": "github.com/pingcap/tidb/types/parser_driver",
"revision": "ed7bb004170311e73664c280e77298760de74425",
"revisionTime": "2019-02-19T02:02:46Z"
"revision": "38a453d29c8cb6644c6bfd28be4efe243e10c161",
"revisionTime": "2019-02-21T13:18:03Z"
},
{
"checksumSHA1": "OOig47D9TSVOUAYkNj2yJok1Hmo=",
"checksumSHA1": "oSpVUrmVZl6RPxrpwtKgeNodckQ=",
"path": "github.com/pingcap/tidb/util/execdetails",
"revision": "ed7bb004170311e73664c280e77298760de74425",
"revisionTime": "2019-02-19T02:02:46Z"
"revision": "38a453d29c8cb6644c6bfd28be4efe243e10c161",
"revisionTime": "2019-02-21T13:18:03Z"
},
{
"checksumSHA1": "RdbHgQWMHjRtKjqPcTX81k1V3sw=",
"path": "github.com/pingcap/tidb/util/hack",
"revision": "ed7bb004170311e73664c280e77298760de74425",
"revisionTime": "2019-02-19T02:02:46Z"
"revision": "38a453d29c8cb6644c6bfd28be4efe243e10c161",
"revisionTime": "2019-02-21T13:18:03Z"
},
{
"checksumSHA1": "xSyepiuqsoaaeDch7cXeumvVHKM=",
"path": "github.com/pingcap/tidb/util/memory",
"revision": "ed7bb004170311e73664c280e77298760de74425",
"revisionTime": "2019-02-19T02:02:46Z"
"revision": "38a453d29c8cb6644c6bfd28be4efe243e10c161",
"revisionTime": "2019-02-21T13:18:03Z"
},
{
"checksumSHA1": "SmYeIK/fIYXNu8IKxD6HOVQVTuU=",
"checksumSHA1": "QPIBwDNUFF5Whrnd41S3mkKa4gQ=",
"path": "github.com/pingcap/tipb/go-tipb",
"revision": "11e33c750323a0267a6aee335eaaeb7831bdae67",
"revisionTime": "2018-10-12T11:26:00Z"
"revision": "aa146c1ab9bb2b7ec5e00e8904aa95465f3f106b",
"revisionTime": "2019-02-21T05:42:54Z"
},
{
"checksumSHA1": "l0hSacaw5sInpzZkFwGLH/azUD4=",
"path": "github.com/pingcap/tipb/sharedbytes",
"revision": "11e33c750323a0267a6aee335eaaeb7831bdae67",
"revisionTime": "2018-10-12T11:26:00Z"
"revision": "aa146c1ab9bb2b7ec5e00e8904aa95465f3f106b",
"revisionTime": "2019-02-21T05:42:54Z"
},
{
"checksumSHA1": "I7hloldMJZTqUx6hbVDp5nk9fZQ=",
......@@ -413,62 +413,62 @@
{
"checksumSHA1": "aKn1oKcY74N8TRLm3Ayt7Q4bbI4=",
"path": "vitess.io/vitess/go/bytes2",
"revision": "092479406b27ae61a8fcd146a0e08af2d51a7245",
"revisionTime": "2019-02-18T03:34:22Z"
"revision": "b7e5a982740b1bc49dc8129605b9f037370829ae",
"revisionTime": "2019-02-20T22:32:46Z"
},
{
"checksumSHA1": "bhE6CGQgZTIgLPp9lnvlKW/47xc=",
"path": "vitess.io/vitess/go/hack",
"revision": "092479406b27ae61a8fcd146a0e08af2d51a7245",
"revisionTime": "2019-02-18T03:34:22Z"
"revision": "b7e5a982740b1bc49dc8129605b9f037370829ae",
"revisionTime": "2019-02-20T22:32:46Z"
},
{
"checksumSHA1": "w4BH8HL/CgT6aBWojJeZHOj5DZg=",
"path": "vitess.io/vitess/go/sqltypes",
"revision": "092479406b27ae61a8fcd146a0e08af2d51a7245",
"revisionTime": "2019-02-18T03:34:22Z"
"revision": "b7e5a982740b1bc49dc8129605b9f037370829ae",
"revisionTime": "2019-02-20T22:32:46Z"
},
{
"checksumSHA1": "vAIRxI6MHsq3x1hLQwIyw5AvqtI=",
"path": "vitess.io/vitess/go/vt/log",
"revision": "092479406b27ae61a8fcd146a0e08af2d51a7245",
"revisionTime": "2019-02-18T03:34:22Z"
"revision": "b7e5a982740b1bc49dc8129605b9f037370829ae",
"revisionTime": "2019-02-20T22:32:46Z"
},
{
"checksumSHA1": "nRmynSAD/uvTjH0/Ftr9Iz/VsN4=",
"path": "vitess.io/vitess/go/vt/proto/query",
"revision": "092479406b27ae61a8fcd146a0e08af2d51a7245",
"revisionTime": "2019-02-18T03:34:22Z"
"revision": "b7e5a982740b1bc49dc8129605b9f037370829ae",
"revisionTime": "2019-02-20T22:32:46Z"
},
{
"checksumSHA1": "YLWTmL+rvz0htn0niRMrIUI6rKc=",
"path": "vitess.io/vitess/go/vt/proto/topodata",
"revision": "092479406b27ae61a8fcd146a0e08af2d51a7245",
"revisionTime": "2019-02-18T03:34:22Z"
"revision": "b7e5a982740b1bc49dc8129605b9f037370829ae",
"revisionTime": "2019-02-20T22:32:46Z"
},
{
"checksumSHA1": "1gA4wbQ2DiVjeLJauYSQiuBJiE0=",
"path": "vitess.io/vitess/go/vt/proto/vtgate",
"revision": "092479406b27ae61a8fcd146a0e08af2d51a7245",
"revisionTime": "2019-02-18T03:34:22Z"
"revision": "b7e5a982740b1bc49dc8129605b9f037370829ae",
"revisionTime": "2019-02-20T22:32:46Z"
},
{
"checksumSHA1": "qz32abYdmm9NfKTc++K0l1EvXXM=",
"path": "vitess.io/vitess/go/vt/proto/vtrpc",
"revision": "092479406b27ae61a8fcd146a0e08af2d51a7245",
"revisionTime": "2019-02-18T03:34:22Z"
"revision": "b7e5a982740b1bc49dc8129605b9f037370829ae",
"revisionTime": "2019-02-20T22:32:46Z"
},
{
"checksumSHA1": "lpx8L51nDqrhQis64dEBk7RI32k=",
"path": "vitess.io/vitess/go/vt/sqlparser",
"revision": "092479406b27ae61a8fcd146a0e08af2d51a7245",
"revisionTime": "2019-02-18T03:34:22Z"
"revision": "b7e5a982740b1bc49dc8129605b9f037370829ae",
"revisionTime": "2019-02-20T22:32:46Z"
},
{
"checksumSHA1": "Jx+gOh/kiBDSZxEIWHyYn9brjdo=",
"path": "vitess.io/vitess/go/vt/vterrors",
"revision": "092479406b27ae61a8fcd146a0e08af2d51a7245",
"revisionTime": "2019-02-18T03:34:22Z"
"revision": "b7e5a982740b1bc49dc8129605b9f037370829ae",
"revisionTime": "2019-02-20T22:32:46Z"
}
],
"rootPath": "github.com/XiaoMi/soar"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册