diff --git a/ddl/index.go b/ddl/index.go index 7332121e76..66d1f537c5 100644 --- a/ddl/index.go +++ b/ddl/index.go @@ -394,7 +394,6 @@ func (d *ddl) getSnapshotRows(t table.Table, version uint64, seekHandle int64) ( handles = append(handles, handle) if len(handles) == maxBatchSize { - seekHandle = handle + 1 break } @@ -476,54 +475,7 @@ func (d *ddl) backfillTableIndex(t table.Table, indexInfo *model.IndexInfo, hand func (d *ddl) dropTableIndex(t table.Table, indexInfo *model.IndexInfo) error { prefix := kv.GenIndexPrefix(t.IndexPrefix(), indexInfo.ID) - for { - keys := make([]kv.Key, 0, maxBatchSize) - err := kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { - iter, err := txn.Seek(prefix) - if err != nil { - return errors.Trace(err) - } + err := d.delKeysWithPrefix(prefix) - defer iter.Close() - for i := 0; i < maxBatchSize; i++ { - if iter.Valid() && iter.Key().HasPrefix(prefix) { - keys = append(keys, iter.Key().Clone()) - err = iter.Next() - if err != nil { - return errors.Trace(err) - } - } else { - break - } - } - - return nil - }) - - // if err or delete no keys, return. - if err != nil || len(keys) == 0 { - return errors.Trace(err) - } - - // delete index key one by one - for _, key := range keys { - err = kv.RunInNewTxn(d.store, true, func(txn kv.Transaction) error { - if err1 := d.isReorgRunnable(txn); err1 != nil { - return errors.Trace(err1) - } - - err1 := txn.Delete(key) - // if key doesn't exist, skip this error. - if err1 != nil && !terror.ErrorEqual(err1, kv.ErrNotExist) { - return errors.Trace(err1) - } - - return nil - }) - - if err != nil { - return errors.Trace(err) - } - } - } + return errors.Trace(err) } diff --git a/ddl/reorg.go b/ddl/reorg.go index be27db8088..afaee3d2ef 100644 --- a/ddl/reorg.go +++ b/ddl/reorg.go @@ -182,6 +182,7 @@ func (d *ddl) delKeysWithPrefix(prefix kv.Key) error { for _, key := range keys { err := txn.Delete(key) // must skip ErrNotExist + // if key doesn't exist, skip this error. if err != nil && !terror.ErrorEqual(err, kv.ErrNotExist) { return errors.Trace(err) } diff --git a/expression/builtin/builtin.go b/expression/builtin/builtin.go index cb41f826a4..9c6f61fd68 100644 --- a/expression/builtin/builtin.go +++ b/expression/builtin/builtin.go @@ -114,6 +114,7 @@ var Funcs = map[string]Func{ "found_rows": {builtinFoundRows, 0, 0, false, false}, "user": {builtinUser, 0, 0, false, false}, "connection_id": {builtinConnectionID, 0, 0, true, false}, + "version": {builtinVersion, 0, 0, true, false}, } func invArg(arg interface{}, s string) error { diff --git a/expression/builtin/info.go b/expression/builtin/info.go index 14687d6b42..34f255e2d9 100644 --- a/expression/builtin/info.go +++ b/expression/builtin/info.go @@ -20,6 +20,7 @@ package builtin import ( "github.com/juju/errors" "github.com/pingcap/tidb/context" + "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/db" "github.com/pingcap/tidb/sessionctx/variable" ) @@ -76,3 +77,7 @@ func builtinConnectionID(args []interface{}, data map[interface{}]interface{}) ( ctx := c.(context.Context) return variable.GetSessionVars(ctx).ConnectionID, nil } + +func builtinVersion(args []interface{}, data map[interface{}]interface{}) (v interface{}, err error) { + return mysql.ServerVersion, nil +} diff --git a/expression/builtin/info_test.go b/expression/builtin/info_test.go index 93eca4577b..987561a806 100644 --- a/expression/builtin/info_test.go +++ b/expression/builtin/info_test.go @@ -15,6 +15,7 @@ package builtin import ( . "github.com/pingcap/check" + "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/db" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/util/mock" @@ -94,3 +95,10 @@ func (s *testBuiltinSuite) TestConnectionID(c *C) { c.Assert(err, IsNil) c.Assert(v, Equals, uint64(1)) } + +func (s *testBuiltinSuite) TestVersion(c *C) { + m := map[interface{}]interface{}{} + v, err := builtinVersion(nil, m) + c.Assert(err, IsNil) + c.Assert(v, Equals, mysql.ServerVersion) +} diff --git a/parser/parser.y b/parser/parser.y index ccfd8ab8ff..b0ceb7baa8 100644 --- a/parser/parser.y +++ b/parser/parser.y @@ -280,6 +280,7 @@ import ( value "VALUE" values "VALUES" variables "VARIABLES" + version "VERSION" warnings "WARNINGS" week "WEEK" weekday "WEEKDAY" @@ -1696,7 +1697,7 @@ NotKeywordToken: | "DATE_ADD" | "DATE_SUB" | "DAYNAME" | "DAYOFMONTH" | "DAYOFWEEK" | "DAYOFYEAR" | "FOUND_ROWS" | "GROUP_CONCAT"| "HOUR" | "IFNULL" | "LENGTH" | "LOCATE" | "MAX" | "MICROSECOND" | "MIN" | "MINUTE" | "NULLIF" | "MONTH" | "NOW" | "POW" | "POWER" | "RAND" | "SECOND" | "SQL_CALC_FOUND_ROWS" | "SUBDATE" | "SUBSTRING" %prec lowerThanLeftParen -| "SUBSTRING_INDEX" | "SUM" | "TRIM" | "WEEKDAY" | "WEEKOFYEAR" | "YEARWEEK" +| "SUBSTRING_INDEX" | "SUM" | "TRIM" | "VERSION" | "WEEKDAY" | "WEEKOFYEAR" | "YEARWEEK" /************************************************************************************ * @@ -2043,7 +2044,7 @@ Function: | FunctionCallAgg FunctionNameConflict: - "DATABASE" | "SCHEMA" | "IF" | "LEFT" | "REPEAT" | "CURRENT_USER" | "CURRENT_DATE" + "DATABASE" | "SCHEMA" | "IF" | "LEFT" | "REPEAT" | "CURRENT_USER" | "CURRENT_DATE" | "VERSION" FunctionCallConflict: FunctionNameConflict '(' ExpressionListOpt ')' diff --git a/parser/parser_test.go b/parser/parser_test.go index 7ce828d882..7f30e22712 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -41,7 +41,7 @@ func (s *testParserSuite) TestSimple(c *C) { "collation", "comment", "avg_row_length", "checksum", "compression", "connection", "key_block_size", "max_rows", "min_rows", "national", "row", "quarter", "escape", "grants", "status", "fields", "triggers", "delay_key_write", "isolation", "repeatable", "committed", "uncommitted", "only", "serializable", "level", - "curtime", "variables", "dayname", + "curtime", "variables", "dayname", "version", } for _, kw := range unreservedKws { src := fmt.Sprintf("SELECT %s FROM tbl;", kw) @@ -355,6 +355,7 @@ func (s *testParserSuite) TestBuiltin(c *C) { {"SELECT CURRENT_USER();", true}, {"SELECT CURRENT_USER;", true}, {"SELECT CONNECTION_ID();", true}, + {"SELECT VERSION();", true}, {"SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);", true}, {"SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);", true}, diff --git a/parser/scanner.l b/parser/scanner.l index 59cf21f7f0..808a2506b8 100644 --- a/parser/scanner.l +++ b/parser/scanner.l @@ -477,6 +477,7 @@ upper {u}{p}{p}{e}{r} value {v}{a}{l}{u}{e} values {v}{a}{l}{u}{e}{s} variables {v}{a}{r}{i}{a}{b}{l}{e}{s} +version {v}{e}{r}{s}{i}{o}{n} warnings {w}{a}{r}{n}{i}{n}{g}{s} week {w}{e}{e}{k} weekday {w}{e}{e}{k}{d}{a}{y} @@ -976,6 +977,8 @@ year_month {y}{e}{a}{r}_{m}{o}{n}{t}{h} {values} return values {variables} lval.item = string(l.val) return variables +{version} lval.item = string(l.val) + return version {warnings} lval.item = string(l.val) return warnings {week} lval.item = string(l.val)