public void insertRow() throws SQLException {
      int pos;

      if (onInsertRow == false ||
          insertRow.isCompleteRow(RowSetMD) == false) {
         throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.failedins").toString());
      }
      // Added the setting of parameters that are passed
      // to setXXX methods after an empty CRS Object is
      // created through RowSetMetaData object
      Object [] toInsert = getParams();

      for(int i = 0;i < toInsert.length; i++) {
         insertRow.setColumnObject(i+1,toInsert[i]);
      }

      Row insRow = new Row(RowSetMD.getColumnCount(),
          insertRow.getOrigRow());
      insRow.setInserted();
      /*
       * The new row is inserted into the RowSet
       * immediately following the current row.
       *
       * If we are afterlast then the rows are
       * inserted at the end.
       */
      if (currentRow >= numRows || currentRow < 0) {
         pos = numRows;
      } else {
         pos = currentRow;
      }

      rvh.add(pos, insRow);
      ++numRows;
      // notify the listeners that the row changed.
      notifyRowChanged();
   }
Inserts the contents of this <code>StreamingRowSetImpl</code> object's insert
row into this rowset immediately following the current row.
If the current row is the
position after the last row or before the first row, the new row will
be inserted at the end of the rowset.  This method also notifies
listeners registered with this rowset that the row has changed.
<P>
The cursor must be on the insert row when this method is called.

@throws SQLException if (1) the cursor is not on the insert row,
           (2) one or more of the non-nullable columns in the insert
           row has not been given a value, or (3) this rowset is
           <code>ResultSet.CONCUR_READ_ONLY</code>
src/main/java/org/replicadb/rowset/StreamingRowSetImpl.java