/**
   * Extract value from SQL result
   *
   * @param result ResultSet that must contain contain time, severity, ..., value
   * @param handle_array Try to read array elements, or only a scalar value?
   * @return IValue Decoded IValue
   * @throws Exception on error, including cancellation
   */
  protected VType decodeSampleTableValue(final ResultSet result, final boolean handle_array)
      throws Exception {
    // Get time stamp
    final java.sql.Timestamp stamp = result.getTimestamp(1);
    // Oracle has nanoseconds in TIMESTAMP, other RDBs in separate column
    if (!reader.isOracle()) stamp.setNanos(result.getInt(7));
    final Timestamp time = TimestampHelper.fromSQLTimestamp(stamp);

    // Get severity/status
    final String status = reader.getStatus(result.getInt(3));
    final AlarmSeverity severity = filterSeverity(reader.getSeverity(result.getInt(2)), status);

    // Determine the value type
    // Try double
    final double dbl0 = result.getDouble(5);
    if (!result.wasNull()) {
      // Is it an error to have enumeration strings for double samples?
      // In here, we handle it by returning enumeration samples,
      // because the meta data would be wrong for double values.
      if (labels != null) return new ArchiveVEnum(time, severity, status, labels, (int) dbl0);
      // Double data.
      if (handle_array) { // Get array elements - if any.
        final double data[] =
            reader.useArrayBlob()
                ? readBlobArrayElements(dbl0, result)
                : readArrayElements(time, dbl0, severity);
        if (data.length == 1) return new ArchiveVNumber(time, severity, status, display, data[0]);
        else return new ArchiveVNumberArray(time, severity, status, display, data);
      } else return new ArchiveVNumber(time, severity, status, display, dbl0);
    }

    // Try integer
    final int num = result.getInt(4);
    if (!result.wasNull()) { // Enumerated integer?
      if (labels != null) return new ArchiveVEnum(time, severity, status, labels, num);
      return new ArchiveVNumber(time, severity, status, display, num);
    }

    // Default to string
    final String txt = result.getString(6);
    return new ArchiveVString(time, severity, status, txt);
  }