code: func (h *BindHandle) Update(fullLoad bool) (err error) {
  	sql := "select original_sql, bind_sql, default_db, status, create_time, update_time, charset, collation from mysql.bind_info"
  	if !fullLoad {
  		sql += " where update_time >= \"" + h.lastUpdateTime.String() + "\""
  	}
  
  	// No need to acquire the session context lock for ExecRestrictedSQL, it
  	// uses another background session.
  	rows, _, err := h.sctx.Context.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(nil, sql)
  	if err != nil {
  		return err
  	}
  
  	// Make sure there is only one goroutine writes the cache.
  	h.bindInfo.Lock()
  	newCache := h.bindInfo.Value.Load().(cache).copy()
  	defer func() {
  		h.bindInfo.Value.Store(newCache)
  		h.bindInfo.Unlock()
  	}()
  
  	for _, row := range rows {
  		hash, meta, err := h.newBindMeta(newBindRecord(row))
  		// Update lastUpdateTime to the newest one.
  		if meta.UpdateTime.Compare(h.lastUpdateTime) > 0 {
  			h.lastUpdateTime = meta.UpdateTime
  		}
  		if err != nil {
  			logutil.Logger(context.Background()).Error("update bindinfo failed", zap.Error(err))
  			continue
  		}
  
  		newCache.removeStaleBindMetas(hash, meta)
  		if meta.Status == Using {
  			newCache[hash] = append(newCache[hash], meta)
  		}
  	}
  	return nil
  }
docs: // Update updates the global sql bind cache.