code: func Init() {
  	initOnce := func() {
  		p := parser.New()
  		tbls := make([]*model.TableInfo, 0)
  		dbID := autoid.GenLocalSchemaID()
  
  		for _, sql := range perfSchemaTables {
  			stmt, err := p.ParseOneStmt(sql, "", "")
  			if err != nil {
  				panic(err)
  			}
  			meta, err := ddl.BuildTableInfoFromAST(stmt.(*ast.CreateTableStmt))
  			if err != nil {
  				panic(err)
  			}
  			tbls = append(tbls, meta)
  			meta.ID = autoid.GenLocalSchemaID()
  			for _, c := range meta.Columns {
  				c.ID = autoid.GenLocalSchemaID()
  			}
  		}
  		dbInfo := &model.DBInfo{
  			ID:      dbID,
  			Name:    model.NewCIStr(Name),
  			Charset: mysql.DefaultCharset,
  			Collate: mysql.DefaultCollationName,
  			Tables:  tbls,
  		}
  		infoschema.RegisterVirtualTable(dbInfo, tableFromMeta)
  	}
  	if expression.EvalAstExpr != nil {
  		once.Do(initOnce)
  	}
  }
docs: // Init register the PERFORMANCE_SCHEMA virtual tables.
  // It should be init(), and the ideal usage should be:
  //
  // import _ "github.com/pingcap/tidb/perfschema"
  //
  // This function depends on plan/core.init(), which initialize the expression.EvalAstExpr function.
  // The initialize order is a problem if init() is used as the function name.