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

update vendor

上级 441b0e88
......@@ -222,6 +222,17 @@ func (n *IndexColName) Accept(v Visitor) (Node, bool) {
return v.Leave(n)
}
// MatchType is the type for reference match type.
type MatchType int
// match type
const (
MatchNone MatchType = iota
MatchFull
MatchPartial
MatchSimple
)
// ReferenceDef is used for parsing foreign key reference option from SQL.
// See http://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html
type ReferenceDef struct {
......@@ -231,6 +242,7 @@ type ReferenceDef struct {
IndexColNames []*IndexColName
OnDelete *OnDeleteOpt
OnUpdate *OnUpdateOpt
Match MatchType
}
// Restore implements Node interface.
......@@ -251,6 +263,17 @@ func (n *ReferenceDef) Restore(ctx *RestoreCtx) error {
}
}
ctx.WritePlain(")")
if n.Match != MatchNone {
ctx.WriteKeyWord(" MATCH ")
switch n.Match {
case MatchFull:
ctx.WriteKeyWord("FULL")
case MatchPartial:
ctx.WriteKeyWord("PARTIAL")
case MatchSimple:
ctx.WriteKeyWord("SIMPLE")
}
}
if n.OnDelete.ReferOpt != ReferOptionNoOption {
ctx.WritePlain(" ")
if err := n.OnDelete.Restore(ctx); err != nil {
......@@ -308,6 +331,7 @@ const (
ReferOptionCascade
ReferOptionSetNull
ReferOptionNoAction
ReferOptionSetDefault
)
// String implements fmt.Stringer interface.
......@@ -321,6 +345,8 @@ func (r ReferOptionType) String() string {
return "SET NULL"
case ReferOptionNoAction:
return "NO ACTION"
case ReferOptionSetDefault:
return "SET DEFAULT"
}
return ""
}
......@@ -393,6 +419,7 @@ const (
ColumnOptionGenerated
ColumnOptionReference
ColumnOptionCollate
ColumnOptionCheck
)
var (
......@@ -417,6 +444,8 @@ type ColumnOption struct {
// Refer is used for foreign key.
Refer *ReferenceDef
StrValue string
// Enforced is only for Check, default is true.
Enforced bool
}
// Restore implements Node interface.
......@@ -473,6 +502,18 @@ func (n *ColumnOption) Restore(ctx *RestoreCtx) error {
}
ctx.WriteKeyWord("COLLATE ")
ctx.WritePlain(n.StrValue)
case ColumnOptionCheck:
ctx.WriteKeyWord("CHECK")
ctx.WritePlain("(")
if err := n.Expr.Restore(ctx); err != nil {
return errors.Trace(err)
}
ctx.WritePlain(")")
if n.Enforced {
ctx.WriteKeyWord(" ENFORCED")
} else {
ctx.WriteKeyWord(" NOT ENFORCED")
}
default:
return errors.New("An error occurred while splicing ColumnOption")
}
......@@ -562,12 +603,17 @@ const (
ConstraintUniqIndex
ConstraintForeignKey
ConstraintFulltext
ConstraintCheck
)
// Constraint is constraint for table definition.
type Constraint struct {
node
// only supported by MariaDB 10.0.2+ (ADD {INDEX|KEY}, ADD FOREIGN KEY),
// see https://mariadb.com/kb/en/library/alter-table/
IfNotExists bool
Tp ConstraintType
Name string
......@@ -576,6 +622,10 @@ type Constraint struct {
Refer *ReferenceDef // Used for foreign key.
Option *IndexOption // Index Options
Expr ExprNode // Used for Check
Enforced bool // Used for Check
}
// Restore implements Node interface.
......@@ -587,8 +637,14 @@ func (n *Constraint) Restore(ctx *RestoreCtx) error {
ctx.WriteKeyWord("PRIMARY KEY")
case ConstraintKey:
ctx.WriteKeyWord("KEY")
if n.IfNotExists {
ctx.WriteKeyWord(" IF NOT EXISTS")
}
case ConstraintIndex:
ctx.WriteKeyWord("INDEX")
if n.IfNotExists {
ctx.WriteKeyWord(" IF NOT EXISTS")
}
case ConstraintUniq:
ctx.WriteKeyWord("UNIQUE")
case ConstraintUniqKey:
......@@ -597,6 +653,24 @@ func (n *Constraint) Restore(ctx *RestoreCtx) error {
ctx.WriteKeyWord("UNIQUE INDEX")
case ConstraintFulltext:
ctx.WriteKeyWord("FULLTEXT")
case ConstraintCheck:
if n.Name != "" {
ctx.WriteKeyWord("CONSTRAINT ")
ctx.WriteName(n.Name)
ctx.WritePlain(" ")
}
ctx.WriteKeyWord("CHECK")
ctx.WritePlain("(")
if err := n.Expr.Restore(ctx); err != nil {
return errors.Trace(err)
}
ctx.WritePlain(") ")
if n.Enforced {
ctx.WriteKeyWord("ENFORCED")
} else {
ctx.WriteKeyWord("NOT ENFORCED")
}
return nil
}
if n.Tp == ConstraintForeignKey {
......@@ -606,6 +680,9 @@ func (n *Constraint) Restore(ctx *RestoreCtx) error {
ctx.WritePlain(" ")
}
ctx.WriteKeyWord("FOREIGN KEY ")
if n.IfNotExists {
ctx.WriteKeyWord("IF NOT EXISTS ")
}
} else if n.Name != "" {
ctx.WritePlain(" ")
ctx.WriteName(n.Name)
......@@ -885,15 +962,20 @@ type DropTableStmt struct {
IfExists bool
Tables []*TableName
IsView bool
IsTemporary bool // make sense ONLY if/when IsView == false
}
// Restore implements Node interface.
func (n *DropTableStmt) Restore(ctx *RestoreCtx) error {
if n.IsView {
ctx.WriteKeyWord("DROP VIEW ")
} else {
if n.IsTemporary {
ctx.WriteKeyWord("DROP TEMPORARY TABLE ")
} else {
ctx.WriteKeyWord("DROP TABLE ")
}
}
if n.IfExists {
ctx.WriteKeyWord("IF EXISTS ")
}
......@@ -1120,6 +1202,10 @@ func (n *CreateViewStmt) Accept(v Visitor) (Node, bool) {
type CreateIndexStmt struct {
ddlNode
// only supported by MariaDB 10.0.2+,
// see https://mariadb.com/kb/en/library/create-index/
IfNotExists bool
IndexName string
Table *TableName
Unique bool
......@@ -1134,6 +1220,9 @@ func (n *CreateIndexStmt) Restore(ctx *RestoreCtx) error {
ctx.WriteKeyWord("UNIQUE ")
}
ctx.WriteKeyWord("INDEX ")
if n.IfNotExists {
ctx.WriteKeyWord("IF NOT EXISTS ")
}
ctx.WriteName(n.IndexName)
ctx.WriteKeyWord(" ON ")
if err := n.Table.Restore(ctx); err != nil {
......@@ -1293,6 +1382,44 @@ func (n *UnlockTablesStmt) Restore(ctx *RestoreCtx) error {
return nil
}
// CleanupTableLockStmt is a statement to cleanup table lock.
type CleanupTableLockStmt struct {
ddlNode
Tables []*TableName
}
// Accept implements Node Accept interface.
func (n *CleanupTableLockStmt) Accept(v Visitor) (Node, bool) {
newNode, skipChildren := v.Enter(n)
if skipChildren {
return v.Leave(newNode)
}
n = newNode.(*CleanupTableLockStmt)
for i := range n.Tables {
node, ok := n.Tables[i].Accept(v)
if !ok {
return n, false
}
n.Tables[i] = node.(*TableName)
}
return v.Leave(n)
}
// Restore implements Node interface.
func (n *CleanupTableLockStmt) Restore(ctx *RestoreCtx) error {
ctx.WriteKeyWord("ADMIN CLEANUP TABLE LOCK ")
for i, v := range n.Tables {
if i != 0 {
ctx.WritePlain(", ")
}
if err := v.Restore(ctx); err != nil {
return errors.Annotatef(err, "An error occurred while restore CleanupTableLockStmt.Tables[%d]", i)
}
}
return nil
}
// TableOptionType is the type for TableOption
type TableOptionType int
......@@ -1322,6 +1449,8 @@ const (
TableOptionNodegroup
TableOptionDataDirectory
TableOptionIndexDirectory
TableOptionStorageMedia
TableOptionStatsSamplePages
)
// RowFormat types
......@@ -1491,6 +1620,17 @@ func (n *TableOption) Restore(ctx *RestoreCtx) error {
ctx.WriteKeyWord("INDEX DIRECTORY ")
ctx.WritePlain("= ")
ctx.WriteString(n.StrValue)
case TableOptionStorageMedia:
ctx.WriteKeyWord("STORAGE ")
ctx.WriteKeyWord(n.StrValue)
case TableOptionStatsSamplePages:
ctx.WriteKeyWord("STATS_SAMPLE_PAGES ")
ctx.WritePlain("= ")
if n.UintValue == 0 {
ctx.WriteKeyWord("DEFAULT")
} else {
ctx.WritePlainf("%d", n.UintValue)
}
default:
return errors.Errorf("invalid TableOption: %d", n.Tp)
}
......@@ -1578,6 +1718,7 @@ const (
AlterTablePartition
AlterTableEnableKeys
AlterTableDisableKeys
AlterTableRemovePartitioning
// TODO: Add more actions
)
......@@ -1641,6 +1782,14 @@ func (a AlterAlgorithm) String() string {
type AlterTableSpec struct {
node
// only supported by MariaDB 10.0.2+ (DROP COLUMN, CHANGE COLUMN, MODIFY COLUMN, DROP INDEX, DROP FOREIGN KEY, DROP PARTITION)
// see https://mariadb.com/kb/en/library/alter-table/
IfExists bool
// only supported by MariaDB 10.0.2+ (ADD COLUMN, ADD PARTITION)
// see https://mariadb.com/kb/en/library/alter-table/
IfNotExists bool
Tp AlterTableType
Name string
Constraint *Constraint
......@@ -1684,6 +1833,9 @@ func (n *AlterTableSpec) Restore(ctx *RestoreCtx) error {
}
case AlterTableAddColumns:
ctx.WriteKeyWord("ADD COLUMN ")
if n.IfNotExists {
ctx.WriteKeyWord("IF NOT EXISTS ")
}
if n.Position != nil && len(n.NewColumns) == 1 {
if err := n.NewColumns[0].Restore(ctx); err != nil {
return errors.Annotatef(err, "An error occurred while restore AlterTableSpec.NewColumns[%d]", 0)
......@@ -1713,6 +1865,9 @@ func (n *AlterTableSpec) Restore(ctx *RestoreCtx) error {
}
case AlterTableDropColumn:
ctx.WriteKeyWord("DROP COLUMN ")
if n.IfExists {
ctx.WriteKeyWord("IF EXISTS ")
}
if err := n.OldColumnName.Restore(ctx); err != nil {
return errors.Annotate(err, "An error occurred while restore AlterTableSpec.OldColumnName")
}
......@@ -1721,12 +1876,21 @@ func (n *AlterTableSpec) Restore(ctx *RestoreCtx) error {
ctx.WriteKeyWord("DROP PRIMARY KEY")
case AlterTableDropIndex:
ctx.WriteKeyWord("DROP INDEX ")
if n.IfExists {
ctx.WriteKeyWord("IF EXISTS ")
}
ctx.WriteName(n.Name)
case AlterTableDropForeignKey:
ctx.WriteKeyWord("DROP FOREIGN KEY ")
if n.IfExists {
ctx.WriteKeyWord("IF EXISTS ")
}
ctx.WriteName(n.Name)
case AlterTableModifyColumn:
ctx.WriteKeyWord("MODIFY COLUMN ")
if n.IfExists {
ctx.WriteKeyWord("IF EXISTS ")
}
if err := n.NewColumns[0].Restore(ctx); err != nil {
return errors.Annotate(err, "An error occurred while restore AlterTableSpec.NewColumns[0]")
}
......@@ -1738,6 +1902,9 @@ func (n *AlterTableSpec) Restore(ctx *RestoreCtx) error {
}
case AlterTableChangeColumn:
ctx.WriteKeyWord("CHANGE COLUMN ")
if n.IfExists {
ctx.WriteKeyWord("IF EXISTS ")
}
if err := n.OldColumnName.Restore(ctx); err != nil {
return errors.Annotate(err, "An error occurred while restore AlterTableSpec.OldColumnName")
}
......@@ -1763,9 +1930,18 @@ func (n *AlterTableSpec) Restore(ctx *RestoreCtx) error {
}
if len(n.NewColumns[0].Options) == 1 {
ctx.WriteKeyWord("SET DEFAULT ")
if err := n.NewColumns[0].Options[0].Expr.Restore(ctx); err != nil {
expr := n.NewColumns[0].Options[0].Expr
if valueExpr, ok := expr.(ValueExpr); ok {
if err := valueExpr.Restore(ctx); err != nil {
return errors.Annotate(err, "An error occurred while restore AlterTableSpec.NewColumns[0].Options[0].Expr")
}
} else {
ctx.WritePlain("(")
if err := expr.Restore(ctx); err != nil {
return errors.Annotate(err, "An error occurred while restore AlterTableSpec.NewColumns[0].Options[0].Expr")
}
ctx.WritePlain(")")
}
} else {
ctx.WriteKeyWord(" DROP DEFAULT")
}
......@@ -1788,6 +1964,9 @@ func (n *AlterTableSpec) Restore(ctx *RestoreCtx) error {
ctx.WritePlain(" /* AlterTableForce is not supported */ ")
case AlterTableAddPartitions:
ctx.WriteKeyWord("ADD PARTITION")
if n.IfNotExists {
ctx.WriteKeyWord(" IF NOT EXISTS")
}
if n.PartDefinitions != nil {
ctx.WritePlain(" (")
for i, def := range n.PartDefinitions {
......@@ -1808,6 +1987,9 @@ func (n *AlterTableSpec) Restore(ctx *RestoreCtx) error {
ctx.WritePlainf("%d", n.Num)
case AlterTableDropPartition:
ctx.WriteKeyWord("DROP PARTITION ")
if n.IfExists {
ctx.WriteKeyWord("IF EXISTS ")
}
for i, name := range n.PartitionNames {
if i != 0 {
ctx.WritePlain(",")
......@@ -1830,6 +2012,8 @@ func (n *AlterTableSpec) Restore(ctx *RestoreCtx) error {
ctx.WriteKeyWord("ENABLE KEYS")
case AlterTableDisableKeys:
ctx.WriteKeyWord("DISABLE KEYS")
case AlterTableRemovePartitioning:
ctx.WriteKeyWord("REMOVE PARTITIONING")
default:
// TODO: not support
ctx.WritePlainf(" /* AlterTableType(%d) is not supported */ ", n.Tp)
......@@ -1898,7 +2082,7 @@ func (n *AlterTableStmt) Restore(ctx *RestoreCtx) error {
return errors.Annotate(err, "An error occurred while restore AlterTableStmt.Table")
}
for i, spec := range n.Specs {
if i == 0 || spec.Tp == AlterTablePartition {
if i == 0 || spec.Tp == AlterTablePartition || spec.Tp == AlterTableRemovePartitioning {
ctx.WritePlain(" ")
} else {
ctx.WritePlain(", ")
......
......@@ -1827,6 +1827,7 @@ const (
ShowDrainerStatus
ShowOpenTables
ShowAnalyzeStatus
ShowRegions
)
const (
......@@ -1852,6 +1853,7 @@ type ShowStmt struct {
DBName string
Table *TableName // Used for showing columns.
Column *ColumnName // Used for `desc table column`.
IndexName model.CIStr
Flag int // Some flag parsed from sql, such as FULL.
Full bool
User *auth.UserIdentity // Used for show grants/create user.
......@@ -2088,6 +2090,17 @@ func (n *ShowStmt) Restore(ctx *RestoreCtx) error {
ctx.WriteKeyWord("DRAINER STATUS")
case ShowAnalyzeStatus:
ctx.WriteKeyWord("ANALYZE STATUS")
case ShowRegions:
ctx.WriteKeyWord("TABLE ")
if err := n.Table.Restore(ctx); err != nil {
return errors.Annotate(err, "An error occurred while restore SplitIndexRegionStmt.Table")
}
if len(n.IndexName.L) > 0 {
ctx.WriteKeyWord(" INDEX ")
ctx.WriteName(n.IndexName.String())
}
ctx.WriteKeyWord(" REGIONS")
return nil
default:
return errors.New("Unknown ShowStmt type")
}
......
......@@ -200,6 +200,7 @@ const (
MakeSet = "make_set"
Mid = "mid"
Oct = "oct"
OctetLength = "octet_length"
Ord = "ord"
Position = "position"
Quote = "quote"
......
......@@ -329,6 +329,7 @@ type ExecuteStmt struct {
Name string
UsingVars []ExprNode
BinaryArgs interface{}
ExecID uint32
}
......@@ -1380,6 +1381,9 @@ const (
AdminShowSlow
AdminShowNextRowID
AdminReloadExprPushdownBlacklist
AdminReloadOptRuleBlacklist
AdminPluginDisable
AdminPluginEnable
)
// HandleRange represents a range where handle value >= Begin and < End.
......@@ -1455,6 +1459,7 @@ type AdminStmt struct {
HandleRanges []HandleRange
ShowSlow *ShowSlow
Plugins []string
}
// Restore implements Node interface.
......@@ -1550,6 +1555,28 @@ func (n *AdminStmt) Restore(ctx *RestoreCtx) error {
}
case AdminReloadExprPushdownBlacklist:
ctx.WriteKeyWord("RELOAD EXPR_PUSHDOWN_BLACKLIST")
case AdminReloadOptRuleBlacklist:
ctx.WriteKeyWord("RELOAD OPT_RULE_BLACKLIST")
case AdminPluginEnable:
ctx.WriteKeyWord("PLUGINS ENABLE")
for i, v := range n.Plugins {
if i == 0 {
ctx.WritePlain(" ")
} else {
ctx.WritePlain(", ")
}
ctx.WritePlain(v)
}
case AdminPluginDisable:
ctx.WriteKeyWord("PLUGINS DISABLE")
for i, v := range n.Plugins {
if i == 0 {
ctx.WritePlain(" ")
} else {
ctx.WritePlain(", ")
}
ctx.WritePlain(v)
}
default:
return errors.New("Unsupported AdminStmt type")
}
......@@ -1585,52 +1612,18 @@ type PrivElem struct {
// Restore implements Node interface.
func (n *PrivElem) Restore(ctx *RestoreCtx) error {
switch n.Priv {
case 0:
if n.Priv == 0 {
ctx.WritePlain("/* UNSUPPORTED TYPE */")
case mysql.AllPriv:
} else if n.Priv == mysql.AllPriv {
ctx.WriteKeyWord("ALL")
case mysql.AlterPriv:
ctx.WriteKeyWord("ALTER")
case mysql.CreatePriv:
ctx.WriteKeyWord("CREATE")
case mysql.CreateUserPriv:
ctx.WriteKeyWord("CREATE USER")
case mysql.CreateRolePriv:
ctx.WriteKeyWord("CREATE ROLE")
case mysql.TriggerPriv:
ctx.WriteKeyWord("TRIGGER")
case mysql.DeletePriv:
ctx.WriteKeyWord("DELETE")
case mysql.DropPriv:
ctx.WriteKeyWord("DROP")
case mysql.ProcessPriv:
ctx.WriteKeyWord("PROCESS")
case mysql.ExecutePriv:
ctx.WriteKeyWord("EXECUTE")
case mysql.IndexPriv:
ctx.WriteKeyWord("INDEX")
case mysql.InsertPriv:
ctx.WriteKeyWord("INSERT")
case mysql.SelectPriv:
ctx.WriteKeyWord("SELECT")
case mysql.SuperPriv:
ctx.WriteKeyWord("SUPER")
case mysql.ShowDBPriv:
ctx.WriteKeyWord("SHOW DATABASES")
case mysql.UpdatePriv:
ctx.WriteKeyWord("UPDATE")
case mysql.GrantPriv:
ctx.WriteKeyWord("GRANT OPTION")
case mysql.ReferencesPriv:
ctx.WriteKeyWord("REFERENCES")
case mysql.CreateViewPriv:
ctx.WriteKeyWord("CREATE VIEW")
case mysql.ShowViewPriv:
ctx.WriteKeyWord("SHOW VIEW")
default:
} else {
str, ok := mysql.Priv2Str[n.Priv]
if ok {
ctx.WriteKeyWord(str)
} else {
return errors.New("Undefined privilege type")
}
}
if n.Cols != nil {
ctx.WritePlain(" (")
for i, v := range n.Cols {
......@@ -2005,9 +1998,10 @@ type TableOptimizerHint struct {
func (n *TableOptimizerHint) Restore(ctx *RestoreCtx) error {
ctx.WriteKeyWord(n.HintName.String())
ctx.WritePlain("(")
if n.HintName.L == "max_execution_time" {
switch n.HintName.L {
case "max_execution_time":
ctx.WritePlainf("%d", n.MaxExecutionTime)
} else {
case "tidb_hj", "tidb_smj", "tidb_inlj":
for i, table := range n.Tables {
if i != 0 {
ctx.WritePlain(", ")
......@@ -2029,6 +2023,10 @@ func (n *TableOptimizerHint) Accept(v Visitor) (Node, bool) {
return v.Leave(n)
}
type BinaryLiteral interface {
ToString() string
}
// NewDecimal creates a types.Decimal value, it's provided by parser driver.
var NewDecimal func(string) (interface{}, error)
......
......@@ -32,13 +32,38 @@ type AnalyzeTableStmt struct {
TableNames []*TableName
PartitionNames []model.CIStr
IndexNames []model.CIStr
MaxNumBuckets uint64
AnalyzeOpts []AnalyzeOpt
// IndexFlag is true when we only analyze indices for a table.
IndexFlag bool
Incremental bool
}
// AnalyzeOptType is the type for analyze options.
type AnalyzeOptionType int
// Analyze option types.
const (
AnalyzeOptNumBuckets = iota
AnalyzeOptNumTopN
AnalyzeOptCMSketchDepth
AnalyzeOptCMSketchWidth
)
// AnalyzeOptionString stores the string form of analyze options.
var AnalyzeOptionString = map[AnalyzeOptionType]string{
AnalyzeOptNumBuckets: "BUCKETS",
AnalyzeOptNumTopN: "TOPN",
AnalyzeOptCMSketchWidth: "CMSKETCH WIDTH",
AnalyzeOptCMSketchDepth: "CMSKETCH DEPTH",
}
// AnalyzeOpt stores the analyze option type and value.
type AnalyzeOpt struct {
Type AnalyzeOptionType
Value uint64
}
// Restore implements Node interface.
func (n *AnalyzeTableStmt) Restore(ctx *RestoreCtx) error {
if n.Incremental {
......@@ -74,10 +99,15 @@ func (n *AnalyzeTableStmt) Restore(ctx *RestoreCtx) error {
}
ctx.WriteName(index.O)
}
if n.MaxNumBuckets != 0 {
ctx.WriteKeyWord(" WITH ")
ctx.WritePlainf("%d", n.MaxNumBuckets)
ctx.WriteKeyWord(" BUCKETS")
if len(n.AnalyzeOpts) != 0 {
ctx.WriteKeyWord(" WITH")
for i, opt := range n.AnalyzeOpts {
if i != 0 {
ctx.WritePlain(",")
}
ctx.WritePlainf(" %d ", opt.Value)
ctx.WritePlain(AnalyzeOptionString[opt.Type])
}
}
return nil
}
......
......@@ -27,7 +27,9 @@ func IsReadOnly(node Node) bool {
node.Accept(&checker)
return checker.readOnly
case *ExplainStmt, *DoStmt:
case *ExplainStmt:
return !st.Analyze || IsReadOnly(st.Stmt)
case *DoStmt:
return true
default:
return false
......
......@@ -9,8 +9,8 @@ require (
github.com/cznic/y v0.0.0-20170802143616-045f81c6662a
github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8
github.com/pingcap/errors v0.11.4
github.com/pingcap/tidb v0.0.0-20190321025159-e8299209340c
github.com/pingcap/tipb v0.0.0-20190107072121-abbec73437b7
github.com/pingcap/tidb v0.0.0-20190703092821-755875aacb5a
github.com/pingcap/tipb v0.0.0-20190428032612-535e1abaa330
github.com/sirupsen/logrus v1.3.0
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2
)
......@@ -3,22 +3,31 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f h1:5ZfJxyXo8KyX8DgGXC5B7ILL8y51fci/qYz2B4j8iLY=
github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/blacktear23/go-proxyprotocol v0.0.0-20180807104634-af7a81e8dd0d/go.mod h1:VKt7CNAQxpFpSDz3sXyj9hY/GbVsQCr0sB3w59nE7lU=
github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4=
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20171208011716-f6d7a1f6fbf3/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w=
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
github.com/coreos/bbolt v1.3.0 h1:HIgH5xUWXT914HCI671AxuTTqjj64UOFr7pHn48LUTI=
github.com/coreos/bbolt v1.3.0/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20181031085051-9002847aa142 h1:3jFq2xL4ZajGK4aZY8jz+DAF0FHjI51BXjjSwCzS1Dk=
github.com/coreos/go-systemd v0.0.0-20181031085051-9002847aa142/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg=
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=
......@@ -39,24 +48,32 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v0.0.0-20180421182945-02af3965c54e/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o=
github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM=
github.com/etcd-io/gofail v0.0.0-20180808172546-51ce9a71510a h1:QNEenQIsGDEEfFNSnN+h6hE1OwnHqTg7Dl9gEk1Cko4=
github.com/etcd-io/gofail v0.0.0-20180808172546-51ce9a71510a/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I=
github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
github.com/go-playground/overalls v0.0.0-20180201144345-22ec1a223b7c/go.mod h1:UqxAgEOt89sCiXlrc/ycnx00LVvUO/eS8tMUkWX4R7w=
github.com/go-sql-driver/mysql v0.0.0-20170715192408-3955978caca4/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/gogo/protobuf v0.0.0-20180717141946-636bf0302bc9/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.0 h1:xU6/SpYbvkNYiptHJYEDRseDLvYE7wSqhYYNy0QSUzI=
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff h1:kOkM9whyQYodu09SJ6W3NCsHG7crFaJILQ22Gozp3lg=
github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
......@@ -66,33 +83,58 @@ github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/shlex v0.0.0-20181106134648-c34317bd91bf/go.mod h1:RpwtwJQFrIEPstU94h88MWPXP2ektJZ8cZ0YntAmXiE=
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
github.com/gorilla/mux v1.6.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/mux v1.6.2 h1:Pgr17XVTNXAk3q/r4CpKzC5xBM/qW1uVLV+IhRZpIIk=
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 h1:Iju5GlWwrvL6UBg4zJJt3btmonfrMlCDdsejg4CZE7c=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/grpc-gateway v1.4.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
github.com/grpc-ecosystem/grpc-gateway v1.5.1 h1:3scN4iuXkNOyP98jF55Lv8a9j1o/IwvnDIZ0LHJK1nk=
github.com/grpc-ecosystem/grpc-gateway v1.5.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio=
github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.0.0/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe h1:W/GaMY0y69G4cFlmsC6B9sbuo2fP8OFP1ABjt4kPz+w=
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
github.com/matttproud/golang_protobuf_extensions v1.0.0/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/montanaflynn/stats v0.0.0-20151014174947-eeaced052adb/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/montanaflynn/stats v0.0.0-20180911141734-db72e6cae808 h1:pmpDGKLw4n82EtrNiLqB+xSz/JQwFOaZuMALYUHwX5s=
github.com/montanaflynn/stats v0.0.0-20180911141734-db72e6cae808/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/myesui/uuid v1.0.0 h1:xCBmH4l5KuvLYc5L7AS7SZg9/jKdIFubM7OVoLqaQUI=
......@@ -101,62 +143,89 @@ github.com/ngaut/pools v0.0.0-20180318154953-b7bc8c42aac7 h1:7KAv7KMGTTqSmYZtNdc
github.com/ngaut/pools v0.0.0-20180318154953-b7bc8c42aac7/go.mod h1:iWMfgwqYW+e8n5lC/jjNEhwcjbRDpl5NT7n2h+4UNcI=
github.com/ngaut/sync2 v0.0.0-20141008032647-7a24ed77b2ef h1:K0Fn+DoFqNqktdZtdV3bPQ/0cuYh2H4rkg0tytX/07k=
github.com/ngaut/sync2 v0.0.0-20141008032647-7a24ed77b2ef/go.mod h1:7WjlapSfwQyo6LNmIvEWzsW1hbBQfpUO4JWnuQRmva8=
github.com/nicksnyder/go-i18n v1.10.0/go.mod h1:HrK7VCrbOvQoUAQ7Vpy7i87N7JZZZ7R2xBGjv0j365Q=
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo=
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg=
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/pelletier/go-toml v1.3.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ=
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 h1:USx2/E1bX46VG32FIw034Au6seQ2fY9NEILmNh/UlQg=
github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ=
github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9/go.mod h1:4b2X8xSqxIroj/IZ9MX/VGZhAwc11wB9wRIzHvz6SeM=
github.com/pingcap/errors v0.10.1/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
github.com/pingcap/errors v0.11.0 h1:DCJQB8jrHbQ1VVlMFIrbj2ApScNNotVmkSNplu2yUt4=
github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
github.com/pingcap/errors v0.11.1 h1:BXFZ6MdDd2U1uJUa2sRAWTmm+nieEzuyYM0R4aUTcC8=
github.com/pingcap/errors v0.11.1/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
github.com/pingcap/failpoint v0.0.0-20190512135322-30cc7431d99c/go.mod h1:DNS3Qg7bEDhU6EXNHF+XSv/PGznQaMJ5FWvctpm6pQI=
github.com/pingcap/gofail v0.0.0-20181217135706-6a951c1e42c3 h1:04yuCf5NMvLU8rB2m4Qs3rynH7EYpMno3lHkewIOdMo=
github.com/pingcap/gofail v0.0.0-20181217135706-6a951c1e42c3/go.mod h1:DazNTg0PTldtpsQiT9I5tVJwV1onHMKBBgXzmJUlMns=
github.com/pingcap/goleveldb v0.0.0-20171020122428-b9ff6c35079e h1:P73/4dPCL96rGrobssy1nVy2VaVpNCuLpCbr+FEaTA8=
github.com/pingcap/goleveldb v0.0.0-20171020122428-b9ff6c35079e/go.mod h1:O17XtbryoCJhkKGbT62+L2OlrniwqiGLSqrmdHCMzZw=
github.com/pingcap/kvproto v0.0.0-20190215154024-7f2fc73ef562 h1:32oF1/8lVnBR2JVcCAnKPQATTOX0+ckRDFpjQk4Ngno=
github.com/pingcap/kvproto v0.0.0-20190215154024-7f2fc73ef562/go.mod h1:QMdbTAXCHzzygQzqcG9uVUgU2fKeSN1GmfMiykdSzzY=
github.com/pingcap/kvproto v0.0.0-20190516013202-4cf58ad90b6c/go.mod h1:QMdbTAXCHzzygQzqcG9uVUgU2fKeSN1GmfMiykdSzzY=
github.com/pingcap/kvproto v0.0.0-20190619024611-a4759dfe3753/go.mod h1:QMdbTAXCHzzygQzqcG9uVUgU2fKeSN1GmfMiykdSzzY=
github.com/pingcap/log v0.0.0-20190214045112-b37da76f67a7/go.mod h1:xsfkWVaFVV5B8e1K9seWfyJWFrIhbtUTAD8NV1Pq3+w=
github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596 h1:t2OQTpPJnrPDGlvA+3FwJptMTt6MEPdzK1Wt99oaefQ=
github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596/go.mod h1:WpHUKhNZ18v116SvGrmjkA9CBhYmuUTKL+p8JC9ANEw=
github.com/pingcap/parser v0.0.0-20190312024907-3f6280b08c8b/go.mod h1:1FNvfp9+J0wvc4kl8eGNh7Rqrxveg15jJoWo/a0uHwA=
github.com/pingcap/parser v0.0.0-20190701123046-5768e68c1e65/go.mod h1:1FNvfp9+J0wvc4kl8eGNh7Rqrxveg15jJoWo/a0uHwA=
github.com/pingcap/pd v0.0.0-20190617100349-293d4b5189bf/go.mod h1:3DlDlFT7EF64A1bmb/tulZb6wbPSagm5G4p1AlhaEDs=
github.com/pingcap/pd v2.1.0-rc.4+incompatible h1:/buwGk04aHO5odk/+O8ZOXGs4qkUjYTJ2UpCJXna8NE=
github.com/pingcap/pd v2.1.0-rc.4+incompatible/go.mod h1:nD3+EoYes4+aNNODO99ES59V83MZSI+dFbhyr667a0E=
github.com/pingcap/tidb v0.0.0-20190321025159-e8299209340c h1:n3i2K6zUzXZDe6imOtdOhWltuqCLFtmLropKwS6ljeI=
github.com/pingcap/tidb v0.0.0-20190321025159-e8299209340c/go.mod h1:FcgD4o1kq3YNk08MWtMRwNZXQJpM28bFdb/go9KpmEA=
github.com/pingcap/tidb v0.0.0-20190703092821-755875aacb5a h1:YfYdeUJC7LwGt2HYAWqtOuNAidYIg6uKPYWpNe+Px3s=
github.com/pingcap/tidb v0.0.0-20190703092821-755875aacb5a/go.mod h1:DU3S1YEJN8b1BookBt3g27hljItkONKZSJR+Bu/C/9g=
github.com/pingcap/tidb-tools v2.1.3-0.20190116051332-34c808eef588+incompatible h1:e9Gi/LP9181HT3gBfSOeSBA+5JfemuE4aEAhqNgoE4k=
github.com/pingcap/tidb-tools v2.1.3-0.20190116051332-34c808eef588+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM=
github.com/pingcap/tidb-tools v2.1.3-0.20190321065848-1e8b48f5c168+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM=
github.com/pingcap/tipb v0.0.0-20190107072121-abbec73437b7 h1:wnjdQRhybddDesBVBKyOLUPgDaOFdtqA92pduBgWvVQ=
github.com/pingcap/tipb v0.0.0-20190107072121-abbec73437b7/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI=
github.com/pingcap/tipb v0.0.0-20190428032612-535e1abaa330 h1:rRMLMjIMFulCX9sGKZ1hoov/iROMsKyC8Snc02nSukw=
github.com/pingcap/tipb v0.0.0-20190428032612-535e1abaa330/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7 h1:gGBSHPOU7g8YjTbhwn+lvFm2VDEhhA+PwDIlstkgSxE=
github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M=
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.0 h1:tXuTFVHC03mW0D+Ua1Q2d1EAVqLTuggX50V0VLICCzY=
github.com/prometheus/client_golang v0.9.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f05m9MGOsuEi1ATq9shN03HrxNkD/luQvxCv8=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/common v0.0.0-20180518154759-7600349dcfe1/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39 h1:Cto4X6SVMWRPBkJ/3YHn1iDGDGc/Z+sW+AEMKHMVvN4=
github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/procfs v0.0.0-20180612222113-7d6f385de8be/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d h1:GoAlyOgbOEIFdaDqxJVlbOQ1DtGmZWs/Qau0hIlk+WQ=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446 h1:/NRJ5vAYoqz+7sG51ubIDHXeWO8DlTSrToPu6q11ziA=
github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M=
github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7 h1:FUL3b97ZY2EPqg2NbXKuMHs5pXJB9hjj1fDHnF2vl28=
github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/shirou/gopsutil v2.18.10+incompatible h1:cy84jW6EVRPa5g9HAHrlbxMSIjBhDSX0OFYyMYminYs=
github.com/shirou/gopsutil v2.18.10+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
github.com/shurcooL/vfsgen v0.0.0-20181020040650-a97a25d856ca/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.3.0 h1:hI/7Q+DtNZ2kINb6qt/lS+IyXnHQe9e90POfeewL/ME=
github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
......@@ -164,15 +233,19 @@ github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/struCoder/pidusage v0.1.2/go.mod h1:pWBlW3YuSwRl6h7R5KbvA4N8oOqe9LjaKW5CwT1SPjI=
github.com/syndtr/goleveldb v0.0.0-20180815032940-ae2bd5eed72d/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2/go.mod h1:2PfKggNGDuadAa0LElHrByyrz4JPZ9fFx6Gs7nx7ZZU=
github.com/tinylib/msgp v1.1.0 h1:9fQd+ICuRIu/ue4vxJZu6/LzxN0HwMds2nq/0cFvxHU=
github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6 h1:lYIiVDtZnyTWlNwiAxLj0bbpTcx1BWCFhXjfsvmPdNc=
github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/twinj/uuid v1.0.0 h1:fzz7COZnDrXGTAOHGuUGYd6sG+JMq+AoE7+Jlu0przk=
......@@ -185,16 +258,27 @@ github.com/uber/jaeger-lib v1.5.0 h1:OHbgr8l656Ub3Fw5k9SWnBfIEwvoHQ+W2y+Aa9D1Uyo
github.com/uber/jaeger-lib v1.5.0/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
github.com/ugorji/go v0.0.0-20171019201919-bdcc60b419d1 h1:UvhxfNjNqlZ/x3cDyqxMhoiUpemd3zXkVQApN6bM/lg=
github.com/ugorji/go v0.0.0-20171019201919-bdcc60b419d1/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
github.com/ugorji/go v1.1.2/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
github.com/ugorji/go/codec v0.0.0-20190204201341-e444a5086c43/go.mod h1:iT03XoTwV7xq/+UGwKO3UbC1nNNlopQiY61beSdrtOA=
github.com/unrolled/render v0.0.0-20171102162132-65450fb6b2d3/go.mod h1:tu82oB5W2ykJRVioYsB+IQKcft7ryBr7w12qMBUPyXg=
github.com/unrolled/render v0.0.0-20180914162206-b9786414de4d h1:ggUgChAeyge4NZ4QUw6lhHsVymzwSDJOZcE0s2X8S20=
github.com/unrolled/render v0.0.0-20180914162206-b9786414de4d/go.mod h1:tu82oB5W2ykJRVioYsB+IQKcft7ryBr7w12qMBUPyXg=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
github.com/urfave/negroni v0.3.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4=
github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18 h1:MPPkRncZLN9Kh4MEFmbnK4h3BD7AUmskWv2+EeZJCCs=
github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/yookoala/realpath v1.0.0/go.mod h1:gJJMA9wuX7AcqLy1+ffPatSCySA1FQ2S8Ya9AIoYBpE=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/etcd v0.0.0-20190320044326-77d4b742cdbf/go.mod h1:KSGwdbiFchh5KIC9My2+ZVl5/3ANcwohw50dpPwa2cw=
go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/zap v1.9.1 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o=
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
golang.org/x/crypto v0.0.0-20180608092829-8ac0e0d97ce4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
......@@ -217,24 +301,34 @@ golang.org/x/sys v0.0.0-20190109145017-48ac38b7c8cb/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 h1:z99zHgr7hKfrUcX/KsoJk5FJfjTceCKIp96+biqP4To=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190130214255-bb1329dc71a0 h1:iRpjPej1fPzmfoBhMFkp3HdqzF+ytPmAwiQhJGV0zGw=
golang.org/x/tools v0.0.0-20190130214255-bb1329dc71a0/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/genproto v0.0.0-20180608181217-32ee49c4dd80/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20181004005441-af9cb2a35e7f/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190108161440-ae2f86662275 h1:9oFlwfEGIvmxXTcY53ygNyxIQtWciRHjrnUvZJCYXYU=
google.golang.org/genproto v0.0.0-20190108161440-ae2f86662275/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
google.golang.org/grpc v0.0.0-20180607172857-7a6a684ca69e/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
google.golang.org/grpc v1.17.0 h1:TRJYBgMclJvGYn2rIMjj+h9KtMt5r1Ij7ODVRIZkwhk=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
gopkg.in/alecthomas/gometalinter.v2 v2.0.12/go.mod h1:NDRytsqEZyolNuAgTzJkZMkSQM7FIKyzVzGhjB/qfYo=
gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20180810215634-df19058c872c/go.mod h1:3HH7i1SgMqlzxCcBmUHW657sD4Kvv9sC3HpL3YukzwA=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
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/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
gopkg.in/stretchr/testify.v1 v1.2.2 h1:yhQC6Uy5CqibAIlk1wlusa/MJ3iAN49/BsR/dCCKz3M=
......
......@@ -211,9 +211,11 @@ func (s *Scanner) Lex(v *yySymType) int {
case quotedIdentifier:
tok = identifier
}
if tok == unicode.ReplacementChar && s.r.eof() {
return 0
if tok == unicode.ReplacementChar {
return invalid
}
return tok
}
......
......@@ -183,6 +183,7 @@ var tokenMap = map[string]int{
"CIPHER": cipher,
"CLEANUP": cleanup,
"CLIENT": client,
"CMSKETCH": cmSketch,
"COALESCE": coalesce,
"COLLATE": collate,
"COLLATION": collation,
......@@ -232,10 +233,12 @@ var tokenMap = map[string]int{
"DELAY_KEY_WRITE": delayKeyWrite,
"DELAYED": delayed,
"DELETE": deleteKwd,
"DEPTH": depth,
"DESC": desc,
"DESCRIBE": describe,
"DIRECTORY": directory,
"DISABLE": disable,
"DISK": disk,
"DISTINCT": distinct,
"DISTINCTROW": distinct,
"DIV": div,
......@@ -250,6 +253,7 @@ var tokenMap = map[string]int{
"ENABLE": enable,
"ENCLOSED": enclosed,
"END": end,
"ENFORCED": enforced,
"ENGINE": engine,
"ENGINES": engines,
"ENUM": enum,
......@@ -351,6 +355,7 @@ var tokenMap = map[string]int{
"LONGTEXT": longtextType,
"LOW_PRIORITY": lowPriority,
"MASTER": master,
"MATCH": match,
"MAX": max,
"MAX_CONNECTIONS_PER_HOUR": maxConnectionsPerHour,
"MAX_EXECUTION_TIME": maxExecutionTime,
......@@ -402,7 +407,9 @@ var tokenMap = map[string]int{
"OUTER": outer,
"PACK_KEYS": packKeys,
"PAGE": pageSym,
"PARTIAL": partial,
"PARTITION": partition,
"PARTITIONING": partitioning,
"PARTITIONS": partitions,
"PASSWORD": password,
"PESSIMISTIC": pessimistic,
......@@ -435,6 +442,7 @@ var tokenMap = map[string]int{
"REGEXP": regexpKwd,
"REGIONS": regions,
"RELOAD": reload,
"REMOVE": remove,
"RENAME": rename,
"REPEAT": repeat,
"REPEATABLE": repeatable,
......@@ -467,6 +475,7 @@ var tokenMap = map[string]int{
"SHARED": shared,
"SHOW": show,
"SIGNED": signed,
"SIMPLE": simple,
"SLAVE": slave,
"SLOW": slow,
"SMALLINT": smallIntType,
......@@ -490,7 +499,9 @@ var tokenMap = map[string]int{
"STATS_HEALTHY": statsHealthy,
"STATS_META": statsMeta,
"STATS_PERSISTENT": statsPersistent,
"STATS_SAMPLE_PAGES": statsSamplePages,
"STATUS": status,
"STORAGE": storage,
"SWAPS": swaps,
"SWITCHES": switchesSym,
"SYSTEM_TIME": systemTime,
......@@ -522,6 +533,8 @@ var tokenMap = map[string]int{
"TIDB_HJ": tidbHJ,
"TIDB_INLJ": tidbINLJ,
"TIDB_SMJ": tidbSMJ,
"TIDB_HASHAGG": tidbHASHAGG,
"TIDB_STREAMAGG": tidbSTREAMAGG,
"TIME": timeType,
"TIMESTAMP": timestampType,
"TIMESTAMPADD": timestampAdd,
......@@ -539,6 +552,7 @@ var tokenMap = map[string]int{
"TOKUDB_UNCOMPRESSED": tokudbUncompressed,
"TOKUDB_ZLIB": tokudbZlib,
"TOP": top,
"TOPN": topn,
"TRACE": trace,
"TRADITIONAL": traditional,
"TRAILING": trailing,
......@@ -579,6 +593,7 @@ var tokenMap = map[string]int{
"WEEK": week,
"WHEN": when,
"WHERE": where,
"WIDTH": width,
"WITH": with,
"WRITE": write,
"XOR": xor,
......@@ -589,6 +604,7 @@ var tokenMap = map[string]int{
"BINDING": binding,
"BINDINGS": bindings,
"EXPR_PUSHDOWN_BLACKLIST": exprPushdownBlacklist,
"OPT_RULE_BLACKLIST": optRuleBlacklist,
}
// See https://dev.mysql.com/doc/refman/5.7/en/function-resolution.html for details
......
......@@ -42,4 +42,6 @@ const (
FlagDividedByZeroAsWarning = 1 << 8
// FlagInUnionStmt indicates if this is a UNION statement.
FlagInUnionStmt = 1 << 9
// FlagInLoadDataStmt indicates if this is a LOAD DATA statement.
FlagInLoadDataStmt = 1 << 10
)
......@@ -233,6 +233,13 @@ const (
CreateRolePriv
// DropRolePriv is the privilege to drop a role.
DropRolePriv
CreateTMPTablePriv
LockTablesPriv
CreateRoutinePriv
AlterRoutinePriv
EventPriv
// AllPriv is the privilege for all actions.
AllPriv
)
......@@ -296,6 +303,40 @@ var Priv2UserCol = map[PrivilegeType]string{
ShowViewPriv: "Show_view_priv",
CreateRolePriv: "Create_role_priv",
DropRolePriv: "Drop_role_priv",
CreateTMPTablePriv: "Create_tmp_table_priv",
LockTablesPriv: "Lock_tables_priv",
CreateRoutinePriv: "Create_routine_priv",
AlterRoutinePriv: "Alter_routine_priv",
EventPriv: "Event_priv",
}
// Col2PrivType is the privilege tables column name to privilege type.
var Col2PrivType = map[string]PrivilegeType{
"Create_priv": CreatePriv,
"Select_priv": SelectPriv,
"Insert_priv": InsertPriv,
"Update_priv": UpdatePriv,
"Delete_priv": DeletePriv,
"Show_db_priv": ShowDBPriv,
"Super_priv": SuperPriv,
"Create_user_priv": CreateUserPriv,
"Trigger_priv": TriggerPriv,
"Drop_priv": DropPriv,
"Process_priv": ProcessPriv,
"Grant_priv": GrantPriv,
"References_priv": ReferencesPriv,
"Alter_priv": AlterPriv,
"Execute_priv": ExecutePriv,
"Index_priv": IndexPriv,
"Create_view_priv": CreateViewPriv,
"Show_view_priv": ShowViewPriv,
"Create_role_priv": CreateRolePriv,
"Drop_role_priv": DropRolePriv,
"Create_tmp_table_priv": CreateTMPTablePriv,
"Lock_tables_priv": LockTablesPriv,
"Create_routine_priv": CreateRoutinePriv,
"Alter_routine_priv": AlterRoutinePriv,
"Event_priv": EventPriv,
}
// Command2Str is the command information to command name.
......@@ -334,33 +375,6 @@ var Command2Str = map[byte]string{
ComResetConnection: "Reset connect",
}
// Col2PrivType is the privilege tables column name to privilege type.
var Col2PrivType = map[string]PrivilegeType{
"Create_priv": CreatePriv,
"Select_priv": SelectPriv,
"Insert_priv": InsertPriv,
"Update_priv": UpdatePriv,
"Delete_priv": DeletePriv,
"Show_db_priv": ShowDBPriv,
"Super_priv": SuperPriv,
"Create_user_priv": CreateUserPriv,
"Trigger_priv": TriggerPriv,
"Drop_priv": DropPriv,
"Process_priv": ProcessPriv,
"Grant_priv": GrantPriv,
"References_priv": ReferencesPriv,
"Alter_priv": AlterPriv,
"Execute_priv": ExecutePriv,
"Index_priv": IndexPriv,
"Create_view_priv": CreateViewPriv,
"Show_view_priv": ShowViewPriv,
"Create_role_priv": CreateRolePriv,
"Drop_role_priv": DropRolePriv,
}
// AllGlobalPrivs is all the privileges in global scope.
var AllGlobalPrivs = []PrivilegeType{SelectPriv, InsertPriv, UpdatePriv, DeletePriv, CreatePriv, DropPriv, ProcessPriv, GrantPriv, ReferencesPriv, AlterPriv, ShowDBPriv, SuperPriv, ExecutePriv, IndexPriv, CreateUserPriv, TriggerPriv, CreateViewPriv, ShowViewPriv, CreateRolePriv, DropRolePriv}
// Priv2Str is the map for privilege to string.
var Priv2Str = map[PrivilegeType]string{
CreatePriv: "Create",
......@@ -383,6 +397,11 @@ var Priv2Str = map[PrivilegeType]string{
ShowViewPriv: "Show View",
CreateRolePriv: "Create Role",
DropRolePriv: "Drop Role",
CreateTMPTablePriv: "CREATE TEMPORARY TABLES",
LockTablesPriv: "LOCK TABLES",
CreateRoutinePriv: "CREATE ROUTINE",
AlterRoutinePriv: "ALTER ROUTINE",
EventPriv: "EVENT",
}
// Priv2SetStr is the map for privilege to string.
......@@ -419,6 +438,9 @@ var SetStr2Priv = map[string]PrivilegeType{
"Show View": ShowViewPriv,
}
// AllGlobalPrivs is all the privileges in global scope.
var AllGlobalPrivs = []PrivilegeType{SelectPriv, InsertPriv, UpdatePriv, DeletePriv, CreatePriv, DropPriv, ProcessPriv, GrantPriv, ReferencesPriv, AlterPriv, ShowDBPriv, SuperPriv, ExecutePriv, IndexPriv, CreateUserPriv, TriggerPriv, CreateViewPriv, ShowViewPriv, CreateRolePriv, DropRolePriv, CreateTMPTablePriv, LockTablesPriv, CreateRoutinePriv, AlterRoutinePriv, EventPriv}
// AllDBPrivs is all the privileges in database scope.
var AllDBPrivs = []PrivilegeType{SelectPriv, InsertPriv, UpdatePriv, DeletePriv, CreatePriv, DropPriv, GrantPriv, AlterPriv, ExecutePriv, IndexPriv, CreateViewPriv, ShowViewPriv}
......
......@@ -255,4 +255,5 @@ var MySQLState = map[uint16]string{
ErrInvalidJSONData: "22032",
ErrInvalidJSONPathWildcard: "42000",
ErrJSONUsedAsKey: "42000",
ErrInvalidJSONPathArrayCell: "42000",
}
......@@ -79,6 +79,7 @@ var defaultLengthAndDecimalForCast = map[byte]lengthAndDecimal{
TypeNewDecimal: {11, 0},
TypeDuration: {10, 0},
TypeLonglong: {22, 0},
TypeDouble: {22, -1},
TypeJSON: {4194304, 0}, // Flen differs.
}
......
因为 它太大了无法显示 source diff 。你可以改为 查看blob
......@@ -175,6 +175,7 @@ import (
longblobType "LONGBLOB"
longtextType "LONGTEXT"
lowPriority "LOW_PRIORITY"
match "MATCH"
maxValue "MAXVALUE"
mediumblobType "MEDIUMBLOB"
mediumIntType "MEDIUMINT"
......@@ -318,6 +319,7 @@ import (
delayKeyWrite "DELAY_KEY_WRITE"
directory "DIRECTORY"
disable "DISABLE"
disk "DISK"
do "DO"
duplicate "DUPLICATE"
dynamic "DYNAMIC"
......@@ -385,6 +387,8 @@ import (
only "ONLY"
pageSym "PAGE"
password "PASSWORD"
partial "PARTIAL"
partitioning "PARTITIONING"
partitions "PARTITIONS"
pipesAsOr
plugins "PLUGINS"
......@@ -402,6 +406,7 @@ import (
recover "RECOVER"
redundant "REDUNDANT"
reload "RELOAD"
remove "REMOVE"
repeatable "REPEATABLE"
respect "RESPECT"
replication "REPLICATION"
......@@ -419,6 +424,7 @@ import (
share "SHARE"
shared "SHARED"
signed "SIGNED"
simple "SIMPLE"
slave "SLAVE"
slow "SLOW"
snapshot "SNAPSHOT"
......@@ -427,7 +433,9 @@ import (
sqlNoCache "SQL_NO_CACHE"
start "START"
statsPersistent "STATS_PERSISTENT"
statsSamplePages "STATS_SAMPLE_PAGES"
status "STATUS"
storage "STORAGE"
swaps "SWAPS"
switchesSym "SWITCHES"
systemTime "SYSTEM_TIME"
......@@ -467,6 +475,7 @@ import (
week "WEEK"
yearType "YEAR"
x509 "X509"
enforced "ENFORCED"
/* The following tokens belong to NotKeywordToken. Notice: make sure these tokens are contained in NotKeywordToken. */
addDate "ADDDATE"
......@@ -515,12 +524,15 @@ import (
varPop "VAR_POP"
varSamp "VAR_SAMP"
exprPushdownBlacklist "EXPR_PUSHDOWN_BLACKLIST"
optRuleBlacklist "OPT_RULE_BLACKLIST"
/* The following tokens belong to TiDBKeyword. Notice: make sure these tokens are contained in TiDBKeyword. */
admin "ADMIN"
buckets "BUCKETS"
cancel "CANCEL"
cmSketch "CMSKETCH"
ddl "DDL"
depth "DEPTH"
drainer "DRAINER"
jobs "JOBS"
job "JOB"
......@@ -538,7 +550,11 @@ import (
tidbHJ "TIDB_HJ"
tidbSMJ "TIDB_SMJ"
tidbINLJ "TIDB_INLJ"
tidbHASHAGG "TIDB_HASHAGG"
tidbSTREAMAGG "TIDB_STREAMAGG"
topn "TOPN"
split "SPLIT"
width "WIDTH"
regions "REGIONS"
builtinAddDate
......@@ -682,9 +698,13 @@ import (
%type <item>
AdminShowSlow "Admin Show Slow statement"
AlterAlgorithm "Alter table algorithm"
AlterTablePartitionOpt "Alter table partition option"
AlterTableSpec "Alter table specification"
AlterTableSpecList "Alter table specification list"
AlterTableSpecListOpt "Alter table specification list optional"
AnalyzeOption "Analyze option"
AnalyzeOptionList "Analyze option list"
AnalyzeOptionListOpt "Optional analyze option list"
AnyOrAll "Any or All for subquery"
Assignment "assignment"
AssignmentList "assignment list"
......@@ -744,6 +764,7 @@ import (
FieldAsName "Field alias name"
FieldAsNameOpt "Field alias name opt"
FieldList "field expression list"
FieldTerminator "Field terminator"
FlushOption "Flush option"
PluginNameList "Plugin Name List"
TableRefsClause "Table references clause"
......@@ -787,13 +808,13 @@ import (
LoadDataSetItem "Single load data specification"
LocalOpt "Local opt"
LockClause "Alter table lock clause"
MaxNumBuckets "Max number of buckets"
NumLiteral "Num/Int/Float/Decimal Literal"
NoWriteToBinLogAliasOpt "NO_WRITE_TO_BINLOG alias LOCAL or empty"
ObjectType "Grant statement object type"
OnDuplicateKeyUpdate "ON DUPLICATE KEY UPDATE value list"
DuplicateOpt "[IGNORE|REPLACE] in CREATE TABLE ... SELECT statement or LOAD DATA statement"
OptFull "Full or empty"
OptTemporary "TEMPORARY or empty"
Order "ORDER BY clause optional collation specification"
OrderBy "ORDER BY clause"
OrReplace "or replace"
......@@ -826,8 +847,9 @@ import (
PrivLevel "Privilege scope"
PrivType "Privilege type"
ReferDef "Reference definition"
OnDeleteOpt "optional ON DELETE clause"
OnUpdateOpt "optional ON UPDATE clause"
OnDelete "ON DELETE clause"
OnUpdate "ON UPDATE clause"
OnDeleteUpdateOpt "optional ON DELETE and UPDATE clause"
OptGConcatSeparator "optional GROUP_CONCAT SEPARATOR"
ReferOpt "reference option"
RequireList "require list"
......@@ -986,6 +1008,11 @@ import (
TableOptimizerHintOpt "Table level optimizer hint"
TableOptimizerHints "Table level optimizer hints"
TableOptimizerHintList "Table level optimizer hint list"
EnforcedOrNot "{ENFORCED|NOT ENFORCED}"
EnforcedOrNotOpt "Optional {ENFORCED|NOT ENFORCED}"
EnforcedOrNotOrNotNullOpt "{[ENFORCED|NOT ENFORCED|NOT NULL]}"
Match "[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]"
MatchOpt "optional MATCH clause"
%type <ident>
AsOpt "AS or EmptyString"
......@@ -1074,6 +1101,7 @@ import (
%left '*' '/' '%' div mod
%left '^'
%left '~' neg
%precedence lowerThanNot
%right not not2
%right collate
......@@ -1096,33 +1124,52 @@ Start:
* See https://dev.mysql.com/doc/refman/5.7/en/alter-table.html
*******************************************************************************************/
AlterTableStmt:
"ALTER" IgnoreOptional "TABLE" TableName AlterTableSpecListOpt PartitionOpt
"ALTER" IgnoreOptional "TABLE" TableName AlterTableSpecListOpt AlterTablePartitionOpt
{
specs := $5.([]*ast.AlterTableSpec)
if $6 != nil {
specs = append(specs, &ast.AlterTableSpec{
Tp: ast.AlterTablePartition,
Partition: $6.(*ast.PartitionOptions),
})
specs = append(specs, $6.(*ast.AlterTableSpec))
}
$$ = &ast.AlterTableStmt{
Table: $4.(*ast.TableName),
Specs: specs,
}
}
| "ALTER" IgnoreOptional "TABLE" TableName "ANALYZE" "PARTITION" PartitionNameList MaxNumBuckets
| "ALTER" IgnoreOptional "TABLE" TableName "ANALYZE" "PARTITION" PartitionNameList AnalyzeOptionListOpt
{
$$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$4.(*ast.TableName)}, PartitionNames: $7.([]model.CIStr), MaxNumBuckets: $8.(uint64),}
$$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$4.(*ast.TableName)}, PartitionNames: $7.([]model.CIStr), AnalyzeOpts: $8.([]ast.AnalyzeOpt),}
}
| "ALTER" IgnoreOptional "TABLE" TableName "ANALYZE" "PARTITION" PartitionNameList "INDEX" IndexNameList MaxNumBuckets
| "ALTER" IgnoreOptional "TABLE" TableName "ANALYZE" "PARTITION" PartitionNameList "INDEX" IndexNameList AnalyzeOptionListOpt
{
$$ = &ast.AnalyzeTableStmt{
TableNames: []*ast.TableName{$4.(*ast.TableName)},
PartitionNames: $7.([]model.CIStr),
IndexNames: $9.([]model.CIStr),
IndexFlag: true,
MaxNumBuckets: $10.(uint64),
AnalyzeOpts: $10.([]ast.AnalyzeOpt),
}
}
AlterTablePartitionOpt:
PartitionOpt
{
if $1 != nil {
$$ = &ast.AlterTableSpec{
Tp: ast.AlterTablePartition,
Partition: $1.(*ast.PartitionOptions),
}
} else {
$$ = nil
}
}
| "REMOVE" "PARTITIONING"
{
$$ = &ast.AlterTableSpec{
Tp: ast.AlterTableRemovePartitioning,
}
yylex.AppendError(yylex.Errorf("The REMOVE PARTITIONING clause is parsed but ignored by all storage engines."))
parser.lastErrorAsWarn()
}
AlterTableSpec:
......@@ -1144,19 +1191,21 @@ AlterTableSpec:
}
$$ = op
}
| "ADD" ColumnKeywordOpt ColumnDef ColumnPosition
| "ADD" ColumnKeywordOpt IfNotExists ColumnDef ColumnPosition
{
$$ = &ast.AlterTableSpec{
IfNotExists: $3.(bool),
Tp: ast.AlterTableAddColumns,
NewColumns: []*ast.ColumnDef{$3.(*ast.ColumnDef)},
Position: $4.(*ast.ColumnPosition),
NewColumns: []*ast.ColumnDef{$4.(*ast.ColumnDef)},
Position: $5.(*ast.ColumnPosition),
}
}
| "ADD" ColumnKeywordOpt '(' ColumnDefList ')'
| "ADD" ColumnKeywordOpt IfNotExists '(' ColumnDefList ')'
{
$$ = &ast.AlterTableSpec{
IfNotExists: $3.(bool),
Tp: ast.AlterTableAddColumns,
NewColumns: $4.([]*ast.ColumnDef),
NewColumns: $5.([]*ast.ColumnDef),
}
}
| "ADD" Constraint
......@@ -1167,13 +1216,14 @@ AlterTableSpec:
Constraint: constraint,
}
}
| "ADD" "PARTITION" PartitionDefinitionListOpt
| "ADD" "PARTITION" IfNotExists PartitionDefinitionListOpt
{
var defs []*ast.PartitionDefinition
if $3 != nil {
defs = $3.([]*ast.PartitionDefinition)
if $4 != nil {
defs = $4.([]*ast.PartitionDefinition)
}
$$ = &ast.AlterTableSpec{
IfNotExists: $3.(bool),
Tp: ast.AlterTableAddPartitions,
PartDefinitions: defs,
}
......@@ -1192,22 +1242,24 @@ AlterTableSpec:
Num: getUint64FromNUM($3),
}
}
| "DROP" ColumnKeywordOpt ColumnName RestrictOrCascadeOpt
| "DROP" ColumnKeywordOpt IfExists ColumnName RestrictOrCascadeOpt
{
$$ = &ast.AlterTableSpec{
IfExists: $3.(bool),
Tp: ast.AlterTableDropColumn,
OldColumnName: $3.(*ast.ColumnName),
OldColumnName: $4.(*ast.ColumnName),
}
}
| "DROP" "PRIMARY" "KEY"
{
$$ = &ast.AlterTableSpec{Tp: ast.AlterTableDropPrimaryKey}
}
| "DROP" "PARTITION" PartitionNameList %prec lowerThanComma
| "DROP" "PARTITION" IfExists PartitionNameList %prec lowerThanComma
{
$$ = &ast.AlterTableSpec{
IfExists: $3.(bool),
Tp: ast.AlterTableDropPartition,
PartitionNames: $3.([]model.CIStr),
PartitionNames: $4.([]model.CIStr),
}
}
| "TRUNCATE" "PARTITION" PartitionNameList %prec lowerThanComma
......@@ -1217,18 +1269,20 @@ AlterTableSpec:
PartitionNames: $3.([]model.CIStr),
}
}
| "DROP" KeyOrIndex Identifier
| "DROP" KeyOrIndex IfExists Identifier
{
$$ = &ast.AlterTableSpec{
IfExists: $3.(bool),
Tp: ast.AlterTableDropIndex,
Name: $3,
Name: $4,
}
}
| "DROP" "FOREIGN" "KEY" Symbol
| "DROP" "FOREIGN" "KEY" IfExists Symbol
{
$$ = &ast.AlterTableSpec{
IfExists: $4.(bool),
Tp: ast.AlterTableDropForeignKey,
Name: $4.(string),
Name: $5.(string),
}
}
| "DISABLE" "KEYS"
......@@ -1243,21 +1297,23 @@ AlterTableSpec:
Tp: ast.AlterTableEnableKeys,
}
}
| "MODIFY" ColumnKeywordOpt ColumnDef ColumnPosition
| "MODIFY" ColumnKeywordOpt IfExists ColumnDef ColumnPosition
{
$$ = &ast.AlterTableSpec{
IfExists: $3.(bool),
Tp: ast.AlterTableModifyColumn,
NewColumns: []*ast.ColumnDef{$3.(*ast.ColumnDef)},
Position: $4.(*ast.ColumnPosition),
NewColumns: []*ast.ColumnDef{$4.(*ast.ColumnDef)},
Position: $5.(*ast.ColumnPosition),
}
}
| "CHANGE" ColumnKeywordOpt ColumnName ColumnDef ColumnPosition
| "CHANGE" ColumnKeywordOpt IfExists ColumnName ColumnDef ColumnPosition
{
$$ = &ast.AlterTableSpec{
IfExists: $3.(bool),
Tp: ast.AlterTableChangeColumn,
OldColumnName: $3.(*ast.ColumnName),
NewColumns: []*ast.ColumnDef{$4.(*ast.ColumnDef)},
Position: $5.(*ast.ColumnPosition),
OldColumnName: $4.(*ast.ColumnName),
NewColumns: []*ast.ColumnDef{$5.(*ast.ColumnDef)},
Position: $6.(*ast.ColumnPosition),
}
}
| "ALTER" ColumnKeywordOpt ColumnName "SET" "DEFAULT" SignedLiteral
......@@ -1272,6 +1328,18 @@ AlterTableSpec:
NewColumns: []*ast.ColumnDef{colDef},
}
}
| "ALTER" ColumnKeywordOpt ColumnName "SET" "DEFAULT" '(' Expression ')'
{
option := &ast.ColumnOption{Expr: $7}
colDef := &ast.ColumnDef{
Name: $3.(*ast.ColumnName),
Options: []*ast.ColumnOption{option},
}
$$ = &ast.AlterTableSpec{
Tp: ast.AlterTableAlterColumn,
NewColumns: []*ast.ColumnDef{colDef},
}
}
| "ALTER" ColumnKeywordOpt ColumnName "DROP" "DEFAULT"
{
colDef := &ast.ColumnDef{
......@@ -1352,29 +1420,38 @@ AlterAlgorithm:
{
$$ = ast.AlterAlgorithmInstant
}
| identifier
{
yylex.AppendError(ErrUnknownAlterAlgorithm.GenWithStackByArgs($1))
return 1
}
LockClauseOpt:
{}
| LockClause {}
LockClause:
"LOCK" eq "NONE"
"LOCK" EqOpt "NONE"
{
$$ = ast.LockTypeNone
}
| "LOCK" eq "DEFAULT"
| "LOCK" EqOpt "DEFAULT"
{
$$ = ast.LockTypeDefault
}
| "LOCK" eq "SHARED"
| "LOCK" EqOpt "SHARED"
{
$$ = ast.LockTypeShared
}
| "LOCK" eq "EXCLUSIVE"
| "LOCK" EqOpt "EXCLUSIVE"
{
$$ = ast.LockTypeExclusive
}
| "LOCK" EqOpt identifier
{
yylex.AppendError(ErrUnknownAlterLock.GenWithStackByArgs($3))
return 1
}
KeyOrIndex: "KEY" | "INDEX"
......@@ -1541,7 +1618,6 @@ SplitRegionStmt:
}
}
SplitOption:
"BETWEEN" RowValue "AND" RowValue "REGIONS" NUM
{
......@@ -1561,33 +1637,33 @@ SplitOption:
/*******************************************************************************************/
AnalyzeTableStmt:
"ANALYZE" "TABLE" TableNameList MaxNumBuckets
"ANALYZE" "TABLE" TableNameList AnalyzeOptionListOpt
{
$$ = &ast.AnalyzeTableStmt{TableNames: $3.([]*ast.TableName), MaxNumBuckets: $4.(uint64)}
$$ = &ast.AnalyzeTableStmt{TableNames: $3.([]*ast.TableName), AnalyzeOpts: $4.([]ast.AnalyzeOpt),}
}
| "ANALYZE" "TABLE" TableName "INDEX" IndexNameList MaxNumBuckets
| "ANALYZE" "TABLE" TableName "INDEX" IndexNameList AnalyzeOptionListOpt
{
$$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$3.(*ast.TableName)}, IndexNames: $5.([]model.CIStr), IndexFlag: true, MaxNumBuckets: $6.(uint64)}
$$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$3.(*ast.TableName)}, IndexNames: $5.([]model.CIStr), IndexFlag: true, AnalyzeOpts: $6.([]ast.AnalyzeOpt),}
}
| "ANALYZE" "INCREMENTAL" "TABLE" TableName "INDEX" IndexNameList MaxNumBuckets
| "ANALYZE" "INCREMENTAL" "TABLE" TableName "INDEX" IndexNameList AnalyzeOptionListOpt
{
$$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$4.(*ast.TableName)}, IndexNames: $6.([]model.CIStr), IndexFlag: true, Incremental: true, MaxNumBuckets: $7.(uint64)}
$$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$4.(*ast.TableName)}, IndexNames: $6.([]model.CIStr), IndexFlag: true, Incremental: true, AnalyzeOpts: $7.([]ast.AnalyzeOpt),}
}
| "ANALYZE" "TABLE" TableName "PARTITION" PartitionNameList MaxNumBuckets
| "ANALYZE" "TABLE" TableName "PARTITION" PartitionNameList AnalyzeOptionListOpt
{
$$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$3.(*ast.TableName)}, PartitionNames: $5.([]model.CIStr), MaxNumBuckets: $6.(uint64),}
$$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$3.(*ast.TableName)}, PartitionNames: $5.([]model.CIStr), AnalyzeOpts: $6.([]ast.AnalyzeOpt),}
}
| "ANALYZE" "TABLE" TableName "PARTITION" PartitionNameList "INDEX" IndexNameList MaxNumBuckets
| "ANALYZE" "TABLE" TableName "PARTITION" PartitionNameList "INDEX" IndexNameList AnalyzeOptionListOpt
{
$$ = &ast.AnalyzeTableStmt{
TableNames: []*ast.TableName{$3.(*ast.TableName)},
PartitionNames: $5.([]model.CIStr),
IndexNames: $7.([]model.CIStr),
IndexFlag: true,
MaxNumBuckets: $8.(uint64),
AnalyzeOpts: $8.([]ast.AnalyzeOpt),
}
}
| "ANALYZE" "INCREMENTAL" "TABLE" TableName "PARTITION" PartitionNameList "INDEX" IndexNameList MaxNumBuckets
| "ANALYZE" "INCREMENTAL" "TABLE" TableName "PARTITION" PartitionNameList "INDEX" IndexNameList AnalyzeOptionListOpt
{
$$ = &ast.AnalyzeTableStmt{
TableNames: []*ast.TableName{$4.(*ast.TableName)},
......@@ -1595,17 +1671,45 @@ AnalyzeTableStmt:
IndexNames: $8.([]model.CIStr),
IndexFlag: true,
Incremental: true,
MaxNumBuckets: $9.(uint64),
AnalyzeOpts: $9.([]ast.AnalyzeOpt),
}
}
MaxNumBuckets:
AnalyzeOptionListOpt:
{
$$ = uint64(0)
$$ = []ast.AnalyzeOpt{}
}
| "WITH" NUM "BUCKETS"
| "WITH" AnalyzeOptionList
{
$$ = getUint64FromNUM($2)
$$ = $2.([]ast.AnalyzeOpt)
}
AnalyzeOptionList:
AnalyzeOption
{
$$ = []ast.AnalyzeOpt{$1.(ast.AnalyzeOpt)}
}
| AnalyzeOptionList ',' AnalyzeOption
{
$$ = append($1.([]ast.AnalyzeOpt), $3.(ast.AnalyzeOpt))
}
AnalyzeOption:
NUM "BUCKETS"
{
$$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumBuckets, Value: getUint64FromNUM($1)}
}
| NUM "TOPN"
{
$$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumTopN, Value: getUint64FromNUM($1)}
}
| NUM "CMSKETCH" "DEPTH"
{
$$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptCMSketchDepth, Value: getUint64FromNUM($1)}
}
| NUM "CMSKETCH" "WIDTH"
{
$$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptCMSketchWidth, Value: getUint64FromNUM($1)}
}
/*******************************************************************************************/
......@@ -1769,6 +1873,42 @@ PrimaryOpt:
{}
| "PRIMARY"
EnforcedOrNot:
"ENFORCED"
{
$$ = true
}
| "NOT" "ENFORCED"
{
$$ = false
}
EnforcedOrNotOpt:
{
$$ = true
} %prec lowerThanNot
| EnforcedOrNot
{
$$ = $1
}
EnforcedOrNotOrNotNullOpt:
// This branch is needed to workaround the need of a lookahead of 2 for the grammar:
//
// { [NOT] NULL | CHECK(...) [NOT] ENFORCED } ...
"NOT" "NULL"
{
$$ = 0
}
| EnforcedOrNotOpt
{
if ($1.(bool)) {
$$ = 1
} else {
$$ = 2
}
}
ColumnOption:
"NOT" "NULL"
{
......@@ -1809,11 +1949,30 @@ ColumnOption:
{
$$ = &ast.ColumnOption{Tp: ast.ColumnOptionComment, Expr: ast.NewValueExpr($2)}
}
| "CHECK" '(' Expression ')'
| "CHECK" '(' Expression ')' EnforcedOrNotOrNotNullOpt
{
// See https://dev.mysql.com/doc/refman/5.7/en/create-table.html
// The CHECK clause is parsed but ignored by all storage engines.
$$ = &ast.ColumnOption{}
// See the branch named `EnforcedOrNotOrNotNullOpt`.
optionCheck := &ast.ColumnOption{
Tp: ast.ColumnOptionCheck,
Expr: $3,
Enforced: true,
}
switch $5.(int) {
case 0:
$$ = []*ast.ColumnOption{optionCheck, {Tp: ast.ColumnOptionNotNull}}
case 1:
optionCheck.Enforced = true
$$ = optionCheck
case 2:
optionCheck.Enforced = false
$$ = optionCheck
default:
}
yylex.AppendError(yylex.Errorf("The CHECK clause is parsed but ignored by all storage engines."))
parser.lastErrorAsWarn()
}
| GeneratedAlways "AS" '(' Expression ')' VirtualOrStored
{
......@@ -1858,11 +2017,19 @@ VirtualOrStored:
ColumnOptionList:
ColumnOption
{
$$ = []*ast.ColumnOption{$1.(*ast.ColumnOption)}
if columnOption,ok := $1.(*ast.ColumnOption); ok {
$$ = []*ast.ColumnOption{columnOption}
} else {
$$ = $1
}
}
| ColumnOptionList ColumnOption
{
$$ = append($1.([]*ast.ColumnOption), $2.(*ast.ColumnOption))
if columnOption,ok := $2.(*ast.ColumnOption); ok {
$$ = append($1.([]*ast.ColumnOption), columnOption)
} else {
$$ = append($1.([]*ast.ColumnOption), $2.([]*ast.ColumnOption)...)
}
}
ColumnOptionListOpt:
......@@ -1904,21 +2071,22 @@ ConstraintElem:
}
$$ = c
}
| KeyOrIndex IndexName IndexTypeOpt '(' IndexColNameList ')' IndexOptionList
| KeyOrIndex IfNotExists IndexName IndexTypeOpt '(' IndexColNameList ')' IndexOptionList
{
c := &ast.Constraint{
IfNotExists: $2.(bool),
Tp: ast.ConstraintIndex,
Keys: $5.([]*ast.IndexColName),
Name: $2.(string),
Keys: $6.([]*ast.IndexColName),
Name: $3.(string),
}
if $7 != nil {
c.Option = $7.(*ast.IndexOption)
if $8 != nil {
c.Option = $8.(*ast.IndexOption)
}
if $3 != nil {
if $4 != nil {
if c.Option == nil {
c.Option = &ast.IndexOption{}
}
c.Option.Tp = $3.(model.IndexType)
c.Option.Tp = $4.(model.IndexType)
}
$$ = c
}
......@@ -1940,51 +2108,96 @@ ConstraintElem:
}
$$ = c
}
| "FOREIGN" "KEY" IndexName '(' IndexColNameList ')' ReferDef
| "FOREIGN" "KEY" IfNotExists IndexName '(' IndexColNameList ')' ReferDef
{
$$ = &ast.Constraint{
IfNotExists: $3.(bool),
Tp: ast.ConstraintForeignKey,
Keys: $5.([]*ast.IndexColName),
Name: $3.(string),
Refer: $7.(*ast.ReferenceDef),
Keys: $6.([]*ast.IndexColName),
Name: $4.(string),
Refer: $8.(*ast.ReferenceDef),
}
}
| "CHECK" '(' Expression ')' EnforcedOrNotOpt
{
$$ = &ast.Constraint{
Tp: ast.ConstraintCheck,
Expr: $3.(ast.ExprNode),
Enforced: $5.(bool),
}
yylex.AppendError(yylex.Errorf("The CHECK clause is parsed but ignored by all storage engines."))
parser.lastErrorAsWarn()
}
ReferDef:
"REFERENCES" TableName '(' IndexColNameList ')' OnDeleteOpt OnUpdateOpt
Match:
"MATCH" "FULL"
{
var onDeleteOpt *ast.OnDeleteOpt
if $6 != nil {
onDeleteOpt = $6.(*ast.OnDeleteOpt)
$$ = ast.MatchFull
}
var onUpdateOpt *ast.OnUpdateOpt
if $7 != nil {
onUpdateOpt = $7.(*ast.OnUpdateOpt)
| "MATCH" "PARTIAL"
{
$$ = ast.MatchPartial
}
| "MATCH" "SIMPLE"
{
$$ = ast.MatchSimple
}
MatchOpt:
{
$$ = ast.MatchNone
}
| Match
{
$$ = $1
yylex.AppendError(yylex.Errorf("The MATCH clause is parsed but ignored by all storage engines."))
parser.lastErrorAsWarn()
}
ReferDef:
"REFERENCES" TableName '(' IndexColNameList ')' MatchOpt OnDeleteUpdateOpt
{
onDeleteUpdate := $7.([2]interface{})
$$ = &ast.ReferenceDef{
Table: $2.(*ast.TableName),
IndexColNames: $4.([]*ast.IndexColName),
OnDelete: onDeleteOpt,
OnUpdate: onUpdateOpt,
OnDelete: onDeleteUpdate[0].(*ast.OnDeleteOpt),
OnUpdate: onDeleteUpdate[1].(*ast.OnUpdateOpt),
Match: $6.(ast.MatchType),
}
}
OnDeleteOpt:
{
$$ = &ast.OnDeleteOpt{}
} %prec lowerThanOn
| "ON" "DELETE" ReferOpt
OnDelete:
"ON" "DELETE" ReferOpt
{
$$ = &ast.OnDeleteOpt{ReferOpt: $3.(ast.ReferOptionType)}
}
OnUpdateOpt:
OnUpdate:
"ON" "UPDATE" ReferOpt
{
$$ = &ast.OnUpdateOpt{}
$$ = &ast.OnUpdateOpt{ReferOpt: $3.(ast.ReferOptionType)}
}
OnDeleteUpdateOpt:
{
$$ = [2]interface{}{&ast.OnDeleteOpt{}, &ast.OnUpdateOpt{}}
} %prec lowerThanOn
| "ON" "UPDATE" ReferOpt
| OnDelete %prec lowerThanOn
{
$$ = &ast.OnUpdateOpt{ReferOpt: $3.(ast.ReferOptionType)}
$$ = [2]interface{}{$1, &ast.OnUpdateOpt{}}
}
| OnUpdate %prec lowerThanOn
{
$$ = [2]interface{}{&ast.OnDeleteOpt{}, $1}
}
| OnDelete OnUpdate
{
$$ = [2]interface{}{$1, $2}
}
| OnUpdate OnDelete
{
$$ = [2]interface{}{$2, $1}
}
ReferOpt:
......@@ -2004,6 +2217,12 @@ ReferOpt:
{
$$ = ast.ReferOptionNoAction
}
| "SET" "DEFAULT"
{
$$ = ast.ReferOptionSetDefault
yylex.AppendError(yylex.Errorf("The SET DEFAULT clause is parsed but ignored by all storage engines."))
parser.lastErrorAsWarn()
}
/*
* The DEFAULT clause specifies a default value for a column.
......@@ -2064,27 +2283,28 @@ NumLiteral:
CreateIndexStmt:
"CREATE" CreateIndexStmtUnique "INDEX" Identifier IndexTypeOpt "ON" TableName '(' IndexColNameList ')' IndexOptionList LockClauseOpt
"CREATE" CreateIndexStmtUnique "INDEX" IfNotExists Identifier IndexTypeOpt "ON" TableName '(' IndexColNameList ')' IndexOptionList LockClauseOpt
{
var indexOption *ast.IndexOption
if $11 != nil {
indexOption = $11.(*ast.IndexOption)
if $12 != nil {
indexOption = $12.(*ast.IndexOption)
if indexOption.Tp == model.IndexTypeInvalid {
if $5 != nil {
indexOption.Tp = $5.(model.IndexType)
if $6 != nil {
indexOption.Tp = $6.(model.IndexType)
}
}
} else {
indexOption = &ast.IndexOption{}
if $5 != nil {
indexOption.Tp = $5.(model.IndexType)
if $6 != nil {
indexOption.Tp = $6.(model.IndexType)
}
}
$$ = &ast.CreateIndexStmt{
Unique: $2.(bool),
IndexName: $4,
Table: $7.(*ast.TableName),
IndexColNames: $9.([]*ast.IndexColName),
IfNotExists: $4.(bool),
IndexName: $5,
Table: $8.(*ast.TableName),
IndexColNames: $10.([]*ast.IndexColName),
IndexOption: indexOption,
}
}
......@@ -2734,26 +2954,26 @@ DoStmt:
*
*******************************************************************/
DeleteFromStmt:
"DELETE" TableOptimizerHints PriorityOpt QuickOptional IgnoreOptional "FROM" TableName IndexHintListOpt WhereClauseOptional OrderByOptional LimitClause
"DELETE" TableOptimizerHints PriorityOpt QuickOptional IgnoreOptional "FROM" TableName TableAsNameOpt IndexHintListOpt WhereClauseOptional OrderByOptional LimitClause
{
// Single Table
tn := $7.(*ast.TableName)
tn.IndexHints = $8.([]*ast.IndexHint)
join := &ast.Join{Left: &ast.TableSource{Source: tn}, Right: nil}
tn.IndexHints = $9.([]*ast.IndexHint)
join := &ast.Join{Left: &ast.TableSource{Source: tn, AsName: $8.(model.CIStr)}, Right: nil}
x := &ast.DeleteStmt{
TableRefs: &ast.TableRefsClause{TableRefs: join},
Priority: $3.(mysql.PriorityEnum),
Quick: $4.(bool),
IgnoreErr: $5.(bool),
}
if $9 != nil {
x.Where = $9.(ast.ExprNode)
}
if $10 != nil {
x.Order = $10.(*ast.OrderByClause)
x.Where = $10.(ast.ExprNode)
}
if $11 != nil {
x.Limit = $11.(*ast.Limit)
x.Order = $11.(*ast.OrderByClause)
}
if $12 != nil {
x.Limit = $12.(*ast.Limit)
}
$$ = x
......@@ -2815,15 +3035,16 @@ DropIndexStmt:
}
DropTableStmt:
"DROP" TableOrTables TableNameList RestrictOrCascadeOpt
{
$$ = &ast.DropTableStmt{Tables: $3.([]*ast.TableName), IsView: false}
}
| "DROP" TableOrTables "IF" "EXISTS" TableNameList RestrictOrCascadeOpt
"DROP" OptTemporary TableOrTables IfExists TableNameList RestrictOrCascadeOpt
{
$$ = &ast.DropTableStmt{IfExists: true, Tables: $5.([]*ast.TableName), IsView: false}
$$ = &ast.DropTableStmt{IfExists: $4.(bool), Tables: $5.([]*ast.TableName), IsView: false, IsTemporary: $2.(bool)}
}
OptTemporary:
/* empty */ { $$= false; }
| "TEMPORARY" { $$= true; }
;
DropViewStmt:
"DROP" "VIEW" TableNameList RestrictOrCascadeOpt
{
......@@ -3499,7 +3720,7 @@ identifier | UnReservedKeyword | NotKeywordToken | TiDBKeyword
UnReservedKeyword:
"ACTION" | "ASCII" | "AUTO_INCREMENT" | "AFTER" | "ALWAYS" | "AVG" | "BEGIN" | "BIT" | "BOOL" | "BOOLEAN" | "BTREE" | "BYTE" | "CLEANUP" | "CHARSET" %prec charsetKwd
| "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"
| "DYNAMIC"| "END" | "ENFORCED" | "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"
| "ROLE" |"ROLLBACK" | "SESSION" | "SIGNED" | "SNAPSHOT" | "START" | "STATUS" | "OPEN"| "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"
......@@ -3511,19 +3732,19 @@ UnReservedKeyword:
| "MICROSECOND" | "MINUTE" | "PLUGINS" | "PRECEDING" | "QUERY" | "QUERIES" | "SECOND" | "SEPARATOR" | "SHARE" | "SHARED" | "SLOW" | "MAX_CONNECTIONS_PER_HOUR" | "MAX_QUERIES_PER_HOUR" | "MAX_UPDATES_PER_HOUR"
| "MAX_USER_CONNECTIONS" | "REPLICATION" | "CLIENT" | "SLAVE" | "RELOAD" | "TEMPORARY" | "ROUTINE" | "EVENT" | "ALGORITHM" | "DEFINER" | "INVOKER" | "MERGE" | "TEMPTABLE" | "UNDEFINED" | "SECURITY" | "CASCADED"
| "RECOVER" | "CIPHER" | "SUBJECT" | "ISSUER" | "X509" | "NEVER" | "EXPIRE" | "ACCOUNT" | "INCREMENTAL" | "CPU" | "MEMORY" | "BLOCK" | "IO" | "CONTEXT" | "SWITCHES" | "PAGE" | "FAULTS" | "IPC" | "SWAPS" | "SOURCE"
| "TRADITIONAL" | "SQL_BUFFER_RESULT" | "DIRECTORY" | "HISTORY" | "LIST" | "NODEGROUP" | "SYSTEM_TIME"
| "TRADITIONAL" | "SQL_BUFFER_RESULT" | "DIRECTORY" | "HISTORY" | "LIST" | "NODEGROUP" | "SYSTEM_TIME" | "PARTIAL" | "SIMPLE" | "REMOVE" | "PARTITIONING" | "STORAGE" | "DISK" | "STATS_SAMPLE_PAGES"
TiDBKeyword:
"ADMIN" | "BUCKETS" | "CANCEL" | "DDL" | "DRAINER" | "JOBS" | "JOB" | "NODE_ID" | "NODE_STATE" | "PUMP" | "STATS" | "STATS_META" | "STATS_HISTOGRAMS" | "STATS_BUCKETS" | "STATS_HEALTHY" | "TIDB" | "TIDB_HJ"
| "TIDB_SMJ" | "TIDB_INLJ" | "SPLIT" | "OPTIMISTIC" | "PESSIMISTIC" | "REGIONS"
"ADMIN" | "BUCKETS" | "CANCEL" | "CMSKETCH" | "DDL" | "DEPTH" | "DRAINER" | "JOBS" | "JOB" | "NODE_ID" | "NODE_STATE" | "PUMP" | "STATS" | "STATS_META" | "STATS_HISTOGRAMS" | "STATS_BUCKETS" | "STATS_HEALTHY" | "TIDB" | "TIDB_HJ"
| "TIDB_SMJ" | "TIDB_INLJ" | "TIDB_HASHAGG" | "TIDB_STREAMAGG" | "TOPN" | "SPLIT" | "OPTIMISTIC" | "PESSIMISTIC" | "WIDTH" | "REGIONS"
NotKeywordToken:
"ADDDATE" | "BIT_AND" | "BIT_OR" | "BIT_XOR" | "CAST" | "COPY" | "COUNT" | "CURTIME" | "DATE_ADD" | "DATE_SUB" | "EXTRACT" | "GET_FORMAT" | "GROUP_CONCAT"
| "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" | "TOKUDB_DEFAULT" | "TOKUDB_FAST" | "TOKUDB_LZMA" | "TOKUDB_QUICKLZ" | "TOKUDB_SNAPPY" | "TOKUDB_SMALL" | "TOKUDB_UNCOMPRESSED" | "TOKUDB_ZLIB" | "TOP" | "TRIM" | "NEXT_ROW_ID"
| "EXPR_PUSHDOWN_BLACKLIST"
| "EXPR_PUSHDOWN_BLACKLIST" | "OPT_RULE_BLACKLIST"
/************************************************************************************
*
......@@ -4853,6 +5074,15 @@ CastType:
x.Collate = mysql.DefaultCollationName
$$ = x
}
| "DOUBLE"
{
x := types.NewFieldType(mysql.TypeDouble)
x.Flen, x.Decimal = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDouble)
x.Flag |= mysql.BinaryFlag
x.Charset = charset.CharsetBin
x.Collate = charset.CollationBin
$$ = x
}
PriorityOpt:
{
......@@ -5004,6 +5234,9 @@ SelectStmtBasic:
Distinct: $2.(*ast.SelectStmtOpts).Distinct,
Fields: $3.(*ast.FieldList),
}
if st.SelectStmtOpts.TableHints != nil {
st.TableHints = st.SelectStmtOpts.TableHints
}
$$ = st
}
......@@ -5027,9 +5260,6 @@ SelectStmtFromTable:
{
st := $1.(*ast.SelectStmt)
st.From = $3.(*ast.TableRefsClause)
if st.SelectStmtOpts.TableHints != nil {
st.TableHints = st.SelectStmtOpts.TableHints
}
lastField := st.Fields.Fields[len(st.Fields.Fields)-1]
if lastField.Expr != nil && lastField.AsName.O == "" {
lastEnd := parser.endOffset(&yyS[yypt-5])
......@@ -5778,6 +6008,14 @@ TableOptimizerHintOpt:
{
$$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), Tables: $3.([]model.CIStr)}
}
| tidbHASHAGG '(' ')'
{
$$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1)}
}
| tidbSTREAMAGG '(' ')'
{
$$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1)}
}
| maxExecutionTime '(' NUM ')'
{
$$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), MaxExecutionTime: getUint64FromNUM($3)}
......@@ -6503,6 +6741,32 @@ AdminStmt:
Tp: ast.AdminReloadExprPushdownBlacklist,
}
}
| "ADMIN" "RELOAD" "OPT_RULE_BLACKLIST"
{
$$ = &ast.AdminStmt{
Tp: ast.AdminReloadOptRuleBlacklist,
}
}
| "ADMIN" "PLUGINS" "ENABLE" PluginNameList
{
$$ = &ast.AdminStmt{
Tp: ast.AdminPluginEnable,
Plugins: $4.([]string),
}
}
| "ADMIN" "PLUGINS" "DISABLE" PluginNameList
{
$$ = &ast.AdminStmt{
Tp: ast.AdminPluginDisable,
Plugins: $4.([]string),
}
}
| "ADMIN" "CLEANUP" "TABLE" "LOCK" TableNameList
{
$$ = &ast.CleanupTableLockStmt{
Tables: $5.([]*ast.TableName),
}
}
AdminShowSlow:
"RECENT" NUM
......@@ -6609,6 +6873,21 @@ ShowStmt:
User: $4.(*auth.UserIdentity),
}
}
| "SHOW" "TABLE" TableName "REGIONS"
{
$$ = &ast.ShowStmt{
Tp: ast.ShowRegions,
Table: $3.(*ast.TableName),
}
}
| "SHOW" "TABLE" TableName "INDEX" Identifier "REGIONS"
{
$$ = &ast.ShowStmt{
Tp: ast.ShowRegions,
Table: $3.(*ast.TableName),
IndexName: model.NewCIStr($5),
}
}
| "SHOW" "GRANTS"
{
// See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html
......@@ -7236,11 +7515,6 @@ TableElement:
{
$$ = $1.(*ast.Constraint)
}
| "CHECK" '(' Expression ')'
{
/* Nothing to do now */
$$ = nil
}
TableElementList:
TableElement
......@@ -7343,6 +7617,23 @@ TableOption:
{
$$ = &ast.TableOption{Tp: ast.TableOptionStatsPersistent}
}
| "STATS_SAMPLE_PAGES" EqOpt LengthNum
{
// Parse it but will ignore it.
// In MySQL, STATS_SAMPLE_PAGES=N(Where 0<N<=65535) or STAS_SAMPLE_PAGES=DEFAULT.
// Cause we don't support it, so we don't check range of the value.
$$ = &ast.TableOption{Tp: ast.TableOptionStatsSamplePages, UintValue: $3.(uint64)}
yylex.AppendError(yylex.Errorf("The STATS_SAMPLE_PAGES is parsed but ignored by all storage engines."))
parser.lastErrorAsWarn()
}
| "STATS_SAMPLE_PAGES" EqOpt "DEFAULT"
{
// Parse it but will ignore it.
// In MySQL, default value of STATS_SAMPLE_PAGES is 0.
$$ = &ast.TableOption{Tp: ast.TableOptionStatsSamplePages, UintValue: 0}
yylex.AppendError(yylex.Errorf("The STATS_SAMPLE_PAGES is parsed but ignored by all storage engines."))
parser.lastErrorAsWarn()
}
| "SHARD_ROW_ID_BITS" EqOpt LengthNum
{
$$ = &ast.TableOption{Tp: ast.TableOptionShardRowID, UintValue: $3.(uint64)}
......@@ -7356,6 +7647,20 @@ TableOption:
// Parse it but will ignore it.
$$ = &ast.TableOption{Tp: ast.TableOptionPackKeys}
}
| "STORAGE" "MEMORY"
{
// Parse it but will ignore it.
$$ = &ast.TableOption{Tp: ast.TableOptionStorageMedia, StrValue: "MEMORY"}
yylex.AppendError(yylex.Errorf("The STORAGE clause is parsed but ignored by all storage engines."))
parser.lastErrorAsWarn()
}
| "STORAGE" "DISK"
{
// Parse it but will ignore it.
$$ = &ast.TableOption{Tp: ast.TableOptionStorageMedia, StrValue: "DISK"}
yylex.AppendError(yylex.Errorf("The STORAGE clause is parsed but ignored by all storage engines."))
parser.lastErrorAsWarn()
}
StatsPersistentVal:
"DEFAULT"
......@@ -7956,6 +8261,7 @@ OptCharset:
CharsetKw:
"CHARACTER" "SET"
| "CHARSET"
| "CHAR" "SET"
OptCollate:
{
......@@ -8604,11 +8910,11 @@ PrivType:
}
| "CREATE" "TEMPORARY" "TABLES"
{
$$ = mysql.PrivilegeType(0)
$$ = mysql.CreateTMPTablePriv
}
| "LOCK" "TABLES"
{
$$ = mysql.PrivilegeType(0)
$$ = mysql.LockTablesPriv
}
| "CREATE" "VIEW"
{
......@@ -8628,15 +8934,15 @@ PrivType:
}
| "CREATE" "ROUTINE"
{
$$ = mysql.PrivilegeType(0)
$$ = mysql.CreateRoutinePriv
}
| "ALTER" "ROUTINE"
{
$$ = mysql.PrivilegeType(0)
$$ = mysql.AlterRoutinePriv
}
| "EVENT"
{
$$ = mysql.PrivilegeType(0)
$$ = mysql.EventPriv
}
ObjectType:
......@@ -8823,16 +9129,16 @@ FieldItemList:
}
FieldItem:
"TERMINATED" "BY" stringLit
"TERMINATED" "BY" FieldTerminator
{
$$ = &ast.FieldItem{
Type: ast.Terminated,
Value: $3,
Value: $3.(string),
}
}
| "OPTIONALLY" "ENCLOSED" "BY" stringLit
| "OPTIONALLY" "ENCLOSED" "BY" FieldTerminator
{
str := $4
str := $4.(string)
if str != "\\" && len(str) > 1 {
yylex.AppendError(ErrWrongFieldTerminators.GenWithStackByArgs())
return 1
......@@ -8842,9 +9148,9 @@ FieldItem:
Value: str,
}
}
| "ENCLOSED" "BY" stringLit
| "ENCLOSED" "BY" FieldTerminator
{
str := $3
str := $3.(string)
if str != "\\" && len(str) > 1 {
yylex.AppendError(ErrWrongFieldTerminators.GenWithStackByArgs())
return 1
......@@ -8854,9 +9160,9 @@ FieldItem:
Value: str,
}
}
| "ESCAPED" "BY" stringLit
| "ESCAPED" "BY" FieldTerminator
{
str := $3
str := $3.(string)
if str != "\\" && len(str) > 1 {
yylex.AppendError(ErrWrongFieldTerminators.GenWithStackByArgs())
return 1
......@@ -8867,6 +9173,20 @@ FieldItem:
}
}
FieldTerminator:
stringLit
{
$$ = $1
}
| hexLit
{
$$ = $1.(ast.BinaryLiteral).ToString()
}
| bitLit
{
$$ = $1.(ast.BinaryLiteral).ToString()
}
Lines:
{
$$ = &ast.LinesClause{Terminated: "\n"}
......
{
mv go.mod1 go.mod
mv go.sum1 go.sum
GO111MODULE=on go test -race -covermode=atomic -coverprofile=coverage.txt ./...
GO111MODULE=on go test -p 1 -race -covermode=atomic -coverprofile=coverage.txt -coverpkg=./... ./...
} || {
mv go.mod go.mod1
mv go.sum go.sum1
......
......@@ -299,6 +299,8 @@ func (ft *FieldType) RestoreAsCastType(ctx *format.RestoreCtx) {
}
case mysql.TypeJSON:
ctx.WriteKeyWord("JSON")
case mysql.TypeDouble:
ctx.WriteKeyWord("DOUBLE")
}
}
......
......@@ -34,6 +34,8 @@ const (
codeWrongArgument = terror.ErrCode(mysql.ErrWrongArguments)
codeWrongFieldTerminators = terror.ErrCode(mysql.ErrWrongFieldTerminators)
codeTooBigDisplayWidth = terror.ErrCode(mysql.ErrTooBigDisplaywidth)
codeErrUnknownAlterLock = terror.ErrCode(mysql.ErrUnknownAlterLock)
codeErrUnknownAlterAlgorithm = terror.ErrCode(mysql.ErrUnknownAlterAlgorithm)
)
var (
......@@ -51,7 +53,10 @@ var (
ErrWrongFieldTerminators = terror.ClassParser.New(codeWrongFieldTerminators, mysql.MySQLErrName[mysql.ErrWrongFieldTerminators])
// ErrTooBigDisplayWidth returns for data display width exceed limit .
ErrTooBigDisplayWidth = terror.ClassParser.New(codeTooBigDisplayWidth, mysql.MySQLErrName[mysql.ErrTooBigDisplaywidth])
// ErrUnknownAlterLock returns for no alter lock type found error.
ErrUnknownAlterLock = terror.ClassParser.New(codeErrUnknownAlterLock, mysql.MySQLErrName[mysql.ErrUnknownAlterLock])
// ErrUnknownAlterAlgorithm returns for no alter algorithm found error.
ErrUnknownAlterAlgorithm = terror.ClassParser.New(codeErrUnknownAlterAlgorithm, mysql.MySQLErrName[mysql.ErrUnknownAlterAlgorithm])
// SpecFieldPattern special result field pattern
SpecFieldPattern = regexp.MustCompile(`(\/\*!(M?[0-9]{5,6})?|\*\/)`)
specCodePattern = regexp.MustCompile(`\/\*!(M?[0-9]{5,6})?([^*]|\*+[^*/])*\*+\/`)
......@@ -68,6 +73,8 @@ func init() {
codeWrongArgument: mysql.ErrWrongArguments,
codeWrongFieldTerminators: mysql.ErrWrongFieldTerminators,
codeTooBigDisplayWidth: mysql.ErrTooBigDisplaywidth,
codeErrUnknownAlterLock: mysql.ErrUnknownAlterLock,
codeErrUnknownAlterAlgorithm: mysql.ErrUnknownAlterAlgorithm,
}
terror.ErrClassToMySQLCodes[terror.ClassParser] = parserMySQLErrCodes
}
......
......@@ -21,6 +21,7 @@ import (
"time"
"github.com/pingcap/parser"
"github.com/pingcap/parser/model"
"github.com/pingcap/parser/mysql"
"github.com/pingcap/tidb/util/execdetails"
"github.com/pingcap/tidb/util/memory"
......@@ -69,6 +70,11 @@ type StatementContext struct {
BatchCheck bool
InNullRejectCheck bool
AllowInvalidDate bool
// CastStrToIntStrict is used to control the way we cast float format string to int.
// If ConvertStrToIntStrict is false, we convert it to a valid float string first,
// then cast the float string to int string. Otherwise, we cast string to integer
// prefix in a strict way, only extract 0-9 and (+ or - in first bit).
CastStrToIntStrict bool
// mu struct holds variables that change during execution.
mu struct {
......@@ -119,8 +125,8 @@ type StatementContext struct {
RuntimeStatsColl *execdetails.RuntimeStatsColl
TableIDs []int64
IndexIDs []int64
NowTs time.Time
SysTs time.Time
nowTs time.Time // use this variable for now/current_timestamp calculation/cache for one stmt
stmtTimeCached bool
StmtType string
OriginalSQL string
digestMemo struct {
......@@ -131,6 +137,21 @@ type StatementContext struct {
Tables []TableEntry
}
// GetNowTsCached getter for nowTs, if not set get now time and cache it
func (sc *StatementContext) GetNowTsCached() time.Time {
if !sc.stmtTimeCached {
now := time.Now()
sc.nowTs = now
sc.stmtTimeCached = true
}
return sc.nowTs
}
// ResetNowTs resetter for nowTs, clear cached time flag
func (sc *StatementContext) ResetNowTs() {
sc.stmtTimeCached = false
}
// SQLDigest gets normalized and digest for provided sql.
// it will cache result after first calling.
func (sc *StatementContext) SQLDigest() (normalized, sqlDigest string) {
......@@ -345,14 +366,6 @@ func (sc *StatementContext) SetHistogramsNotLoad() {
sc.mu.Unlock()
}
// HistogramsNotLoad gets histogramsNotLoad.
func (sc *StatementContext) HistogramsNotLoad() bool {
sc.mu.Lock()
notLoad := sc.mu.histogramsNotLoad
sc.mu.Unlock()
return notLoad
}
// HandleTruncate ignores or returns the error based on the StatementContext state.
func (sc *StatementContext) HandleTruncate(err error) error {
// TODO: At present we have not checked whether the error can be ignored or treated as warning.
......@@ -446,6 +459,39 @@ func (sc *StatementContext) ShouldIgnoreOverflowError() bool {
return false
}
// PushDownFlags converts StatementContext to tipb.SelectRequest.Flags.
func (sc *StatementContext) PushDownFlags() uint64 {
var flags uint64
if sc.InInsertStmt {
flags |= model.FlagInInsertStmt
} else if sc.InUpdateStmt || sc.InDeleteStmt {
flags |= model.FlagInUpdateOrDeleteStmt
} else if sc.InSelectStmt {
flags |= model.FlagInSelectStmt
}
if sc.IgnoreTruncate {
flags |= model.FlagIgnoreTruncate
} else if sc.TruncateAsWarning {
flags |= model.FlagTruncateAsWarning
}
if sc.OverflowAsWarning {
flags |= model.FlagOverflowAsWarning
}
if sc.IgnoreZeroInDate {
flags |= model.FlagIgnoreZeroInDate
}
if sc.DividedByZeroAsWarning {
flags |= model.FlagDividedByZeroAsWarning
}
if sc.PadCharToFullLength {
flags |= model.FlagPadCharToFullLength
}
if sc.InLoadDataStmt {
flags |= model.FlagInLoadDataStmt
}
return flags
}
// CopTasksDetails returns some useful information of cop-tasks during execution.
func (sc *StatementContext) CopTasksDetails() *CopTasksDetails {
sc.mu.Lock()
......
......@@ -183,6 +183,11 @@ func NewBitLiteral(s string) (BitLiteral, error) {
return BitLiteral(b), nil
}
// ToString implement ast.BinaryLiteral interface
func (b BitLiteral) ToString() string {
return BinaryLiteral(b).ToString()
}
// ParseHexStr parses hexadecimal string literal.
// See https://dev.mysql.com/doc/refman/5.7/en/hexadecimal-literals.html
func ParseHexStr(s string) (BinaryLiteral, error) {
......@@ -225,3 +230,8 @@ func NewHexLiteral(s string) (HexLiteral, error) {
}
return HexLiteral(h), nil
}
// ToString implement ast.BinaryLiteral interface
func (b HexLiteral) ToString() string {
return BinaryLiteral(b).ToString()
}
......@@ -362,30 +362,63 @@ func NumberToDuration(number int64, fsp int) (Duration, error) {
// getValidIntPrefix gets prefix of the string which can be successfully parsed as int.
func getValidIntPrefix(sc *stmtctx.StatementContext, str string) (string, error) {
if !sc.CastStrToIntStrict {
floatPrefix, err := getValidFloatPrefix(sc, str)
if err != nil {
return floatPrefix, errors.Trace(err)
}
return floatStrToIntStr(sc, floatPrefix, str)
}
validLen := 0
for i := 0; i < len(str); i++ {
c := str[i]
if (c == '+' || c == '-') && i == 0 {
continue
}
if c >= '0' && c <= '9' {
validLen = i + 1
continue
}
break
}
valid := str[:validLen]
if valid == "" {
valid = "0"
}
if validLen == 0 || validLen != len(str) {
return valid, errors.Trace(handleTruncateError(sc, ErrTruncatedWrongVal.GenWithStackByArgs("INTEGER", str)))
}
return valid, nil
}
// roundIntStr is to round int string base on the number following dot.
// roundIntStr is to round a **valid int string** base on the number following dot.
func roundIntStr(numNextDot byte, intStr string) string {
if numNextDot < '5' {
return intStr
}
retStr := []byte(intStr)
for i := len(intStr) - 1; i >= 0; i-- {
if retStr[i] != '9' {
retStr[i]++
idx := len(intStr) - 1
for ; idx >= 1; idx-- {
if retStr[idx] != '9' {
retStr[idx]++
break
}
if i == 0 {
retStr[i] = '1'
retStr[idx] = '0'
}
if idx == 0 {
if intStr[0] == '9' {
retStr[0] = '1'
retStr = append(retStr, '0')
} else if isDigit(intStr[0]) {
retStr[0]++
} else {
retStr[1] = '1'
retStr = append(retStr, '0')
break
}
retStr[i] = '0'
}
return string(retStr)
}
......@@ -394,6 +427,9 @@ func roundIntStr(numNextDot byte, intStr string) string {
// strconv.ParseInt, we can't parse float first then convert it to string because precision will
// be lost. For example, the string value "18446744073709551615" which is the max number of unsigned
// int will cause some precision to lose. intStr[0] may be a positive and negative sign like '+' or '-'.
//
// This func will find serious overflow such as the len of intStr > 20 (without prefix `+/-`)
// however, it will not check whether the intStr overflow BIGINT.
func floatStrToIntStr(sc *stmtctx.StatementContext, validFloat string, oriStr string) (intStr string, _ error) {
var dotIdx = -1
var eIdx = -1
......@@ -429,6 +465,7 @@ func floatStrToIntStr(sc *stmtctx.StatementContext, validFloat string, oriStr st
}
return intStr, nil
}
// intCnt and digits contain the prefix `+/-` if validFloat[0] is `+/-`
var intCnt int
digits := make([]byte, 0, len(validFloat))
if dotIdx == -1 {
......@@ -443,15 +480,18 @@ func floatStrToIntStr(sc *stmtctx.StatementContext, validFloat string, oriStr st
if err != nil {
return validFloat, errors.Trace(err)
}
if exp > 0 && int64(intCnt) > (math.MaxInt64-int64(exp)) {
// (exp + incCnt) overflows MaxInt64.
intCnt += exp
if exp >= 0 && (intCnt > 21 || intCnt < 0) {
// MaxInt64 has 19 decimal digits.
// MaxUint64 has 20 decimal digits.
// And the intCnt may contain the len of `+/-`,
// so I use 21 here as the early detection.
sc.AppendWarning(ErrOverflow.GenWithStackByArgs("BIGINT", oriStr))
return validFloat[:eIdx], nil
}
intCnt += exp
if intCnt <= 0 {
intStr = "0"
if intCnt == 0 && len(digits) > 0 {
if intCnt == 0 && len(digits) > 0 && isDigit(digits[0]) {
intStr = roundIntStr(digits[0], intStr)
}
return intStr, nil
......@@ -474,11 +514,6 @@ func floatStrToIntStr(sc *stmtctx.StatementContext, validFloat string, oriStr st
} else {
// convert scientific notation decimal number
extraZeroCount := intCnt - len(digits)
if extraZeroCount > 20 {
// Append overflow warning and return to avoid allocating too much memory.
sc.AppendWarning(ErrOverflow.GenWithStackByArgs("BIGINT", oriStr))
return validFloat[:eIdx], nil
}
intStr = string(digits) + strings.Repeat("0", extraZeroCount)
}
return intStr, nil
......@@ -525,10 +560,10 @@ func ConvertJSONToInt(sc *stmtctx.StatementContext, j json.BinaryJSON, unsigned
if !unsigned {
lBound := IntergerSignedLowerBound(mysql.TypeLonglong)
uBound := IntergerSignedUpperBound(mysql.TypeLonglong)
return ConvertFloatToInt(f, lBound, uBound, mysql.TypeDouble)
return ConvertFloatToInt(f, lBound, uBound, mysql.TypeLonglong)
}
bound := IntergerUnsignedUpperBound(mysql.TypeLonglong)
u, err := ConvertFloatToUint(sc, f, bound, mysql.TypeDouble)
u, err := ConvertFloatToUint(sc, f, bound, mysql.TypeLonglong)
return int64(u), errors.Trace(err)
case json.TypeCodeString:
str := string(hack.String(j.GetString()))
......@@ -552,8 +587,7 @@ func ConvertJSONToFloat(sc *stmtctx.StatementContext, j json.BinaryJSON) (float6
case json.TypeCodeInt64:
return float64(j.GetInt64()), nil
case json.TypeCodeUint64:
u, err := ConvertIntToUint(sc, j.GetInt64(), IntergerUnsignedUpperBound(mysql.TypeLonglong), mysql.TypeLonglong)
return float64(u), errors.Trace(err)
return float64(j.GetUint64()), nil
case json.TypeCodeFloat64:
return j.GetFloat64(), nil
case json.TypeCodeString:
......@@ -580,6 +614,10 @@ func ConvertJSONToDecimal(sc *stmtctx.StatementContext, j json.BinaryJSON) (*MyD
// getValidFloatPrefix gets prefix of string which can be successfully parsed as float.
func getValidFloatPrefix(sc *stmtctx.StatementContext, s string) (valid string, err error) {
if (sc.InDeleteStmt || sc.InSelectStmt || sc.InUpdateStmt) && s == "" {
return "0", nil
}
var (
sawDot bool
sawDigit bool
......@@ -620,7 +658,7 @@ func getValidFloatPrefix(sc *stmtctx.StatementContext, s string) (valid string,
valid = "0"
}
if validLen == 0 || validLen != len(s) {
err = errors.Trace(handleTruncateError(sc))
err = errors.Trace(handleTruncateError(sc, ErrTruncated))
}
return valid, err
}
......
......@@ -14,7 +14,6 @@
package types
import (
"context"
"fmt"
"math"
"sort"
......@@ -1245,7 +1244,7 @@ func (d *Datum) convertToMysqlEnum(sc *stmtctx.StatementContext, target *FieldTy
e, err = ParseEnumValue(target.Elems, uintDatum.GetUint64())
}
if err != nil {
logutil.Logger(context.Background()).Error("convert to MySQL enum failed", zap.Error(err))
logutil.BgLogger().Error("convert to MySQL enum failed", zap.Error(err))
err = errors.Trace(ErrTruncated)
}
ret.SetValue(e)
......@@ -1781,14 +1780,14 @@ func (ds *datumsSorter) Swap(i, j int) {
ds.datums[i], ds.datums[j] = ds.datums[j], ds.datums[i]
}
func handleTruncateError(sc *stmtctx.StatementContext) error {
func handleTruncateError(sc *stmtctx.StatementContext, err error) error {
if sc.IgnoreTruncate {
return nil
}
if !sc.TruncateAsWarning {
return ErrTruncated
return err
}
sc.AppendWarning(ErrTruncated)
sc.AppendWarning(err)
return nil
}
......
......@@ -86,9 +86,12 @@ func ParseFrac(s string, fsp int) (v int, overflow bool, err error) {
return
}
// alignFrac is used to generate alignment frac, like `100` -> `100000`
// alignFrac is used to generate alignment frac, like `100` -> `100000` ,`-100` -> `-100000`
func alignFrac(s string, fsp int) string {
sl := len(s)
if sl > 0 && s[0] == '-' {
sl = sl - 1
}
if sl < fsp {
return s + strings.Repeat("0", fsp-sl)
}
......
......@@ -369,6 +369,49 @@ func (bj BinaryJSON) Modify(pathExprList []PathExpression, values []BinaryJSON,
return bj, nil
}
// ArrayInsert insert a BinaryJSON into the given array cell.
// All path expressions cannot contain * or ** wildcard.
// If any error occurs, the input won't be changed.
func (bj BinaryJSON) ArrayInsert(pathExpr PathExpression, value BinaryJSON) (res BinaryJSON, err error) {
// Check the path is a index
if len(pathExpr.legs) < 1 {
return bj, ErrInvalidJSONPathArrayCell
}
parentPath, lastLeg := pathExpr.popOneLastLeg()
if lastLeg.typ != pathLegIndex {
return bj, ErrInvalidJSONPathArrayCell
}
// Find the target array
obj, exists := bj.Extract([]PathExpression{parentPath})
if !exists || obj.TypeCode != TypeCodeArray {
return bj, nil
}
idx := lastLeg.arrayIndex
count := obj.GetElemCount()
if idx >= count {
idx = count
}
// Insert into the array
newArray := make([]BinaryJSON, 0, count+1)
for i := 0; i < idx; i++ {
elem := obj.arrayGetElem(i)
newArray = append(newArray, elem)
}
newArray = append(newArray, value)
for i := idx; i < count; i++ {
elem := obj.arrayGetElem(i)
newArray = append(newArray, elem)
}
obj = buildBinaryArray(newArray)
bj, err = bj.Modify([]PathExpression{parentPath}, []BinaryJSON{obj}, ModifySet)
if err != nil {
return bj, err
}
return bj, nil
}
// Remove removes the elements indicated by pathExprList from JSON.
func (bj BinaryJSON) Remove(pathExprList []PathExpression) (BinaryJSON, error) {
for _, pathExpr := range pathExprList {
......
......@@ -216,6 +216,8 @@ var (
ErrInvalidJSONPathWildcard = terror.ClassJSON.New(mysql.ErrInvalidJSONPathWildcard, mysql.MySQLErrName[mysql.ErrInvalidJSONPathWildcard])
// ErrInvalidJSONContainsPathType means invalid JSON contains path type.
ErrInvalidJSONContainsPathType = terror.ClassJSON.New(mysql.ErrInvalidJSONContainsPathType, mysql.MySQLErrName[mysql.ErrInvalidJSONContainsPathType])
// ErrInvalidJSONPathArrayCell means invalid JSON path for an array cell.
ErrInvalidJSONPathArrayCell = terror.ClassJSON.New(mysql.ErrInvalidJSONPathArrayCell, mysql.MySQLErrName[mysql.ErrInvalidJSONPathArrayCell])
)
func init() {
......@@ -225,6 +227,7 @@ func init() {
mysql.ErrInvalidJSONData: mysql.ErrInvalidJSONData,
mysql.ErrInvalidJSONPathWildcard: mysql.ErrInvalidJSONPathWildcard,
mysql.ErrInvalidJSONContainsPathType: mysql.ErrInvalidJSONContainsPathType,
mysql.ErrInvalidJSONPathArrayCell: mysql.ErrInvalidJSONPathArrayCell,
}
}
......
......@@ -107,6 +107,14 @@ var (
zeroMyDecimal = MyDecimal{}
)
// get the zero of MyDecimal with the specified result fraction digits
func zeroMyDecimalWithFrac(frac int8) MyDecimal {
zero := MyDecimal{}
zero.digitsFrac = frac
zero.resultFrac = frac
return zero
}
// add adds a and b and carry, returns the sum and new carry.
func add(a, b, carry int32) (int32, int32) {
sum := a + b + carry
......@@ -1556,7 +1564,7 @@ func doSub(from1, from2, to *MyDecimal) (cmp int, err error) {
if to == nil {
return 0, nil
}
*to = zeroMyDecimal
*to = zeroMyDecimalWithFrac(to.resultFrac)
return 0, nil
}
}
......@@ -1911,7 +1919,7 @@ func DecimalMul(from1, from2, to *MyDecimal) error {
idx++
/* We got decimal zero */
if idx == end {
*to = zeroMyDecimal
*to = zeroMyDecimalWithFrac(to.resultFrac)
break
}
}
......@@ -2010,7 +2018,7 @@ func doDivMod(from1, from2, to, mod *MyDecimal, fracIncr int) error {
}
if prec1 <= 0 {
/* short-circuit everything: from1 == 0 */
*to = zeroMyDecimal
*to = zeroMyDecimalWithFrac(to.resultFrac)
return nil
}
prec1 -= countLeadingZeroes((prec1-1)%digitsPerWord, from1.wordBuf[idx1])
......
......@@ -70,8 +70,9 @@ func (t MysqlTime) Microsecond() int {
func (t MysqlTime) Weekday() gotime.Weekday {
// TODO: Consider time_zone variable.
t1, err := t.GoTime(gotime.Local)
// allow invalid dates
if err != nil {
return 0
return t1.Weekday()
}
return t1.Weekday()
}
......
......@@ -15,7 +15,6 @@ package types
import (
"bytes"
"context"
"fmt"
"math"
"regexp"
......@@ -305,7 +304,7 @@ func (t Time) ToNumber() *MyDecimal {
s, err := t.DateFormat(tfStr)
if err != nil {
logutil.Logger(context.Background()).Error("[fatal] never happen because we've control the format!")
logutil.BgLogger().Error("[fatal] never happen because we've control the format!")
}
if t.Fsp > 0 {
......@@ -1470,7 +1469,7 @@ func checkDateRange(t MysqlTime) error {
func checkMonthDay(year, month, day int, allowInvalidDate bool) error {
if month < 0 || month > 12 {
return errors.Trace(ErrIncorrectDatetimeValue.GenWithStackByArgs(month))
return errors.Trace(ErrIncorrectDatetimeValue.GenWithStackByArgs(fmt.Sprintf("%d-%d-%d", year, month, day)))
}
maxDay := 31
......@@ -1484,7 +1483,7 @@ func checkMonthDay(year, month, day int, allowInvalidDate bool) error {
}
if day < 0 || day > maxDay {
return errors.Trace(ErrIncorrectDatetimeValue.GenWithStackByArgs(day))
return errors.Trace(ErrIncorrectDatetimeValue.GenWithStackByArgs(fmt.Sprintf("%d-%d-%d", year, month, day)))
}
return nil
}
......
......@@ -330,6 +330,11 @@ func Logger(ctx context.Context) *zap.Logger {
return zaplog.L()
}
// BgLogger is alias of `logutil.BgLogger()`
func BgLogger() *zap.Logger {
return zaplog.L()
}
// WithConnID attaches connId to context.
func WithConnID(ctx context.Context, connID uint32) context.Context {
var logger *zap.Logger
......
......@@ -14,7 +14,7 @@
package memory
import (
"context"
"fmt"
"sync"
"github.com/pingcap/parser/mysql"
......@@ -29,12 +29,22 @@ type ActionOnExceed interface {
// Action will be called when memory usage exceeds memory quota by the
// corresponding Tracker.
Action(t *Tracker)
// SetLogHook binds a log hook which will be triggered and log an detailed
// message for the out-of-memory sql.
SetLogHook(hook func(uint64))
}
// LogOnExceed logs a warning only once when memory usage exceeds memory quota.
type LogOnExceed struct {
mutex sync.Mutex // For synchronization.
acted bool
ConnID uint64
logHook func(uint64)
}
// SetLogHook sets a hook for LogOnExceed.
func (a *LogOnExceed) SetLogHook(hook func(uint64)) {
a.logHook = hook
}
// Action logs a warning only once when memory usage exceeds memory quota.
......@@ -43,16 +53,26 @@ func (a *LogOnExceed) Action(t *Tracker) {
defer a.mutex.Unlock()
if !a.acted {
a.acted = true
logutil.Logger(context.Background()).Warn("memory exceeds quota",
if a.logHook == nil {
logutil.BgLogger().Warn("memory exceeds quota",
zap.Error(errMemExceedThreshold.GenWithStackByArgs(t.label, t.BytesConsumed(), t.bytesLimit, t.String())))
return
}
a.logHook(a.ConnID)
}
}
// PanicOnExceed panics when memory usage exceeds memory quota.
type PanicOnExceed struct {
mutex sync.Mutex // For synchronization.
acted bool
ConnID uint64
logHook func(uint64)
}
// SetLogHook sets a hook for PanicOnExceed.
func (a *PanicOnExceed) SetLogHook(hook func(uint64)) {
a.logHook = hook
}
// Action panics when memory usage exceeds memory quota.
......@@ -64,7 +84,10 @@ func (a *PanicOnExceed) Action(t *Tracker) {
}
a.acted = true
a.mutex.Unlock()
panic(PanicMemoryExceed + t.String())
if a.logHook != nil {
a.logHook(a.ConnID)
}
panic(PanicMemoryExceed + fmt.Sprintf("[conn_id=%d]", a.ConnID))
}
var (
......
......@@ -87,11 +87,6 @@ func (t *Tracker) AttachTo(parent *Tracker) {
t.parent.Consume(t.BytesConsumed())
}
// Detach detaches this Tracker from its parent.
func (t *Tracker) Detach() {
t.parent.remove(t)
}
func (t *Tracker) remove(oldChild *Tracker) {
t.mu.Lock()
defer t.mu.Unlock()
......@@ -144,9 +139,6 @@ func (t *Tracker) Consume(bytes int64) {
rootExceed = tracker
}
if tracker.parent == nil {
// since we only need a total memory usage during execution,
// we only record max consumed bytes in root(statement-level) for performance.
for {
maxNow := atomic.LoadInt64(&tracker.maxConsumed)
consumed := atomic.LoadInt64(&tracker.bytesConsumed)
......@@ -156,7 +148,6 @@ func (t *Tracker) Consume(bytes int64) {
break
}
}
}
if rootExceed != nil {
rootExceed.actionOnExceed.Action(rootExceed)
}
......@@ -172,6 +163,21 @@ func (t *Tracker) MaxConsumed() int64 {
return atomic.LoadInt64(&t.maxConsumed)
}
// SearchTracker searches the specific tracker under this tracker.
func (t *Tracker) SearchTracker(label string) *Tracker {
if t.label.String() == label {
return t
}
t.mu.Lock()
defer t.mu.Unlock()
for _, child := range t.mu.children {
if result := child.SearchTracker(label); result != nil {
return result
}
}
return nil
}
// String returns the string representation of this Tracker tree.
func (t *Tracker) String() string {
buffer := bytes.NewBufferString("\n")
......
......@@ -117,118 +117,118 @@
"revisionTime": "2019-03-07T07:54:52Z"
},
{
"checksumSHA1": "gkdPCV8bVezIdBd/w2RiZf7eXTU=",
"checksumSHA1": "8XbJFHOYoZvqf3Fq+J4l90DiGlM=",
"path": "github.com/pingcap/parser",
"revision": "3b36f86d9b7bba02fef99748e3a98069708a64f3",
"revisionTime": "2019-06-12T05:27:18Z"
"revision": "5238015a66f827e0d0d01e9a1dc19e4e3338c5bf",
"revisionTime": "2019-07-30T09:13:57Z"
},
{
"checksumSHA1": "/HUw+IEQjCkicSG7qSMWqRlmvz0=",
"checksumSHA1": "a+3CnBMiJTPiAKhRzxW5ybMR6IY=",
"path": "github.com/pingcap/parser/ast",
"revision": "3b36f86d9b7bba02fef99748e3a98069708a64f3",
"revisionTime": "2019-06-12T05:27:18Z"
"revision": "5238015a66f827e0d0d01e9a1dc19e4e3338c5bf",
"revisionTime": "2019-07-30T09:13:57Z"
},
{
"checksumSHA1": "xiv40YqnvHcbIhaEzJqjh5K7ehM=",
"path": "github.com/pingcap/parser/auth",
"revision": "3b36f86d9b7bba02fef99748e3a98069708a64f3",
"revisionTime": "2019-06-12T05:27:18Z"
"revision": "5238015a66f827e0d0d01e9a1dc19e4e3338c5bf",
"revisionTime": "2019-07-30T09:13:57Z"
},
{
"checksumSHA1": "EvDXpplklIXmKqLclzWzaN/uHKQ=",
"path": "github.com/pingcap/parser/charset",
"revision": "3b36f86d9b7bba02fef99748e3a98069708a64f3",
"revisionTime": "2019-06-12T05:27:18Z"
"revision": "5238015a66f827e0d0d01e9a1dc19e4e3338c5bf",
"revisionTime": "2019-07-30T09:13:57Z"
},
{
"checksumSHA1": "Aao6Mul/qqogOwPwM2arBKZkYZs=",
"path": "github.com/pingcap/parser/format",
"revision": "3b36f86d9b7bba02fef99748e3a98069708a64f3",
"revisionTime": "2019-06-12T05:27:18Z"
"revision": "5238015a66f827e0d0d01e9a1dc19e4e3338c5bf",
"revisionTime": "2019-07-30T09:13:57Z"
},
{
"checksumSHA1": "CvZtQeDgNfQUrGDi5mrv5osJ5F0=",
"checksumSHA1": "f14oFKfX0pSkUM9w9m94eZG5vEw=",
"path": "github.com/pingcap/parser/model",
"revision": "3b36f86d9b7bba02fef99748e3a98069708a64f3",
"revisionTime": "2019-06-12T05:27:18Z"
"revision": "5238015a66f827e0d0d01e9a1dc19e4e3338c5bf",
"revisionTime": "2019-07-30T09:13:57Z"
},
{
"checksumSHA1": "02F5sAuKee53HMwsu6fx+iw5cnM=",
"checksumSHA1": "JcR/7pmocSZK4K6tDK2zO54DJWg=",
"path": "github.com/pingcap/parser/mysql",
"revision": "3b36f86d9b7bba02fef99748e3a98069708a64f3",
"revisionTime": "2019-06-12T05:27:18Z"
"revision": "5238015a66f827e0d0d01e9a1dc19e4e3338c5bf",
"revisionTime": "2019-07-30T09:13:57Z"
},
{
"checksumSHA1": "olapD16WCMBU9vrA5PtlERGFfXw=",
"path": "github.com/pingcap/parser/opcode",
"revision": "3b36f86d9b7bba02fef99748e3a98069708a64f3",
"revisionTime": "2019-06-12T05:27:18Z"
"revision": "5238015a66f827e0d0d01e9a1dc19e4e3338c5bf",
"revisionTime": "2019-07-30T09:13:57Z"
},
{
"checksumSHA1": "L6rzy3sJU1RPf7AkJN+0zcwW/YY=",
"path": "github.com/pingcap/parser/terror",
"revision": "3b36f86d9b7bba02fef99748e3a98069708a64f3",
"revisionTime": "2019-06-12T05:27:18Z"
"revision": "5238015a66f827e0d0d01e9a1dc19e4e3338c5bf",
"revisionTime": "2019-07-30T09:13:57Z"
},
{
"checksumSHA1": "EWbRvJs3Y1KLBaHnwaCHps3t0+4=",
"checksumSHA1": "nWkzWKjheFi0/Ov/0rhc4CUMZLo=",
"path": "github.com/pingcap/parser/types",
"revision": "3b36f86d9b7bba02fef99748e3a98069708a64f3",
"revisionTime": "2019-06-12T05:27:18Z"
"revision": "5238015a66f827e0d0d01e9a1dc19e4e3338c5bf",
"revisionTime": "2019-07-30T09:13:57Z"
},
{
"checksumSHA1": "irgF5OsNQZiD589px9hV3scdp8U=",
"checksumSHA1": "KHvXxhiZAHkE8APuMlaAXDOX6eU=",
"path": "github.com/pingcap/tidb/sessionctx/stmtctx",
"revision": "7d27fa63d349b9d266682a3fff6e732c156cf1db",
"revisionTime": "2019-06-12T12:43:29Z"
"revision": "13778fe51b713f005e1de848e7994f0a8031678f",
"revisionTime": "2019-07-31T03:50:10Z"
},
{
"checksumSHA1": "1INT6BSMg5WA9x4ftRegJBhDJQg=",
"checksumSHA1": "6pIJUxO/VoKsIdWibgApSW91MRg=",
"path": "github.com/pingcap/tidb/types",
"revision": "7d27fa63d349b9d266682a3fff6e732c156cf1db",
"revisionTime": "2019-06-12T12:43:29Z"
"revision": "13778fe51b713f005e1de848e7994f0a8031678f",
"revisionTime": "2019-07-31T03:50:10Z"
},
{
"checksumSHA1": "HYVqavXulc59n0RyI/D1jZVKon4=",
"checksumSHA1": "gKBD02jzm/d7gn2kX7pXLi+M2ZY=",
"path": "github.com/pingcap/tidb/types/json",
"revision": "7d27fa63d349b9d266682a3fff6e732c156cf1db",
"revisionTime": "2019-06-12T12:43:29Z"
"revision": "13778fe51b713f005e1de848e7994f0a8031678f",
"revisionTime": "2019-07-31T03:50:10Z"
},
{
"checksumSHA1": "45zWX5Q6D6aTEWtc4p/lbD9WD4o=",
"path": "github.com/pingcap/tidb/types/parser_driver",
"revision": "7d27fa63d349b9d266682a3fff6e732c156cf1db",
"revisionTime": "2019-06-12T12:43:29Z"
"revision": "13778fe51b713f005e1de848e7994f0a8031678f",
"revisionTime": "2019-07-31T03:50:10Z"
},
{
"checksumSHA1": "dI3bZpUsujM1shEDvORNQj5FCN0=",
"path": "github.com/pingcap/tidb/util/execdetails",
"revision": "7d27fa63d349b9d266682a3fff6e732c156cf1db",
"revisionTime": "2019-06-12T12:43:29Z"
"revision": "13778fe51b713f005e1de848e7994f0a8031678f",
"revisionTime": "2019-07-31T03:50:10Z"
},
{
"checksumSHA1": "RdbHgQWMHjRtKjqPcTX81k1V3sw=",
"path": "github.com/pingcap/tidb/util/hack",
"revision": "7d27fa63d349b9d266682a3fff6e732c156cf1db",
"revisionTime": "2019-06-12T12:43:29Z"
"revision": "13778fe51b713f005e1de848e7994f0a8031678f",
"revisionTime": "2019-07-31T03:50:10Z"
},
{
"checksumSHA1": "16Cv4I5dFUSCuz0AufzUilN4IOI=",
"checksumSHA1": "5DVxTRYAXrCkrtmTqi/fZfY/Zfk=",
"path": "github.com/pingcap/tidb/util/logutil",
"revision": "7d27fa63d349b9d266682a3fff6e732c156cf1db",
"revisionTime": "2019-06-12T12:43:29Z"
"revision": "13778fe51b713f005e1de848e7994f0a8031678f",
"revisionTime": "2019-07-31T03:50:10Z"
},
{
"checksumSHA1": "OveQu0ABBJmMEwmmthqSRQC2Ef0=",
"path": "github.com/pingcap/tidb/util/math",
"revision": "7d27fa63d349b9d266682a3fff6e732c156cf1db",
"revisionTime": "2019-06-12T12:43:29Z"
"revision": "13778fe51b713f005e1de848e7994f0a8031678f",
"revisionTime": "2019-07-31T03:50:10Z"
},
{
"checksumSHA1": "EoqVTAze03xNtGcKbsZT4eYx9bI=",
"checksumSHA1": "loL2JgZDLapEOgfM/XUJI5f0HVs=",
"path": "github.com/pingcap/tidb/util/memory",
"revision": "7d27fa63d349b9d266682a3fff6e732c156cf1db",
"revisionTime": "2019-06-12T12:43:29Z"
"revision": "13778fe51b713f005e1de848e7994f0a8031678f",
"revisionTime": "2019-07-31T03:50:10Z"
},
{
"checksumSHA1": "QPIBwDNUFF5Whrnd41S3mkKa4gQ=",
......@@ -485,68 +485,68 @@
{
"checksumSHA1": "aKn1oKcY74N8TRLm3Ayt7Q4bbI4=",
"path": "vitess.io/vitess/go/bytes2",
"revision": "22dbada8b16e2c969dd60c77f4e6a346c70d5952",
"revisionTime": "2019-06-11T03:26:25Z"
"revision": "f93c96c738d7d5bbbcdc03c828f8bf0a5ba16250",
"revisionTime": "2019-07-30T06:18:30Z"
},
{
"checksumSHA1": "bhE6CGQgZTIgLPp9lnvlKW/47xc=",
"path": "vitess.io/vitess/go/hack",
"revision": "22dbada8b16e2c969dd60c77f4e6a346c70d5952",
"revisionTime": "2019-06-11T03:26:25Z"
"revision": "f93c96c738d7d5bbbcdc03c828f8bf0a5ba16250",
"revisionTime": "2019-07-30T06:18:30Z"
},
{
"checksumSHA1": "RERqgxOX48XzRIoe5fQzvWSJV0Y=",
"checksumSHA1": "2m7CYdLr+epKNLqWaGHkinr3k7w=",
"path": "vitess.io/vitess/go/sqltypes",
"revision": "22dbada8b16e2c969dd60c77f4e6a346c70d5952",
"revisionTime": "2019-06-11T03:26:25Z"
"revision": "f93c96c738d7d5bbbcdc03c828f8bf0a5ba16250",
"revisionTime": "2019-07-30T06:18:30Z"
},
{
"checksumSHA1": "vAIRxI6MHsq3x1hLQwIyw5AvqtI=",
"path": "vitess.io/vitess/go/vt/log",
"revision": "22dbada8b16e2c969dd60c77f4e6a346c70d5952",
"revisionTime": "2019-06-11T03:26:25Z"
"revision": "f93c96c738d7d5bbbcdc03c828f8bf0a5ba16250",
"revisionTime": "2019-07-30T06:18:30Z"
},
{
"checksumSHA1": "/0K9CBbInkAhioqKX9ocBrJ6AKE=",
"path": "vitess.io/vitess/go/vt/proto/binlogdata",
"revision": "22dbada8b16e2c969dd60c77f4e6a346c70d5952",
"revisionTime": "2019-06-11T03:26:25Z"
"revision": "f93c96c738d7d5bbbcdc03c828f8bf0a5ba16250",
"revisionTime": "2019-07-30T06:18:30Z"
},
{
"checksumSHA1": "87Zndvk3Y+M+QxMx3uFa0iSbvWY=",
"path": "vitess.io/vitess/go/vt/proto/query",
"revision": "22dbada8b16e2c969dd60c77f4e6a346c70d5952",
"revisionTime": "2019-06-11T03:26:25Z"
"revision": "f93c96c738d7d5bbbcdc03c828f8bf0a5ba16250",
"revisionTime": "2019-07-30T06:18:30Z"
},
{
"checksumSHA1": "xpcb9NfXMEeHhEPStbJntIfa5GQ=",
"path": "vitess.io/vitess/go/vt/proto/topodata",
"revision": "22dbada8b16e2c969dd60c77f4e6a346c70d5952",
"revisionTime": "2019-06-11T03:26:25Z"
"revision": "f93c96c738d7d5bbbcdc03c828f8bf0a5ba16250",
"revisionTime": "2019-07-30T06:18:30Z"
},
{
"checksumSHA1": "Ie634JZ/Np9603mG+PQ0ZkUsaQI=",
"checksumSHA1": "Bv8lucvoH9AnJSYiWX8MIrJl4zY=",
"path": "vitess.io/vitess/go/vt/proto/vtgate",
"revision": "22dbada8b16e2c969dd60c77f4e6a346c70d5952",
"revisionTime": "2019-06-11T03:26:25Z"
"revision": "f93c96c738d7d5bbbcdc03c828f8bf0a5ba16250",
"revisionTime": "2019-07-30T06:18:30Z"
},
{
"checksumSHA1": "qz32abYdmm9NfKTc++K0l1EvXXM=",
"path": "vitess.io/vitess/go/vt/proto/vtrpc",
"revision": "22dbada8b16e2c969dd60c77f4e6a346c70d5952",
"revisionTime": "2019-06-11T03:26:25Z"
"revision": "f93c96c738d7d5bbbcdc03c828f8bf0a5ba16250",
"revisionTime": "2019-07-30T06:18:30Z"
},
{
"checksumSHA1": "/V79kL29yMBxAofQBL/XqxJv/GE=",
"checksumSHA1": "9Fy+Gm//g50wu30nICOF7HMq4po=",
"path": "vitess.io/vitess/go/vt/sqlparser",
"revision": "22dbada8b16e2c969dd60c77f4e6a346c70d5952",
"revisionTime": "2019-06-11T03:26:25Z"
"revision": "f93c96c738d7d5bbbcdc03c828f8bf0a5ba16250",
"revisionTime": "2019-07-30T06:18:30Z"
},
{
"checksumSHA1": "z9+F/lA1Xrl5S16LKssUH8VL6hs=",
"path": "vitess.io/vitess/go/vt/vterrors",
"revision": "22dbada8b16e2c969dd60c77f4e6a346c70d5952",
"revisionTime": "2019-06-11T03:26:25Z"
"revision": "f93c96c738d7d5bbbcdc03c828f8bf0a5ba16250",
"revisionTime": "2019-07-30T06:18:30Z"
}
],
"rootPath": "github.com/XiaoMi/soar"
......
......@@ -26,6 +26,9 @@ import (
"vitess.io/vitess/go/vt/vterrors"
)
// TODO(sougou): change these functions to be more permissive.
// Most string to number conversions should quietly convert to 0.
// numeric represents a numeric value extracted from
// a Value, used for arithmetic operations.
type numeric struct {
......@@ -35,6 +38,8 @@ type numeric struct {
fval float64
}
var zeroBytes = []byte("0")
// NullsafeAdd adds two Values in a null-safe manner. A null value
// is treated as 0. If both values are null, then a null is returned.
// If both values are not null, a numeric value is built
......@@ -48,10 +53,10 @@ type numeric struct {
// result is preserved.
func NullsafeAdd(v1, v2 Value, resultType querypb.Type) (Value, error) {
if v1.IsNull() {
return v2, nil
v1 = MakeTrusted(resultType, zeroBytes)
}
if v2.IsNull() {
return v1, nil
v2 = MakeTrusted(resultType, zeroBytes)
}
lv1, err := newNumeric(v1)
......
......@@ -54,7 +54,7 @@ func (x TransactionMode) String() string {
return proto.EnumName(TransactionMode_name, int32(x))
}
func (TransactionMode) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{0}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{0}
}
// CommitOrder is used to designate which of the ShardSessions
......@@ -89,7 +89,7 @@ func (x CommitOrder) String() string {
return proto.EnumName(CommitOrder_name, int32(x))
}
func (CommitOrder) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{1}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{1}
}
// Session objects are exchanged like cookies through various
......@@ -138,7 +138,7 @@ func (m *Session) Reset() { *m = Session{} }
func (m *Session) String() string { return proto.CompactTextString(m) }
func (*Session) ProtoMessage() {}
func (*Session) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{0}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{0}
}
func (m *Session) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Session.Unmarshal(m, b)
......@@ -240,7 +240,7 @@ func (m *Session_ShardSession) Reset() { *m = Session_ShardSession{} }
func (m *Session_ShardSession) String() string { return proto.CompactTextString(m) }
func (*Session_ShardSession) ProtoMessage() {}
func (*Session_ShardSession) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{0, 0}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{0, 0}
}
func (m *Session_ShardSession) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Session_ShardSession.Unmarshal(m, b)
......@@ -298,7 +298,7 @@ func (m *ExecuteRequest) Reset() { *m = ExecuteRequest{} }
func (m *ExecuteRequest) String() string { return proto.CompactTextString(m) }
func (*ExecuteRequest) ProtoMessage() {}
func (*ExecuteRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{1}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{1}
}
func (m *ExecuteRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecuteRequest.Unmarshal(m, b)
......@@ -386,7 +386,7 @@ func (m *ExecuteResponse) Reset() { *m = ExecuteResponse{} }
func (m *ExecuteResponse) String() string { return proto.CompactTextString(m) }
func (*ExecuteResponse) ProtoMessage() {}
func (*ExecuteResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{2}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{2}
}
func (m *ExecuteResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecuteResponse.Unmarshal(m, b)
......@@ -456,7 +456,7 @@ func (m *ExecuteShardsRequest) Reset() { *m = ExecuteShardsRequest{} }
func (m *ExecuteShardsRequest) String() string { return proto.CompactTextString(m) }
func (*ExecuteShardsRequest) ProtoMessage() {}
func (*ExecuteShardsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{3}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{3}
}
func (m *ExecuteShardsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecuteShardsRequest.Unmarshal(m, b)
......@@ -551,7 +551,7 @@ func (m *ExecuteShardsResponse) Reset() { *m = ExecuteShardsResponse{} }
func (m *ExecuteShardsResponse) String() string { return proto.CompactTextString(m) }
func (*ExecuteShardsResponse) ProtoMessage() {}
func (*ExecuteShardsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{4}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{4}
}
func (m *ExecuteShardsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecuteShardsResponse.Unmarshal(m, b)
......@@ -622,7 +622,7 @@ func (m *ExecuteKeyspaceIdsRequest) Reset() { *m = ExecuteKeyspaceIdsReq
func (m *ExecuteKeyspaceIdsRequest) String() string { return proto.CompactTextString(m) }
func (*ExecuteKeyspaceIdsRequest) ProtoMessage() {}
func (*ExecuteKeyspaceIdsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{5}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{5}
}
func (m *ExecuteKeyspaceIdsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecuteKeyspaceIdsRequest.Unmarshal(m, b)
......@@ -717,7 +717,7 @@ func (m *ExecuteKeyspaceIdsResponse) Reset() { *m = ExecuteKeyspaceIdsRe
func (m *ExecuteKeyspaceIdsResponse) String() string { return proto.CompactTextString(m) }
func (*ExecuteKeyspaceIdsResponse) ProtoMessage() {}
func (*ExecuteKeyspaceIdsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{6}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{6}
}
func (m *ExecuteKeyspaceIdsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecuteKeyspaceIdsResponse.Unmarshal(m, b)
......@@ -788,7 +788,7 @@ func (m *ExecuteKeyRangesRequest) Reset() { *m = ExecuteKeyRangesRequest
func (m *ExecuteKeyRangesRequest) String() string { return proto.CompactTextString(m) }
func (*ExecuteKeyRangesRequest) ProtoMessage() {}
func (*ExecuteKeyRangesRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{7}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{7}
}
func (m *ExecuteKeyRangesRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecuteKeyRangesRequest.Unmarshal(m, b)
......@@ -883,7 +883,7 @@ func (m *ExecuteKeyRangesResponse) Reset() { *m = ExecuteKeyRangesRespon
func (m *ExecuteKeyRangesResponse) String() string { return proto.CompactTextString(m) }
func (*ExecuteKeyRangesResponse) ProtoMessage() {}
func (*ExecuteKeyRangesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{8}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{8}
}
func (m *ExecuteKeyRangesResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecuteKeyRangesResponse.Unmarshal(m, b)
......@@ -956,7 +956,7 @@ func (m *ExecuteEntityIdsRequest) Reset() { *m = ExecuteEntityIdsRequest
func (m *ExecuteEntityIdsRequest) String() string { return proto.CompactTextString(m) }
func (*ExecuteEntityIdsRequest) ProtoMessage() {}
func (*ExecuteEntityIdsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{9}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{9}
}
func (m *ExecuteEntityIdsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecuteEntityIdsRequest.Unmarshal(m, b)
......@@ -1055,7 +1055,7 @@ func (m *ExecuteEntityIdsRequest_EntityId) Reset() { *m = ExecuteEntityI
func (m *ExecuteEntityIdsRequest_EntityId) String() string { return proto.CompactTextString(m) }
func (*ExecuteEntityIdsRequest_EntityId) ProtoMessage() {}
func (*ExecuteEntityIdsRequest_EntityId) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{9, 0}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{9, 0}
}
func (m *ExecuteEntityIdsRequest_EntityId) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecuteEntityIdsRequest_EntityId.Unmarshal(m, b)
......@@ -1115,7 +1115,7 @@ func (m *ExecuteEntityIdsResponse) Reset() { *m = ExecuteEntityIdsRespon
func (m *ExecuteEntityIdsResponse) String() string { return proto.CompactTextString(m) }
func (*ExecuteEntityIdsResponse) ProtoMessage() {}
func (*ExecuteEntityIdsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{10}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{10}
}
func (m *ExecuteEntityIdsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecuteEntityIdsResponse.Unmarshal(m, b)
......@@ -1180,7 +1180,7 @@ func (m *ExecuteBatchRequest) Reset() { *m = ExecuteBatchRequest{} }
func (m *ExecuteBatchRequest) String() string { return proto.CompactTextString(m) }
func (*ExecuteBatchRequest) ProtoMessage() {}
func (*ExecuteBatchRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{11}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{11}
}
func (m *ExecuteBatchRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecuteBatchRequest.Unmarshal(m, b)
......@@ -1268,7 +1268,7 @@ func (m *ExecuteBatchResponse) Reset() { *m = ExecuteBatchResponse{} }
func (m *ExecuteBatchResponse) String() string { return proto.CompactTextString(m) }
func (*ExecuteBatchResponse) ProtoMessage() {}
func (*ExecuteBatchResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{12}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{12}
}
func (m *ExecuteBatchResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecuteBatchResponse.Unmarshal(m, b)
......@@ -1328,7 +1328,7 @@ func (m *BoundShardQuery) Reset() { *m = BoundShardQuery{} }
func (m *BoundShardQuery) String() string { return proto.CompactTextString(m) }
func (*BoundShardQuery) ProtoMessage() {}
func (*BoundShardQuery) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{13}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{13}
}
func (m *BoundShardQuery) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BoundShardQuery.Unmarshal(m, b)
......@@ -1396,7 +1396,7 @@ func (m *ExecuteBatchShardsRequest) Reset() { *m = ExecuteBatchShardsReq
func (m *ExecuteBatchShardsRequest) String() string { return proto.CompactTextString(m) }
func (*ExecuteBatchShardsRequest) ProtoMessage() {}
func (*ExecuteBatchShardsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{14}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{14}
}
func (m *ExecuteBatchShardsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecuteBatchShardsRequest.Unmarshal(m, b)
......@@ -1477,7 +1477,7 @@ func (m *ExecuteBatchShardsResponse) Reset() { *m = ExecuteBatchShardsRe
func (m *ExecuteBatchShardsResponse) String() string { return proto.CompactTextString(m) }
func (*ExecuteBatchShardsResponse) ProtoMessage() {}
func (*ExecuteBatchShardsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{15}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{15}
}
func (m *ExecuteBatchShardsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecuteBatchShardsResponse.Unmarshal(m, b)
......@@ -1538,7 +1538,7 @@ func (m *BoundKeyspaceIdQuery) Reset() { *m = BoundKeyspaceIdQuery{} }
func (m *BoundKeyspaceIdQuery) String() string { return proto.CompactTextString(m) }
func (*BoundKeyspaceIdQuery) ProtoMessage() {}
func (*BoundKeyspaceIdQuery) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{16}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{16}
}
func (m *BoundKeyspaceIdQuery) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BoundKeyspaceIdQuery.Unmarshal(m, b)
......@@ -1605,7 +1605,7 @@ func (m *ExecuteBatchKeyspaceIdsRequest) Reset() { *m = ExecuteBatchKeys
func (m *ExecuteBatchKeyspaceIdsRequest) String() string { return proto.CompactTextString(m) }
func (*ExecuteBatchKeyspaceIdsRequest) ProtoMessage() {}
func (*ExecuteBatchKeyspaceIdsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{17}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{17}
}
func (m *ExecuteBatchKeyspaceIdsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecuteBatchKeyspaceIdsRequest.Unmarshal(m, b)
......@@ -1686,7 +1686,7 @@ func (m *ExecuteBatchKeyspaceIdsResponse) Reset() { *m = ExecuteBatchKey
func (m *ExecuteBatchKeyspaceIdsResponse) String() string { return proto.CompactTextString(m) }
func (*ExecuteBatchKeyspaceIdsResponse) ProtoMessage() {}
func (*ExecuteBatchKeyspaceIdsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{18}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{18}
}
func (m *ExecuteBatchKeyspaceIdsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecuteBatchKeyspaceIdsResponse.Unmarshal(m, b)
......@@ -1750,7 +1750,7 @@ func (m *StreamExecuteRequest) Reset() { *m = StreamExecuteRequest{} }
func (m *StreamExecuteRequest) String() string { return proto.CompactTextString(m) }
func (*StreamExecuteRequest) ProtoMessage() {}
func (*StreamExecuteRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{19}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{19}
}
func (m *StreamExecuteRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StreamExecuteRequest.Unmarshal(m, b)
......@@ -1829,7 +1829,7 @@ func (m *StreamExecuteResponse) Reset() { *m = StreamExecuteResponse{} }
func (m *StreamExecuteResponse) String() string { return proto.CompactTextString(m) }
func (*StreamExecuteResponse) ProtoMessage() {}
func (*StreamExecuteResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{20}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{20}
}
func (m *StreamExecuteResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StreamExecuteResponse.Unmarshal(m, b)
......@@ -1880,7 +1880,7 @@ func (m *StreamExecuteShardsRequest) Reset() { *m = StreamExecuteShardsR
func (m *StreamExecuteShardsRequest) String() string { return proto.CompactTextString(m) }
func (*StreamExecuteShardsRequest) ProtoMessage() {}
func (*StreamExecuteShardsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{21}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{21}
}
func (m *StreamExecuteShardsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StreamExecuteShardsRequest.Unmarshal(m, b)
......@@ -1957,7 +1957,7 @@ func (m *StreamExecuteShardsResponse) Reset() { *m = StreamExecuteShards
func (m *StreamExecuteShardsResponse) String() string { return proto.CompactTextString(m) }
func (*StreamExecuteShardsResponse) ProtoMessage() {}
func (*StreamExecuteShardsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{22}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{22}
}
func (m *StreamExecuteShardsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StreamExecuteShardsResponse.Unmarshal(m, b)
......@@ -2009,7 +2009,7 @@ func (m *StreamExecuteKeyspaceIdsRequest) Reset() { *m = StreamExecuteKe
func (m *StreamExecuteKeyspaceIdsRequest) String() string { return proto.CompactTextString(m) }
func (*StreamExecuteKeyspaceIdsRequest) ProtoMessage() {}
func (*StreamExecuteKeyspaceIdsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{23}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{23}
}
func (m *StreamExecuteKeyspaceIdsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StreamExecuteKeyspaceIdsRequest.Unmarshal(m, b)
......@@ -2086,7 +2086,7 @@ func (m *StreamExecuteKeyspaceIdsResponse) Reset() { *m = StreamExecuteK
func (m *StreamExecuteKeyspaceIdsResponse) String() string { return proto.CompactTextString(m) }
func (*StreamExecuteKeyspaceIdsResponse) ProtoMessage() {}
func (*StreamExecuteKeyspaceIdsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{24}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{24}
}
func (m *StreamExecuteKeyspaceIdsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StreamExecuteKeyspaceIdsResponse.Unmarshal(m, b)
......@@ -2138,7 +2138,7 @@ func (m *StreamExecuteKeyRangesRequest) Reset() { *m = StreamExecuteKeyR
func (m *StreamExecuteKeyRangesRequest) String() string { return proto.CompactTextString(m) }
func (*StreamExecuteKeyRangesRequest) ProtoMessage() {}
func (*StreamExecuteKeyRangesRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{25}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{25}
}
func (m *StreamExecuteKeyRangesRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StreamExecuteKeyRangesRequest.Unmarshal(m, b)
......@@ -2215,7 +2215,7 @@ func (m *StreamExecuteKeyRangesResponse) Reset() { *m = StreamExecuteKey
func (m *StreamExecuteKeyRangesResponse) String() string { return proto.CompactTextString(m) }
func (*StreamExecuteKeyRangesResponse) ProtoMessage() {}
func (*StreamExecuteKeyRangesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{26}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{26}
}
func (m *StreamExecuteKeyRangesResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StreamExecuteKeyRangesResponse.Unmarshal(m, b)
......@@ -2261,7 +2261,7 @@ func (m *BeginRequest) Reset() { *m = BeginRequest{} }
func (m *BeginRequest) String() string { return proto.CompactTextString(m) }
func (*BeginRequest) ProtoMessage() {}
func (*BeginRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{27}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{27}
}
func (m *BeginRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BeginRequest.Unmarshal(m, b)
......@@ -2308,7 +2308,7 @@ func (m *BeginResponse) Reset() { *m = BeginResponse{} }
func (m *BeginResponse) String() string { return proto.CompactTextString(m) }
func (*BeginResponse) ProtoMessage() {}
func (*BeginResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{28}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{28}
}
func (m *BeginResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BeginResponse.Unmarshal(m, b)
......@@ -2356,7 +2356,7 @@ func (m *CommitRequest) Reset() { *m = CommitRequest{} }
func (m *CommitRequest) String() string { return proto.CompactTextString(m) }
func (*CommitRequest) ProtoMessage() {}
func (*CommitRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{29}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{29}
}
func (m *CommitRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CommitRequest.Unmarshal(m, b)
......@@ -2408,7 +2408,7 @@ func (m *CommitResponse) Reset() { *m = CommitResponse{} }
func (m *CommitResponse) String() string { return proto.CompactTextString(m) }
func (*CommitResponse) ProtoMessage() {}
func (*CommitResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{30}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{30}
}
func (m *CommitResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CommitResponse.Unmarshal(m, b)
......@@ -2444,7 +2444,7 @@ func (m *RollbackRequest) Reset() { *m = RollbackRequest{} }
func (m *RollbackRequest) String() string { return proto.CompactTextString(m) }
func (*RollbackRequest) ProtoMessage() {}
func (*RollbackRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{31}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{31}
}
func (m *RollbackRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RollbackRequest.Unmarshal(m, b)
......@@ -2489,7 +2489,7 @@ func (m *RollbackResponse) Reset() { *m = RollbackResponse{} }
func (m *RollbackResponse) String() string { return proto.CompactTextString(m) }
func (*RollbackResponse) ProtoMessage() {}
func (*RollbackResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{32}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{32}
}
func (m *RollbackResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RollbackResponse.Unmarshal(m, b)
......@@ -2525,7 +2525,7 @@ func (m *ResolveTransactionRequest) Reset() { *m = ResolveTransactionReq
func (m *ResolveTransactionRequest) String() string { return proto.CompactTextString(m) }
func (*ResolveTransactionRequest) ProtoMessage() {}
func (*ResolveTransactionRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{33}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{33}
}
func (m *ResolveTransactionRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ResolveTransactionRequest.Unmarshal(m, b)
......@@ -2581,7 +2581,7 @@ func (m *MessageStreamRequest) Reset() { *m = MessageStreamRequest{} }
func (m *MessageStreamRequest) String() string { return proto.CompactTextString(m) }
func (*MessageStreamRequest) ProtoMessage() {}
func (*MessageStreamRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{34}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{34}
}
func (m *MessageStreamRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MessageStreamRequest.Unmarshal(m, b)
......@@ -2656,7 +2656,7 @@ func (m *MessageAckRequest) Reset() { *m = MessageAckRequest{} }
func (m *MessageAckRequest) String() string { return proto.CompactTextString(m) }
func (*MessageAckRequest) ProtoMessage() {}
func (*MessageAckRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{35}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{35}
}
func (m *MessageAckRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MessageAckRequest.Unmarshal(m, b)
......@@ -2720,7 +2720,7 @@ func (m *IdKeyspaceId) Reset() { *m = IdKeyspaceId{} }
func (m *IdKeyspaceId) String() string { return proto.CompactTextString(m) }
func (*IdKeyspaceId) ProtoMessage() {}
func (*IdKeyspaceId) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{36}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{36}
}
func (m *IdKeyspaceId) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_IdKeyspaceId.Unmarshal(m, b)
......@@ -2773,7 +2773,7 @@ func (m *MessageAckKeyspaceIdsRequest) Reset() { *m = MessageAckKeyspace
func (m *MessageAckKeyspaceIdsRequest) String() string { return proto.CompactTextString(m) }
func (*MessageAckKeyspaceIdsRequest) ProtoMessage() {}
func (*MessageAckKeyspaceIdsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{37}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{37}
}
func (m *MessageAckKeyspaceIdsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MessageAckKeyspaceIdsRequest.Unmarshal(m, b)
......@@ -2832,7 +2832,7 @@ func (m *ResolveTransactionResponse) Reset() { *m = ResolveTransactionRe
func (m *ResolveTransactionResponse) String() string { return proto.CompactTextString(m) }
func (*ResolveTransactionResponse) ProtoMessage() {}
func (*ResolveTransactionResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{38}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{38}
}
func (m *ResolveTransactionResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ResolveTransactionResponse.Unmarshal(m, b)
......@@ -2880,7 +2880,7 @@ type SplitQueryRequest struct {
// SELECT <cols> FROM <table> WHERE <filter>.
// It must not contain subqueries nor any of the keywords
// JOIN, GROUP BY, ORDER BY, LIMIT, DISTINCT.
// Furthermore, <table> must be a single “concrete” table.
// Furthermore, <table> must be a single "concrete" table.
// It cannot be a view.
Query *query.BoundQuery `protobuf:"bytes,3,opt,name=query,proto3" json:"query,omitempty"`
// Each generated query-part will be restricted to rows whose values
......@@ -2950,7 +2950,7 @@ func (m *SplitQueryRequest) Reset() { *m = SplitQueryRequest{} }
func (m *SplitQueryRequest) String() string { return proto.CompactTextString(m) }
func (*SplitQueryRequest) ProtoMessage() {}
func (*SplitQueryRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{39}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{39}
}
func (m *SplitQueryRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SplitQueryRequest.Unmarshal(m, b)
......@@ -3039,7 +3039,7 @@ func (m *SplitQueryResponse) Reset() { *m = SplitQueryResponse{} }
func (m *SplitQueryResponse) String() string { return proto.CompactTextString(m) }
func (*SplitQueryResponse) ProtoMessage() {}
func (*SplitQueryResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{40}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{40}
}
func (m *SplitQueryResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SplitQueryResponse.Unmarshal(m, b)
......@@ -3080,7 +3080,7 @@ func (m *SplitQueryResponse_KeyRangePart) Reset() { *m = SplitQueryRespo
func (m *SplitQueryResponse_KeyRangePart) String() string { return proto.CompactTextString(m) }
func (*SplitQueryResponse_KeyRangePart) ProtoMessage() {}
func (*SplitQueryResponse_KeyRangePart) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{40, 0}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{40, 0}
}
func (m *SplitQueryResponse_KeyRangePart) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SplitQueryResponse_KeyRangePart.Unmarshal(m, b)
......@@ -3128,7 +3128,7 @@ func (m *SplitQueryResponse_ShardPart) Reset() { *m = SplitQueryResponse
func (m *SplitQueryResponse_ShardPart) String() string { return proto.CompactTextString(m) }
func (*SplitQueryResponse_ShardPart) ProtoMessage() {}
func (*SplitQueryResponse_ShardPart) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{40, 1}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{40, 1}
}
func (m *SplitQueryResponse_ShardPart) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SplitQueryResponse_ShardPart.Unmarshal(m, b)
......@@ -3181,7 +3181,7 @@ func (m *SplitQueryResponse_Part) Reset() { *m = SplitQueryResponse_Part
func (m *SplitQueryResponse_Part) String() string { return proto.CompactTextString(m) }
func (*SplitQueryResponse_Part) ProtoMessage() {}
func (*SplitQueryResponse_Part) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{40, 2}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{40, 2}
}
func (m *SplitQueryResponse_Part) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SplitQueryResponse_Part.Unmarshal(m, b)
......@@ -3242,7 +3242,7 @@ func (m *GetSrvKeyspaceRequest) Reset() { *m = GetSrvKeyspaceRequest{} }
func (m *GetSrvKeyspaceRequest) String() string { return proto.CompactTextString(m) }
func (*GetSrvKeyspaceRequest) ProtoMessage() {}
func (*GetSrvKeyspaceRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{41}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{41}
}
func (m *GetSrvKeyspaceRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetSrvKeyspaceRequest.Unmarshal(m, b)
......@@ -3282,7 +3282,7 @@ func (m *GetSrvKeyspaceResponse) Reset() { *m = GetSrvKeyspaceResponse{}
func (m *GetSrvKeyspaceResponse) String() string { return proto.CompactTextString(m) }
func (*GetSrvKeyspaceResponse) ProtoMessage() {}
func (*GetSrvKeyspaceResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{42}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{42}
}
func (m *GetSrvKeyspaceResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetSrvKeyspaceResponse.Unmarshal(m, b)
......@@ -3327,7 +3327,7 @@ func (m *VStreamRequest) Reset() { *m = VStreamRequest{} }
func (m *VStreamRequest) String() string { return proto.CompactTextString(m) }
func (*VStreamRequest) ProtoMessage() {}
func (*VStreamRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{43}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{43}
}
func (m *VStreamRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_VStreamRequest.Unmarshal(m, b)
......@@ -3387,7 +3387,7 @@ func (m *VStreamResponse) Reset() { *m = VStreamResponse{} }
func (m *VStreamResponse) String() string { return proto.CompactTextString(m) }
func (*VStreamResponse) ProtoMessage() {}
func (*VStreamResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{44}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{44}
}
func (m *VStreamResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_VStreamResponse.Unmarshal(m, b)
......@@ -3445,7 +3445,7 @@ func (m *UpdateStreamRequest) Reset() { *m = UpdateStreamRequest{} }
func (m *UpdateStreamRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateStreamRequest) ProtoMessage() {}
func (*UpdateStreamRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{45}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{45}
}
func (m *UpdateStreamRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UpdateStreamRequest.Unmarshal(m, b)
......@@ -3533,7 +3533,7 @@ func (m *UpdateStreamResponse) Reset() { *m = UpdateStreamResponse{} }
func (m *UpdateStreamResponse) String() string { return proto.CompactTextString(m) }
func (*UpdateStreamResponse) ProtoMessage() {}
func (*UpdateStreamResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_vtgate_d9799c8e1157b676, []int{46}
return fileDescriptor_vtgate_339c92b13a08c8a7, []int{46}
}
func (m *UpdateStreamResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UpdateStreamResponse.Unmarshal(m, b)
......@@ -3624,9 +3624,9 @@ func init() {
proto.RegisterEnum("vtgate.CommitOrder", CommitOrder_name, CommitOrder_value)
}
func init() { proto.RegisterFile("vtgate.proto", fileDescriptor_vtgate_d9799c8e1157b676) }
func init() { proto.RegisterFile("vtgate.proto", fileDescriptor_vtgate_339c92b13a08c8a7) }
var fileDescriptor_vtgate_d9799c8e1157b676 = []byte{
var fileDescriptor_vtgate_339c92b13a08c8a7 = []byte{
// 2041 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5a, 0xcd, 0x8f, 0x23, 0x47,
0x15, 0x4f, 0x77, 0xfb, 0xf3, 0xf9, 0x73, 0x6b, 0xbc, 0x1b, 0xc7, 0x19, 0x76, 0x26, 0x1d, 0x46,
......
因为 它太大了无法显示 source diff 。你可以改为 查看blob
......@@ -219,9 +219,9 @@ func skipToEnd(yylex interface{}) {
%type <tableExprs> from_opt table_references
%type <tableExpr> table_reference table_factor join_table
%type <joinCondition> join_condition join_condition_opt on_expression_opt
%type <tableNames> table_name_list
%type <tableNames> table_name_list delete_table_list
%type <str> inner_join outer_join straight_join natural_join
%type <tableName> table_name into_table_name
%type <tableName> table_name into_table_name delete_table_name
%type <aliasedTableName> aliased_table_name
%type <indexHints> index_hint_list
%type <expr> where_expression_opt
......@@ -454,6 +454,10 @@ delete_statement:
{
$$ = &Delete{Comments: Comments($2), Targets: $3, TableExprs: $5, Where: NewWhere(WhereStr, $6)}
}
|DELETE comment_opt delete_table_list from_or_using table_references where_expression_opt
{
$$ = &Delete{Comments: Comments($2), Targets: $3, TableExprs: $5, Where: NewWhere(WhereStr, $6)}
}
from_or_using:
FROM {}
......@@ -469,6 +473,16 @@ table_name_list:
$$ = append($$, $3)
}
delete_table_list:
delete_table_name
{
$$ = TableNames{$1}
}
| delete_table_list ',' delete_table_name
{
$$ = append($$, $3)
}
opt_partition_clause:
{
$$ = nil
......@@ -2062,6 +2076,12 @@ table_name:
$$ = TableName{Qualifier: $1, Name: $3}
}
delete_table_name:
table_id '.' '*'
{
$$ = TableName{Name: $1}
}
index_hint_list:
{
$$ = nil
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册