Skip to content

Commit

Permalink
server: optimize com_field_list, make use database faster. (#5677) (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
winkyao authored and jackysp committed Jan 19, 2018
1 parent 78f1023 commit fb60b79
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 10 deletions.
16 changes: 6 additions & 10 deletions server/driver_tidb.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import (
"github.com/pingcap/tidb/ast"
"github.com/pingcap/tidb/kv"
"github.com/pingcap/tidb/mysql"
"github.com/pingcap/tidb/terror"
"github.com/pingcap/tidb/util"
"github.com/pingcap/tidb/util/auth"
"github.com/pingcap/tidb/util/types"
Expand Down Expand Up @@ -230,19 +229,16 @@ func (tc *TiDBContext) Auth(user *auth.UserIdentity, auth []byte, salt []byte) b
}

// FieldList implements QueryCtx FieldList method.
func (tc *TiDBContext) FieldList(table string) (colums []*ColumnInfo, err error) {
rs, err := tc.Execute("SELECT * FROM `" + table + "` LIMIT 0")
if len(rs) > 0 {
defer terror.Call(rs[0].Close)
}
func (tc *TiDBContext) FieldList(table string) (columns []*ColumnInfo, err error) {
fields, err := tc.session.FieldList(table)
if err != nil {
return nil, errors.Trace(err)
}
colums, err = rs[0].Columns()
if err != nil {
return nil, errors.Trace(err)
columns = make([]*ColumnInfo, 0, len(fields))
for _, f := range fields {
columns = append(columns, convertColumnInfo(f))
}
return
return columns, nil
}

// GetStatement implements QueryCtx GetStatement method.
Expand Down
69 changes: 69 additions & 0 deletions server/tidb_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -401,3 +401,72 @@ func (ts *TidbTestSuite) TestShowCreateTableFlen(c *C) {
c.Assert(int(cols[0].ColumnLength), Equals, 5*tmysql.MaxBytesOfCharacter)
c.Assert(int(cols[1].ColumnLength), Equals, len(row[1].GetString())*tmysql.MaxBytesOfCharacter)
}

func checkColNames(c *C, columns []*ColumnInfo, names ...string) {
for i, name := range names {
c.Assert(columns[i].Name, Equals, name)
c.Assert(columns[i].OrgName, Equals, name)
}
}

func (ts *TidbTestSuite) TestFieldList(c *C) {
ctx, err := ts.tidbdrv.OpenCtx(uint64(0), 0, uint8(tmysql.DefaultCollationID), "test", nil)
c.Assert(err, IsNil)
_, err = ctx.Execute("use test;")
c.Assert(err, IsNil)

testSQL := `create table t (
c_bit bit(10),
c_int_d int,
c_bigint_d bigint,
c_float_d float,
c_double_d double,
c_decimal decimal(6, 3),
c_datetime datetime(2),
c_time time(3),
c_date date,
c_timestamp timestamp(4) DEFAULT CURRENT_TIMESTAMP(4),
c_char char(20),
c_varchar varchar(20),
c_text_d text,
c_binary binary(20),
c_blob_d blob,
c_set set('a', 'b', 'c'),
c_enum enum('a', 'b', 'c'),
c_json JSON,
c_year year
)`
_, err = ctx.Execute(testSQL)
c.Assert(err, IsNil)
colInfos, err := ctx.FieldList("t")
c.Assert(err, IsNil)
c.Assert(len(colInfos), Equals, 19)

checkColNames(c, colInfos, "c_bit", "c_int_d", "c_bigint_d", "c_float_d",
"c_double_d", "c_decimal", "c_datetime", "c_time", "c_date", "c_timestamp",
"c_char", "c_varchar", "c_text_d", "c_binary", "c_blob_d", "c_set", "c_enum",
"c_json", "c_year")

for _, cols := range colInfos {
c.Assert(cols.Schema, Equals, "test")
}

for _, cols := range colInfos {
c.Assert(cols.Table, Equals, "t")
}

for i, col := range colInfos {
switch i {
case 10, 11, 12, 15, 16:
// c_char char(20), c_varchar varchar(20), c_text_d text,
// c_set set('a', 'b', 'c'), c_enum enum('a', 'b', 'c')
c.Assert(col.Charset, Equals, uint16(tmysql.CharsetIDs["utf8"]), Commentf("index %d", i))
continue
}

c.Assert(col.Charset, Equals, uint16(tmysql.CharsetIDs["binary"]), Commentf("index %d", i))
}

// c_decimal decimal(6, 3)
c.Assert(colInfos[5].Decimal, Equals, uint8(3))
}
28 changes: 28 additions & 0 deletions session.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import (
"github.com/pingcap/tidb/executor"
"github.com/pingcap/tidb/kv"
"github.com/pingcap/tidb/meta"
"github.com/pingcap/tidb/model"
"github.com/pingcap/tidb/mysql"
"github.com/pingcap/tidb/parser"
"github.com/pingcap/tidb/plan/cache"
Expand Down Expand Up @@ -84,6 +85,8 @@ type Session interface {
ShowProcess() util.ProcessInfo
// PrePareTxnCtx is exported for test.
PrepareTxnCtx()
// FieldList returns fields list of a table.
FieldList(tableName string) (fields []*ast.ResultField, err error)
}

var (
Expand Down Expand Up @@ -219,6 +222,31 @@ func (s *session) GetSessionManager() util.SessionManager {
return s.sessionManager
}

// FieldList returns fields list of a table.
func (s *session) FieldList(tableName string) ([]*ast.ResultField, error) {
is := executor.GetInfoSchema(s)
dbName := model.NewCIStr(s.GetSessionVars().CurrentDB)
tName := model.NewCIStr(tableName)
table, err := is.TableByName(dbName, tName)
if err != nil {
return nil, errors.Trace(err)
}

cols := table.Cols()
fields := make([]*ast.ResultField, 0, len(cols))
for _, col := range table.Cols() {
rf := &ast.ResultField{
ColumnAsName: col.Name,
TableAsName: tName,
DBName: dbName,
Table: table.Meta(),
Column: col.ColumnInfo,
}
fields = append(fields, rf)
}
return fields, nil
}

type schemaLeaseChecker struct {
domain.SchemaValidator
schemaVer int64
Expand Down

0 comments on commit fb60b79

Please sign in to comment.