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

update vendor support more mysql syntax

上级 50a0bc2e
......@@ -610,6 +610,7 @@ var tokenMap = map[string]int{
"TRIM": trim,
"TRUE": trueKwd,
"TRUNCATE": truncate,
"TYPE": tp,
"UNBOUNDED": unbounded,
"UNCOMMITTED": uncommitted,
"UNDEFINED": undefined,
......
......@@ -254,19 +254,22 @@ const (
// which is 1 more than the maximum number of decimals permitted for the DECIMAL, FLOAT, and DOUBLE data types.
NotFixedDec = 31
MaxIntWidth = 20
MaxRealWidth = 23
MaxFloatingTypeScale = 30
MaxFloatingTypeWidth = 255
MaxDecimalScale = 30
MaxDecimalWidth = 65
MaxDateWidth = 10 // YYYY-MM-DD.
MaxDatetimeWidthNoFsp = 19 // YYYY-MM-DD HH:MM:SS
MaxDatetimeWidthWithFsp = 26 // YYYY-MM-DD HH:MM:SS[.fraction]
MaxDatetimeFullWidth = 29 // YYYY-MM-DD HH:MM:SS.###### AM
MaxDurationWidthNoFsp = 10 // HH:MM:SS
MaxDurationWidthWithFsp = 15 // HH:MM:SS[.fraction]
MaxBlobWidth = 16777216
MaxIntWidth = 20
MaxRealWidth = 23
MaxFloatingTypeScale = 30
MaxFloatingTypeWidth = 255
MaxDecimalScale = 30
MaxDecimalWidth = 65
MaxDateWidth = 10 // YYYY-MM-DD.
MaxDatetimeWidthNoFsp = 19 // YYYY-MM-DD HH:MM:SS
MaxDatetimeWidthWithFsp = 26 // YYYY-MM-DD HH:MM:SS[.fraction]
MaxDatetimeFullWidth = 29 // YYYY-MM-DD HH:MM:SS.###### AM
MaxDurationWidthNoFsp = 10 // HH:MM:SS
MaxDurationWidthWithFsp = 15 // HH:MM:SS[.fraction]
MaxBlobWidth = 16777216
MaxBitDisplayWidth = 64
MaxFloatPrecisionLength = 24
MaxDoublePrecisionLength = 53
)
// MySQL max type field length.
......
......@@ -883,6 +883,7 @@ const (
ErrRowInWrongPartition = 1863
ErrErrorLast = 1863
ErrMaxExecTimeExceeded = 1907
ErrInvalidFieldSize = 3013
ErrInvalidJSONData = 3069
ErrGeneratedColumnFunctionIsNotAllowed = 3102
ErrBadGeneratedColumn = 3105
......
......@@ -885,6 +885,7 @@ var MySQLErrName = map[uint16]string{
ErrDependentByGeneratedColumn: "Column '%s' has a generated column dependency.",
ErrGeneratedColumnFunctionIsNotAllowed: "Expression of generated column '%s' contains a disallowed function.",
ErrGeneratedColumnRefAutoInc: "Generated column '%s' cannot refer to auto-increment column.",
ErrInvalidFieldSize: "Invalid size for column '%s'.",
ErrInvalidJSONData: "Invalid JSON data provided to function %s: %s",
ErrInvalidJSONText: "Invalid JSON text: %-.192s",
ErrInvalidJSONPath: "Invalid JSON path expression %s.",
......
......@@ -491,6 +491,7 @@ import (
transaction "TRANSACTION"
triggers "TRIGGERS"
truncate "TRUNCATE"
tp "TYPE"
unbounded "UNBOUNDED"
uncommitted "UNCOMMITTED"
unknown "UNKNOWN"
......@@ -845,11 +846,13 @@ import (
IndexKeyTypeOpt "index key type"
IndexLockAndAlgorithmOpt "index lock and algorithm"
IndexName "index name"
IndexNameAndTypeOpt "index name and index type"
IndexNameList "index name list"
IndexOption "Index Option"
IndexOptionList "Index Option List or empty"
IndexType "index type"
IndexTypeOpt "Optional index type"
IndexTypeName "index type name"
IndexTypeOpt "optional index type"
InsertValues "Rest part of INSERT/REPLACE INTO statement"
JoinTable "join table"
JoinType "join type"
......@@ -2440,20 +2443,20 @@ ColumnOptionListOpt:
}
ConstraintElem:
"PRIMARY" "KEY" IndexName IndexTypeOpt '(' IndexColNameList ')' IndexOptionList
"PRIMARY" "KEY" IndexNameAndTypeOpt '(' IndexColNameList ')' IndexOptionList
{
c := &ast.Constraint{
Tp: ast.ConstraintPrimaryKey,
Keys: $6.([]*ast.IndexColName),
Keys: $5.([]*ast.IndexColName),
}
if $8 != nil {
c.Option = $8.(*ast.IndexOption)
if $7 != nil {
c.Option = $7.(*ast.IndexOption)
}
if $4 != nil {
if indexType := $3.([]interface{})[1]; indexType != nil {
if c.Option == nil {
c.Option = &ast.IndexOption{}
}
c.Option.Tp = $4.(model.IndexType)
c.Option.Tp = indexType.(model.IndexType)
}
$$ = c
}
......@@ -2469,40 +2472,40 @@ ConstraintElem:
}
$$ = c
}
| KeyOrIndex IfNotExists IndexName IndexTypeOpt '(' IndexColNameList ')' IndexOptionList
| KeyOrIndex IfNotExists IndexNameAndTypeOpt '(' IndexColNameList ')' IndexOptionList
{
c := &ast.Constraint{
IfNotExists: $2.(bool),
Tp: ast.ConstraintIndex,
Keys: $6.([]*ast.IndexColName),
Name: $3.(string),
Keys: $5.([]*ast.IndexColName),
}
if $8 != nil {
c.Option = $8.(*ast.IndexOption)
if $7 != nil {
c.Option = $7.(*ast.IndexOption)
}
if $4 != nil {
c.Name = $3.([]interface{})[0].(string)
if indexType := $3.([]interface{})[1]; indexType != nil {
if c.Option == nil {
c.Option = &ast.IndexOption{}
}
c.Option.Tp = $4.(model.IndexType)
c.Option.Tp = indexType.(model.IndexType)
}
$$ = c
}
| "UNIQUE" KeyOrIndexOpt IndexName IndexTypeOpt '(' IndexColNameList ')' IndexOptionList
| "UNIQUE" KeyOrIndexOpt IndexNameAndTypeOpt '(' IndexColNameList ')' IndexOptionList
{
c := &ast.Constraint{
Tp: ast.ConstraintUniq,
Keys: $6.([]*ast.IndexColName),
Name: $3.(string),
Keys: $5.([]*ast.IndexColName),
}
if $8 != nil {
c.Option = $8.(*ast.IndexOption)
if $7 != nil {
c.Option = $7.(*ast.IndexOption)
}
if $4 != nil {
c.Name = $3.([]interface{})[0].(string)
if indexType := $3.([]interface{})[1]; indexType != nil {
if c.Option == nil {
c.Option = &ast.IndexOption{}
}
c.Option.Tp = $4.(model.IndexType)
c.Option.Tp = indexType.(model.IndexType)
}
$$ = c
}
......@@ -2692,6 +2695,8 @@ NumLiteral:
/**************************************CreateIndexStmt***************************************
* See https://dev.mysql.com/doc/refman/8.0/en/create-index.html
*
* TYPE type_name is recognized as a synonym for USING type_name. However, USING is the preferred form.
*
* CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
* [index_type]
* ON tbl_name (key_part,...)
......@@ -4195,7 +4200,6 @@ IndexOptionList:
}
}
IndexOption:
"KEY_BLOCK_SIZE" EqOpt LengthNum
{
......@@ -4230,18 +4234,37 @@ IndexOption:
}
}
IndexType:
"USING" "BTREE"
/*
See: https://github.com/mysql/mysql-server/blob/8.0/sql/sql_yacc.yy#L7179
The syntax for defining an index is:
... INDEX [index_name] [USING|TYPE] <index_type> ...
The problem is that whereas USING is a reserved word, TYPE is not. We can
still handle it if an index name is supplied, i.e.:
... INDEX type TYPE <index_type> ...
here the index's name is unmbiguously 'type', but for this:
... INDEX TYPE <index_type> ...
it's impossible to know what this actually mean - is 'type' the name or the
type? For this reason we accept the TYPE syntax only if a name is supplied.
*/
IndexNameAndTypeOpt:
IndexName
{
$$ = model.IndexTypeBtree
$$ = []interface{}{$1, nil}
}
| "USING" "HASH"
| IndexName "USING" IndexTypeName
{
$$ = model.IndexTypeHash
$$ = []interface{}{$1, $3}
}
| "USING" "RTREE"
| Identifier "TYPE" IndexTypeName
{
$$ = model.IndexTypeRtree
$$ = []interface{}{$1, $3}
}
IndexTypeOpt:
......@@ -4253,6 +4276,30 @@ IndexTypeOpt:
$$ = $1
}
IndexType:
"USING" IndexTypeName
{
$$ = $2
}
| "TYPE" IndexTypeName
{
$$ = $2
}
IndexTypeName:
"BTREE"
{
$$ = model.IndexTypeBtree
}
| "HASH"
{
$$ = model.IndexTypeHash
}
| "RTREE"
{
$$ = model.IndexTypeRtree
}
IndexInvisible:
"VISIBLE"
{
......@@ -4284,7 +4331,7 @@ UnReservedKeyword:
| "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" | "PARTIAL" | "SIMPLE" | "REMOVE" | "PARTITIONING" | "STORAGE" | "DISK" | "STATS_SAMPLE_PAGES" | "SECONDARY_ENGINE" | "SECONDARY_LOAD" | "SECONDARY_UNLOAD" | "VALIDATION"
| "WITHOUT" | "RTREE" | "EXCHANGE" | "COLUMN_FORMAT" | "REPAIR" | "IMPORT" | "DISCARD" | "TABLE_CHECKSUM"
| "SQL_TSI_DAY" | "SQL_TSI_HOUR" | "SQL_TSI_MINUTE" | "SQL_TSI_MONTH" | "SQL_TSI_QUARTER" | "SQL_TSI_SECOND" | "SQL_TSI_WEEK" | "SQL_TSI_YEAR" | "INVISIBLE" | "VISIBLE"
| "SQL_TSI_DAY" | "SQL_TSI_HOUR" | "SQL_TSI_MINUTE" | "SQL_TSI_MONTH" | "SQL_TSI_QUARTER" | "SQL_TSI_SECOND" | "SQL_TSI_WEEK" | "SQL_TSI_YEAR" | "INVISIBLE" | "VISIBLE" | "TYPE"
TiDBKeyword:
"ADMIN" | "AGG_TO_COP" |"BUCKETS" | "CANCEL" | "CMSKETCH" | "DDL" | "DEPTH" | "DRAINER" | "JOBS" | "JOB" | "NODE_ID" | "NODE_STATE" | "PUMP" | "SAMPLES" | "STATS" | "STATS_META" | "STATS_HISTOGRAMS" | "STATS_BUCKETS" | "STATS_HEALTHY" | "TIDB"
......@@ -8648,8 +8695,8 @@ NumericType:
fopt := $2.(*ast.FloatOpt)
x := types.NewFieldType($1.(byte))
x.Flen = fopt.Flen
if x.Tp == mysql.TypeFloat && fopt.Decimal == types.UnspecifiedLength && x.Flen <= 53 {
if x.Flen > 24 {
if x.Tp == mysql.TypeFloat && fopt.Decimal == types.UnspecifiedLength && x.Flen <= mysql.MaxDoublePrecisionLength {
if x.Flen > mysql.MaxFloatPrecisionLength {
x.Tp = mysql.TypeDouble
}
x.Flen = types.UnspecifiedLength
......@@ -8671,7 +8718,7 @@ NumericType:
x.Flen = $2.(int)
if x.Flen == types.UnspecifiedLength || x.Flen == 0 {
x.Flen = 1
} else if x.Flen > 64 {
} else if x.Flen > mysql.MaxBitDisplayWidth {
yylex.AppendError(ErrTooBigDisplayWidth.GenWithStackByArgs(x.Flen))
}
$$ = x
......
......@@ -34,7 +34,7 @@ var (
// ErrDivByZero is return when do division by 0.
ErrDivByZero = terror.ClassTypes.New(codeDivByZero, "Division by 0")
// ErrTooBigDisplayWidth is return when display width out of range for column.
ErrTooBigDisplayWidth = terror.ClassTypes.New(codeTooBigDisplayWidth, "Too Big Display width")
ErrTooBigDisplayWidth = terror.ClassTypes.New(codeTooBigDisplayWidth, mysql.MySQLErrName[mysql.ErrTooBigDisplaywidth])
// ErrTooBigFieldLength is return when column length too big for column.
ErrTooBigFieldLength = terror.ClassTypes.New(codeTooBigFieldLength, "Too Big Field length")
// ErrTooBigSet is returned when too many strings for column.
......@@ -49,6 +49,8 @@ var (
ErrBadNumber = terror.ClassTypes.New(codeBadNumber, "Bad Number")
// ErrInvalidDefault is returned when meet a invalid default value.
ErrInvalidDefault = parser_types.ErrInvalidDefault
// ErrInvalidFieldSize is returned when the precision of a column is out of range.
ErrInvalidFieldSize = terror.ClassTypes.New(codeInvalidFieldSize, mysql.MySQLErrName[mysql.ErrInvalidFieldSize])
// ErrCastAsSignedOverflow is returned when positive out-of-range integer, and convert to it's negative complement.
ErrCastAsSignedOverflow = terror.ClassTypes.New(codeUnknown, msgCastAsSignedOverflow)
// ErrCastNegIntAsUnsigned is returned when a negative integer be casted to an unsigned int.
......@@ -93,6 +95,7 @@ const (
codeTruncatedWrongValue = terror.ErrCode(mysql.ErrTruncatedWrongValue)
codeUnknown = terror.ErrCode(mysql.ErrUnknown)
codeInvalidDefault = terror.ErrCode(mysql.ErrInvalidDefault)
codeInvalidFieldSize = terror.ErrCode(mysql.ErrInvalidFieldSize)
codeMBiggerThanD = terror.ErrCode(mysql.ErrMBiggerThanD)
codeDataOutOfRange = terror.ErrCode(mysql.ErrWarnDataOutOfRange)
codeDuplicatedValueInType = terror.ErrCode(mysql.ErrDuplicatedValueInType)
......
......@@ -66,19 +66,17 @@ func (bj BinaryJSON) Unquote() (string, error) {
switch bj.TypeCode {
case TypeCodeString:
tmp := string(hack.String(bj.GetString()))
s, err := unquoteString(tmp)
if err != nil {
return "", errors.Trace(err)
tlen := len(tmp)
if tlen < 2 {
return tmp, nil
}
// Remove prefix and suffix '"'.
slen := len(s)
if slen > 1 {
head, tail := s[0], s[slen-1]
if head == '"' && tail == '"' {
return s[1 : slen-1], nil
}
head, tail := tmp[0], tmp[tlen-1]
if head == '"' && tail == '"' {
// Remove prefix and suffix '"' before unquoting
return unquoteString(tmp[1 : tlen-1])
}
return s, nil
// if value is not double quoted, do nothing
return tmp, nil
default:
return bj.String(), nil
}
......
......@@ -129,118 +129,118 @@
"revisionTime": "2019-03-07T07:54:52Z"
},
{
"checksumSHA1": "wopyI0JhbHosTiSv1vL/d6xyjDs=",
"checksumSHA1": "JPMpA0GItqyzBSfsCuIQd1TkK2o=",
"path": "github.com/pingcap/parser",
"revision": "736e807a964125f7730192af0016e4fcf05c7b70",
"revisionTime": "2019-08-29T07:33:47Z"
"revision": "275a827cf4e3798ca50ae8b5224895f0919e70ed",
"revisionTime": "2019-09-02T03:07:20Z"
},
{
"checksumSHA1": "rNycpMFm1SPArRiqljKlCdtbKlE=",
"path": "github.com/pingcap/parser/ast",
"revision": "736e807a964125f7730192af0016e4fcf05c7b70",
"revisionTime": "2019-08-29T07:33:47Z"
"revision": "275a827cf4e3798ca50ae8b5224895f0919e70ed",
"revisionTime": "2019-09-02T03:07:20Z"
},
{
"checksumSHA1": "xiv40YqnvHcbIhaEzJqjh5K7ehM=",
"path": "github.com/pingcap/parser/auth",
"revision": "736e807a964125f7730192af0016e4fcf05c7b70",
"revisionTime": "2019-08-29T07:33:47Z"
"revision": "275a827cf4e3798ca50ae8b5224895f0919e70ed",
"revisionTime": "2019-09-02T03:07:20Z"
},
{
"checksumSHA1": "EvDXpplklIXmKqLclzWzaN/uHKQ=",
"path": "github.com/pingcap/parser/charset",
"revision": "736e807a964125f7730192af0016e4fcf05c7b70",
"revisionTime": "2019-08-29T07:33:47Z"
"revision": "275a827cf4e3798ca50ae8b5224895f0919e70ed",
"revisionTime": "2019-09-02T03:07:20Z"
},
{
"checksumSHA1": "Aao6Mul/qqogOwPwM2arBKZkYZs=",
"path": "github.com/pingcap/parser/format",
"revision": "736e807a964125f7730192af0016e4fcf05c7b70",
"revisionTime": "2019-08-29T07:33:47Z"
"revision": "275a827cf4e3798ca50ae8b5224895f0919e70ed",
"revisionTime": "2019-09-02T03:07:20Z"
},
{
"checksumSHA1": "GAJ7IUg0t8DCKJbJQxJLkklEj2E=",
"path": "github.com/pingcap/parser/model",
"revision": "736e807a964125f7730192af0016e4fcf05c7b70",
"revisionTime": "2019-08-29T07:33:47Z"
"revision": "275a827cf4e3798ca50ae8b5224895f0919e70ed",
"revisionTime": "2019-09-02T03:07:20Z"
},
{
"checksumSHA1": "9aEsfUW5bJTXPD7x2obSyd+6gw4=",
"checksumSHA1": "vPXc18Mug99WhSvLXC/JtwOdEmA=",
"path": "github.com/pingcap/parser/mysql",
"revision": "736e807a964125f7730192af0016e4fcf05c7b70",
"revisionTime": "2019-08-29T07:33:47Z"
"revision": "275a827cf4e3798ca50ae8b5224895f0919e70ed",
"revisionTime": "2019-09-02T03:07:20Z"
},
{
"checksumSHA1": "olapD16WCMBU9vrA5PtlERGFfXw=",
"path": "github.com/pingcap/parser/opcode",
"revision": "736e807a964125f7730192af0016e4fcf05c7b70",
"revisionTime": "2019-08-29T07:33:47Z"
"revision": "275a827cf4e3798ca50ae8b5224895f0919e70ed",
"revisionTime": "2019-09-02T03:07:20Z"
},
{
"checksumSHA1": "L6rzy3sJU1RPf7AkJN+0zcwW/YY=",
"path": "github.com/pingcap/parser/terror",
"revision": "736e807a964125f7730192af0016e4fcf05c7b70",
"revisionTime": "2019-08-29T07:33:47Z"
"revision": "275a827cf4e3798ca50ae8b5224895f0919e70ed",
"revisionTime": "2019-09-02T03:07:20Z"
},
{
"checksumSHA1": "u1Lmm4Fa3su4ElZMN4w0hPzFZl4=",
"path": "github.com/pingcap/parser/types",
"revision": "736e807a964125f7730192af0016e4fcf05c7b70",
"revisionTime": "2019-08-29T07:33:47Z"
"revision": "275a827cf4e3798ca50ae8b5224895f0919e70ed",
"revisionTime": "2019-09-02T03:07:20Z"
},
{
"checksumSHA1": "ryt2yutvbgdMuS5uvtaiJqqvZXQ=",
"path": "github.com/pingcap/tidb/sessionctx/stmtctx",
"revision": "bdbaeb419dd5ff1b3a0b16f907a0cd7c421c83b0",
"revisionTime": "2019-08-29T06:45:52Z"
"revision": "67d4f913dd3f305b39c4d6ba53a6ff82fc040c39",
"revisionTime": "2019-09-02T13:30:13Z"
},
{
"checksumSHA1": "tKaN6jgHhSXad0RSNpSe0q9fiMo=",
"checksumSHA1": "sNH6BHp65A9tc3DBD15aOI6GDko=",
"path": "github.com/pingcap/tidb/types",
"revision": "bdbaeb419dd5ff1b3a0b16f907a0cd7c421c83b0",
"revisionTime": "2019-08-29T06:45:52Z"
"revision": "67d4f913dd3f305b39c4d6ba53a6ff82fc040c39",
"revisionTime": "2019-09-02T13:30:13Z"
},
{
"checksumSHA1": "gKBD02jzm/d7gn2kX7pXLi+M2ZY=",
"checksumSHA1": "OSOQVeP518zWu3RoYSDWoh7DIjg=",
"path": "github.com/pingcap/tidb/types/json",
"revision": "bdbaeb419dd5ff1b3a0b16f907a0cd7c421c83b0",
"revisionTime": "2019-08-29T06:45:52Z"
"revision": "67d4f913dd3f305b39c4d6ba53a6ff82fc040c39",
"revisionTime": "2019-09-02T13:30:13Z"
},
{
"checksumSHA1": "45zWX5Q6D6aTEWtc4p/lbD9WD4o=",
"path": "github.com/pingcap/tidb/types/parser_driver",
"revision": "bdbaeb419dd5ff1b3a0b16f907a0cd7c421c83b0",
"revisionTime": "2019-08-29T06:45:52Z"
"revision": "67d4f913dd3f305b39c4d6ba53a6ff82fc040c39",
"revisionTime": "2019-09-02T13:30:13Z"
},
{
"checksumSHA1": "uH6u5fhPvRiiOUCG8bJfphXm4jo=",
"path": "github.com/pingcap/tidb/util/execdetails",
"revision": "bdbaeb419dd5ff1b3a0b16f907a0cd7c421c83b0",
"revisionTime": "2019-08-29T06:45:52Z"
"revision": "67d4f913dd3f305b39c4d6ba53a6ff82fc040c39",
"revisionTime": "2019-09-02T13:30:13Z"
},
{
"checksumSHA1": "zw1limoYLowZjRm8wgicyjC72+U=",
"path": "github.com/pingcap/tidb/util/hack",
"revision": "bdbaeb419dd5ff1b3a0b16f907a0cd7c421c83b0",
"revisionTime": "2019-08-29T06:45:52Z"
"revision": "67d4f913dd3f305b39c4d6ba53a6ff82fc040c39",
"revisionTime": "2019-09-02T13:30:13Z"
},
{
"checksumSHA1": "fDbwnQlRCKnr5y6MY799BEd4WlQ=",
"path": "github.com/pingcap/tidb/util/logutil",
"revision": "bdbaeb419dd5ff1b3a0b16f907a0cd7c421c83b0",
"revisionTime": "2019-08-29T06:45:52Z"
"revision": "67d4f913dd3f305b39c4d6ba53a6ff82fc040c39",
"revisionTime": "2019-09-02T13:30:13Z"
},
{
"checksumSHA1": "OveQu0ABBJmMEwmmthqSRQC2Ef0=",
"path": "github.com/pingcap/tidb/util/math",
"revision": "bdbaeb419dd5ff1b3a0b16f907a0cd7c421c83b0",
"revisionTime": "2019-08-29T06:45:52Z"
"revision": "67d4f913dd3f305b39c4d6ba53a6ff82fc040c39",
"revisionTime": "2019-09-02T13:30:13Z"
},
{
"checksumSHA1": "loL2JgZDLapEOgfM/XUJI5f0HVs=",
"path": "github.com/pingcap/tidb/util/memory",
"revision": "bdbaeb419dd5ff1b3a0b16f907a0cd7c421c83b0",
"revisionTime": "2019-08-29T06:45:52Z"
"revision": "67d4f913dd3f305b39c4d6ba53a6ff82fc040c39",
"revisionTime": "2019-09-02T13:30:13Z"
},
{
"checksumSHA1": "QPIBwDNUFF5Whrnd41S3mkKa4gQ=",
......@@ -497,68 +497,68 @@
{
"checksumSHA1": "aKn1oKcY74N8TRLm3Ayt7Q4bbI4=",
"path": "vitess.io/vitess/go/bytes2",
"revision": "ad6099c8cb9fce72a4b2d22ea55f4f693e846b3e",
"revisionTime": "2019-08-28T05:53:53Z"
"revision": "74ae4e28066640597b0a6b1163fb99cd0b53b3ff",
"revisionTime": "2019-08-30T03:35:45Z"
},
{
"checksumSHA1": "bhE6CGQgZTIgLPp9lnvlKW/47xc=",
"path": "vitess.io/vitess/go/hack",
"revision": "ad6099c8cb9fce72a4b2d22ea55f4f693e846b3e",
"revisionTime": "2019-08-28T05:53:53Z"
"revision": "74ae4e28066640597b0a6b1163fb99cd0b53b3ff",
"revisionTime": "2019-08-30T03:35:45Z"
},
{
"checksumSHA1": "y2C3mKrC39Tffb/614ZYa/qEVGU=",
"path": "vitess.io/vitess/go/sqltypes",
"revision": "ad6099c8cb9fce72a4b2d22ea55f4f693e846b3e",
"revisionTime": "2019-08-28T05:53:53Z"
"revision": "74ae4e28066640597b0a6b1163fb99cd0b53b3ff",
"revisionTime": "2019-08-30T03:35:45Z"
},
{
"checksumSHA1": "vAIRxI6MHsq3x1hLQwIyw5AvqtI=",
"path": "vitess.io/vitess/go/vt/log",
"revision": "ad6099c8cb9fce72a4b2d22ea55f4f693e846b3e",
"revisionTime": "2019-08-28T05:53:53Z"
"revision": "74ae4e28066640597b0a6b1163fb99cd0b53b3ff",
"revisionTime": "2019-08-30T03:35:45Z"
},
{
"checksumSHA1": "//MHnGEq9xApvIMdwQaRrQf5ZWo=",
"path": "vitess.io/vitess/go/vt/proto/binlogdata",
"revision": "ad6099c8cb9fce72a4b2d22ea55f4f693e846b3e",
"revisionTime": "2019-08-28T05:53:53Z"
"revision": "74ae4e28066640597b0a6b1163fb99cd0b53b3ff",
"revisionTime": "2019-08-30T03:35:45Z"
},
{
"checksumSHA1": "u8uuZWMqaXgQ1MduggrgIHU50FI=",
"path": "vitess.io/vitess/go/vt/proto/query",
"revision": "ad6099c8cb9fce72a4b2d22ea55f4f693e846b3e",
"revisionTime": "2019-08-28T05:53:53Z"
"revision": "74ae4e28066640597b0a6b1163fb99cd0b53b3ff",
"revisionTime": "2019-08-30T03:35:45Z"
},
{
"checksumSHA1": "rJ1Iqz/lvaKikIUx4oEFfYJtoBQ=",
"path": "vitess.io/vitess/go/vt/proto/topodata",
"revision": "ad6099c8cb9fce72a4b2d22ea55f4f693e846b3e",
"revisionTime": "2019-08-28T05:53:53Z"
"revision": "74ae4e28066640597b0a6b1163fb99cd0b53b3ff",
"revisionTime": "2019-08-30T03:35:45Z"
},
{
"checksumSHA1": "Bv8lucvoH9AnJSYiWX8MIrJl4zY=",
"path": "vitess.io/vitess/go/vt/proto/vtgate",
"revision": "ad6099c8cb9fce72a4b2d22ea55f4f693e846b3e",
"revisionTime": "2019-08-28T05:53:53Z"
"revision": "74ae4e28066640597b0a6b1163fb99cd0b53b3ff",
"revisionTime": "2019-08-30T03:35:45Z"
},
{
"checksumSHA1": "HeUJu5njPq9iznpAOcrLpLD7f9w=",
"path": "vitess.io/vitess/go/vt/proto/vtrpc",
"revision": "ad6099c8cb9fce72a4b2d22ea55f4f693e846b3e",
"revisionTime": "2019-08-28T05:53:53Z"
"revision": "74ae4e28066640597b0a6b1163fb99cd0b53b3ff",
"revisionTime": "2019-08-30T03:35:45Z"
},
{
"checksumSHA1": "uhDAaoN8RkmdkmkbYkaX5dLPquc=",
"checksumSHA1": "6g61BeExwL7AYkuujmuo+SUUvaM=",
"path": "vitess.io/vitess/go/vt/sqlparser",
"revision": "ad6099c8cb9fce72a4b2d22ea55f4f693e846b3e",
"revisionTime": "2019-08-28T05:53:53Z"
"revision": "74ae4e28066640597b0a6b1163fb99cd0b53b3ff",
"revisionTime": "2019-08-30T03:35:45Z"
},
{
"checksumSHA1": "z9+F/lA1Xrl5S16LKssUH8VL6hs=",
"path": "vitess.io/vitess/go/vt/vterrors",
"revision": "ad6099c8cb9fce72a4b2d22ea55f4f693e846b3e",
"revisionTime": "2019-08-28T05:53:53Z"
"revision": "74ae4e28066640597b0a6b1163fb99cd0b53b3ff",
"revisionTime": "2019-08-30T03:35:45Z"
}
],
"rootPath": "github.com/XiaoMi/soar"
......
......@@ -56,11 +56,16 @@ const (
func Preview(sql string) int {
trimmed := StripLeadingComments(sql)
firstWord := trimmed
if end := strings.IndexFunc(trimmed, unicode.IsSpace); end != -1 {
firstWord = trimmed[:end]
if strings.Index(trimmed, "/*!") == 0 {
return StmtComment
}
isNotLetter := func(r rune) bool { return !unicode.IsLetter(r) }
firstWord := strings.TrimLeftFunc(trimmed, isNotLetter)
if end := strings.IndexFunc(firstWord, unicode.IsSpace); end != -1 {
firstWord = firstWord[:end]
}
firstWord = strings.TrimLeftFunc(firstWord, func(r rune) bool { return !unicode.IsLetter(r) })
// Comparison is done in order of priority.
loweredFirstWord := strings.ToLower(firstWord)
switch loweredFirstWord {
......@@ -103,9 +108,6 @@ func Preview(sql string) int {
case "analyze", "describe", "desc", "explain", "repair", "optimize":
return StmtOther
}
if strings.Index(trimmed, "/*!") == 0 {
return StmtComment
}
return StmtUnknown
}
......
......@@ -797,9 +797,9 @@ func (node *DDL) Format(buf *TrackedBuffer) {
case FlushStr:
buf.Myprintf("%s", node.Action)
case CreateVindexStr:
buf.Myprintf("alter vschema create vindex %v %v", node.VindexSpec.Name, node.VindexSpec)
buf.Myprintf("alter vschema create vindex %v %v", node.Table, node.VindexSpec)
case DropVindexStr:
buf.Myprintf("alter vschema drop vindex %v", node.VindexSpec.Name)
buf.Myprintf("alter vschema drop vindex %v", node.Table)
case AddVschemaTableStr:
buf.Myprintf("alter vschema add table %v", node.Table)
case DropVschemaTableStr:
......
......@@ -1308,19 +1308,27 @@ alter_statement:
{
$$ = &DDL{Action: AlterStr, Table: $4, PartitionSpec: $5}
}
| ALTER VSCHEMA CREATE VINDEX sql_id vindex_type_opt vindex_params_opt
| ALTER VSCHEMA CREATE VINDEX table_name vindex_type_opt vindex_params_opt
{
$$ = &DDL{Action: CreateVindexStr, VindexSpec: &VindexSpec{
Name: $5,
Type: $6,
Params: $7,
}}
$$ = &DDL{
Action: CreateVindexStr,
Table: $5,
VindexSpec: &VindexSpec{
Name: NewColIdent($5.Name.String()),
Type: $6,
Params: $7,
},
}
}
| ALTER VSCHEMA DROP VINDEX sql_id
| ALTER VSCHEMA DROP VINDEX table_name
{
$$ = &DDL{Action: DropVindexStr, VindexSpec: &VindexSpec{
Name: $5,
}}
$$ = &DDL{
Action: DropVindexStr,
Table: $5,
VindexSpec: &VindexSpec{
Name: NewColIdent($5.Name.String()),
},
}
}
| ALTER VSCHEMA ADD TABLE table_name
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册