code: @Override
    int readCheckpoint(ReadStream is,
                       byte[] blockBuffer, int rowOffset, int rowLength,
                       int blobTail)
      throws IOException
    {
      int blobLen = BitsUtil.readInt16(is);
      int colOffset = rowOffset + offset();
  
      if (blobLen != 0) {
        int sublen = blobLen & ~LARGE_BLOB_MASK;
        
        int newBlobTail = blobTail + sublen;
        
        if (rowOffset <= newBlobTail) {
          return -1;
        }
        
        is.readAll(blockBuffer, blobTail, sublen);
        
        BitsUtil.writeInt16(blockBuffer, colOffset, blobTail);
        BitsUtil.writeInt16(blockBuffer, colOffset + 2, blobLen);
        
        // System.out.println("READ: " + Hex.toHex(blockBuffer, rowOffset, 12) + " " + Hex.toHex(blockBuffer, blobTail, sublen));
        
        return newBlobTail;
      }
      else {
        BitsUtil.writeInt16(blockBuffer, colOffset, 0);
        BitsUtil.writeInt16(blockBuffer, colOffset + 2, 0);
        
        return blobTail;
      }
    }
docs: Reads checkpoint blob data from the stream into the current block.
  
  If the block is full, returns -1.
  
  @param is the source stream for the checkpoint
  @param blockBuffer the target block to be filled
  @param rowOffset the offset of the row being filled
  @param rowLength the rowLength
  @param blobTail the inline-blob's tail pointer.
  
  @return the new blob tail pointer or -1 if the blob doesn't fit.