*: fix duplicated table name when join #180
修复类似下列SQL没有报错:
create table if not exists t (c1 int, c2 int);
create table if not exists t1 (c1 int, c2 int);
select * from t join t1 as t;
在:
if err := r.checkTableDuplicate(t, tr); err != nil {
return nil, nil, errors.Trace(err)
}
使用了新添加的checkTableDuplicate来检查重复即可。
Shenli/fix beego #181
对更新操作支持别名,如:UPDATE items T0 join month T1 on T0.id=T1.mid SET T0.price=T1.mprice;
并且对like支持二进制,如:LIKE BINARY xxx
TiDB MySQL protocol server #170
支持mysql-server协议,不再是一个嵌入式驱动,可像mysql那样通过mysql客户端连接。
doc: update README.md. #184
修改 README.md。
*: add autocommit judgment and test #183
对session的ServerStatusInTrans和ServerStatusInTrans 都合并到Status作为标志位,并且统一了修改状态的函数SetStatusFlag()。
table: Fix run xorm error #185
修复一个二进制解码错误。
例如:
drop table t if exists; CREATE TABLE test.t (c1 tinyint unsigned, c2 smallint unsigned, c3 int unsigned, c4 bigint unsigned, c5 double, c6 bit); insert test.t values (1, 2, 3, 4, 5, 6); select * from test.t where c1 = 1;
这里的最后一个6会返回null。
原因是这里没有TypeBit类型:
func (t *Table) unflatten(rec interface{}, col *column.Col) (interface{}, error) { if rec == nil { return nil, nil } switch col.Tp { case mysql.TypeFloat: return float32(rec.(float64)), nil case mysql.TypeTiny, mysql.TypeShort, mysql.TypeYear, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong, mysql.TypeDouble, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeBlob, mysql.TypeLongBlob, mysql.TypeVarchar, mysql.TypeString: return rec, nil case mysql.TypeDate, mysql.TypeDatetime, mysql.TypeTimestamp: var t mysql.Time t.Type = col.Tp t.Fsp = col.Decimal err := t.Unmarshal(rec.([]byte)) if err != nil { return nil, errors.Trace(err) } return t, nil case mysql.TypeDuration: return mysql.Duration{Duration: time.Duration(rec.(int64)), Fsp: col.Decimal}, nil case mysql.TypeNewDecimal, mysql.TypeDecimal: return mysql.ParseDecimal(rec.(string)) } log.Error(col.Tp, rec, reflect.TypeOf(rec)) return nil, nil }
加上即可。
tidb-server: Remove tidb-server binary file from repo #189
删除生成的可执行二进制文件。
table: Add the bit unit test #190
添加对PR185 的二进制的测试数据。
Makefile: able to specify binary location #186
Makefile中修改编译后可执行文件的位置。
support null safe <=> compare #187
支持<=>安全的比较null值。否则用=比较的话有null会返回null。
expressions: Extract builtin information functions to builtin_info.go #192
把builtinDatabase和builtinFoundRows独立出一个文件。
tidb-server: Add bootstrap methord to create. user table.#191
修改mysql内置表初始化函数CreateTiDBTestDatabase为Bootstrap,并增加了mysql.user表。
refactor subquery to support correlated subquery #182
支持了select * from t1 where c1 = (select c2 from t2 where t1.c2 = t2.c1);这样的语法。
rset: remove redundant rset layer. #202
清理了一些无用代码。
roadmap: Change status of MySQL protocol to checked.
修改了ROADMAP.md的开发进度描述。
Shenli/set password #195
支持set password 语法。
Add golint package get in makefile and update ci. #198
更新了makefile文件。
stmt/stmts: fix show stmt use current db bug. #206
修复获取当前数据库信息时的错误,运行下面查询为空。
use test; create table if not exists t (c int); show columns from t;
parser: make WhereClauseOptional return Expression.#201
修改了parser,更换了部分表达式绑定。
support show variables where syntax #200
支持如下SQL语句:
show variables where variable_name = 'autocommit';
Support basic create user statement #207
新增支持创建用户的SQL。
support bit type #196
支持bit类型
*: Remove leading comment when check IsQuery #210
对原来的自带tidb输入行忽略注释。已经存在的新版tidb-server不存在这个问题。
support boundary check for bit type #213
对插入bit类型数据检查最大长度限制。
if err = column.CastValues(ctx, r, cols); err != nil { return nil, errors.Trace(err) } if err = column.CheckNotNull(tableCols, r); err != nil { return nil, errors.Trace(err) } // Notes: incompatible with mysql // MySQL will set last insert id to the first row, as follows: // `t(id int AUTO_INCREMENT, c1 int, PRIMARY KEY (id))` // `insert t (c1) values(1),(2),(3);` // Last insert id will be 1, not 3. h, err := t.AddRecord(ctx, r) if err == nil { continue } if len(s.OnDuplicate) == 0 || !errors2.ErrorEqual(err, kv.ErrKeyExists) { return nil, errors.Trace(err) } // On duplicate key Update the duplicate row. // Evaluate the updated value. // TODO: report rows affected and last insert id. toUpdateColumns, err := getUpdateColumns(t, s.OnDuplicate, false, nil) if err != nil { return nil, errors.Trace(err) } data, err := t.Row(ctx, h) if err != nil { return nil, errors.Trace(err) } err = updateRecord(ctx, h, data, t, toUpdateColumns, s.OnDuplicate, r, nil) if err != nil { return nil, errors.Trace(err) } } return nil, nil }
在CastValues检查了长度限制。
expression: remove return error in Clone interface #211
删除某些不会返回错误的检查。
first MVCC support #209
支持MVCC,用Key -> META 以及Key_version->val来表示版本号,其中版本号越大数据越新,所以快照查询k的函数变成了:
func (s *dbSnapshot) Get(k kv.Key) ([]byte, error) { // engine Snapshot return nil, nil for value not found, // so here we will check nil and return kv.ErrNotExist. // get newest version, (0, MaxUint64) // Key arrangement: // Key -> META // ... // Key_ver // Key_ver-1 // Key_ver-2 // ... // Key_ver-n // Key_0 // NextKey -> META // NextKey_xxx startKey := MvccEncodeVersionKey(k, kv.Version{math.MaxUint64}) endKey := MvccEncodeVersionKey(k, kv.Version{0}) // get raw iterator it := s.Snapshot.NewIterator(startKey) defer it.Release() var rawKey []byte var v []byte if it.Next() { // If scan exceed this key's all versions // it.Key() > endKey. if kv.EncodedKey(it.Key()).Cmp(endKey) < 0 { // Check newest version of this key. // If it's tombstone, just skip it. if !isTombstone(it.Value()) { rawKey = it.Key() v = it.Value() } } } // No such key (or it's tombstone). if rawKey == nil { return nil, kv.ErrNotExist } return v, nil }
搜索版本变成从大到小。