code: func (e *InsertValues) evalRow(list []expression.Expression, rowIdx int) ([]types.Datum, error) {
  	rowLen := len(e.Table.Cols())
  	if e.hasExtraHandle {
  		rowLen++
  	}
  	row := make([]types.Datum, rowLen)
  	hasValue := make([]bool, rowLen)
  
  	// For statements like `insert into t set a = b + 1`.
  	if e.hasRefCols {
  		if err := e.setValueForRefColumn(row, hasValue); err != nil {
  			return nil, err
  		}
  	}
  
  	e.evalBuffer.SetDatums(row...)
  	for i, expr := range list {
  		val, err := expr.Eval(e.evalBuffer.ToRow())
  		if err = e.handleErr(e.insertColumns[i], &val, rowIdx, err); err != nil {
  			return nil, err
  		}
  		val1, err := table.CastValue(e.ctx, val, e.insertColumns[i].ToInfo())
  		if err = e.handleErr(e.insertColumns[i], &val, rowIdx, err); err != nil {
  			return nil, err
  		}
  
  		offset := e.insertColumns[i].Offset
  		row[offset], hasValue[offset] = *val1.Copy(), true
  		e.evalBuffer.SetDatum(offset, val1)
  	}
  
  	return e.fillRow(row, hasValue)
  }
docs: // evalRow evaluates a to-be-inserted row. The value of the column may base on another column,
  // so we use setValueForRefColumn to fill the empty row some default values when needFillDefaultValues is true.