code: func (h *Handle) RecalculateExpectCount(q *statistics.QueryFeedback) error {
  	t, ok := h.StatsCache.Load().(StatsCache)[q.PhysicalID]
  	if !ok {
  		return nil
  	}
  	tablePseudo := t.Pseudo || t.IsOutdated()
  	if !tablePseudo {
  		return nil
  	}
  	isIndex := q.Hist.Tp.Tp == mysql.TypeBlob
  	id := q.Hist.ID
  	if isIndex && (t.Indices[id] == nil || !t.Indices[id].NotAccurate()) {
  		return nil
  	}
  	if !isIndex && (t.Columns[id] == nil || !t.Columns[id].NotAccurate()) {
  		return nil
  	}
  
  	sc := &stmtctx.StatementContext{TimeZone: time.UTC}
  	ranges, err := q.DecodeToRanges(isIndex)
  	if err != nil {
  		return errors.Trace(err)
  	}
  	expected := 0.0
  	if isIndex {
  		idx := t.Indices[id]
  		expected, err = idx.GetRowCount(sc, ranges, t.ModifyCount)
  		expected *= idx.GetIncreaseFactor(t.Count)
  	} else {
  		c := t.Columns[id]
  		expected, err = c.GetColumnRowCount(sc, ranges, t.ModifyCount)
  		expected *= c.GetIncreaseFactor(t.Count)
  	}
  	if err != nil {
  		return errors.Trace(err)
  	}
  	q.Expected = int64(expected)
  	return nil
  }
docs: // RecalculateExpectCount recalculates the expect row count if the origin row count is estimated by pseudo.