code: func (is *PhysicalIndexScan) initSchema(id int, idx *model.IndexInfo, isDoubleRead bool) {
  	indexCols := make([]*expression.Column, 0, len(idx.Columns))
  	for _, col := range idx.Columns {
  		colFound := is.dataSourceSchema.FindColumnByName(col.Name.L)
  		if colFound == nil {
  			colFound = &expression.Column{
  				ColName:  col.Name,
  				RetType:  &is.Table.Columns[col.Offset].FieldType,
  				UniqueID: is.ctx.GetSessionVars().AllocPlanColumnID(),
  			}
  		} else {
  			colFound = colFound.Clone().(*expression.Column)
  		}
  		indexCols = append(indexCols, colFound)
  	}
  	setHandle := false
  	for _, col := range is.Columns {
  		if (mysql.HasPriKeyFlag(col.Flag) && is.Table.PKIsHandle) || col.ID == model.ExtraHandleID {
  			indexCols = append(indexCols, is.dataSourceSchema.FindColumnByName(col.Name.L))
  			setHandle = true
  			break
  		}
  	}
  	// If it's double read case, the first index must return handle. So we should add extra handle column
  	// if there isn't a handle column.
  	if isDoubleRead && !setHandle {
  		indexCols = append(indexCols, &expression.Column{ID: model.ExtraHandleID, ColName: model.ExtraHandleName, UniqueID: is.ctx.GetSessionVars().AllocPlanColumnID()})
  	}
  	is.SetSchema(expression.NewSchema(indexCols...))
  }
docs: // TODO: refactor this part, we should not call Clone in fact.