code: func (e *InsertValues) setValueForRefColumn(row []types.Datum, hasValue []bool) error {
  	for i, c := range e.Table.Cols() {
  		d, err := e.getColDefaultValue(i, c)
  		if err == nil {
  			row[i] = d
  			if !mysql.HasAutoIncrementFlag(c.Flag) {
  				// It is an interesting behavior in MySQL.
  				// If the value of auto ID is not explicit, MySQL use 0 value for auto ID when it is
  				// evaluated by another column, but it should be used once only.
  				// When we fill it as an auto ID column, it should be set as it used to be.
  				// So just keep `hasValue` false for auto ID, and the others set true.
  				hasValue[c.Offset] = true
  			}
  		} else if table.ErrNoDefaultValue.Equal(err) {
  			row[i] = table.GetZeroValue(c.ToInfo())
  			hasValue[c.Offset] = false
  		} else if e.filterErr(err) != nil {
  			return err
  		}
  	}
  	return nil
  }
docs: // setValueForRefColumn set some default values for the row to eval the row value with other columns,
  // it follows these rules:
  //     1. for nullable and no default value column, use NULL.
  //     2. for nullable and have default value column, use it's default value.
  //     3. for not null column, use zero value even in strict mode.
  //     4. for auto_increment column, use zero value.
  //     5. for generated column, use NULL.