Merge branch 'master' into zimuxia/inspectkv-sql
Conflicts: parser/parser.y
This commit is contained in:
52
ddl/index.go
52
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)
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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 ')'
|
||||
|
||||
@ -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},
|
||||
|
||||
@ -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)
|
||||
|
||||
Reference in New Issue
Block a user