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 }