docs: @SuppressWarnings("unchecked")
    public <T> T getObject(int columnIndex, Class<T> type) throws SQLException {
      if (type == null) {
        throw new SQLException("Class type cannot be null");
      }
      checkObjectRange(columnIndex);
      if (row.lastValueWasNull()) {
        return null;
      }
      ColumnInformation col = columnsInformation[columnIndex - 1];
  
      if (type.equals(String.class)) {
        return (T) row.getInternalString(col, null, timeZone);
  
      } else if (type.equals(Integer.class)) {
        return (T) (Integer) row.getInternalInt(col);
  
      } else if (type.equals(Long.class)) {
        return (T) (Long) row.getInternalLong(col);
  
      } else if (type.equals(Short.class)) {
        return (T) (Short) row.getInternalShort(col);
  
      } else if (type.equals(Double.class)) {
        return (T) (Double) row.getInternalDouble(col);
  
      } else if (type.equals(Float.class)) {
        return (T) (Float) row.getInternalFloat(col);
  
      } else if (type.equals(Byte.class)) {
        return (T) (Byte) row.getInternalByte(col);
  
      } else if (type.equals(byte[].class)) {
        byte[] data = new byte[row.getLengthMaxFieldSize()];
        System.arraycopy(row.buf, row.pos, data, 0, row.getLengthMaxFieldSize());
        return (T) data;
  
      } else if (type.equals(Date.class)) {
        return (T) row.getInternalDate(col, null, timeZone);
  
      } else if (type.equals(Time.class)) {
        return (T) row.getInternalTime(col, null, timeZone);
  
      } else if (type.equals(Timestamp.class) || type.equals(java.util.Date.class)) {
        return (T) row.getInternalTimestamp(col, null, timeZone);
  
      } else if (type.equals(Boolean.class)) {
        return (T) (Boolean) row.getInternalBoolean(col);
  
      } else if (type.equals(Calendar.class)) {
        Calendar calendar = Calendar.getInstance(timeZone);
        Timestamp timestamp = row.getInternalTimestamp(col, null, timeZone);
        if (timestamp == null) {
          return null;
        }
        calendar.setTimeInMillis(timestamp.getTime());
        return type.cast(calendar);
  
      } else if (type.equals(Clob.class) || type.equals(NClob.class)) {
        return (T) new MariaDbClob(row.buf, row.pos, row.getLengthMaxFieldSize());
  
      } else if (type.equals(InputStream.class)) {
        return (T) new ByteArrayInputStream(row.buf, row.pos, row.getLengthMaxFieldSize());
  
      } else if (type.equals(Reader.class)) {
        String value = row.getInternalString(col, null, timeZone);
        if (value == null) {
          return null;
        }
        return (T) new StringReader(value);
  
      } else if (type.equals(BigDecimal.class)) {
        return (T) row.getInternalBigDecimal(col);
  
      } else if (type.equals(BigInteger.class)) {
        return (T) row.getInternalBigInteger(col);
      } else if (type.equals(BigDecimal.class)) {
        return (T) row.getInternalBigDecimal(col);
  
      } else if (type.equals(LocalDateTime.class)) {
        ZonedDateTime zonedDateTime = row
            .getInternalZonedDateTime(col, LocalDateTime.class, timeZone);
        return zonedDateTime == null ? null
            : type.cast(zonedDateTime.withZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime());
  
      } else if (type.equals(ZonedDateTime.class)) {
        ZonedDateTime zonedDateTime = row
            .getInternalZonedDateTime(col, ZonedDateTime.class, timeZone);
        if (zonedDateTime == null) {
          return null;
        }
        return type.cast(row.getInternalZonedDateTime(col, ZonedDateTime.class, timeZone));
  
      } else if (type.equals(OffsetDateTime.class)) {
        ZonedDateTime tmpZonedDateTime = row
            .getInternalZonedDateTime(col, OffsetDateTime.class, timeZone);
        return tmpZonedDateTime == null ? null : type.cast(tmpZonedDateTime.toOffsetDateTime());
  
      } else if (type.equals(OffsetDateTime.class)) {
        LocalDate localDate = row.getInternalLocalDate(col, timeZone);
        if (localDate == null) {
          return null;
        }
        return type.cast(localDate);
  
      } else if (type.equals(LocalDate.class)) {
        LocalDate localDate = row.getInternalLocalDate(col, timeZone);
        if (localDate == null) {
          return null;
        }
        return type.cast(localDate);
  
      } else if (type.equals(LocalTime.class)) {
        LocalTime localTime = row.getInternalLocalTime(col, timeZone);
        if (localTime == null) {
          return null;
        }
        return type.cast(localTime);
  
      } else if (type.equals(OffsetTime.class)) {
        OffsetTime offsetTime = row.getInternalOffsetTime(col, timeZone);
        if (offsetTime == null) {
          return null;
        }
        return type.cast(offsetTime);
  
      }
      throw ExceptionMapper
          .getFeatureNotSupportedException("Type class '" + type.getName() + "' is not supported");
  
    }