code: func (p *LogicalProjection) buildSchemaByExprs() *expression.Schema {
  	schema := expression.NewSchema(make([]*expression.Column, 0, p.schema.Len())...)
  	for _, expr := range p.Exprs {
  		if col, isCol := expr.(*expression.Column); isCol {
  			schema.Append(col)
  		} else {
  			// If the expression is not a column, we add a column to occupy the position.
  			schema.Append(&expression.Column{
  				UniqueID: p.ctx.GetSessionVars().AllocPlanColumnID(),
  				RetType:  expr.GetType(),
  			})
  		}
  	}
  	return schema
  }
docs: // A bijection exists between columns of a projection's schema and this projection's Exprs.
  // Sometimes we need a schema made by expr of Exprs to convert a column in child's schema to a column in this projection's Schema.