docs: @Override
    public Object getObject(String type, String value, byte[] byteValue) throws SQLException {
      if (typemap != null) {
        Class<?> c = typemap.get(type);
        if (c != null) {
          // Handle the type (requires SQLInput & SQLOutput classes to be implemented)
          throw new PSQLException(GT.tr("Custom type maps are not supported."),
              PSQLState.NOT_IMPLEMENTED);
        }
      }
  
      PGobject obj = null;
  
      if (LOGGER.isLoggable(Level.FINEST)) {
        LOGGER.log(Level.FINEST, "Constructing object from type={0} value=<{1}>", new Object[]{type, value});
      }
  
      try {
        Class<? extends PGobject> klass = typeCache.getPGobject(type);
  
        // If className is not null, then try to instantiate it,
        // It must be basetype PGobject
  
        // This is used to implement the org.postgresql unique types (like lseg,
        // point, etc).
  
        if (klass != null) {
          obj = klass.newInstance();
          obj.setType(type);
          if (byteValue != null && obj instanceof PGBinaryObject) {
            PGBinaryObject binObj = (PGBinaryObject) obj;
            binObj.setByteValue(byteValue, 0);
          } else {
            obj.setValue(value);
          }
        } else {
          // If className is null, then the type is unknown.
          // so return a PGobject with the type set, and the value set
          obj = new PGobject();
          obj.setType(type);
          obj.setValue(value);
        }
  
        return obj;
      } catch (SQLException sx) {
        // rethrow the exception. Done because we capture any others next
        throw sx;
      } catch (Exception ex) {
        throw new PSQLException(GT.tr("Failed to create object for: {0}.", type),
            PSQLState.CONNECTION_FAILURE, ex);
      }
    }