docs: public int setString(long pos, String str, int offset,
                           int len) throws SQLException {
  
          if (!this.createdByConnection) {
  
              /** @todo - better error message */
              throw Util.notSupported();
          }
  
          String ldata = this.data;
  
          checkValid(ldata);
  
          if (str == null) {
              throw Util.nullArgument("str");
          }
  
          final int strlen = str.length();
  
          if (offset < 0 || offset > strlen) {
              throw Util.outOfRangeArgument("offset: " + offset);
          }
  
          if (len > strlen - offset) {
              throw Util.outOfRangeArgument("len: " + len);
          }
  
          if (pos < MIN_POS || pos > 1L + (Integer.MAX_VALUE - len)) {
              throw Util.outOfRangeArgument("pos: " + pos);
          }
  
          final int    dlen = ldata.length();
          final int    ipos = (int) (pos - 1);
          StringBuffer sb;
  
          if (ipos > dlen - len) {
              sb = new StringBuffer(ipos + len);
  
              sb.append(ldata.substring(0, ipos));
  
              ldata = null;
  
              sb.append(str.substring(offset, offset + len));
  
              str = null;
          } else {
              sb    = new StringBuffer(ldata);
              ldata = null;
  
              for (int i = ipos, j = 0; j < len; i++, j++) {
                  sb.setCharAt(i, str.charAt(offset + j));
              }
              str = null;
          }
  
          // paranoia, in case somone free'd us during the copies.
          checkValid(this.data);
  
          this.data = sb.toString();
  
          return len;
      }