Merge branch 'master' into zimuxia/inspectkv-sql

Conflicts:
	parser/parser.y
This commit is contained in:
xia
2016-01-11 11:18:42 +08:00
8 changed files with 25 additions and 53 deletions

View File

@ -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)
}

View File

@ -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)
}

View File

@ -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 {

View File

@ -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
}

View File

@ -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)
}

View File

@ -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 ')'

View File

@ -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},

View File

@ -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)