code: func (p *MySQLPrivilege) LoadUserTable(ctx sessionctx.Context) error {
  	err := p.loadTable(ctx, "select HIGH_PRIORITY Host,User,Password,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Process_priv,Grant_priv,References_priv,Alter_priv,Show_db_priv,Super_priv,Execute_priv,Create_view_priv,Show_view_priv,Index_priv,Create_user_priv,Trigger_priv,Create_role_priv,Drop_role_priv,account_locked from mysql.user;", p.decodeUserTableRow)
  	if err != nil {
  		return errors.Trace(err)
  	}
  	// See https://dev.mysql.com/doc/refman/8.0/en/connection-access.html
  	// When multiple matches are possible, the server must determine which of them to use. It resolves this issue as follows:
  	// 1. Whenever the server reads the user table into memory, it sorts the rows.
  	// 2. When a client attempts to connect, the server looks through the rows in sorted order.
  	// 3. The server uses the first row that matches the client host name and user name.
  	// The server uses sorting rules that order rows with the most-specific Host values first.
  	p.SortUserTable()
  	return nil
  }
docs: // LoadUserTable loads the mysql.user table from database.