code: func DecodeRawRowData(ctx sessionctx.Context, meta *model.TableInfo, h int64, cols []*table.Column,
  	value []byte) ([]types.Datum, map[int64]types.Datum, error) {
  	v := make([]types.Datum, len(cols))
  	colTps := make(map[int64]*types.FieldType, len(cols))
  	for i, col := range cols {
  		if col == nil {
  			continue
  		}
  		if col.IsPKHandleColumn(meta) {
  			if mysql.HasUnsignedFlag(col.Flag) {
  				v[i].SetUint64(uint64(h))
  			} else {
  				v[i].SetInt64(h)
  			}
  			continue
  		}
  		colTps[col.ID] = &col.FieldType
  	}
  	rowMap, err := tablecodec.DecodeRow(value, colTps, ctx.GetSessionVars().Location())
  	if err != nil {
  		return nil, rowMap, err
  	}
  	defaultVals := make([]types.Datum, len(cols))
  	for i, col := range cols {
  		if col == nil {
  			continue
  		}
  		if col.IsPKHandleColumn(meta) {
  			continue
  		}
  		ri, ok := rowMap[col.ID]
  		if ok {
  			v[i] = ri
  			continue
  		}
  		v[i], err = GetColDefaultValue(ctx, col, defaultVals)
  		if err != nil {
  			return nil, rowMap, err
  		}
  	}
  	return v, rowMap, nil
  }
docs: // DecodeRawRowData decodes raw row data into a datum slice and a (columnID:columnValue) map.