github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/pingcap/tidb/perfschema/init.go (about)

     1  // Copyright 2016 PingCAP, Inc.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package perfschema
    15  
    16  import (
    17  	"github.com/insionng/yougam/libraries/juju/errors"
    18  	"github.com/insionng/yougam/libraries/pingcap/tidb/meta/autoid"
    19  	"github.com/insionng/yougam/libraries/pingcap/tidb/model"
    20  	"github.com/insionng/yougam/libraries/pingcap/tidb/mysql"
    21  	"github.com/insionng/yougam/libraries/pingcap/tidb/table"
    22  	"github.com/insionng/yougam/libraries/pingcap/tidb/table/tables"
    23  	"github.com/insionng/yougam/libraries/pingcap/tidb/util/charset"
    24  	"github.com/insionng/yougam/libraries/pingcap/tidb/util/types"
    25  )
    26  
    27  type columnInfo struct {
    28  	tp    byte
    29  	size  int
    30  	flag  uint
    31  	deflt interface{}
    32  	elems []string
    33  }
    34  
    35  const (
    36  	// Maximum concurrent number of elements in table events_xxx_current.
    37  	// TODO: make it configurable?
    38  	currentElemMax int64 = 1024
    39  	// Maximum allowed number of elements in table events_xxx_history.
    40  	// TODO: make it configurable?
    41  	historyElemMax int64 = 1024
    42  )
    43  
    44  var setupActorsCols = []columnInfo{
    45  	{mysql.TypeString, 60, mysql.NotNullFlag, `%`, nil},
    46  	{mysql.TypeString, 32, mysql.NotNullFlag, `%`, nil},
    47  	{mysql.TypeString, 16, mysql.NotNullFlag, `%`, nil},
    48  	{mysql.TypeEnum, -1, mysql.NotNullFlag, "YES", []string{"YES", "NO"}},
    49  	{mysql.TypeEnum, -1, mysql.NotNullFlag, "YES", []string{"YES", "NO"}},
    50  }
    51  
    52  var setupObjectsCols = []columnInfo{
    53  	{mysql.TypeEnum, -1, mysql.NotNullFlag, "TABLE", []string{"EVENT", "FUNCTION", "TABLE"}},
    54  	{mysql.TypeVarchar, 64, 0, `%`, nil},
    55  	{mysql.TypeVarchar, 64, mysql.NotNullFlag, `%`, nil},
    56  	{mysql.TypeEnum, -1, mysql.NotNullFlag, "YES", []string{"YES", "NO"}},
    57  	{mysql.TypeEnum, -1, mysql.NotNullFlag, "YES", []string{"YES", "NO"}},
    58  }
    59  
    60  var setupInstrumentsCols = []columnInfo{
    61  	{mysql.TypeVarchar, 128, mysql.NotNullFlag, nil, nil},
    62  	{mysql.TypeEnum, -1, mysql.NotNullFlag, nil, []string{"YES", "NO"}},
    63  	{mysql.TypeEnum, -1, mysql.NotNullFlag, nil, []string{"YES", "NO"}},
    64  }
    65  
    66  var setupConsumersCols = []columnInfo{
    67  	{mysql.TypeVarchar, 64, mysql.NotNullFlag, nil, nil},
    68  	{mysql.TypeEnum, -1, mysql.NotNullFlag, nil, []string{"YES", "NO"}},
    69  }
    70  
    71  var setupTimersCols = []columnInfo{
    72  	{mysql.TypeVarchar, 64, mysql.NotNullFlag, nil, nil},
    73  	{mysql.TypeEnum, -1, mysql.NotNullFlag, nil, []string{"NANOSECOND", "MICROSECOND", "MILLISECOND"}},
    74  }
    75  
    76  var stmtsCurrentCols = []columnInfo{
    77  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
    78  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
    79  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
    80  	{mysql.TypeVarchar, 128, mysql.NotNullFlag, nil, nil},
    81  	{mysql.TypeVarchar, 64, 0, nil, nil},
    82  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
    83  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
    84  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
    85  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
    86  	{mysql.TypeLongBlob, -1, 0, nil, nil},
    87  	{mysql.TypeVarchar, 32, 0, nil, nil},
    88  	{mysql.TypeLongBlob, -1, 0, nil, nil},
    89  	{mysql.TypeVarchar, 64, 0, nil, nil},
    90  	{mysql.TypeVarchar, 64, 0, nil, nil},
    91  	{mysql.TypeVarchar, 64, 0, nil, nil},
    92  	{mysql.TypeVarchar, 64, 0, nil, nil},
    93  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
    94  	{mysql.TypeLong, 11, 0, nil, nil},
    95  	{mysql.TypeVarchar, 5, 0, nil, nil},
    96  	{mysql.TypeVarchar, 128, 0, nil, nil},
    97  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
    98  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
    99  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   100  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   101  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   102  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   103  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   104  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   105  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   106  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   107  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   108  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   109  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   110  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   111  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   112  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   113  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   114  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   115  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
   116  	{mysql.TypeEnum, -1, 0, nil, []string{"TRANSACTION", "STATEMENT", "STAGE"}},
   117  	{mysql.TypeLong, 11, 0, nil, nil},
   118  }
   119  
   120  var preparedStmtsInstancesCols = []columnInfo{
   121  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   122  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   123  	{mysql.TypeVarchar, 64, 0, nil, nil},
   124  	{mysql.TypeLongBlob, -1, mysql.NotNullFlag, nil, nil},
   125  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   126  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   127  	{mysql.TypeEnum, -1, 0, nil, []string{"EVENT", "FUNCTION", "TABLE"}},
   128  	{mysql.TypeVarchar, 64, 0, nil, nil},
   129  	{mysql.TypeVarchar, 64, 0, nil, nil},
   130  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   131  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   132  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   133  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   134  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   135  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   136  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   137  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   138  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   139  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   140  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   141  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   142  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   143  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   144  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   145  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   146  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   147  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   148  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   149  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   150  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   151  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   152  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   153  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   154  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   155  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   156  }
   157  
   158  var transCurrentCols = []columnInfo{
   159  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   160  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   161  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
   162  	{mysql.TypeVarchar, 128, mysql.NotNullFlag, nil, nil},
   163  	{mysql.TypeEnum, -1, 0, nil, []string{"ACTIVE", "COMMITTED", "ROLLED BACK"}},
   164  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   165  	{mysql.TypeVarchar, 64, 0, nil, nil},
   166  	{mysql.TypeLong, 11, 0, nil, nil},
   167  	{mysql.TypeVarchar, 130, 0, nil, nil},
   168  	{mysql.TypeVarchar, 130, 0, nil, nil},
   169  	{mysql.TypeVarchar, 64, 0, nil, nil},
   170  	{mysql.TypeVarchar, 64, 0, nil, nil},
   171  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
   172  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
   173  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
   174  	{mysql.TypeEnum, -1, 0, nil, []string{"READ ONLY", "READ WRITE"}},
   175  	{mysql.TypeVarchar, 64, 0, nil, nil},
   176  	{mysql.TypeEnum, -1, mysql.NotNullFlag, nil, []string{"YES", "NO"}},
   177  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
   178  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
   179  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
   180  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
   181  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
   182  	{mysql.TypeEnum, -1, 0, nil, []string{"TRANSACTION", "STATEMENT", "STAGE"}},
   183  }
   184  
   185  var stagesCurrentCols = []columnInfo{
   186  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   187  	{mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil},
   188  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
   189  	{mysql.TypeVarchar, 128, mysql.NotNullFlag, nil, nil},
   190  	{mysql.TypeVarchar, 64, 0, nil, nil},
   191  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
   192  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
   193  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
   194  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
   195  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
   196  	{mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil},
   197  	{mysql.TypeEnum, -1, 0, nil, []string{"TRANSACTION", "STATEMENT", "STAGE"}},
   198  }
   199  
   200  func createMemoryTable(meta *model.TableInfo, alloc autoid.Allocator) (table.Table, error) {
   201  	tbl, _ := tables.MemoryTableFromMeta(alloc, meta)
   202  	return tbl, nil
   203  }
   204  
   205  func createBoundedTable(meta *model.TableInfo, alloc autoid.Allocator, capacity int64) table.Table {
   206  	return tables.BoundedTableFromMeta(alloc, meta, capacity)
   207  }
   208  
   209  func (ps *perfSchema) buildTables() error {
   210  	tbls := make([]*model.TableInfo, 0, len(ps.tables))
   211  	dbID := autoid.GenLocalSchemaID()
   212  
   213  	for name, meta := range ps.tables {
   214  		tbls = append(tbls, meta)
   215  		meta.ID = autoid.GenLocalSchemaID()
   216  		for _, c := range meta.Columns {
   217  			c.ID = autoid.GenLocalSchemaID()
   218  		}
   219  		alloc := autoid.NewMemoryAllocator(dbID)
   220  
   221  		var tbl table.Table
   222  		switch name {
   223  		case TableStmtsCurrent, TablePreparedStmtsInstances, TableTransCurrent, TableStagesCurrent:
   224  			tbl = createBoundedTable(meta, alloc, currentElemMax)
   225  		case TableStmtsHistory, TableStmtsHistoryLong, TableTransHistory, TableTransHistoryLong, TableStagesHistory, TableStagesHistoryLong:
   226  			tbl = createBoundedTable(meta, alloc, historyElemMax)
   227  		default:
   228  			var err error
   229  			tbl, err = createMemoryTable(meta, alloc)
   230  			if err != nil {
   231  				return errors.Trace(err)
   232  			}
   233  		}
   234  		ps.mTables[name] = tbl
   235  	}
   236  	ps.dbInfo = &model.DBInfo{
   237  		ID:      dbID,
   238  		Name:    model.NewCIStr(Name),
   239  		Charset: mysql.DefaultCharset,
   240  		Collate: mysql.DefaultCollationName,
   241  		Tables:  tbls,
   242  	}
   243  	return nil
   244  }
   245  
   246  func (ps *perfSchema) buildModel(tbName string, colNames []string, cols []columnInfo) {
   247  	rcols := make([]*model.ColumnInfo, len(cols))
   248  	for i, col := range cols {
   249  		var ci *model.ColumnInfo
   250  		if col.elems == nil {
   251  			ci = buildUsualColumnInfo(i, colNames[i], col.tp, col.size, col.flag, col.deflt)
   252  		} else {
   253  			ci = buildEnumColumnInfo(i, colNames[i], col.elems, col.flag, col.deflt)
   254  		}
   255  		rcols[i] = ci
   256  	}
   257  
   258  	ps.tables[tbName] = &model.TableInfo{
   259  		Name:    model.NewCIStr(tbName),
   260  		Charset: "utf8",
   261  		Collate: "utf8",
   262  		Columns: rcols,
   263  	}
   264  }
   265  
   266  func buildUsualColumnInfo(offset int, name string, tp byte, size int, flag uint, def interface{}) *model.ColumnInfo {
   267  	mCharset := charset.CharsetBin
   268  	mCollation := charset.CharsetBin
   269  	if tp == mysql.TypeString || tp == mysql.TypeVarchar || tp == mysql.TypeBlob || tp == mysql.TypeLongBlob {
   270  		mCharset = mysql.DefaultCharset
   271  		mCollation = mysql.DefaultCollationName
   272  	}
   273  	if def == nil {
   274  		flag |= mysql.NoDefaultValueFlag
   275  	}
   276  	// TODO: does TypeLongBlob need size?
   277  	fieldType := types.FieldType{
   278  		Charset: mCharset,
   279  		Collate: mCollation,
   280  		Tp:      tp,
   281  		Flen:    size,
   282  		Flag:    uint(flag),
   283  	}
   284  	colInfo := &model.ColumnInfo{
   285  		Name:         model.NewCIStr(name),
   286  		Offset:       offset,
   287  		FieldType:    fieldType,
   288  		DefaultValue: def,
   289  		State:        model.StatePublic,
   290  	}
   291  	return colInfo
   292  }
   293  
   294  func buildEnumColumnInfo(offset int, name string, elems []string, flag uint, def interface{}) *model.ColumnInfo {
   295  	mCharset := charset.CharsetBin
   296  	mCollation := charset.CharsetBin
   297  	if def == nil {
   298  		flag |= mysql.NoDefaultValueFlag
   299  	}
   300  	fieldType := types.FieldType{
   301  		Charset: mCharset,
   302  		Collate: mCollation,
   303  		Tp:      mysql.TypeEnum,
   304  		Flag:    uint(flag),
   305  		Elems:   elems,
   306  	}
   307  	colInfo := &model.ColumnInfo{
   308  		Name:         model.NewCIStr(name),
   309  		Offset:       offset,
   310  		FieldType:    fieldType,
   311  		DefaultValue: def,
   312  		State:        model.StatePublic,
   313  	}
   314  	return colInfo
   315  }
   316  
   317  func (ps *perfSchema) initRecords(tbName string, records [][]types.Datum) error {
   318  	tbl, ok := ps.mTables[tbName]
   319  	if !ok {
   320  		return errInvalidPerfSchemaTable.Gen("Unknown PerformanceSchema table: %s", tbName)
   321  	}
   322  	for _, rec := range records {
   323  		_, err := tbl.AddRecord(nil, rec)
   324  		if err != nil {
   325  			return errors.Trace(err)
   326  		}
   327  	}
   328  	return nil
   329  }
   330  
   331  var setupTimersRecords [][]types.Datum
   332  
   333  func (ps *perfSchema) initialize() (err error) {
   334  	ps.tables = make(map[string]*model.TableInfo)
   335  	ps.mTables = make(map[string]table.Table, len(ps.tables))
   336  	ps.stmtHandles = make([]int64, currentElemMax)
   337  
   338  	allColDefs := [][]columnInfo{
   339  		setupActorsCols,
   340  		setupObjectsCols,
   341  		setupInstrumentsCols,
   342  		setupConsumersCols,
   343  		setupTimersCols,
   344  		stmtsCurrentCols,
   345  		stmtsCurrentCols, // same as above
   346  		stmtsCurrentCols, // same as above
   347  		preparedStmtsInstancesCols,
   348  		transCurrentCols,
   349  		transCurrentCols, // same as above
   350  		transCurrentCols, // same as above
   351  		stagesCurrentCols,
   352  		stagesCurrentCols, // same as above
   353  		stagesCurrentCols, // same as above
   354  	}
   355  
   356  	allColNames := [][]string{
   357  		ColumnSetupActors,
   358  		ColumnSetupObjects,
   359  		ColumnSetupInstruments,
   360  		ColumnSetupConsumers,
   361  		ColumnSetupTimers,
   362  		ColumnStmtsCurrent,
   363  		ColumnStmtsHistory,
   364  		ColumnStmtsHistoryLong,
   365  		ColumnPreparedStmtsInstances,
   366  		ColumnStmtsCurrent,
   367  		ColumnStmtsHistory,
   368  		ColumnStmtsHistoryLong,
   369  		ColumnStagesCurrent,
   370  		ColumnStagesHistory,
   371  		ColumnStagesHistoryLong,
   372  	}
   373  
   374  	// initialize all table, column and result field definitions
   375  	for i, def := range allColDefs {
   376  		ps.buildModel(PerfSchemaTables[i], allColNames[i], def)
   377  	}
   378  	err = ps.buildTables()
   379  	if err != nil {
   380  		return errors.Trace(err)
   381  	}
   382  
   383  	setupActorsRecords := [][]types.Datum{
   384  		types.MakeDatums(`%`, `%`, `%`, mysql.Enum{Name: "YES", Value: 1}, mysql.Enum{Name: "YES", Value: 1}),
   385  	}
   386  	err = ps.initRecords(TableSetupActors, setupActorsRecords)
   387  	if err != nil {
   388  		return errors.Trace(err)
   389  	}
   390  
   391  	setupObjectsRecords := [][]types.Datum{
   392  		types.MakeDatums(mysql.Enum{Name: "EVENT", Value: 1}, "mysql", `%`, mysql.Enum{Name: "NO", Value: 2}, mysql.Enum{Name: "NO", Value: 2}),
   393  		types.MakeDatums(mysql.Enum{Name: "EVENT", Value: 1}, "performance_schema", `%`, mysql.Enum{Name: "NO", Value: 2}, mysql.Enum{Name: "NO", Value: 2}),
   394  		types.MakeDatums(mysql.Enum{Name: "EVENT", Value: 1}, "information_schema", `%`, mysql.Enum{Name: "NO", Value: 2}, mysql.Enum{Name: "NO", Value: 2}),
   395  		types.MakeDatums(mysql.Enum{Name: "EVENT", Value: 1}, `%`, `%`, mysql.Enum{Name: "YES", Value: 1}, mysql.Enum{Name: "YES", Value: 1}),
   396  		types.MakeDatums(mysql.Enum{Name: "FUNCTION", Value: 2}, "mysql", `%`, mysql.Enum{Name: "NO", Value: 2}, mysql.Enum{Name: "NO", Value: 2}),
   397  		types.MakeDatums(mysql.Enum{Name: "FUNCTION", Value: 2}, "performance_schema", `%`, mysql.Enum{Name: "NO", Value: 2}, mysql.Enum{Name: "NO", Value: 2}),
   398  		types.MakeDatums(mysql.Enum{Name: "FUNCTION", Value: 2}, "information_schema", `%`, mysql.Enum{Name: "NO", Value: 2}, mysql.Enum{Name: "NO", Value: 2}),
   399  		types.MakeDatums(mysql.Enum{Name: "FUNCTION", Value: 2}, `%`, `%`, mysql.Enum{Name: "YES", Value: 1}, mysql.Enum{Name: "YES", Value: 1}),
   400  		types.MakeDatums(mysql.Enum{Name: "TABLE", Value: 3}, "mysql", `%`, mysql.Enum{Name: "NO", Value: 2}, mysql.Enum{Name: "NO", Value: 2}),
   401  		types.MakeDatums(mysql.Enum{Name: "TABLE", Value: 3}, "performance_schema", `%`, mysql.Enum{Name: "NO", Value: 2}, mysql.Enum{Name: "NO", Value: 2}),
   402  		types.MakeDatums(mysql.Enum{Name: "TABLE", Value: 3}, "information_schema", `%`, mysql.Enum{Name: "NO", Value: 2}, mysql.Enum{Name: "NO", Value: 2}),
   403  		types.MakeDatums(mysql.Enum{Name: "TABLE", Value: 3}, `%`, `%`, mysql.Enum{Name: "YES", Value: 1}, mysql.Enum{Name: "YES", Value: 1}),
   404  	}
   405  	err = ps.initRecords(TableSetupObjects, setupObjectsRecords)
   406  	if err != nil {
   407  		return errors.Trace(err)
   408  	}
   409  
   410  	setupConsumersRecords := [][]types.Datum{
   411  		types.MakeDatums("events_stages_current", mysql.Enum{Name: "NO", Value: 2}),
   412  		types.MakeDatums("events_stages_history", mysql.Enum{Name: "NO", Value: 2}),
   413  		types.MakeDatums("events_stages_history_long", mysql.Enum{Name: "NO", Value: 2}),
   414  		types.MakeDatums("events_statements_current", mysql.Enum{Name: "YES", Value: 1}),
   415  		types.MakeDatums("events_statements_history", mysql.Enum{Name: "YES", Value: 1}),
   416  		types.MakeDatums("events_statements_history_long", mysql.Enum{Name: "NO", Value: 2}),
   417  		types.MakeDatums("events_transactions_current", mysql.Enum{Name: "YES", Value: 1}),
   418  		types.MakeDatums("events_transactions_history", mysql.Enum{Name: "YES", Value: 1}),
   419  		types.MakeDatums("events_transactions_history_long", mysql.Enum{Name: "YES", Value: 1}),
   420  		types.MakeDatums("global_instrumentation", mysql.Enum{Name: "YES", Value: 1}),
   421  		types.MakeDatums("thread_instrumentation", mysql.Enum{Name: "YES", Value: 1}),
   422  		types.MakeDatums("statements_digest", mysql.Enum{Name: "YES", Value: 1}),
   423  	}
   424  	err = ps.initRecords(TableSetupConsumers, setupConsumersRecords)
   425  	if err != nil {
   426  		return errors.Trace(err)
   427  	}
   428  
   429  	setupTimersRecords = [][]types.Datum{
   430  		types.MakeDatums("stage", mysql.Enum{Name: "NANOSECOND", Value: 1}),
   431  		types.MakeDatums("statement", mysql.Enum{Name: "NANOSECOND", Value: 1}),
   432  		types.MakeDatums("transaction", mysql.Enum{Name: "NANOSECOND", Value: 1}),
   433  	}
   434  	err = ps.initRecords(TableSetupTimers, setupTimersRecords)
   435  	if err != nil {
   436  		return errors.Trace(err)
   437  	}
   438  
   439  	return nil
   440  }
   441  
   442  func (ps *perfSchema) GetDBMeta() *model.DBInfo {
   443  	return ps.dbInfo
   444  }
   445  
   446  func (ps *perfSchema) GetTable(name string) (table.Table, bool) {
   447  	tbl, ok := ps.mTables[name]
   448  	return tbl, ok
   449  }