code: func (e *InsertValues) fillRow(row []types.Datum, hasValue []bool) ([]types.Datum, error) {
  	gIdx := 0
  	for i, c := range e.Table.Cols() {
  		var err error
  		// Get the default value for all no value columns, the auto increment column is different from the others.
  		row[i], err = e.fillColValue(row[i], i, c, hasValue[i])
  		if err != nil {
  			return nil, err
  		}
  
  		// Evaluate the generated columns.
  		if c.IsGenerated() {
  			var val types.Datum
  			val, err = e.GenExprs[gIdx].Eval(chunk.MutRowFromDatums(row).ToRow())
  			gIdx++
  			if e.filterErr(err) != nil {
  				return nil, err
  			}
  			row[i], err = table.CastValue(e.ctx, val, c.ToInfo())
  			if err != nil {
  				return nil, err
  			}
  		}
  
  		// Handle the bad null error.
  		if row[i], err = c.HandleBadNull(row[i], e.ctx.GetSessionVars().StmtCtx); err != nil {
  			return nil, err
  		}
  	}
  	return row, nil
  }
docs: // fillRow fills generated columns, auto_increment column and empty column.
  // For NOT NULL column, it will return error or use zero value based on sql_mode.