public static void checkObjectByteInfo(ObjectInspector objectInspector,
      byte[] bytes, int offset, RecordInfo recordInfo, VInt vInt) {
    Category category = objectInspector.getCategory();
    switch (category) {
    case PRIMITIVE:
      PrimitiveCategory primitiveCategory = ((PrimitiveObjectInspector) objectInspector)
          .getPrimitiveCategory();
      switch (primitiveCategory) {
      case VOID:
        recordInfo.elementOffset = 0;
        recordInfo.elementSize = 0;
        break;
      case BOOLEAN:
      case BYTE:
        recordInfo.elementOffset = 0;
        recordInfo.elementSize = 1;
        break;
      case SHORT:
        recordInfo.elementOffset = 0;
        recordInfo.elementSize = 2;
        break;
      case FLOAT:
        recordInfo.elementOffset = 0;
        recordInfo.elementSize = 4;
        break;
      case DOUBLE:
        recordInfo.elementOffset = 0;
        recordInfo.elementSize = 8;
        break;
      case INT:
        recordInfo.elementOffset = 0;
        recordInfo.elementSize = WritableUtils.decodeVIntSize(bytes[offset]);
        break;
      case LONG:
        recordInfo.elementOffset = 0;
        recordInfo.elementSize = WritableUtils.decodeVIntSize(bytes[offset]);
        break;
      case STRING:
        // using vint instead of 4 bytes
        LazyBinaryUtils.readVInt(bytes, offset, vInt);
        recordInfo.elementOffset = vInt.length;
        recordInfo.elementSize = vInt.value;
        break;
      case CHAR:
      case VARCHAR:
        LazyBinaryUtils.readVInt(bytes, offset, vInt);
        recordInfo.elementOffset = vInt.length;
        recordInfo.elementSize = vInt.value;
        break;
      case BINARY:
        // using vint instead of 4 bytes
        LazyBinaryUtils.readVInt(bytes, offset, vInt);
        recordInfo.elementOffset = vInt.length;
        recordInfo.elementSize = vInt.value;
        break;
      case DATE:
        recordInfo.elementOffset = 0;
        recordInfo.elementSize = WritableUtils.decodeVIntSize(bytes[offset]);
        break;
      case TIMESTAMP:
        recordInfo.elementOffset = 0;
        recordInfo.elementSize = TimestampWritableV2.getTotalLength(bytes, offset);
        break;
      case TIMESTAMPLOCALTZ:
        recordInfo.elementOffset = 0;
        recordInfo.elementSize = TimestampLocalTZWritable.getTotalLength(bytes, offset);
        break;
      case INTERVAL_YEAR_MONTH:
        recordInfo.elementOffset = 0;
        recordInfo.elementSize = WritableUtils.decodeVIntSize(bytes[offset]);
        break;
      case INTERVAL_DAY_TIME:
        recordInfo.elementOffset = 0;
        int secondsSize = WritableUtils.decodeVIntSize(bytes[offset]);
        int nanosSize = WritableUtils.decodeVIntSize(bytes[offset + secondsSize]);
        recordInfo.elementSize = secondsSize + nanosSize;
        break;
      case DECIMAL:
        // using vint instead of 4 bytes
        LazyBinaryUtils.readVInt(bytes, offset, vInt);
        recordInfo.elementOffset = 0;
        recordInfo.elementSize = vInt.length;
        LazyBinaryUtils.readVInt(bytes, offset + vInt.length, vInt);
        recordInfo.elementSize += vInt.length + vInt.value;
        break;
      default: {
        throw new RuntimeException("Unrecognized primitive type: "
            + primitiveCategory);
      }
      }
      break;
    case LIST:
    case MAP:
    case STRUCT:
    case UNION:
      recordInfo.elementOffset = 4;
      recordInfo.elementSize = LazyBinaryUtils.byteArrayToInt(bytes, offset);
      break;
    default: {
      throw new RuntimeException("Unrecognized non-primitive type: " + category);
    }
    }
  }
Check a particular field and set its size and offset in bytes based on the
field type and the bytes arrays.

For void, boolean, byte, short, int, long, float and double, there is no
offset and the size is fixed. For string, map, list, struct, the first four
bytes are used to store the size. So the offset is 4 and the size is
computed by concating the first four bytes together. The first four bytes
are defined with respect to the offset in the bytes arrays.
For timestamp, if the first bit is 0, the record length is 4, otherwise
a VInt begins at the 5th byte and its length is added to 4.

@param objectInspector
         object inspector of the field
@param bytes
         bytes arrays store the table row
@param offset
         offset of this field
@param recordInfo
         modify this byteinfo object and return it
serde/src/java/org/apache/hadoop/hive/serde2/lazybinary/LazyBinaryUtils.java