001package com.hfg.sql.jdbc;
002
003import java.io.InputStream;
004import java.io.Reader;
005import java.math.BigDecimal;
006import java.net.URL;
007import java.sql.*;
008import java.util.Calendar;
009import java.util.HashMap;
010import java.util.List;
011import java.util.Map;
012
013import com.hfg.sql.table.DatabaseCol;
014import com.hfg.sql.table.DatabaseTable;
015
016
017//------------------------------------------------------------------------------
018/**
019 ResultSet wrapper that allows for improved mapping of columns to ResultSet indexes.
020 <div>
021 @author J. Alex Taylor, hairyfatguy.com
022 </div>
023 */
024//------------------------------------------------------------------------------
025// com.hfg XML/HTML Coding Library
026//
027// This library is free software; you can redistribute it and/or
028// modify it under the terms of the GNU Lesser General Public
029// License as published by the Free Software Foundation; either
030// version 2.1 of the License, or (at your option) any later version.
031//
032// This library is distributed in the hope that it will be useful,
033// but WITHOUT ANY WARRANTY; without even the implied warranty of
034// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
035// Lesser General Public License for more details.
036//
037// You should have received a copy of the GNU Lesser General Public
038// License along with this library; if not, write to the Free Software
039// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
040//
041// J. Alex Taylor, President, Founder, CEO, COO, CFO, OOPS hairyfatguy.com
042// jataylor@hairyfatguy.com
043//------------------------------------------------------------------------------
044
045public class JDBCResultSet implements ResultSet
046{
047   ResultSet mInnerResultSet;
048
049   Map<String, Map<DatabaseCol, Integer>> mTableColIndexMap;
050
051   //###########################################################################
052   // CONSTRUCTORS
053   //###########################################################################
054
055   //---------------------------------------------------------------------------
056   public JDBCResultSet(ResultSet inResultSet)
057   {
058      mInnerResultSet = inResultSet;
059   }
060
061
062   //###########################################################################
063   // PUBIC METHODS
064   //###########################################################################
065
066
067   //---------------------------------------------------------------------------
068   /**
069    * Maps the given <code>ResultSet</code> column label to its
070    * <code>ResultSet</code> column index.
071    *
072    * @param inCol the column to map to the select fields
073    * @return the column index of the given column name. If the <code>ResultSet</code> object
074    *         does not contain a column corresponding to the specified column, null is returned
075    */
076   public Integer findColumn(DatabaseCol inCol)
077         throws SQLException
078   {
079      if (null == mTableColIndexMap)
080      {
081         mTableColIndexMap = new HashMap<>(2);
082      }
083
084      DatabaseTable table = inCol.getTable();
085      Map<DatabaseCol, Integer> colIndexMap = mTableColIndexMap.get(table.getQualifiedName());
086      if (null == colIndexMap)
087      {
088         // Intialize the column mapping for this table
089         colIndexMap = new HashMap<>(table.getCols().size());
090         mTableColIndexMap.put(table.getQualifiedName(), colIndexMap);
091
092         ResultSetMetaData metaData = mInnerResultSet.getMetaData();
093         for (int i = 1; i <= metaData.getColumnCount(); i++)
094         {
095            String rsColName = metaData.getColumnName(i);
096
097            for (DatabaseCol col : (List<DatabaseCol>) table.getCols())
098            {
099               if (col.name().equalsIgnoreCase(rsColName))
100               {
101                  colIndexMap.put(col, i);
102                  break;
103               }
104            }
105         }
106      }
107
108      return colIndexMap.get(inCol);
109   }
110
111   //---------------------------------------------------------------------------
112   /**
113    * Moves the cursor forward one row from its current position.
114    * A <code>ResultSet</code> cursor is initially positioned
115    * before the first row; the first call to the method
116    * <code>next</code> makes the first row the current row; the
117    * second call makes the second row the current row, and so on.
118    * <p>
119    * When a call to the <code>next</code> method returns <code>false</code>,
120    * the cursor is positioned after the last row. Any
121    * invocation of a <code>ResultSet</code> method which requires a
122    * current row will result in a <code>SQLException</code> being thrown.
123    * If the result set type is <code>TYPE_FORWARD_ONLY</code>, it is vendor specified
124    * whether their JDBC driver implementation will return <code>false</code> or
125    * throw an <code>SQLException</code> on a
126    * subsequent call to <code>next</code>.
127    *
128    * <P>If an input stream is open for the current row, a call
129    * to the method <code>next</code> will
130    * implicitly close it. A <code>ResultSet</code> object's
131    * warning chain is cleared when a new row is read.
132    *
133    * @return <code>true</code> if the new current row is valid;
134    * <code>false</code> if there are no more rows
135    * @throws SQLException if a database access error occurs or this method is
136    *                      called on a closed result set
137    */
138   @Override
139   public boolean next()
140         throws SQLException
141   {
142      return mInnerResultSet.next();
143   }
144
145   /**
146    * Releases this <code>ResultSet</code> object's database and
147    * JDBC resources immediately instead of waiting for
148    * this to happen when it is automatically closed.
149    *
150    * <P>The closing of a <code>ResultSet</code> object does <strong>not</strong> close the <code>Blob</code>,
151    * <code>Clob</code> or <code>NClob</code> objects created by the <code>ResultSet</code>. <code>Blob</code>,
152    * <code>Clob</code> or <code>NClob</code> objects remain valid for at least the duration of the
153    * transaction in which they are created, unless their <code>free</code> method is invoked.
154    * <p>
155    * When a <code>ResultSet</code> is closed, any <code>ResultSetMetaData</code>
156    * instances that were created by calling the  <code>getMetaData</code>
157    * method remain accessible.
158    *
159    * <P><B>Note:</B> A <code>ResultSet</code> object
160    * is automatically closed by the
161    * <code>Statement</code> object that generated it when
162    * that <code>Statement</code> object is closed,
163    * re-executed, or is used to retrieve the next result from a
164    * sequence of multiple results.
165    * <p>
166    * Calling the method <code>close</code> on a <code>ResultSet</code>
167    * object that is already closed is a no-op.
168    *
169    * @throws SQLException if a database access error occurs
170    */
171   @Override
172   public void close()
173         throws SQLException
174   {
175      mInnerResultSet.close();
176   }
177
178   /**
179    * Reports whether
180    * the last column read had a value of SQL <code>NULL</code>.
181    * Note that you must first call one of the getter methods
182    * on a column to try to read its value and then call
183    * the method <code>wasNull</code> to see if the value read was
184    * SQL <code>NULL</code>.
185    *
186    * @return <code>true</code> if the last column value read was SQL
187    * <code>NULL</code> and <code>false</code> otherwise
188    * @throws SQLException if a database access error occurs or this method is
189    *                      called on a closed result set
190    */
191   @Override
192   public boolean wasNull()
193         throws SQLException
194   {
195      return mInnerResultSet.wasNull();
196   }
197
198   /**
199    * Retrieves the value of the designated column in the current row
200    * of this <code>ResultSet</code> object as
201    * a <code>String</code> in the Java programming language.
202    *
203    * @param columnIndex the first column is 1, the second is 2, ...
204    * @return the column value; if the value is SQL <code>NULL</code>, the
205    * value returned is <code>null</code>
206    * @throws SQLException if the columnIndex is not valid;
207    *                      if a database access error occurs or this method is
208    *                      called on a closed result set
209    */
210   @Override
211   public String getString(int columnIndex)
212         throws SQLException
213   {
214      return mInnerResultSet.getString(columnIndex);
215   }
216
217   /**
218    * Retrieves the value of the designated column in the current row
219    * of this <code>ResultSet</code> object as
220    * a <code>boolean</code> in the Java programming language.
221    *
222    * <P>If the designated column has a datatype of CHAR or VARCHAR
223    * and contains a "0" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT
224    * and contains  a 0, a value of <code>false</code> is returned.  If the designated column has a datatype
225    * of CHAR or VARCHAR
226    * and contains a "1" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT
227    * and contains  a 1, a value of <code>true</code> is returned.
228    *
229    * @param columnIndex the first column is 1, the second is 2, ...
230    * @return the column value; if the value is SQL <code>NULL</code>, the
231    * value returned is <code>false</code>
232    * @throws SQLException if the columnIndex is not valid;
233    *                      if a database access error occurs or this method is
234    *                      called on a closed result set
235    */
236   @Override
237   public boolean getBoolean(int columnIndex)
238         throws SQLException
239   {
240      return mInnerResultSet.getBoolean(columnIndex);
241   }
242
243   /**
244    * Retrieves the value of the designated column in the current row
245    * of this <code>ResultSet</code> object as
246    * a <code>byte</code> in the Java programming language.
247    *
248    * @param columnIndex the first column is 1, the second is 2, ...
249    * @return the column value; if the value is SQL <code>NULL</code>, the
250    * value returned is <code>0</code>
251    * @throws SQLException if the columnIndex is not valid;
252    *                      if a database access error occurs or this method is
253    *                      called on a closed result set
254    */
255   @Override
256   public byte getByte(int columnIndex)
257         throws SQLException
258   {
259      return mInnerResultSet.getByte(columnIndex);
260   }
261
262   /**
263    * Retrieves the value of the designated column in the current row
264    * of this <code>ResultSet</code> object as
265    * a <code>short</code> in the Java programming language.
266    *
267    * @param columnIndex the first column is 1, the second is 2, ...
268    * @return the column value; if the value is SQL <code>NULL</code>, the
269    * value returned is <code>0</code>
270    * @throws SQLException if the columnIndex is not valid;
271    *                      if a database access error occurs or this method is
272    *                      called on a closed result set
273    */
274   @Override
275   public short getShort(int columnIndex)
276         throws SQLException
277   {
278      return mInnerResultSet.getShort(columnIndex);
279   }
280
281   /**
282    * Retrieves the value of the designated column in the current row
283    * of this <code>ResultSet</code> object as
284    * an <code>int</code> in the Java programming language.
285    *
286    * @param columnIndex the first column is 1, the second is 2, ...
287    * @return the column value; if the value is SQL <code>NULL</code>, the
288    * value returned is <code>0</code>
289    * @throws SQLException if the columnIndex is not valid;
290    *                      if a database access error occurs or this method is
291    *                      called on a closed result set
292    */
293   @Override
294   public int getInt(int columnIndex)
295         throws SQLException
296   {
297      return mInnerResultSet.getInt(columnIndex);
298   }
299
300   /**
301    * Retrieves the value of the designated column in the current row
302    * of this <code>ResultSet</code> object as
303    * a <code>long</code> in the Java programming language.
304    *
305    * @param columnIndex the first column is 1, the second is 2, ...
306    * @return the column value; if the value is SQL <code>NULL</code>, the
307    * value returned is <code>0</code>
308    * @throws SQLException if the columnIndex is not valid;
309    *                      if a database access error occurs or this method is
310    *                      called on a closed result set
311    */
312   @Override
313   public long getLong(int columnIndex) throws SQLException
314   {
315      return mInnerResultSet.getLong(columnIndex);
316   }
317
318   /**
319    * Retrieves the value of the designated column in the current row
320    * of this <code>ResultSet</code> object as
321    * a <code>float</code> in the Java programming language.
322    *
323    * @param columnIndex the first column is 1, the second is 2, ...
324    * @return the column value; if the value is SQL <code>NULL</code>, the
325    * value returned is <code>0</code>
326    * @throws SQLException if the columnIndex is not valid;
327    *                      if a database access error occurs or this method is
328    *                      called on a closed result set
329    */
330   @Override
331   public float getFloat(int columnIndex) throws SQLException
332   {
333      return mInnerResultSet.getFloat(columnIndex);
334   }
335
336   /**
337    * Retrieves the value of the designated column in the current row
338    * of this <code>ResultSet</code> object as
339    * a <code>double</code> in the Java programming language.
340    *
341    * @param columnIndex the first column is 1, the second is 2, ...
342    * @return the column value; if the value is SQL <code>NULL</code>, the
343    * value returned is <code>0</code>
344    * @throws SQLException if the columnIndex is not valid;
345    *                      if a database access error occurs or this method is
346    *                      called on a closed result set
347    */
348   @Override
349   public double getDouble(int columnIndex) throws SQLException
350   {
351      return mInnerResultSet.getDouble(columnIndex);
352   }
353
354   /**
355    * Retrieves the value of the designated column in the current row
356    * of this <code>ResultSet</code> object as
357    * a <code>java.sql.BigDecimal</code> in the Java programming language.
358    *
359    * @param columnIndex the first column is 1, the second is 2, ...
360    * @param scale       the number of digits to the right of the decimal point
361    * @return the column value; if the value is SQL <code>NULL</code>, the
362    * value returned is <code>null</code>
363    * @throws SQLException                    if the columnIndex is not valid;
364    *                                         if a database access error occurs or this method is
365    *                                         called on a closed result set
366    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
367    *                                         this method
368    * @deprecated Use {@code getBigDecimal(int columnIndex)}
369    * or {@code getBigDecimal(String columnLabel)}
370    */
371   @Override
372   public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException
373   {
374      return mInnerResultSet.getBigDecimal(columnIndex);
375   }
376
377   /**
378    * Retrieves the value of the designated column in the current row
379    * of this <code>ResultSet</code> object as
380    * a <code>byte</code> array in the Java programming language.
381    * The bytes represent the raw values returned by the driver.
382    *
383    * @param columnIndex the first column is 1, the second is 2, ...
384    * @return the column value; if the value is SQL <code>NULL</code>, the
385    * value returned is <code>null</code>
386    * @throws SQLException if the columnIndex is not valid;
387    *                      if a database access error occurs or this method is
388    *                      called on a closed result set
389    */
390   @Override
391   public byte[] getBytes(int columnIndex) throws SQLException
392   {
393      return mInnerResultSet.getBytes(columnIndex);
394   }
395
396   /**
397    * Retrieves the value of the designated column in the current row
398    * of this <code>ResultSet</code> object as
399    * a <code>java.sql.Date</code> object in the Java programming language.
400    *
401    * @param columnIndex the first column is 1, the second is 2, ...
402    * @return the column value; if the value is SQL <code>NULL</code>, the
403    * value returned is <code>null</code>
404    * @throws SQLException if the columnIndex is not valid;
405    *                      if a database access error occurs or this method is
406    *                      called on a closed result set
407    */
408   @Override
409   public Date getDate(int columnIndex) throws SQLException
410   {
411      return mInnerResultSet.getDate(columnIndex);
412   }
413
414   /**
415    * Retrieves the value of the designated column in the current row
416    * of this <code>ResultSet</code> object as
417    * a <code>java.sql.Time</code> object in the Java programming language.
418    *
419    * @param columnIndex the first column is 1, the second is 2, ...
420    * @return the column value; if the value is SQL <code>NULL</code>, the
421    * value returned is <code>null</code>
422    * @throws SQLException if the columnIndex is not valid;
423    *                      if a database access error occurs or this method is
424    *                      called on a closed result set
425    */
426   @Override
427   public Time getTime(int columnIndex) throws SQLException
428   {
429      return mInnerResultSet.getTime(columnIndex);
430   }
431
432   /**
433    * Retrieves the value of the designated column in the current row
434    * of this <code>ResultSet</code> object as
435    * a <code>java.sql.Timestamp</code> object in the Java programming language.
436    *
437    * @param columnIndex the first column is 1, the second is 2, ...
438    * @return the column value; if the value is SQL <code>NULL</code>, the
439    * value returned is <code>null</code>
440    * @throws SQLException if the columnIndex is not valid;
441    *                      if a database access error occurs or this method is
442    *                      called on a closed result set
443    */
444   @Override
445   public Timestamp getTimestamp(int columnIndex) throws SQLException
446   {
447      return mInnerResultSet.getTimestamp(columnIndex);
448   }
449
450   /**
451    * Retrieves the value of the designated column in the current row
452    * of this <code>ResultSet</code> object as
453    * a stream of ASCII characters. The value can then be read in chunks from the
454    * stream. This method is particularly
455    * suitable for retrieving large <code>LONGVARCHAR</code> values.
456    * The JDBC driver will
457    * do any necessary conversion from the database format into ASCII.
458    *
459    * <P><B>Note:</B> All the data in the returned stream must be
460    * read prior to getting the value of any other column. The next
461    * call to a getter method implicitly closes the stream.  Also, a
462    * stream may return <code>0</code> when the method
463    * <code>InputStream.available</code>
464    * is called whether there is data available or not.
465    *
466    * @param columnIndex the first column is 1, the second is 2, ...
467    * @return a Java input stream that delivers the database column value
468    * as a stream of one-byte ASCII characters;
469    * if the value is SQL <code>NULL</code>, the
470    * value returned is <code>null</code>
471    * @throws SQLException if the columnIndex is not valid;
472    *                      if a database access error occurs or this method is
473    *                      called on a closed result set
474    */
475   @Override
476   public InputStream getAsciiStream(int columnIndex) throws SQLException
477   {
478      return mInnerResultSet.getAsciiStream(columnIndex);
479   }
480
481   /**
482    * Retrieves the value of the designated column in the current row
483    * of this <code>ResultSet</code> object as
484    * as a stream of two-byte 3 characters. The first byte is
485    * the high byte; the second byte is the low byte.
486    * <p>
487    * The value can then be read in chunks from the
488    * stream. This method is particularly
489    * suitable for retrieving large <code>LONGVARCHAR</code>values.  The
490    * JDBC driver will do any necessary conversion from the database
491    * format into Unicode.
492    *
493    * <P><B>Note:</B> All the data in the returned stream must be
494    * read prior to getting the value of any other column. The next
495    * call to a getter method implicitly closes the stream.
496    * Also, a stream may return <code>0</code> when the method
497    * <code>InputStream.available</code>
498    * is called, whether there is data available or not.
499    *
500    * @param columnIndex the first column is 1, the second is 2, ...
501    * @return a Java input stream that delivers the database column value
502    * as a stream of two-byte Unicode characters;
503    * if the value is SQL <code>NULL</code>, the value returned is
504    * <code>null</code>
505    * @throws SQLException                    if the columnIndex is not valid;
506    *                                         if a database access error occurs or this method is
507    *                                         called on a closed result set
508    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
509    *                                         this method
510    * @deprecated use <code>getCharacterStream</code> in place of
511    * <code>getUnicodeStream</code>
512    */
513   @Override
514   public InputStream getUnicodeStream(int columnIndex) throws SQLException
515   {
516      return mInnerResultSet.getUnicodeStream(columnIndex);
517   }
518
519   /**
520    * Retrieves the value of the designated column in the current row
521    * of this <code>ResultSet</code> object as a  stream of
522    * uninterpreted bytes. The value can then be read in chunks from the
523    * stream. This method is particularly
524    * suitable for retrieving large <code>LONGVARBINARY</code> values.
525    *
526    * <P><B>Note:</B> All the data in the returned stream must be
527    * read prior to getting the value of any other column. The next
528    * call to a getter method implicitly closes the stream.  Also, a
529    * stream may return <code>0</code> when the method
530    * <code>InputStream.available</code>
531    * is called whether there is data available or not.
532    *
533    * @param columnIndex the first column is 1, the second is 2, ...
534    * @return a Java input stream that delivers the database column value
535    * as a stream of uninterpreted bytes;
536    * if the value is SQL <code>NULL</code>, the value returned is
537    * <code>null</code>
538    * @throws SQLException if the columnIndex is not valid;
539    *                      if a database access error occurs or this method is
540    *                      called on a closed result set
541    */
542   @Override
543   public InputStream getBinaryStream(int columnIndex) throws SQLException
544   {
545      return mInnerResultSet.getBinaryStream(columnIndex);
546   }
547
548   /**
549    * Retrieves the value of the designated column in the current row
550    * of this <code>ResultSet</code> object as
551    * a <code>String</code> in the Java programming language.
552    *
553    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
554    * @return the column value; if the value is SQL <code>NULL</code>, the
555    * value returned is <code>null</code>
556    * @throws SQLException if the columnLabel is not valid;
557    *                      if a database access error occurs or this method is
558    *                      called on a closed result set
559    */
560   @Override
561   public String getString(String columnLabel) throws SQLException
562   {
563      return mInnerResultSet.getString(columnLabel);
564   }
565
566   /**
567    * Retrieves the value of the designated column in the current row
568    * of this <code>ResultSet</code> object as
569    * a <code>boolean</code> in the Java programming language.
570    *
571    * <P>If the designated column has a datatype of CHAR or VARCHAR
572    * and contains a "0" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT
573    * and contains  a 0, a value of <code>false</code> is returned.  If the designated column has a datatype
574    * of CHAR or VARCHAR
575    * and contains a "1" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT
576    * and contains  a 1, a value of <code>true</code> is returned.
577    *
578    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
579    * @return the column value; if the value is SQL <code>NULL</code>, the
580    * value returned is <code>false</code>
581    * @throws SQLException if the columnLabel is not valid;
582    *                      if a database access error occurs or this method is
583    *                      called on a closed result set
584    */
585   @Override
586   public boolean getBoolean(String columnLabel) throws SQLException
587   {
588      return mInnerResultSet.getBoolean(columnLabel);
589   }
590
591   /**
592    * Retrieves the value of the designated column in the current row
593    * of this <code>ResultSet</code> object as
594    * a <code>byte</code> in the Java programming language.
595    *
596    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
597    * @return the column value; if the value is SQL <code>NULL</code>, the
598    * value returned is <code>0</code>
599    * @throws SQLException if the columnLabel is not valid;
600    *                      if a database access error occurs or this method is
601    *                      called on a closed result set
602    */
603   @Override
604   public byte getByte(String columnLabel) throws SQLException
605   {
606      return mInnerResultSet.getByte(columnLabel);
607   }
608
609   /**
610    * Retrieves the value of the designated column in the current row
611    * of this <code>ResultSet</code> object as
612    * a <code>short</code> in the Java programming language.
613    *
614    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
615    * @return the column value; if the value is SQL <code>NULL</code>, the
616    * value returned is <code>0</code>
617    * @throws SQLException if the columnLabel is not valid;
618    *                      if a database access error occurs or this method is
619    *                      called on a closed result set
620    */
621   @Override
622   public short getShort(String columnLabel) throws SQLException
623   {
624      return mInnerResultSet.getShort(columnLabel);
625   }
626
627   /**
628    * Retrieves the value of the designated column in the current row
629    * of this <code>ResultSet</code> object as
630    * an <code>int</code> in the Java programming language.
631    *
632    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
633    * @return the column value; if the value is SQL <code>NULL</code>, the
634    * value returned is <code>0</code>
635    * @throws SQLException if the columnLabel is not valid;
636    *                      if a database access error occurs or this method is
637    *                      called on a closed result set
638    */
639   @Override
640   public int getInt(String columnLabel) throws SQLException
641   {
642      return mInnerResultSet.getInt(columnLabel);
643   }
644
645   /**
646    * Retrieves the value of the designated column in the current row
647    * of this <code>ResultSet</code> object as
648    * a <code>long</code> in the Java programming language.
649    *
650    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
651    * @return the column value; if the value is SQL <code>NULL</code>, the
652    * value returned is <code>0</code>
653    * @throws SQLException if the columnLabel is not valid;
654    *                      if a database access error occurs or this method is
655    *                      called on a closed result set
656    */
657   @Override
658   public long getLong(String columnLabel) throws SQLException
659   {
660      return mInnerResultSet.getLong(columnLabel);
661   }
662
663   /**
664    * Retrieves the value of the designated column in the current row
665    * of this <code>ResultSet</code> object as
666    * a <code>float</code> in the Java programming language.
667    *
668    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
669    * @return the column value; if the value is SQL <code>NULL</code>, the
670    * value returned is <code>0</code>
671    * @throws SQLException if the columnLabel is not valid;
672    *                      if a database access error occurs or this method is
673    *                      called on a closed result set
674    */
675   @Override
676   public float getFloat(String columnLabel) throws SQLException
677   {
678      return mInnerResultSet.getFloat(columnLabel);
679   }
680
681   /**
682    * Retrieves the value of the designated column in the current row
683    * of this <code>ResultSet</code> object as
684    * a <code>double</code> in the Java programming language.
685    *
686    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
687    * @return the column value; if the value is SQL <code>NULL</code>, the
688    * value returned is <code>0</code>
689    * @throws SQLException if the columnLabel is not valid;
690    *                      if a database access error occurs or this method is
691    *                      called on a closed result set
692    */
693   @Override
694   public double getDouble(String columnLabel) throws SQLException
695   {
696      return mInnerResultSet.getDouble(columnLabel);
697   }
698
699   /**
700    * Retrieves the value of the designated column in the current row
701    * of this <code>ResultSet</code> object as
702    * a <code>java.math.BigDecimal</code> in the Java programming language.
703    *
704    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
705    * @param scale       the number of digits to the right of the decimal point
706    * @return the column value; if the value is SQL <code>NULL</code>, the
707    * value returned is <code>null</code>
708    * @throws SQLException                    if the columnLabel is not valid;
709    *                                         if a database access error occurs or this method is
710    *                                         called on a closed result set
711    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
712    *                                         this method
713    * @deprecated Use {@code getBigDecimal(int columnIndex)}
714    * or {@code getBigDecimal(String columnLabel)}
715    */
716   @Override
717   public BigDecimal getBigDecimal(String columnLabel, int scale) throws SQLException
718   {
719      return mInnerResultSet.getBigDecimal(columnLabel);
720   }
721
722   /**
723    * Retrieves the value of the designated column in the current row
724    * of this <code>ResultSet</code> object as
725    * a <code>byte</code> array in the Java programming language.
726    * The bytes represent the raw values returned by the driver.
727    *
728    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
729    * @return the column value; if the value is SQL <code>NULL</code>, the
730    * value returned is <code>null</code>
731    * @throws SQLException if the columnLabel is not valid;
732    *                      if a database access error occurs or this method is
733    *                      called on a closed result set
734    */
735   @Override
736   public byte[] getBytes(String columnLabel) throws SQLException
737   {
738      return mInnerResultSet.getBytes(columnLabel);
739   }
740
741   /**
742    * Retrieves the value of the designated column in the current row
743    * of this <code>ResultSet</code> object as
744    * a <code>java.sql.Date</code> object in the Java programming language.
745    *
746    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
747    * @return the column value; if the value is SQL <code>NULL</code>, the
748    * value returned is <code>null</code>
749    * @throws SQLException if the columnLabel is not valid;
750    *                      if a database access error occurs or this method is
751    *                      called on a closed result set
752    */
753   @Override
754   public Date getDate(String columnLabel) throws SQLException
755   {
756      return mInnerResultSet.getDate(columnLabel);
757   }
758
759   /**
760    * Retrieves the value of the designated column in the current row
761    * of this <code>ResultSet</code> object as
762    * a <code>java.sql.Time</code> object in the Java programming language.
763    *
764    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
765    * @return the column value;
766    * if the value is SQL <code>NULL</code>,
767    * the value returned is <code>null</code>
768    * @throws SQLException if the columnLabel is not valid;
769    *                      if a database access error occurs or this method is
770    *                      called on a closed result set
771    */
772   @Override
773   public Time getTime(String columnLabel) throws SQLException
774   {
775      return mInnerResultSet.getTime(columnLabel);
776   }
777
778   /**
779    * Retrieves the value of the designated column in the current row
780    * of this <code>ResultSet</code> object as
781    * a <code>java.sql.Timestamp</code> object in the Java programming language.
782    *
783    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
784    * @return the column value; if the value is SQL <code>NULL</code>, the
785    * value returned is <code>null</code>
786    * @throws SQLException if the columnLabel is not valid;
787    *                      if a database access error occurs or this method is
788    *                      called on a closed result set
789    */
790   @Override
791   public Timestamp getTimestamp(String columnLabel) throws SQLException
792   {
793      return mInnerResultSet.getTimestamp(columnLabel);
794   }
795
796   /**
797    * Retrieves the value of the designated column in the current row
798    * of this <code>ResultSet</code> object as a stream of
799    * ASCII characters. The value can then be read in chunks from the
800    * stream. This method is particularly
801    * suitable for retrieving large <code>LONGVARCHAR</code> values.
802    * The JDBC driver will
803    * do any necessary conversion from the database format into ASCII.
804    *
805    * <P><B>Note:</B> All the data in the returned stream must be
806    * read prior to getting the value of any other column. The next
807    * call to a getter method implicitly closes the stream. Also, a
808    * stream may return <code>0</code> when the method <code>available</code>
809    * is called whether there is data available or not.
810    *
811    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
812    * @return a Java input stream that delivers the database column value
813    * as a stream of one-byte ASCII characters.
814    * If the value is SQL <code>NULL</code>,
815    * the value returned is <code>null</code>.
816    * @throws SQLException if the columnLabel is not valid;
817    *                      if a database access error occurs or this method is
818    *                      called on a closed result set
819    */
820   @Override
821   public InputStream getAsciiStream(String columnLabel) throws SQLException
822   {
823      return mInnerResultSet.getAsciiStream(columnLabel);
824   }
825
826   /**
827    * Retrieves the value of the designated column in the current row
828    * of this <code>ResultSet</code> object as a stream of two-byte
829    * Unicode characters. The first byte is the high byte; the second
830    * byte is the low byte.
831    * <p>
832    * The value can then be read in chunks from the
833    * stream. This method is particularly
834    * suitable for retrieving large <code>LONGVARCHAR</code> values.
835    * The JDBC technology-enabled driver will
836    * do any necessary conversion from the database format into Unicode.
837    *
838    * <P><B>Note:</B> All the data in the returned stream must be
839    * read prior to getting the value of any other column. The next
840    * call to a getter method implicitly closes the stream.
841    * Also, a stream may return <code>0</code> when the method
842    * <code>InputStream.available</code> is called, whether there
843    * is data available or not.
844    *
845    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
846    * @return a Java input stream that delivers the database column value
847    * as a stream of two-byte Unicode characters.
848    * If the value is SQL <code>NULL</code>, the value returned
849    * is <code>null</code>.
850    * @throws SQLException                    if the columnLabel is not valid;
851    *                                         if a database access error occurs or this method is
852    *                                         called on a closed result set
853    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
854    *                                         this method
855    * @deprecated use <code>getCharacterStream</code> instead
856    */
857   @Override
858   public InputStream getUnicodeStream(String columnLabel) throws SQLException
859   {
860      return mInnerResultSet.getUnicodeStream(columnLabel);
861   }
862
863   /**
864    * Retrieves the value of the designated column in the current row
865    * of this <code>ResultSet</code> object as a stream of uninterpreted
866    * <code>byte</code>s.
867    * The value can then be read in chunks from the
868    * stream. This method is particularly
869    * suitable for retrieving large <code>LONGVARBINARY</code>
870    * values.
871    *
872    * <P><B>Note:</B> All the data in the returned stream must be
873    * read prior to getting the value of any other column. The next
874    * call to a getter method implicitly closes the stream. Also, a
875    * stream may return <code>0</code> when the method <code>available</code>
876    * is called whether there is data available or not.
877    *
878    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
879    * @return a Java input stream that delivers the database column value
880    * as a stream of uninterpreted bytes;
881    * if the value is SQL <code>NULL</code>, the result is <code>null</code>
882    * @throws SQLException if the columnLabel is not valid;
883    *                      if a database access error occurs or this method is
884    *                      called on a closed result set
885    */
886   @Override
887   public InputStream getBinaryStream(String columnLabel) throws SQLException
888   {
889      return mInnerResultSet.getBinaryStream(columnLabel);
890   }
891
892   /**
893    * Retrieves the first warning reported by calls on this
894    * <code>ResultSet</code> object.
895    * Subsequent warnings on this <code>ResultSet</code> object
896    * will be chained to the <code>SQLWarning</code> object that
897    * this method returns.
898    *
899    * <P>The warning chain is automatically cleared each time a new
900    * row is read.  This method may not be called on a <code>ResultSet</code>
901    * object that has been closed; doing so will cause an
902    * <code>SQLException</code> to be thrown.
903    * <p>
904    * <B>Note:</B> This warning chain only covers warnings caused
905    * by <code>ResultSet</code> methods.  Any warning caused by
906    * <code>Statement</code> methods
907    * (such as reading OUT parameters) will be chained on the
908    * <code>Statement</code> object.
909    *
910    * @return the first <code>SQLWarning</code> object reported or
911    * <code>null</code> if there are none
912    * @throws SQLException if a database access error occurs or this method is
913    *                      called on a closed result set
914    */
915   @Override
916   public SQLWarning getWarnings() throws SQLException
917   {
918      return mInnerResultSet.getWarnings();
919   }
920
921   /**
922    * Clears all warnings reported on this <code>ResultSet</code> object.
923    * After this method is called, the method <code>getWarnings</code>
924    * returns <code>null</code> until a new warning is
925    * reported for this <code>ResultSet</code> object.
926    *
927    * @throws SQLException if a database access error occurs or this method is
928    *                      called on a closed result set
929    */
930   @Override
931   public void clearWarnings() throws SQLException
932   {
933      mInnerResultSet.clearWarnings();
934   }
935
936   /**
937    * Retrieves the name of the SQL cursor used by this <code>ResultSet</code>
938    * object.
939    *
940    * <P>In SQL, a result table is retrieved through a cursor that is
941    * named. The current row of a result set can be updated or deleted
942    * using a positioned update/delete statement that references the
943    * cursor name. To insure that the cursor has the proper isolation
944    * level to support update, the cursor's <code>SELECT</code> statement
945    * should be of the form <code>SELECT FOR UPDATE</code>. If
946    * <code>FOR UPDATE</code> is omitted, the positioned updates may fail.
947    *
948    * <P>The JDBC API supports this SQL feature by providing the name of the
949    * SQL cursor used by a <code>ResultSet</code> object.
950    * The current row of a <code>ResultSet</code> object
951    * is also the current row of this SQL cursor.
952    *
953    * @return the SQL name for this <code>ResultSet</code> object's cursor
954    * @throws SQLException                    if a database access error occurs or this method is called on a closed result set
955    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
956    *                                         this method
957    */
958   @Override
959   public String getCursorName() throws SQLException
960   {
961      return mInnerResultSet.getCursorName();
962   }
963
964   /**
965    * Retrieves the  number, types and properties of
966    * this <code>ResultSet</code> object's columns.
967    *
968    * @return the description of this <code>ResultSet</code> object's columns
969    * @throws SQLException if a database access error occurs or this method is
970    *                      called on a closed result set
971    */
972   @Override
973   public ResultSetMetaData getMetaData() throws SQLException
974   {
975      return mInnerResultSet.getMetaData();
976   }
977
978   /**
979    * <p>Gets the value of the designated column in the current row
980    * of this <code>ResultSet</code> object as
981    * an <code>Object</code> in the Java programming language.
982    *
983    * <p>This method will return the value of the given column as a
984    * Java object.  The type of the Java object will be the default
985    * Java object type corresponding to the column's SQL type,
986    * following the mapping for built-in types specified in the JDBC
987    * specification. If the value is an SQL <code>NULL</code>,
988    * the driver returns a Java <code>null</code>.
989    *
990    * <p>This method may also be used to read database-specific
991    * abstract data types.
992    * <p>
993    * In the JDBC 2.0 API, the behavior of method
994    * <code>getObject</code> is extended to materialize
995    * data of SQL user-defined types.
996    * <p>
997    * If <code>Connection.getTypeMap</code> does not throw a
998    * <code>SQLFeatureNotSupportedException</code>,
999    * then when a column contains a structured or distinct value,
1000    * the behavior of this method is as
1001    * if it were a call to: <code>getObject(columnIndex,
1002    * this.getStatement().getConnection().getTypeMap())</code>.
1003    * <p>
1004    * If <code>Connection.getTypeMap</code> does throw a
1005    * <code>SQLFeatureNotSupportedException</code>,
1006    * then structured values are not supported, and distinct values
1007    * are mapped to the default Java class as determined by the
1008    * underlying SQL type of the DISTINCT type.
1009    *
1010    * @param columnIndex the first column is 1, the second is 2, ...
1011    * @return a <code>java.lang.Object</code> holding the column value
1012    * @throws SQLException if the columnIndex is not valid;
1013    *                      if a database access error occurs or this method is
1014    *                      called on a closed result set
1015    */
1016   @Override
1017   public Object getObject(int columnIndex) throws SQLException
1018   {
1019      return mInnerResultSet.getObject(columnIndex);
1020   }
1021
1022   /**
1023    * <p>Gets the value of the designated column in the current row
1024    * of this <code>ResultSet</code> object as
1025    * an <code>Object</code> in the Java programming language.
1026    *
1027    * <p>This method will return the value of the given column as a
1028    * Java object.  The type of the Java object will be the default
1029    * Java object type corresponding to the column's SQL type,
1030    * following the mapping for built-in types specified in the JDBC
1031    * specification. If the value is an SQL <code>NULL</code>,
1032    * the driver returns a Java <code>null</code>.
1033    * <p>
1034    * This method may also be used to read database-specific
1035    * abstract data types.
1036    * <p>
1037    * In the JDBC 2.0 API, the behavior of the method
1038    * <code>getObject</code> is extended to materialize
1039    * data of SQL user-defined types.  When a column contains
1040    * a structured or distinct value, the behavior of this method is as
1041    * if it were a call to: <code>getObject(columnIndex,
1042    * this.getStatement().getConnection().getTypeMap())</code>.
1043    *
1044    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
1045    * @return a <code>java.lang.Object</code> holding the column value
1046    * @throws SQLException if the columnLabel is not valid;
1047    *                      if a database access error occurs or this method is
1048    *                      called on a closed result set
1049    */
1050   @Override
1051   public Object getObject(String columnLabel) throws SQLException
1052   {
1053      return mInnerResultSet.getObject(columnLabel);
1054   }
1055
1056   /**
1057    * Maps the given <code>ResultSet</code> column label to its
1058    * <code>ResultSet</code> column index.
1059    *
1060    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
1061    * @return the column index of the given column name
1062    * @throws SQLException if the <code>ResultSet</code> object
1063    *                      does not contain a column labeled <code>columnLabel</code>, a database access error occurs
1064    *                      or this method is called on a closed result set
1065    */
1066   @Override
1067   public int findColumn(String columnLabel) throws SQLException
1068   {
1069      return mInnerResultSet.findColumn(columnLabel);
1070   }
1071
1072   /**
1073    * Retrieves the value of the designated column in the current row
1074    * of this <code>ResultSet</code> object as a
1075    * <code>java.io.Reader</code> object.
1076    *
1077    * @param columnIndex the first column is 1, the second is 2, ...
1078    * @return a <code>java.io.Reader</code> object that contains the column
1079    * value; if the value is SQL <code>NULL</code>, the value returned is
1080    * <code>null</code> in the Java programming language.
1081    * @throws SQLException if the columnIndex is not valid;
1082    *                      if a database access error occurs or this method is
1083    *                      called on a closed result set
1084    * @since 1.2
1085    */
1086   @Override
1087   public Reader getCharacterStream(int columnIndex) throws SQLException
1088   {
1089      return mInnerResultSet.getCharacterStream(columnIndex);
1090   }
1091
1092   /**
1093    * Retrieves the value of the designated column in the current row
1094    * of this <code>ResultSet</code> object as a
1095    * <code>java.io.Reader</code> object.
1096    *
1097    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
1098    * @return a <code>java.io.Reader</code> object that contains the column
1099    * value; if the value is SQL <code>NULL</code>, the value returned is
1100    * <code>null</code> in the Java programming language
1101    * @throws SQLException if the columnLabel is not valid;
1102    *                      if a database access error occurs or this method is
1103    *                      called on a closed result set
1104    * @since 1.2
1105    */
1106   @Override
1107   public Reader getCharacterStream(String columnLabel) throws SQLException
1108   {
1109      return mInnerResultSet.getCharacterStream(columnLabel);
1110   }
1111
1112   /**
1113    * Retrieves the value of the designated column in the current row
1114    * of this <code>ResultSet</code> object as a
1115    * <code>java.math.BigDecimal</code> with full precision.
1116    *
1117    * @param columnIndex the first column is 1, the second is 2, ...
1118    * @return the column value (full precision);
1119    * if the value is SQL <code>NULL</code>, the value returned is
1120    * <code>null</code> in the Java programming language.
1121    * @throws SQLException if the columnIndex is not valid;
1122    *                      if a database access error occurs or this method is
1123    *                      called on a closed result set
1124    * @since 1.2
1125    */
1126   @Override
1127   public BigDecimal getBigDecimal(int columnIndex) throws SQLException
1128   {
1129      return mInnerResultSet.getBigDecimal(columnIndex);
1130   }
1131
1132   /**
1133    * Retrieves the value of the designated column in the current row
1134    * of this <code>ResultSet</code> object as a
1135    * <code>java.math.BigDecimal</code> with full precision.
1136    *
1137    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
1138    * @return the column value (full precision);
1139    * if the value is SQL <code>NULL</code>, the value returned is
1140    * <code>null</code> in the Java programming language.
1141    * @throws SQLException if the columnLabel is not valid;
1142    *                      if a database access error occurs or this method is
1143    *                      called on a closed result set
1144    * @since 1.2
1145    */
1146   @Override
1147   public BigDecimal getBigDecimal(String columnLabel) throws SQLException
1148   {
1149      return mInnerResultSet.getBigDecimal(columnLabel);
1150   }
1151
1152   /**
1153    * Retrieves whether the cursor is before the first row in
1154    * this <code>ResultSet</code> object.
1155    * <p>
1156    * <strong>Note:</strong>Support for the <code>isBeforeFirst</code> method
1157    * is optional for <code>ResultSet</code>s with a result
1158    * set type of <code>TYPE_FORWARD_ONLY</code>
1159    *
1160    * @return <code>true</code> if the cursor is before the first row;
1161    * <code>false</code> if the cursor is at any other position or the
1162    * result set contains no rows
1163    * @throws SQLException                    if a database access error occurs or this method is
1164    *                                         called on a closed result set
1165    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1166    *                                         this method
1167    * @since 1.2
1168    */
1169   @Override
1170   public boolean isBeforeFirst() throws SQLException
1171   {
1172      return mInnerResultSet.isBeforeFirst();
1173   }
1174
1175   /**
1176    * Retrieves whether the cursor is after the last row in
1177    * this <code>ResultSet</code> object.
1178    * <p>
1179    * <strong>Note:</strong>Support for the <code>isAfterLast</code> method
1180    * is optional for <code>ResultSet</code>s with a result
1181    * set type of <code>TYPE_FORWARD_ONLY</code>
1182    *
1183    * @return <code>true</code> if the cursor is after the last row;
1184    * <code>false</code> if the cursor is at any other position or the
1185    * result set contains no rows
1186    * @throws SQLException                    if a database access error occurs or this method is
1187    *                                         called on a closed result set
1188    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1189    *                                         this method
1190    * @since 1.2
1191    */
1192   @Override
1193   public boolean isAfterLast() throws SQLException
1194   {
1195      return mInnerResultSet.isAfterLast();
1196   }
1197
1198   /**
1199    * Retrieves whether the cursor is on the first row of
1200    * this <code>ResultSet</code> object.
1201    * <p>
1202    * <strong>Note:</strong>Support for the <code>isFirst</code> method
1203    * is optional for <code>ResultSet</code>s with a result
1204    * set type of <code>TYPE_FORWARD_ONLY</code>
1205    *
1206    * @return <code>true</code> if the cursor is on the first row;
1207    * <code>false</code> otherwise
1208    * @throws SQLException                    if a database access error occurs or this method is
1209    *                                         called on a closed result set
1210    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1211    *                                         this method
1212    * @since 1.2
1213    */
1214   @Override
1215   public boolean isFirst() throws SQLException
1216   {
1217      return mInnerResultSet.isFirst();
1218   }
1219
1220   /**
1221    * Retrieves whether the cursor is on the last row of
1222    * this <code>ResultSet</code> object.
1223    * <strong>Note:</strong> Calling the method <code>isLast</code> may be expensive
1224    * because the JDBC driver
1225    * might need to fetch ahead one row in order to determine
1226    * whether the current row is the last row in the result set.
1227    * <p>
1228    * <strong>Note:</strong> Support for the <code>isLast</code> method
1229    * is optional for <code>ResultSet</code>s with a result
1230    * set type of <code>TYPE_FORWARD_ONLY</code>
1231    *
1232    * @return <code>true</code> if the cursor is on the last row;
1233    * <code>false</code> otherwise
1234    * @throws SQLException                    if a database access error occurs or this method is
1235    *                                         called on a closed result set
1236    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1237    *                                         this method
1238    * @since 1.2
1239    */
1240   @Override
1241   public boolean isLast() throws SQLException
1242   {
1243      return mInnerResultSet.isLast();
1244   }
1245
1246   /**
1247    * Moves the cursor to the front of
1248    * this <code>ResultSet</code> object, just before the
1249    * first row. This method has no effect if the result set contains no rows.
1250    *
1251    * @throws SQLException                    if a database access error
1252    *                                         occurs; this method is called on a closed result set or the
1253    *                                         result set type is <code>TYPE_FORWARD_ONLY</code>
1254    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1255    *                                         this method
1256    * @since 1.2
1257    */
1258   @Override
1259   public void beforeFirst() throws SQLException
1260   {
1261      mInnerResultSet.beforeFirst();
1262   }
1263
1264   /**
1265    * Moves the cursor to the end of
1266    * this <code>ResultSet</code> object, just after the
1267    * last row. This method has no effect if the result set contains no rows.
1268    *
1269    * @throws SQLException                    if a database access error
1270    *                                         occurs; this method is called on a closed result set
1271    *                                         or the result set type is <code>TYPE_FORWARD_ONLY</code>
1272    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1273    *                                         this method
1274    * @since 1.2
1275    */
1276   @Override
1277   public void afterLast() throws SQLException
1278   {
1279       mInnerResultSet.afterLast();
1280   }
1281
1282   /**
1283    * Moves the cursor to the first row in
1284    * this <code>ResultSet</code> object.
1285    *
1286    * @return <code>true</code> if the cursor is on a valid row;
1287    * <code>false</code> if there are no rows in the result set
1288    * @throws SQLException                    if a database access error
1289    *                                         occurs; this method is called on a closed result set
1290    *                                         or the result set type is <code>TYPE_FORWARD_ONLY</code>
1291    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1292    *                                         this method
1293    * @since 1.2
1294    */
1295   @Override
1296   public boolean first() throws SQLException
1297   {
1298      return mInnerResultSet.first();
1299   }
1300
1301   /**
1302    * Moves the cursor to the last row in
1303    * this <code>ResultSet</code> object.
1304    *
1305    * @return <code>true</code> if the cursor is on a valid row;
1306    * <code>false</code> if there are no rows in the result set
1307    * @throws SQLException                    if a database access error
1308    *                                         occurs; this method is called on a closed result set
1309    *                                         or the result set type is <code>TYPE_FORWARD_ONLY</code>
1310    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1311    *                                         this method
1312    * @since 1.2
1313    */
1314   @Override
1315   public boolean last() throws SQLException
1316   {
1317      return mInnerResultSet.last();
1318   }
1319
1320   /**
1321    * Retrieves the current row number.  The first row is number 1, the
1322    * second number 2, and so on.
1323    * <p>
1324    * <strong>Note:</strong>Support for the <code>getRow</code> method
1325    * is optional for <code>ResultSet</code>s with a result
1326    * set type of <code>TYPE_FORWARD_ONLY</code>
1327    *
1328    * @return the current row number; <code>0</code> if there is no current row
1329    * @throws SQLException                    if a database access error occurs
1330    *                                         or this method is called on a closed result set
1331    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1332    *                                         this method
1333    * @since 1.2
1334    */
1335   @Override
1336   public int getRow() throws SQLException
1337   {
1338      return mInnerResultSet.getRow();
1339   }
1340
1341   /**
1342    * Moves the cursor to the given row number in
1343    * this <code>ResultSet</code> object.
1344    *
1345    * <p>If the row number is positive, the cursor moves to
1346    * the given row number with respect to the
1347    * beginning of the result set.  The first row is row 1, the second
1348    * is row 2, and so on.
1349    *
1350    * <p>If the given row number is negative, the cursor moves to
1351    * an absolute row position with respect to
1352    * the end of the result set.  For example, calling the method
1353    * <code>absolute(-1)</code> positions the
1354    * cursor on the last row; calling the method <code>absolute(-2)</code>
1355    * moves the cursor to the next-to-last row, and so on.
1356    *
1357    * <p>If the row number specified is zero, the cursor is moved to
1358    * before the first row.
1359    *
1360    * <p>An attempt to position the cursor beyond the first/last row in
1361    * the result set leaves the cursor before the first row or after
1362    * the last row.
1363    *
1364    * <p><B>Note:</B> Calling <code>absolute(1)</code> is the same
1365    * as calling <code>first()</code>. Calling <code>absolute(-1)</code>
1366    * is the same as calling <code>last()</code>.
1367    *
1368    * @param row the number of the row to which the cursor should move.
1369    *            A value of zero indicates that the cursor will be positioned
1370    *            before the first row; a positive number indicates the row number
1371    *            counting from the beginning of the result set; a negative number
1372    *            indicates the row number counting from the end of the result set
1373    * @return <code>true</code> if the cursor is moved to a position in this
1374    * <code>ResultSet</code> object;
1375    * <code>false</code> if the cursor is before the first row or after the
1376    * last row
1377    * @throws SQLException                    if a database access error
1378    *                                         occurs; this method is called on a closed result set
1379    *                                         or the result set type is <code>TYPE_FORWARD_ONLY</code>
1380    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1381    *                                         this method
1382    * @since 1.2
1383    */
1384   @Override
1385   public boolean absolute(int row) throws SQLException
1386   {
1387      return mInnerResultSet.absolute(row);
1388   }
1389
1390   /**
1391    * Moves the cursor a relative number of rows, either positive or negative.
1392    * Attempting to move beyond the first/last row in the
1393    * result set positions the cursor before/after the
1394    * the first/last row. Calling <code>relative(0)</code> is valid, but does
1395    * not change the cursor position.
1396    *
1397    * <p>Note: Calling the method <code>relative(1)</code>
1398    * is identical to calling the method <code>next()</code> and
1399    * calling the method <code>relative(-1)</code> is identical
1400    * to calling the method <code>previous()</code>.
1401    *
1402    * @param rows an <code>int</code> specifying the number of rows to
1403    *             move from the current row; a positive number moves the cursor
1404    *             forward; a negative number moves the cursor backward
1405    * @return <code>true</code> if the cursor is on a row;
1406    * <code>false</code> otherwise
1407    * @throws SQLException                    if a database access error occurs;  this method
1408    *                                         is called on a closed result set or the result set type is
1409    *                                         <code>TYPE_FORWARD_ONLY</code>
1410    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1411    *                                         this method
1412    * @since 1.2
1413    */
1414   @Override
1415   public boolean relative(int rows) throws SQLException
1416   {
1417      return mInnerResultSet.relative(rows);
1418   }
1419
1420   /**
1421    * Moves the cursor to the previous row in this
1422    * <code>ResultSet</code> object.
1423    * <p>
1424    * When a call to the <code>previous</code> method returns <code>false</code>,
1425    * the cursor is positioned before the first row.  Any invocation of a
1426    * <code>ResultSet</code> method which requires a current row will result in a
1427    * <code>SQLException</code> being thrown.
1428    * <p>
1429    * If an input stream is open for the current row, a call to the method
1430    * <code>previous</code> will implicitly close it.  A <code>ResultSet</code>
1431    * object's warning change is cleared when a new row is read.
1432    *
1433    * @return <code>true</code> if the cursor is now positioned on a valid row;
1434    * <code>false</code> if the cursor is positioned before the first row
1435    * @throws SQLException                    if a database access error
1436    *                                         occurs; this method is called on a closed result set
1437    *                                         or the result set type is <code>TYPE_FORWARD_ONLY</code>
1438    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1439    *                                         this method
1440    * @since 1.2
1441    */
1442   @Override
1443   public boolean previous() throws SQLException
1444   {
1445      return mInnerResultSet.previous();
1446   }
1447
1448   /**
1449    * Gives a hint as to the direction in which the rows in this
1450    * <code>ResultSet</code> object will be processed.
1451    * The initial value is determined by the
1452    * <code>Statement</code> object
1453    * that produced this <code>ResultSet</code> object.
1454    * The fetch direction may be changed at any time.
1455    *
1456    * @param direction an <code>int</code> specifying the suggested
1457    *                  fetch direction; one of <code>ResultSet.FETCH_FORWARD</code>,
1458    *                  <code>ResultSet.FETCH_REVERSE</code>, or
1459    *                  <code>ResultSet.FETCH_UNKNOWN</code>
1460    * @throws SQLException if a database access error occurs; this
1461    *                      method is called on a closed result set or
1462    *                      the result set type is <code>TYPE_FORWARD_ONLY</code> and the fetch
1463    *                      direction is not <code>FETCH_FORWARD</code>
1464    * @see Statement#setFetchDirection
1465    * @see #getFetchDirection
1466    * @since 1.2
1467    */
1468   @Override
1469   public void setFetchDirection(int direction) throws SQLException
1470   {
1471      mInnerResultSet.setFetchDirection(direction);
1472   }
1473
1474   /**
1475    * Retrieves the fetch direction for this
1476    * <code>ResultSet</code> object.
1477    *
1478    * @return the current fetch direction for this <code>ResultSet</code> object
1479    * @throws SQLException if a database access error occurs
1480    *                      or this method is called on a closed result set
1481    * @see #setFetchDirection
1482    * @since 1.2
1483    */
1484   @Override
1485   public int getFetchDirection() throws SQLException
1486   {
1487      return mInnerResultSet.getFetchDirection();
1488   }
1489
1490   /**
1491    * Gives the JDBC driver a hint as to the number of rows that should
1492    * be fetched from the database when more rows are needed for this
1493    * <code>ResultSet</code> object.
1494    * If the fetch size specified is zero, the JDBC driver
1495    * ignores the value and is free to make its own best guess as to what
1496    * the fetch size should be.  The default value is set by the
1497    * <code>Statement</code> object
1498    * that created the result set.  The fetch size may be changed at any time.
1499    *
1500    * @param rows the number of rows to fetch
1501    * @throws SQLException if a database access error occurs; this method
1502    *                      is called on a closed result set or the
1503    *                      condition {@code rows >= 0} is not satisfied
1504    * @see #getFetchSize
1505    * @since 1.2
1506    */
1507   @Override
1508   public void setFetchSize(int rows) throws SQLException
1509   {
1510      mInnerResultSet.setFetchSize(rows);
1511   }
1512
1513   /**
1514    * Retrieves the fetch size for this
1515    * <code>ResultSet</code> object.
1516    *
1517    * @return the current fetch size for this <code>ResultSet</code> object
1518    * @throws SQLException if a database access error occurs
1519    *                      or this method is called on a closed result set
1520    * @see #setFetchSize
1521    * @since 1.2
1522    */
1523   @Override
1524   public int getFetchSize() throws SQLException
1525   {
1526      return mInnerResultSet.getFetchSize();
1527   }
1528
1529   /**
1530    * Retrieves the type of this <code>ResultSet</code> object.
1531    * The type is determined by the <code>Statement</code> object
1532    * that created the result set.
1533    *
1534    * @return <code>ResultSet.TYPE_FORWARD_ONLY</code>,
1535    * <code>ResultSet.TYPE_SCROLL_INSENSITIVE</code>,
1536    * or <code>ResultSet.TYPE_SCROLL_SENSITIVE</code>
1537    * @throws SQLException if a database access error occurs
1538    *                      or this method is called on a closed result set
1539    * @since 1.2
1540    */
1541   @Override
1542   public int getType() throws SQLException
1543   {
1544      return mInnerResultSet.getType();
1545   }
1546
1547   /**
1548    * Retrieves the concurrency mode of this <code>ResultSet</code> object.
1549    * The concurrency used is determined by the
1550    * <code>Statement</code> object that created the result set.
1551    *
1552    * @return the concurrency type, either
1553    * <code>ResultSet.CONCUR_READ_ONLY</code>
1554    * or <code>ResultSet.CONCUR_UPDATABLE</code>
1555    * @throws SQLException if a database access error occurs
1556    *                      or this method is called on a closed result set
1557    * @since 1.2
1558    */
1559   @Override
1560   public int getConcurrency() throws SQLException
1561   {
1562      return mInnerResultSet.getConcurrency();
1563   }
1564
1565   /**
1566    * Retrieves whether the current row has been updated.  The value returned
1567    * depends on whether or not the result set can detect updates.
1568    * <p>
1569    * <strong>Note:</strong> Support for the <code>rowUpdated</code> method is optional with a result set
1570    * concurrency of <code>CONCUR_READ_ONLY</code>
1571    *
1572    * @return <code>true</code> if the current row is detected to
1573    * have been visibly updated by the owner or another; <code>false</code> otherwise
1574    * @throws SQLException                    if a database access error occurs
1575    *                                         or this method is called on a closed result set
1576    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1577    *                                         this method
1578    * @see DatabaseMetaData#updatesAreDetected
1579    * @since 1.2
1580    */
1581   @Override
1582   public boolean rowUpdated() throws SQLException
1583   {
1584      return mInnerResultSet.rowUpdated();
1585   }
1586
1587   /**
1588    * Retrieves whether the current row has had an insertion.
1589    * The value returned depends on whether or not this
1590    * <code>ResultSet</code> object can detect visible inserts.
1591    * <p>
1592    * <strong>Note:</strong> Support for the <code>rowInserted</code> method is optional with a result set
1593    * concurrency of <code>CONCUR_READ_ONLY</code>
1594    *
1595    * @return <code>true</code> if the current row is detected to
1596    * have been inserted; <code>false</code> otherwise
1597    * @throws SQLException                    if a database access error occurs
1598    *                                         or this method is called on a closed result set
1599    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1600    *                                         this method
1601    * @see DatabaseMetaData#insertsAreDetected
1602    * @since 1.2
1603    */
1604   @Override
1605   public boolean rowInserted() throws SQLException
1606   {
1607      return mInnerResultSet.rowInserted();
1608   }
1609
1610   /**
1611    * Retrieves whether a row has been deleted.  A deleted row may leave
1612    * a visible "hole" in a result set.  This method can be used to
1613    * detect holes in a result set.  The value returned depends on whether
1614    * or not this <code>ResultSet</code> object can detect deletions.
1615    * <p>
1616    * <strong>Note:</strong> Support for the <code>rowDeleted</code> method is optional with a result set
1617    * concurrency of <code>CONCUR_READ_ONLY</code>
1618    *
1619    * @return <code>true</code> if the current row is detected to
1620    * have been deleted by the owner or another; <code>false</code> otherwise
1621    * @throws SQLException                    if a database access error occurs
1622    *                                         or this method is called on a closed result set
1623    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1624    *                                         this method
1625    * @see DatabaseMetaData#deletesAreDetected
1626    * @since 1.2
1627    */
1628   @Override
1629   public boolean rowDeleted() throws SQLException
1630   {
1631      return mInnerResultSet.rowDeleted();
1632   }
1633
1634   /**
1635    * Updates the designated column with a <code>null</code> value.
1636    * <p>
1637    * The updater methods are used to update column values in the
1638    * current row or the insert row.  The updater methods do not
1639    * update the underlying database; instead the <code>updateRow</code>
1640    * or <code>insertRow</code> methods are called to update the database.
1641    *
1642    * @param columnIndex the first column is 1, the second is 2, ...
1643    * @throws SQLException                    if the columnIndex is not valid;
1644    *                                         if a database access error occurs;
1645    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
1646    *                                         or this method is called on a closed result set
1647    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1648    *                                         this method
1649    * @since 1.2
1650    */
1651   @Override
1652   public void updateNull(int columnIndex) throws SQLException
1653   {
1654      mInnerResultSet.updateNull(columnIndex);
1655   }
1656
1657   /**
1658    * Updates the designated column with a <code>boolean</code> value.
1659    * The updater methods are used to update column values in the
1660    * current row or the insert row.  The updater methods do not
1661    * update the underlying database; instead the <code>updateRow</code> or
1662    * <code>insertRow</code> methods are called to update the database.
1663    *
1664    * @param columnIndex the first column is 1, the second is 2, ...
1665    * @param x           the new column value
1666    * @throws SQLException                    if the columnIndex is not valid;
1667    *                                         if a database access error occurs;
1668    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
1669    *                                         or this method is called on a closed result set
1670    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1671    *                                         this method
1672    * @since 1.2
1673    */
1674   @Override
1675   public void updateBoolean(int columnIndex, boolean x) throws SQLException
1676   {
1677      mInnerResultSet.updateBoolean(columnIndex, x);
1678   }
1679
1680   /**
1681    * Updates the designated column with a <code>byte</code> value.
1682    * The updater methods are used to update column values in the
1683    * current row or the insert row.  The updater methods do not
1684    * update the underlying database; instead the <code>updateRow</code> or
1685    * <code>insertRow</code> methods are called to update the database.
1686    *
1687    * @param columnIndex the first column is 1, the second is 2, ...
1688    * @param x           the new column value
1689    * @throws SQLException                    if the columnIndex is not valid;
1690    *                                         if a database access error occurs;
1691    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
1692    *                                         or this method is called on a closed result set
1693    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1694    *                                         this method
1695    * @since 1.2
1696    */
1697   @Override
1698   public void updateByte(int columnIndex, byte x) throws SQLException
1699   {
1700      mInnerResultSet.updateByte(columnIndex, x);
1701   }
1702
1703   /**
1704    * Updates the designated column with a <code>short</code> value.
1705    * The updater methods are used to update column values in the
1706    * current row or the insert row.  The updater methods do not
1707    * update the underlying database; instead the <code>updateRow</code> or
1708    * <code>insertRow</code> methods are called to update the database.
1709    *
1710    * @param columnIndex the first column is 1, the second is 2, ...
1711    * @param x           the new column value
1712    * @throws SQLException                    if the columnIndex is not valid;
1713    *                                         if a database access error occurs;
1714    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
1715    *                                         or this method is called on a closed result set
1716    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1717    *                                         this method
1718    * @since 1.2
1719    */
1720   @Override
1721   public void updateShort(int columnIndex, short x) throws SQLException
1722   {
1723      mInnerResultSet.updateShort(columnIndex, x);
1724   }
1725
1726   /**
1727    * Updates the designated column with an <code>int</code> value.
1728    * The updater methods are used to update column values in the
1729    * current row or the insert row.  The updater methods do not
1730    * update the underlying database; instead the <code>updateRow</code> or
1731    * <code>insertRow</code> methods are called to update the database.
1732    *
1733    * @param columnIndex the first column is 1, the second is 2, ...
1734    * @param x           the new column value
1735    * @throws SQLException                    if the columnIndex is not valid;
1736    *                                         if a database access error occurs;
1737    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
1738    *                                         or this method is called on a closed result set
1739    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1740    *                                         this method
1741    * @since 1.2
1742    */
1743   @Override
1744   public void updateInt(int columnIndex, int x) throws SQLException
1745   {
1746      mInnerResultSet.updateInt(columnIndex, x);
1747   }
1748
1749   /**
1750    * Updates the designated column with a <code>long</code> value.
1751    * The updater methods are used to update column values in the
1752    * current row or the insert row.  The updater methods do not
1753    * update the underlying database; instead the <code>updateRow</code> or
1754    * <code>insertRow</code> methods are called to update the database.
1755    *
1756    * @param columnIndex the first column is 1, the second is 2, ...
1757    * @param x           the new column value
1758    * @throws SQLException                    if the columnIndex is not valid;
1759    *                                         if a database access error occurs;
1760    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
1761    *                                         or this method is called on a closed result set
1762    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1763    *                                         this method
1764    * @since 1.2
1765    */
1766   @Override
1767   public void updateLong(int columnIndex, long x) throws SQLException
1768   {
1769      mInnerResultSet.updateLong(columnIndex, x);
1770   }
1771
1772   /**
1773    * Updates the designated column with a <code>float</code> value.
1774    * The updater methods are used to update column values in the
1775    * current row or the insert row.  The updater methods do not
1776    * update the underlying database; instead the <code>updateRow</code> or
1777    * <code>insertRow</code> methods are called to update the database.
1778    *
1779    * @param columnIndex the first column is 1, the second is 2, ...
1780    * @param x           the new column value
1781    * @throws SQLException                    if the columnIndex is not valid;
1782    *                                         if a database access error occurs;
1783    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
1784    *                                         or this method is called on a closed result set
1785    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1786    *                                         this method
1787    * @since 1.2
1788    */
1789   @Override
1790   public void updateFloat(int columnIndex, float x) throws SQLException
1791   {
1792      mInnerResultSet.updateFloat(columnIndex, x);
1793   }
1794
1795   /**
1796    * Updates the designated column with a <code>double</code> value.
1797    * The updater methods are used to update column values in the
1798    * current row or the insert row.  The updater methods do not
1799    * update the underlying database; instead the <code>updateRow</code> or
1800    * <code>insertRow</code> methods are called to update the database.
1801    *
1802    * @param columnIndex the first column is 1, the second is 2, ...
1803    * @param x           the new column value
1804    * @throws SQLException                    if the columnIndex is not valid;
1805    *                                         if a database access error occurs;
1806    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
1807    *                                         or this method is called on a closed result set
1808    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1809    *                                         this method
1810    * @since 1.2
1811    */
1812   @Override
1813   public void updateDouble(int columnIndex, double x) throws SQLException
1814   {
1815      mInnerResultSet.updateDouble(columnIndex, x);
1816   }
1817
1818   /**
1819    * Updates the designated column with a <code>java.math.BigDecimal</code>
1820    * value.
1821    * The updater methods are used to update column values in the
1822    * current row or the insert row.  The updater methods do not
1823    * update the underlying database; instead the <code>updateRow</code> or
1824    * <code>insertRow</code> methods are called to update the database.
1825    *
1826    * @param columnIndex the first column is 1, the second is 2, ...
1827    * @param x           the new column value
1828    * @throws SQLException                    if the columnIndex is not valid;
1829    *                                         if a database access error occurs;
1830    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
1831    *                                         or this method is called on a closed result set
1832    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1833    *                                         this method
1834    * @since 1.2
1835    */
1836   @Override
1837   public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException
1838   {
1839      mInnerResultSet.updateBigDecimal(columnIndex, x);
1840   }
1841
1842   /**
1843    * Updates the designated column with a <code>String</code> value.
1844    * The updater methods are used to update column values in the
1845    * current row or the insert row.  The updater methods do not
1846    * update the underlying database; instead the <code>updateRow</code> or
1847    * <code>insertRow</code> methods are called to update the database.
1848    *
1849    * @param columnIndex the first column is 1, the second is 2, ...
1850    * @param x           the new column value
1851    * @throws SQLException                    if the columnIndex is not valid;
1852    *                                         if a database access error occurs;
1853    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
1854    *                                         or this method is called on a closed result set
1855    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1856    *                                         this method
1857    * @since 1.2
1858    */
1859   @Override
1860   public void updateString(int columnIndex, String x) throws SQLException
1861   {
1862      mInnerResultSet.updateString(columnIndex, x);
1863   }
1864
1865   /**
1866    * Updates the designated column with a <code>byte</code> array value.
1867    * The updater methods are used to update column values in the
1868    * current row or the insert row.  The updater methods do not
1869    * update the underlying database; instead the <code>updateRow</code> or
1870    * <code>insertRow</code> methods are called to update the database.
1871    *
1872    * @param columnIndex the first column is 1, the second is 2, ...
1873    * @param x           the new column value
1874    * @throws SQLException                    if the columnIndex is not valid;
1875    *                                         if a database access error occurs;
1876    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
1877    *                                         or this method is called on a closed result set
1878    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1879    *                                         this method
1880    * @since 1.2
1881    */
1882   @Override
1883   public void updateBytes(int columnIndex, byte[] x) throws SQLException
1884   {
1885      mInnerResultSet.updateBytes(columnIndex, x);
1886   }
1887
1888   /**
1889    * Updates the designated column with a <code>java.sql.Date</code> value.
1890    * The updater methods are used to update column values in the
1891    * current row or the insert row.  The updater methods do not
1892    * update the underlying database; instead the <code>updateRow</code> or
1893    * <code>insertRow</code> methods are called to update the database.
1894    *
1895    * @param columnIndex the first column is 1, the second is 2, ...
1896    * @param x           the new column value
1897    * @throws SQLException                    if the columnIndex is not valid;
1898    *                                         if a database access error occurs;
1899    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
1900    *                                         or this method is called on a closed result set
1901    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1902    *                                         this method
1903    * @since 1.2
1904    */
1905   @Override
1906   public void updateDate(int columnIndex, Date x) throws SQLException
1907   {
1908      mInnerResultSet.updateDate(columnIndex, x);
1909   }
1910
1911   /**
1912    * Updates the designated column with a <code>java.sql.Time</code> value.
1913    * The updater methods are used to update column values in the
1914    * current row or the insert row.  The updater methods do not
1915    * update the underlying database; instead the <code>updateRow</code> or
1916    * <code>insertRow</code> methods are called to update the database.
1917    *
1918    * @param columnIndex the first column is 1, the second is 2, ...
1919    * @param x           the new column value
1920    * @throws SQLException                    if the columnIndex is not valid;
1921    *                                         if a database access error occurs;
1922    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
1923    *                                         or this method is called on a closed result set
1924    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1925    *                                         this method
1926    * @since 1.2
1927    */
1928   @Override
1929   public void updateTime(int columnIndex, Time x) throws SQLException
1930   {
1931      mInnerResultSet.updateTime(columnIndex, x);
1932   }
1933
1934   /**
1935    * Updates the designated column with a <code>java.sql.Timestamp</code>
1936    * value.
1937    * The updater methods are used to update column values in the
1938    * current row or the insert row.  The updater methods do not
1939    * update the underlying database; instead the <code>updateRow</code> or
1940    * <code>insertRow</code> methods are called to update the database.
1941    *
1942    * @param columnIndex the first column is 1, the second is 2, ...
1943    * @param x           the new column value
1944    * @throws SQLException                    if the columnIndex is not valid;
1945    *                                         if a database access error occurs;
1946    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
1947    *                                         or this method is called on a closed result set
1948    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1949    *                                         this method
1950    * @since 1.2
1951    */
1952   @Override
1953   public void updateTimestamp(int columnIndex, Timestamp x) throws SQLException
1954   {
1955      mInnerResultSet.updateTimestamp(columnIndex, x);
1956   }
1957
1958   /**
1959    * Updates the designated column with an ascii stream value, which will have
1960    * the specified number of bytes.
1961    * The updater methods are used to update column values in the
1962    * current row or the insert row.  The updater methods do not
1963    * update the underlying database; instead the <code>updateRow</code> or
1964    * <code>insertRow</code> methods are called to update the database.
1965    *
1966    * @param columnIndex the first column is 1, the second is 2, ...
1967    * @param x           the new column value
1968    * @param length      the length of the stream
1969    * @throws SQLException                    if the columnIndex is not valid;
1970    *                                         if a database access error occurs;
1971    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
1972    *                                         or this method is called on a closed result set
1973    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1974    *                                         this method
1975    * @since 1.2
1976    */
1977   @Override
1978   public void updateAsciiStream(int columnIndex, InputStream x, int length) throws SQLException
1979   {
1980      mInnerResultSet.updateAsciiStream(columnIndex, x, length);
1981   }
1982
1983   /**
1984    * Updates the designated column with a binary stream value, which will have
1985    * the specified number of bytes.
1986    * The updater methods are used to update column values in the
1987    * current row or the insert row.  The updater methods do not
1988    * update the underlying database; instead the <code>updateRow</code> or
1989    * <code>insertRow</code> methods are called to update the database.
1990    *
1991    * @param columnIndex the first column is 1, the second is 2, ...
1992    * @param x           the new column value
1993    * @param length      the length of the stream
1994    * @throws SQLException                    if the columnIndex is not valid;
1995    *                                         if a database access error occurs;
1996    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
1997    *                                         or this method is called on a closed result set
1998    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
1999    *                                         this method
2000    * @since 1.2
2001    */
2002   @Override
2003   public void updateBinaryStream(int columnIndex, InputStream x, int length) throws SQLException
2004   {
2005      mInnerResultSet.updateBinaryStream(columnIndex, x, length);
2006   }
2007
2008   /**
2009    * Updates the designated column with a character stream value, which will have
2010    * the specified number of bytes.
2011    * The updater methods are used to update column values in the
2012    * current row or the insert row.  The updater methods do not
2013    * update the underlying database; instead the <code>updateRow</code> or
2014    * <code>insertRow</code> methods are called to update the database.
2015    *
2016    * @param columnIndex the first column is 1, the second is 2, ...
2017    * @param x           the new column value
2018    * @param length      the length of the stream
2019    * @throws SQLException                    if the columnIndex is not valid;
2020    *                                         if a database access error occurs;
2021    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2022    *                                         or this method is called on a closed result set
2023    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2024    *                                         this method
2025    * @since 1.2
2026    */
2027   @Override
2028   public void updateCharacterStream(int columnIndex, Reader x, int length) throws SQLException
2029   {
2030      mInnerResultSet.updateCharacterStream(columnIndex, x, length);
2031   }
2032
2033   /**
2034    * Updates the designated column with an <code>Object</code> value.
2035    * <p>
2036    * The updater methods are used to update column values in the
2037    * current row or the insert row.  The updater methods do not
2038    * update the underlying database; instead the <code>updateRow</code> or
2039    * <code>insertRow</code> methods are called to update the database.
2040    * <p>
2041    * If the second argument is an <code>InputStream</code> then the stream must contain
2042    * the number of bytes specified by scaleOrLength.  If the second argument is a
2043    * <code>Reader</code> then the reader must contain the number of characters specified
2044    * by scaleOrLength. If these conditions are not true the driver will generate a
2045    * <code>SQLException</code> when the statement is executed.
2046    *
2047    * @param columnIndex   the first column is 1, the second is 2, ...
2048    * @param x             the new column value
2049    * @param scaleOrLength for an object of <code>java.math.BigDecimal</code> ,
2050    *                      this is the number of digits after the decimal point. For
2051    *                      Java Object types <code>InputStream</code> and <code>Reader</code>,
2052    *                      this is the length
2053    *                      of the data in the stream or reader.  For all other types,
2054    *                      this value will be ignored.
2055    * @throws SQLException                    if the columnIndex is not valid;
2056    *                                         if a database access error occurs;
2057    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2058    *                                         or this method is called on a closed result set
2059    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2060    *                                         this method
2061    * @since 1.2
2062    */
2063   @Override
2064   public void updateObject(int columnIndex, Object x, int scaleOrLength) throws SQLException
2065   {
2066      mInnerResultSet.updateObject(columnIndex, x, scaleOrLength);
2067   }
2068
2069   /**
2070    * Updates the designated column with an <code>Object</code> value.
2071    * <p>
2072    * The updater methods are used to update column values in the
2073    * current row or the insert row.  The updater methods do not
2074    * update the underlying database; instead the <code>updateRow</code> or
2075    * <code>insertRow</code> methods are called to update the database.
2076    *
2077    * @param columnIndex the first column is 1, the second is 2, ...
2078    * @param x           the new column value
2079    * @throws SQLException                    if the columnIndex is not valid;
2080    *                                         if a database access error occurs;
2081    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2082    *                                         or this method is called on a closed result set
2083    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2084    *                                         this method
2085    * @since 1.2
2086    */
2087   @Override
2088   public void updateObject(int columnIndex, Object x) throws SQLException
2089   {
2090      mInnerResultSet.updateObject(columnIndex, x);
2091   }
2092
2093   /**
2094    * Updates the designated column with a <code>null</code> value.
2095    * The updater methods are used to update column values in the
2096    * current row or the insert row.  The updater methods do not
2097    * update the underlying database; instead the <code>updateRow</code> or
2098    * <code>insertRow</code> methods are called to update the database.
2099    *
2100    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2101    * @throws SQLException                    if the columnLabel is not valid;
2102    *                                         if a database access error occurs;
2103    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2104    *                                         or this method is called on a closed result set
2105    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2106    *                                         this method
2107    * @since 1.2
2108    */
2109   @Override
2110   public void updateNull(String columnLabel) throws SQLException
2111   {
2112      mInnerResultSet.updateNull(columnLabel);
2113   }
2114
2115   /**
2116    * Updates the designated column with a <code>boolean</code> value.
2117    * The updater methods are used to update column values in the
2118    * current row or the insert row.  The updater methods do not
2119    * update the underlying database; instead the <code>updateRow</code> or
2120    * <code>insertRow</code> methods are called to update the database.
2121    *
2122    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2123    * @param x           the new column value
2124    * @throws SQLException                    if the columnLabel is not valid;
2125    *                                         if a database access error occurs;
2126    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2127    *                                         or this method is called on a closed result set
2128    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2129    *                                         this method
2130    * @since 1.2
2131    */
2132   @Override
2133   public void updateBoolean(String columnLabel, boolean x) throws SQLException
2134   {
2135      mInnerResultSet.updateBoolean(columnLabel, x);
2136   }
2137
2138   /**
2139    * Updates the designated column with a <code>byte</code> value.
2140    * The updater methods are used to update column values in the
2141    * current row or the insert row.  The updater methods do not
2142    * update the underlying database; instead the <code>updateRow</code> or
2143    * <code>insertRow</code> methods are called to update the database.
2144    *
2145    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2146    * @param x           the new column value
2147    * @throws SQLException                    if the columnLabel is not valid;
2148    *                                         if a database access error occurs;
2149    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2150    *                                         or this method is called on a closed result set
2151    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2152    *                                         this method
2153    * @since 1.2
2154    */
2155   @Override
2156   public void updateByte(String columnLabel, byte x) throws SQLException
2157   {
2158      mInnerResultSet.updateByte(columnLabel, x);
2159   }
2160
2161   /**
2162    * Updates the designated column with a <code>short</code> value.
2163    * The updater methods are used to update column values in the
2164    * current row or the insert row.  The updater methods do not
2165    * update the underlying database; instead the <code>updateRow</code> or
2166    * <code>insertRow</code> methods are called to update the database.
2167    *
2168    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2169    * @param x           the new column value
2170    * @throws SQLException                    if the columnLabel is not valid;
2171    *                                         if a database access error occurs;
2172    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2173    *                                         or this method is called on a closed result set
2174    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2175    *                                         this method
2176    * @since 1.2
2177    */
2178   @Override
2179   public void updateShort(String columnLabel, short x) throws SQLException
2180   {
2181      mInnerResultSet.updateShort(columnLabel, x);
2182   }
2183
2184   /**
2185    * Updates the designated column with an <code>int</code> value.
2186    * The updater methods are used to update column values in the
2187    * current row or the insert row.  The updater methods do not
2188    * update the underlying database; instead the <code>updateRow</code> or
2189    * <code>insertRow</code> methods are called to update the database.
2190    *
2191    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2192    * @param x           the new column value
2193    * @throws SQLException                    if the columnLabel is not valid;
2194    *                                         if a database access error occurs;
2195    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2196    *                                         or this method is called on a closed result set
2197    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2198    *                                         this method
2199    * @since 1.2
2200    */
2201   @Override
2202   public void updateInt(String columnLabel, int x) throws SQLException
2203   {
2204      mInnerResultSet.updateInt(columnLabel, x);
2205   }
2206
2207   /**
2208    * Updates the designated column with a <code>long</code> value.
2209    * The updater methods are used to update column values in the
2210    * current row or the insert row.  The updater methods do not
2211    * update the underlying database; instead the <code>updateRow</code> or
2212    * <code>insertRow</code> methods are called to update the database.
2213    *
2214    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2215    * @param x           the new column value
2216    * @throws SQLException                    if the columnLabel is not valid;
2217    *                                         if a database access error occurs;
2218    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2219    *                                         or this method is called on a closed result set
2220    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2221    *                                         this method
2222    * @since 1.2
2223    */
2224   @Override
2225   public void updateLong(String columnLabel, long x) throws SQLException
2226   {
2227      mInnerResultSet.updateLong(columnLabel, x);
2228   }
2229
2230   /**
2231    * Updates the designated column with a <code>float </code> value.
2232    * The updater methods are used to update column values in the
2233    * current row or the insert row.  The updater methods do not
2234    * update the underlying database; instead the <code>updateRow</code> or
2235    * <code>insertRow</code> methods are called to update the database.
2236    *
2237    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2238    * @param x           the new column value
2239    * @throws SQLException                    if the columnLabel is not valid;
2240    *                                         if a database access error occurs;
2241    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2242    *                                         or this method is called on a closed result set
2243    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2244    *                                         this method
2245    * @since 1.2
2246    */
2247   @Override
2248   public void updateFloat(String columnLabel, float x) throws SQLException
2249   {
2250      mInnerResultSet.updateFloat(columnLabel, x);
2251   }
2252
2253   /**
2254    * Updates the designated column with a <code>double</code> value.
2255    * The updater methods are used to update column values in the
2256    * current row or the insert row.  The updater methods do not
2257    * update the underlying database; instead the <code>updateRow</code> or
2258    * <code>insertRow</code> methods are called to update the database.
2259    *
2260    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2261    * @param x           the new column value
2262    * @throws SQLException                    if the columnLabel is not valid;
2263    *                                         if a database access error occurs;
2264    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2265    *                                         or this method is called on a closed result set
2266    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2267    *                                         this method
2268    * @since 1.2
2269    */
2270   @Override
2271   public void updateDouble(String columnLabel, double x) throws SQLException
2272   {
2273      mInnerResultSet.updateDouble(columnLabel, x);
2274   }
2275
2276   /**
2277    * Updates the designated column with a <code>java.sql.BigDecimal</code>
2278    * value.
2279    * The updater methods are used to update column values in the
2280    * current row or the insert row.  The updater methods do not
2281    * update the underlying database; instead the <code>updateRow</code> or
2282    * <code>insertRow</code> methods are called to update the database.
2283    *
2284    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2285    * @param x           the new column value
2286    * @throws SQLException                    if the columnLabel is not valid;
2287    *                                         if a database access error occurs;
2288    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2289    *                                         or this method is called on a closed result set
2290    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2291    *                                         this method
2292    * @since 1.2
2293    */
2294   @Override
2295   public void updateBigDecimal(String columnLabel, BigDecimal x) throws SQLException
2296   {
2297      mInnerResultSet.updateBigDecimal(columnLabel, x);
2298   }
2299
2300   /**
2301    * Updates the designated column with a <code>String</code> value.
2302    * The updater methods are used to update column values in the
2303    * current row or the insert row.  The updater methods do not
2304    * update the underlying database; instead the <code>updateRow</code> or
2305    * <code>insertRow</code> methods are called to update the database.
2306    *
2307    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2308    * @param x           the new column value
2309    * @throws SQLException                    if the columnLabel is not valid;
2310    *                                         if a database access error occurs;
2311    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2312    *                                         or this method is called on a closed result set
2313    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2314    *                                         this method
2315    * @since 1.2
2316    */
2317   @Override
2318   public void updateString(String columnLabel, String x) throws SQLException
2319   {
2320      mInnerResultSet.updateString(columnLabel, x);
2321   }
2322
2323   /**
2324    * Updates the designated column with a byte array value.
2325    * <p>
2326    * The updater methods are used to update column values in the
2327    * current row or the insert row.  The updater methods do not
2328    * update the underlying database; instead the <code>updateRow</code>
2329    * or <code>insertRow</code> methods are called to update the database.
2330    *
2331    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2332    * @param x           the new column value
2333    * @throws SQLException                    if the columnLabel is not valid;
2334    *                                         if a database access error occurs;
2335    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2336    *                                         or this method is called on a closed result set
2337    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2338    *                                         this method
2339    * @since 1.2
2340    */
2341   @Override
2342   public void updateBytes(String columnLabel, byte[] x) throws SQLException
2343   {
2344      mInnerResultSet.updateBytes(columnLabel, x);
2345   }
2346
2347   /**
2348    * Updates the designated column with a <code>java.sql.Date</code> value.
2349    * The updater methods are used to update column values in the
2350    * current row or the insert row.  The updater methods do not
2351    * update the underlying database; instead the <code>updateRow</code> or
2352    * <code>insertRow</code> methods are called to update the database.
2353    *
2354    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2355    * @param x           the new column value
2356    * @throws SQLException                    if the columnLabel is not valid;
2357    *                                         if a database access error occurs;
2358    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2359    *                                         or this method is called on a closed result set
2360    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2361    *                                         this method
2362    * @since 1.2
2363    */
2364   @Override
2365   public void updateDate(String columnLabel, Date x) throws SQLException
2366   {
2367      mInnerResultSet.updateDate(columnLabel, x);
2368   }
2369
2370   /**
2371    * Updates the designated column with a <code>java.sql.Time</code> value.
2372    * The updater methods are used to update column values in the
2373    * current row or the insert row.  The updater methods do not
2374    * update the underlying database; instead the <code>updateRow</code> or
2375    * <code>insertRow</code> methods are called to update the database.
2376    *
2377    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2378    * @param x           the new column value
2379    * @throws SQLException                    if the columnLabel is not valid;
2380    *                                         if a database access error occurs;
2381    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2382    *                                         or this method is called on a closed result set
2383    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2384    *                                         this method
2385    * @since 1.2
2386    */
2387   @Override
2388   public void updateTime(String columnLabel, Time x) throws SQLException
2389   {
2390      mInnerResultSet.updateTime(columnLabel, x);
2391   }
2392
2393   /**
2394    * Updates the designated column with a <code>java.sql.Timestamp</code>
2395    * value.
2396    * The updater methods are used to update column values in the
2397    * current row or the insert row.  The updater methods do not
2398    * update the underlying database; instead the <code>updateRow</code> or
2399    * <code>insertRow</code> methods are called to update the database.
2400    *
2401    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2402    * @param x           the new column value
2403    * @throws SQLException                    if the columnLabel is not valid;
2404    *                                         if a database access error occurs;
2405    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2406    *                                         or this method is called on a closed result set
2407    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2408    *                                         this method
2409    * @since 1.2
2410    */
2411   @Override
2412   public void updateTimestamp(String columnLabel, Timestamp x) throws SQLException
2413   {
2414      mInnerResultSet.updateTimestamp(columnLabel, x);
2415   }
2416
2417   /**
2418    * Updates the designated column with an ascii stream value, which will have
2419    * the specified number of bytes.
2420    * The updater methods are used to update column values in the
2421    * current row or the insert row.  The updater methods do not
2422    * update the underlying database; instead the <code>updateRow</code> or
2423    * <code>insertRow</code> methods are called to update the database.
2424    *
2425    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2426    * @param x           the new column value
2427    * @param length      the length of the stream
2428    * @throws SQLException                    if the columnLabel is not valid;
2429    *                                         if a database access error occurs;
2430    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2431    *                                         or this method is called on a closed result set
2432    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2433    *                                         this method
2434    * @since 1.2
2435    */
2436   @Override
2437   public void updateAsciiStream(String columnLabel, InputStream x, int length) throws SQLException
2438   {
2439      mInnerResultSet.updateAsciiStream(columnLabel, x, length);
2440   }
2441
2442   /**
2443    * Updates the designated column with a binary stream value, which will have
2444    * the specified number of bytes.
2445    * The updater methods are used to update column values in the
2446    * current row or the insert row.  The updater methods do not
2447    * update the underlying database; instead the <code>updateRow</code> or
2448    * <code>insertRow</code> methods are called to update the database.
2449    *
2450    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2451    * @param x           the new column value
2452    * @param length      the length of the stream
2453    * @throws SQLException                    if the columnLabel is not valid;
2454    *                                         if a database access error occurs;
2455    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2456    *                                         or this method is called on a closed result set
2457    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2458    *                                         this method
2459    * @since 1.2
2460    */
2461   @Override
2462   public void updateBinaryStream(String columnLabel, InputStream x, int length) throws SQLException
2463   {
2464      mInnerResultSet.updateBinaryStream(columnLabel, x, length);
2465   }
2466
2467   /**
2468    * Updates the designated column with a character stream value, which will have
2469    * the specified number of bytes.
2470    * The updater methods are used to update column values in the
2471    * current row or the insert row.  The updater methods do not
2472    * update the underlying database; instead the <code>updateRow</code> or
2473    * <code>insertRow</code> methods are called to update the database.
2474    *
2475    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2476    * @param reader      the <code>java.io.Reader</code> object containing
2477    *                    the new column value
2478    * @param length      the length of the stream
2479    * @throws SQLException                    if the columnLabel is not valid;
2480    *                                         if a database access error occurs;
2481    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2482    *                                         or this method is called on a closed result set
2483    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2484    *                                         this method
2485    * @since 1.2
2486    */
2487   @Override
2488   public void updateCharacterStream(String columnLabel, Reader reader, int length) throws SQLException
2489   {
2490      mInnerResultSet.updateCharacterStream(columnLabel, reader, length);
2491   }
2492
2493   /**
2494    * Updates the designated column with an <code>Object</code> value.
2495    * <p>
2496    * The updater methods are used to update column values in the
2497    * current row or the insert row.  The updater methods do not
2498    * update the underlying database; instead the <code>updateRow</code> or
2499    * <code>insertRow</code> methods are called to update the database.
2500    * <p>
2501    * If the second argument is an <code>InputStream</code> then the stream must contain
2502    * the number of bytes specified by scaleOrLength.  If the second argument is a
2503    * <code>Reader</code> then the reader must contain the number of characters specified
2504    * by scaleOrLength. If these conditions are not true the driver will generate a
2505    * <code>SQLException</code> when the statement is executed.
2506    *
2507    * @param columnLabel   the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2508    * @param x             the new column value
2509    * @param scaleOrLength for an object of <code>java.math.BigDecimal</code> ,
2510    *                      this is the number of digits after the decimal point. For
2511    *                      Java Object types <code>InputStream</code> and <code>Reader</code>,
2512    *                      this is the length
2513    *                      of the data in the stream or reader.  For all other types,
2514    *                      this value will be ignored.
2515    * @throws SQLException                    if the columnLabel is not valid;
2516    *                                         if a database access error occurs;
2517    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2518    *                                         or this method is called on a closed result set
2519    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2520    *                                         this method
2521    * @since 1.2
2522    */
2523   @Override
2524   public void updateObject(String columnLabel, Object x, int scaleOrLength) throws SQLException
2525   {
2526      mInnerResultSet.updateObject(columnLabel, x, scaleOrLength);
2527   }
2528
2529   /**
2530    * Updates the designated column with an <code>Object</code> value.
2531    * <p>
2532    * The updater methods are used to update column values in the
2533    * current row or the insert row.  The updater methods do not
2534    * update the underlying database; instead the <code>updateRow</code> or
2535    * <code>insertRow</code> methods are called to update the database.
2536    *
2537    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2538    * @param x           the new column value
2539    * @throws SQLException                    if the columnLabel is not valid;
2540    *                                         if a database access error occurs;
2541    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2542    *                                         or this method is called on a closed result set
2543    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2544    *                                         this method
2545    * @since 1.2
2546    */
2547   @Override
2548   public void updateObject(String columnLabel, Object x) throws SQLException
2549   {
2550      mInnerResultSet.updateObject(columnLabel, x);
2551   }
2552
2553   /**
2554    * Inserts the contents of the insert row into this
2555    * <code>ResultSet</code> object and into the database.
2556    * The cursor must be on the insert row when this method is called.
2557    *
2558    * @throws SQLException                    if a database access error occurs;
2559    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>,
2560    *                                         this method is called on a closed result set,
2561    *                                         if this method is called when the cursor is not on the insert row,
2562    *                                         or if not all of non-nullable columns in
2563    *                                         the insert row have been given a non-null value
2564    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2565    *                                         this method
2566    * @since 1.2
2567    */
2568   @Override
2569   public void insertRow() throws SQLException
2570   {
2571      mInnerResultSet.insertRow();
2572   }
2573
2574   /**
2575    * Updates the underlying database with the new contents of the
2576    * current row of this <code>ResultSet</code> object.
2577    * This method cannot be called when the cursor is on the insert row.
2578    *
2579    * @throws SQLException                    if a database access error occurs;
2580    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>;
2581    *                                         this method is called on a closed result set or
2582    *                                         if this method is called when the cursor is on the insert row
2583    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2584    *                                         this method
2585    * @since 1.2
2586    */
2587   @Override
2588   public void updateRow() throws SQLException
2589   {
2590      mInnerResultSet.updateRow();
2591   }
2592
2593   /**
2594    * Deletes the current row from this <code>ResultSet</code> object
2595    * and from the underlying database.  This method cannot be called when
2596    * the cursor is on the insert row.
2597    *
2598    * @throws SQLException                    if a database access error occurs;
2599    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>;
2600    *                                         this method is called on a closed result set
2601    *                                         or if this method is called when the cursor is on the insert row
2602    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2603    *                                         this method
2604    * @since 1.2
2605    */
2606   @Override
2607   public void deleteRow() throws SQLException
2608   {
2609      mInnerResultSet.deleteRow();
2610   }
2611
2612   /**
2613    * Refreshes the current row with its most recent value in
2614    * the database.  This method cannot be called when
2615    * the cursor is on the insert row.
2616    *
2617    * <P>The <code>refreshRow</code> method provides a way for an
2618    * application to
2619    * explicitly tell the JDBC driver to refetch a row(s) from the
2620    * database.  An application may want to call <code>refreshRow</code> when
2621    * caching or prefetching is being done by the JDBC driver to
2622    * fetch the latest value of a row from the database.  The JDBC driver
2623    * may actually refresh multiple rows at once if the fetch size is
2624    * greater than one.
2625    *
2626    * <P> All values are refetched subject to the transaction isolation
2627    * level and cursor sensitivity.  If <code>refreshRow</code> is called after
2628    * calling an updater method, but before calling
2629    * the method <code>updateRow</code>, then the
2630    * updates made to the row are lost.  Calling the method
2631    * <code>refreshRow</code> frequently will likely slow performance.
2632    *
2633    * @throws SQLException                    if a database access error
2634    *                                         occurs; this method is called on a closed result set;
2635    *                                         the result set type is <code>TYPE_FORWARD_ONLY</code> or if this
2636    *                                         method is called when the cursor is on the insert row
2637    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2638    *                                         this method or this method is not supported for the specified result
2639    *                                         set type and result set concurrency.
2640    * @since 1.2
2641    */
2642   @Override
2643   public void refreshRow() throws SQLException
2644   {
2645      mInnerResultSet.refreshRow();
2646   }
2647
2648   /**
2649    * Cancels the updates made to the current row in this
2650    * <code>ResultSet</code> object.
2651    * This method may be called after calling an
2652    * updater method(s) and before calling
2653    * the method <code>updateRow</code> to roll back
2654    * the updates made to a row.  If no updates have been made or
2655    * <code>updateRow</code> has already been called, this method has no
2656    * effect.
2657    *
2658    * @throws SQLException                    if a database access error
2659    *                                         occurs; this method is called on a closed result set;
2660    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
2661    *                                         or if this method is called when the cursor is
2662    *                                         on the insert row
2663    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2664    *                                         this method
2665    * @since 1.2
2666    */
2667   @Override
2668   public void cancelRowUpdates() throws SQLException
2669   {
2670      mInnerResultSet.cancelRowUpdates();
2671   }
2672
2673   /**
2674    * Moves the cursor to the insert row.  The current cursor position is
2675    * remembered while the cursor is positioned on the insert row.
2676    * <p>
2677    * The insert row is a special row associated with an updatable
2678    * result set.  It is essentially a buffer where a new row may
2679    * be constructed by calling the updater methods prior to
2680    * inserting the row into the result set.
2681    * <p>
2682    * Only the updater, getter,
2683    * and <code>insertRow</code> methods may be
2684    * called when the cursor is on the insert row.  All of the columns in
2685    * a result set must be given a value each time this method is
2686    * called before calling <code>insertRow</code>.
2687    * An updater method must be called before a
2688    * getter method can be called on a column value.
2689    *
2690    * @throws SQLException                    if a database access error occurs; this
2691    *                                         method is called on a closed result set
2692    *                                         or the result set concurrency is <code>CONCUR_READ_ONLY</code>
2693    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2694    *                                         this method
2695    * @since 1.2
2696    */
2697   @Override
2698   public void moveToInsertRow() throws SQLException
2699   {
2700      mInnerResultSet.moveToInsertRow();
2701   }
2702
2703   /**
2704    * Moves the cursor to the remembered cursor position, usually the
2705    * current row.  This method has no effect if the cursor is not on
2706    * the insert row.
2707    *
2708    * @throws SQLException                    if a database access error occurs; this
2709    *                                         method is called on a closed result set
2710    *                                         or the result set concurrency is <code>CONCUR_READ_ONLY</code>
2711    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2712    *                                         this method
2713    * @since 1.2
2714    */
2715   @Override
2716   public void moveToCurrentRow() throws SQLException
2717   {
2718      mInnerResultSet.moveToCurrentRow();
2719   }
2720
2721   /**
2722    * Retrieves the <code>Statement</code> object that produced this
2723    * <code>ResultSet</code> object.
2724    * If the result set was generated some other way, such as by a
2725    * <code>DatabaseMetaData</code> method, this method  may return
2726    * <code>null</code>.
2727    *
2728    * @return the <code>Statement</code> object that produced
2729    * this <code>ResultSet</code> object or <code>null</code>
2730    * if the result set was produced some other way
2731    * @throws SQLException if a database access error occurs
2732    *                      or this method is called on a closed result set
2733    * @since 1.2
2734    */
2735   @Override
2736   public Statement getStatement() throws SQLException
2737   {
2738      return mInnerResultSet.getStatement();
2739   }
2740
2741   /**
2742    * Retrieves the value of the designated column in the current row
2743    * of this <code>ResultSet</code> object as an <code>Object</code>
2744    * in the Java programming language.
2745    * If the value is an SQL <code>NULL</code>,
2746    * the driver returns a Java <code>null</code>.
2747    * This method uses the given <code>Map</code> object
2748    * for the custom mapping of the
2749    * SQL structured or distinct type that is being retrieved.
2750    *
2751    * @param columnIndex the first column is 1, the second is 2, ...
2752    * @param map         a <code>java.util.Map</code> object that contains the mapping
2753    *                    from SQL type names to classes in the Java programming language
2754    * @return an <code>Object</code> in the Java programming language
2755    * representing the SQL value
2756    * @throws SQLException                    if the columnIndex is not valid;
2757    *                                         if a database access error occurs
2758    *                                         or this method is called on a closed result set
2759    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2760    *                                         this method
2761    * @since 1.2
2762    */
2763   @Override
2764   public Object getObject(int columnIndex, Map<String, Class<?>> map) throws SQLException
2765   {
2766      return mInnerResultSet.getObject(columnIndex, map);
2767   }
2768
2769   /**
2770    * Retrieves the value of the designated column in the current row
2771    * of this <code>ResultSet</code> object as a <code>Ref</code> object
2772    * in the Java programming language.
2773    *
2774    * @param columnIndex the first column is 1, the second is 2, ...
2775    * @return a <code>Ref</code> object representing an SQL <code>REF</code>
2776    * value
2777    * @throws SQLException                    if the columnIndex is not valid;
2778    *                                         if a database access error occurs
2779    *                                         or this method is called on a closed result set
2780    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2781    *                                         this method
2782    * @since 1.2
2783    */
2784   @Override
2785   public Ref getRef(int columnIndex) throws SQLException
2786   {
2787      return mInnerResultSet.getRef(columnIndex);
2788   }
2789
2790   /**
2791    * Retrieves the value of the designated column in the current row
2792    * of this <code>ResultSet</code> object as a <code>Blob</code> object
2793    * in the Java programming language.
2794    *
2795    * @param columnIndex the first column is 1, the second is 2, ...
2796    * @return a <code>Blob</code> object representing the SQL
2797    * <code>BLOB</code> value in the specified column
2798    * @throws SQLException                    if the columnIndex is not valid;
2799    *                                         if a database access error occurs
2800    *                                         or this method is called on a closed result set
2801    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2802    *                                         this method
2803    * @since 1.2
2804    */
2805   @Override
2806   public Blob getBlob(int columnIndex) throws SQLException
2807   {
2808      return mInnerResultSet.getBlob(columnIndex);
2809   }
2810
2811   /**
2812    * Retrieves the value of the designated column in the current row
2813    * of this <code>ResultSet</code> object as a <code>Clob</code> object
2814    * in the Java programming language.
2815    *
2816    * @param columnIndex the first column is 1, the second is 2, ...
2817    * @return a <code>Clob</code> object representing the SQL
2818    * <code>CLOB</code> value in the specified column
2819    * @throws SQLException                    if the columnIndex is not valid;
2820    *                                         if a database access error occurs
2821    *                                         or this method is called on a closed result set
2822    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2823    *                                         this method
2824    * @since 1.2
2825    */
2826   @Override
2827   public Clob getClob(int columnIndex) throws SQLException
2828   {
2829      return mInnerResultSet.getClob(columnIndex);
2830   }
2831
2832   /**
2833    * Retrieves the value of the designated column in the current row
2834    * of this <code>ResultSet</code> object as an <code>Array</code> object
2835    * in the Java programming language.
2836    *
2837    * @param columnIndex the first column is 1, the second is 2, ...
2838    * @return an <code>Array</code> object representing the SQL
2839    * <code>ARRAY</code> value in the specified column
2840    * @throws SQLException                    if the columnIndex is not valid;
2841    *                                         if a database access error occurs
2842    *                                         or this method is called on a closed result set
2843    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2844    *                                         this method
2845    * @since 1.2
2846    */
2847   @Override
2848   public Array getArray(int columnIndex) throws SQLException
2849   {
2850      return mInnerResultSet.getArray(columnIndex);
2851   }
2852
2853   /**
2854    * Retrieves the value of the designated column in the current row
2855    * of this <code>ResultSet</code> object as an <code>Object</code>
2856    * in the Java programming language.
2857    * If the value is an SQL <code>NULL</code>,
2858    * the driver returns a Java <code>null</code>.
2859    * This method uses the specified <code>Map</code> object for
2860    * custom mapping if appropriate.
2861    *
2862    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2863    * @param map         a <code>java.util.Map</code> object that contains the mapping
2864    *                    from SQL type names to classes in the Java programming language
2865    * @return an <code>Object</code> representing the SQL value in the
2866    * specified column
2867    * @throws SQLException                    if the columnLabel is not valid;
2868    *                                         if a database access error occurs
2869    *                                         or this method is called on a closed result set
2870    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2871    *                                         this method
2872    * @since 1.2
2873    */
2874   @Override
2875   public Object getObject(String columnLabel, Map<String, Class<?>> map) throws SQLException
2876   {
2877      return mInnerResultSet.getObject(columnLabel, map);
2878   }
2879
2880   /**
2881    * Retrieves the value of the designated column in the current row
2882    * of this <code>ResultSet</code> object as a <code>Ref</code> object
2883    * in the Java programming language.
2884    *
2885    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2886    * @return a <code>Ref</code> object representing the SQL <code>REF</code>
2887    * value in the specified column
2888    * @throws SQLException                    if the columnLabel is not valid;
2889    *                                         if a database access error occurs
2890    *                                         or this method is called on a closed result set
2891    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2892    *                                         this method
2893    * @since 1.2
2894    */
2895   @Override
2896   public Ref getRef(String columnLabel) throws SQLException
2897   {
2898      return mInnerResultSet.getRef(columnLabel);
2899   }
2900
2901   /**
2902    * Retrieves the value of the designated column in the current row
2903    * of this <code>ResultSet</code> object as a <code>Blob</code> object
2904    * in the Java programming language.
2905    *
2906    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2907    * @return a <code>Blob</code> object representing the SQL <code>BLOB</code>
2908    * value in the specified column
2909    * @throws SQLException                    if the columnLabel is not valid;
2910    *                                         if a database access error occurs
2911    *                                         or this method is called on a closed result set
2912    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2913    *                                         this method
2914    * @since 1.2
2915    */
2916   @Override
2917   public Blob getBlob(String columnLabel) throws SQLException
2918   {
2919      return mInnerResultSet.getBlob(columnLabel);
2920   }
2921
2922   /**
2923    * Retrieves the value of the designated column in the current row
2924    * of this <code>ResultSet</code> object as a <code>Clob</code> object
2925    * in the Java programming language.
2926    *
2927    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2928    * @return a <code>Clob</code> object representing the SQL <code>CLOB</code>
2929    * value in the specified column
2930    * @throws SQLException                    if the columnLabel is not valid;
2931    *                                         if a database access error occurs
2932    *                                         or this method is called on a closed result set
2933    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2934    *                                         this method
2935    * @since 1.2
2936    */
2937   @Override
2938   public Clob getClob(String columnLabel) throws SQLException
2939   {
2940      return mInnerResultSet.getClob(columnLabel);
2941   }
2942
2943   /**
2944    * Retrieves the value of the designated column in the current row
2945    * of this <code>ResultSet</code> object as an <code>Array</code> object
2946    * in the Java programming language.
2947    *
2948    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2949    * @return an <code>Array</code> object representing the SQL <code>ARRAY</code> value in
2950    * the specified column
2951    * @throws SQLException                    if the columnLabel is not valid;
2952    *                                         if a database access error occurs
2953    *                                         or this method is called on a closed result set
2954    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
2955    *                                         this method
2956    * @since 1.2
2957    */
2958   @Override
2959   public Array getArray(String columnLabel) throws SQLException
2960   {
2961      return mInnerResultSet.getArray(columnLabel);
2962   }
2963
2964   /**
2965    * Retrieves the value of the designated column in the current row
2966    * of this <code>ResultSet</code> object as a <code>java.sql.Date</code> object
2967    * in the Java programming language.
2968    * This method uses the given calendar to construct an appropriate millisecond
2969    * value for the date if the underlying database does not store
2970    * timezone information.
2971    *
2972    * @param columnIndex the first column is 1, the second is 2, ...
2973    * @param cal         the <code>java.util.Calendar</code> object
2974    *                    to use in constructing the date
2975    * @return the column value as a <code>java.sql.Date</code> object;
2976    * if the value is SQL <code>NULL</code>,
2977    * the value returned is <code>null</code> in the Java programming language
2978    * @throws SQLException if the columnIndex is not valid;
2979    *                      if a database access error occurs
2980    *                      or this method is called on a closed result set
2981    * @since 1.2
2982    */
2983   @Override
2984   public Date getDate(int columnIndex, Calendar cal) throws SQLException
2985   {
2986      return mInnerResultSet.getDate(columnIndex, cal);
2987   }
2988
2989   /**
2990    * Retrieves the value of the designated column in the current row
2991    * of this <code>ResultSet</code> object as a <code>java.sql.Date</code> object
2992    * in the Java programming language.
2993    * This method uses the given calendar to construct an appropriate millisecond
2994    * value for the date if the underlying database does not store
2995    * timezone information.
2996    *
2997    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
2998    * @param cal         the <code>java.util.Calendar</code> object
2999    *                    to use in constructing the date
3000    * @return the column value as a <code>java.sql.Date</code> object;
3001    * if the value is SQL <code>NULL</code>,
3002    * the value returned is <code>null</code> in the Java programming language
3003    * @throws SQLException if the columnLabel is not valid;
3004    *                      if a database access error occurs
3005    *                      or this method is called on a closed result set
3006    * @since 1.2
3007    */
3008   @Override
3009   public Date getDate(String columnLabel, Calendar cal) throws SQLException
3010   {
3011      return mInnerResultSet.getDate(columnLabel, cal);
3012   }
3013
3014   /**
3015    * Retrieves the value of the designated column in the current row
3016    * of this <code>ResultSet</code> object as a <code>java.sql.Time</code> object
3017    * in the Java programming language.
3018    * This method uses the given calendar to construct an appropriate millisecond
3019    * value for the time if the underlying database does not store
3020    * timezone information.
3021    *
3022    * @param columnIndex the first column is 1, the second is 2, ...
3023    * @param cal         the <code>java.util.Calendar</code> object
3024    *                    to use in constructing the time
3025    * @return the column value as a <code>java.sql.Time</code> object;
3026    * if the value is SQL <code>NULL</code>,
3027    * the value returned is <code>null</code> in the Java programming language
3028    * @throws SQLException if the columnIndex is not valid;
3029    *                      if a database access error occurs
3030    *                      or this method is called on a closed result set
3031    * @since 1.2
3032    */
3033   @Override
3034   public Time getTime(int columnIndex, Calendar cal) throws SQLException
3035   {
3036      return mInnerResultSet.getTime(columnIndex, cal);
3037   }
3038
3039   /**
3040    * Retrieves the value of the designated column in the current row
3041    * of this <code>ResultSet</code> object as a <code>java.sql.Time</code> object
3042    * in the Java programming language.
3043    * This method uses the given calendar to construct an appropriate millisecond
3044    * value for the time if the underlying database does not store
3045    * timezone information.
3046    *
3047    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3048    * @param cal         the <code>java.util.Calendar</code> object
3049    *                    to use in constructing the time
3050    * @return the column value as a <code>java.sql.Time</code> object;
3051    * if the value is SQL <code>NULL</code>,
3052    * the value returned is <code>null</code> in the Java programming language
3053    * @throws SQLException if the columnLabel is not valid;
3054    *                      if a database access error occurs
3055    *                      or this method is called on a closed result set
3056    * @since 1.2
3057    */
3058   @Override
3059   public Time getTime(String columnLabel, Calendar cal) throws SQLException
3060   {
3061      return mInnerResultSet.getTime(columnLabel, cal);
3062   }
3063
3064   /**
3065    * Retrieves the value of the designated column in the current row
3066    * of this <code>ResultSet</code> object as a <code>java.sql.Timestamp</code> object
3067    * in the Java programming language.
3068    * This method uses the given calendar to construct an appropriate millisecond
3069    * value for the timestamp if the underlying database does not store
3070    * timezone information.
3071    *
3072    * @param columnIndex the first column is 1, the second is 2, ...
3073    * @param cal         the <code>java.util.Calendar</code> object
3074    *                    to use in constructing the timestamp
3075    * @return the column value as a <code>java.sql.Timestamp</code> object;
3076    * if the value is SQL <code>NULL</code>,
3077    * the value returned is <code>null</code> in the Java programming language
3078    * @throws SQLException if the columnIndex is not valid;
3079    *                      if a database access error occurs
3080    *                      or this method is called on a closed result set
3081    * @since 1.2
3082    */
3083   @Override
3084   public Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException
3085   {
3086      return mInnerResultSet.getTimestamp(columnIndex, cal);
3087   }
3088
3089   /**
3090    * Retrieves the value of the designated column in the current row
3091    * of this <code>ResultSet</code> object as a <code>java.sql.Timestamp</code> object
3092    * in the Java programming language.
3093    * This method uses the given calendar to construct an appropriate millisecond
3094    * value for the timestamp if the underlying database does not store
3095    * timezone information.
3096    *
3097    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3098    * @param cal         the <code>java.util.Calendar</code> object
3099    *                    to use in constructing the date
3100    * @return the column value as a <code>java.sql.Timestamp</code> object;
3101    * if the value is SQL <code>NULL</code>,
3102    * the value returned is <code>null</code> in the Java programming language
3103    * @throws SQLException if the columnLabel is not valid or
3104    *                      if a database access error occurs
3105    *                      or this method is called on a closed result set
3106    * @since 1.2
3107    */
3108   @Override
3109   public Timestamp getTimestamp(String columnLabel, Calendar cal) throws SQLException
3110   {
3111      return mInnerResultSet.getTimestamp(columnLabel, cal);
3112   }
3113
3114   /**
3115    * Retrieves the value of the designated column in the current row
3116    * of this <code>ResultSet</code> object as a <code>java.net.URL</code>
3117    * object in the Java programming language.
3118    *
3119    * @param columnIndex the index of the column 1 is the first, 2 is the second,...
3120    * @return the column value as a <code>java.net.URL</code> object;
3121    * if the value is SQL <code>NULL</code>,
3122    * the value returned is <code>null</code> in the Java programming language
3123    * @throws SQLException                    if the columnIndex is not valid;
3124    *                                         if a database access error occurs; this method
3125    *                                         is called on a closed result set or if a URL is malformed
3126    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3127    *                                         this method
3128    * @since 1.4
3129    */
3130   @Override
3131   public URL getURL(int columnIndex) throws SQLException
3132   {
3133      return mInnerResultSet.getURL(columnIndex);
3134   }
3135
3136   /**
3137    * Retrieves the value of the designated column in the current row
3138    * of this <code>ResultSet</code> object as a <code>java.net.URL</code>
3139    * object in the Java programming language.
3140    *
3141    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3142    * @return the column value as a <code>java.net.URL</code> object;
3143    * if the value is SQL <code>NULL</code>,
3144    * the value returned is <code>null</code> in the Java programming language
3145    * @throws SQLException                    if the columnLabel is not valid;
3146    *                                         if a database access error occurs; this method
3147    *                                         is called on a closed result set or if a URL is malformed
3148    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3149    *                                         this method
3150    * @since 1.4
3151    */
3152   @Override
3153   public URL getURL(String columnLabel) throws SQLException
3154   {
3155      return mInnerResultSet.getURL(columnLabel);
3156   }
3157
3158   /**
3159    * Updates the designated column with a <code>java.sql.Ref</code> value.
3160    * The updater methods are used to update column values in the
3161    * current row or the insert row.  The updater methods do not
3162    * update the underlying database; instead the <code>updateRow</code> or
3163    * <code>insertRow</code> methods are called to update the database.
3164    *
3165    * @param columnIndex the first column is 1, the second is 2, ...
3166    * @param x           the new column value
3167    * @throws SQLException                    if the columnIndex is not valid;
3168    *                                         if a database access error occurs;
3169    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
3170    *                                         or this method is called on a closed result set
3171    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3172    *                                         this method
3173    * @since 1.4
3174    */
3175   @Override
3176   public void updateRef(int columnIndex, Ref x) throws SQLException
3177   {
3178      mInnerResultSet.updateRef(columnIndex, x);
3179   }
3180
3181   /**
3182    * Updates the designated column with a <code>java.sql.Ref</code> value.
3183    * The updater methods are used to update column values in the
3184    * current row or the insert row.  The updater methods do not
3185    * update the underlying database; instead the <code>updateRow</code> or
3186    * <code>insertRow</code> methods are called to update the database.
3187    *
3188    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3189    * @param x           the new column value
3190    * @throws SQLException                    if the columnLabel is not valid;
3191    *                                         if a database access error occurs;
3192    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
3193    *                                         or this method is called on a closed result set
3194    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3195    *                                         this method
3196    * @since 1.4
3197    */
3198   @Override
3199   public void updateRef(String columnLabel, Ref x) throws SQLException
3200   {
3201      mInnerResultSet.updateRef(columnLabel, x);
3202   }
3203
3204   /**
3205    * Updates the designated column with a <code>java.sql.Blob</code> value.
3206    * The updater methods are used to update column values in the
3207    * current row or the insert row.  The updater methods do not
3208    * update the underlying database; instead the <code>updateRow</code> or
3209    * <code>insertRow</code> methods are called to update the database.
3210    *
3211    * @param columnIndex the first column is 1, the second is 2, ...
3212    * @param x           the new column value
3213    * @throws SQLException                    if the columnIndex is not valid;
3214    *                                         if a database access error occurs;
3215    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
3216    *                                         or this method is called on a closed result set
3217    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3218    *                                         this method
3219    * @since 1.4
3220    */
3221   @Override
3222   public void updateBlob(int columnIndex, Blob x) throws SQLException
3223   {
3224      mInnerResultSet.updateBlob(columnIndex, x);
3225   }
3226
3227   /**
3228    * Updates the designated column with a <code>java.sql.Blob</code> value.
3229    * The updater methods are used to update column values in the
3230    * current row or the insert row.  The updater methods do not
3231    * update the underlying database; instead the <code>updateRow</code> or
3232    * <code>insertRow</code> methods are called to update the database.
3233    *
3234    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3235    * @param x           the new column value
3236    * @throws SQLException                    if the columnLabel is not valid;
3237    *                                         if a database access error occurs;
3238    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
3239    *                                         or this method is called on a closed result set
3240    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3241    *                                         this method
3242    * @since 1.4
3243    */
3244   @Override
3245   public void updateBlob(String columnLabel, Blob x) throws SQLException
3246   {
3247      mInnerResultSet.updateBlob(columnLabel, x);
3248   }
3249
3250   /**
3251    * Updates the designated column with a <code>java.sql.Clob</code> value.
3252    * The updater methods are used to update column values in the
3253    * current row or the insert row.  The updater methods do not
3254    * update the underlying database; instead the <code>updateRow</code> or
3255    * <code>insertRow</code> methods are called to update the database.
3256    *
3257    * @param columnIndex the first column is 1, the second is 2, ...
3258    * @param x           the new column value
3259    * @throws SQLException                    if the columnIndex is not valid;
3260    *                                         if a database access error occurs;
3261    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
3262    *                                         or this method is called on a closed result set
3263    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3264    *                                         this method
3265    * @since 1.4
3266    */
3267   @Override
3268   public void updateClob(int columnIndex, Clob x) throws SQLException
3269   {
3270      mInnerResultSet.updateClob(columnIndex, x);
3271   }
3272
3273   /**
3274    * Updates the designated column with a <code>java.sql.Clob</code> value.
3275    * The updater methods are used to update column values in the
3276    * current row or the insert row.  The updater methods do not
3277    * update the underlying database; instead the <code>updateRow</code> or
3278    * <code>insertRow</code> methods are called to update the database.
3279    *
3280    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3281    * @param x           the new column value
3282    * @throws SQLException                    if the columnLabel is not valid;
3283    *                                         if a database access error occurs;
3284    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
3285    *                                         or this method is called on a closed result set
3286    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3287    *                                         this method
3288    * @since 1.4
3289    */
3290   @Override
3291   public void updateClob(String columnLabel, Clob x) throws SQLException
3292   {
3293      mInnerResultSet.updateClob(columnLabel, x);
3294   }
3295
3296   /**
3297    * Updates the designated column with a <code>java.sql.Array</code> value.
3298    * The updater methods are used to update column values in the
3299    * current row or the insert row.  The updater methods do not
3300    * update the underlying database; instead the <code>updateRow</code> or
3301    * <code>insertRow</code> methods are called to update the database.
3302    *
3303    * @param columnIndex the first column is 1, the second is 2, ...
3304    * @param x           the new column value
3305    * @throws SQLException                    if the columnIndex is not valid;
3306    *                                         if a database access error occurs;
3307    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
3308    *                                         or this method is called on a closed result set
3309    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3310    *                                         this method
3311    * @since 1.4
3312    */
3313   @Override
3314   public void updateArray(int columnIndex, Array x) throws SQLException
3315   {
3316      mInnerResultSet.updateArray(columnIndex, x);
3317   }
3318
3319   /**
3320    * Updates the designated column with a <code>java.sql.Array</code> value.
3321    * The updater methods are used to update column values in the
3322    * current row or the insert row.  The updater methods do not
3323    * update the underlying database; instead the <code>updateRow</code> or
3324    * <code>insertRow</code> methods are called to update the database.
3325    *
3326    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3327    * @param x           the new column value
3328    * @throws SQLException                    if the columnLabel is not valid;
3329    *                                         if a database access error occurs;
3330    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
3331    *                                         or this method is called on a closed result set
3332    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3333    *                                         this method
3334    * @since 1.4
3335    */
3336   @Override
3337   public void updateArray(String columnLabel, Array x) throws SQLException
3338   {
3339      mInnerResultSet.updateArray(columnLabel, x);
3340   }
3341
3342   /**
3343    * Retrieves the value of the designated column in the current row of this
3344    * <code>ResultSet</code> object as a <code>java.sql.RowId</code> object in the Java
3345    * programming language.
3346    *
3347    * @param columnIndex the first column is 1, the second 2, ...
3348    * @return the column value; if the value is a SQL <code>NULL</code> the
3349    * value returned is <code>null</code>
3350    * @throws SQLException                    if the columnIndex is not valid;
3351    *                                         if a database access error occurs
3352    *                                         or this method is called on a closed result set
3353    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3354    *                                         this method
3355    * @since 1.6
3356    */
3357   @Override
3358   public RowId getRowId(int columnIndex) throws SQLException
3359   {
3360      return mInnerResultSet.getRowId(columnIndex);
3361   }
3362
3363   /**
3364    * Retrieves the value of the designated column in the current row of this
3365    * <code>ResultSet</code> object as a <code>java.sql.RowId</code> object in the Java
3366    * programming language.
3367    *
3368    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3369    * @return the column value ; if the value is a SQL <code>NULL</code> the
3370    * value returned is <code>null</code>
3371    * @throws SQLException                    if the columnLabel is not valid;
3372    *                                         if a database access error occurs
3373    *                                         or this method is called on a closed result set
3374    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3375    *                                         this method
3376    * @since 1.6
3377    */
3378   @Override
3379   public RowId getRowId(String columnLabel) throws SQLException
3380   {
3381      return mInnerResultSet.getRowId(columnLabel);
3382   }
3383
3384   /**
3385    * Updates the designated column with a <code>RowId</code> value. The updater
3386    * methods are used to update column values in the current row or the insert
3387    * row. The updater methods do not update the underlying database; instead
3388    * the <code>updateRow</code> or <code>insertRow</code> methods are called
3389    * to update the database.
3390    *
3391    * @param columnIndex the first column is 1, the second 2, ...
3392    * @param x           the column value
3393    * @throws SQLException                    if the columnIndex is not valid;
3394    *                                         if a database access error occurs;
3395    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
3396    *                                         or this method is called on a closed result set
3397    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3398    *                                         this method
3399    * @since 1.6
3400    */
3401   @Override
3402   public void updateRowId(int columnIndex, RowId x) throws SQLException
3403   {
3404      mInnerResultSet.updateRowId(columnIndex, x);
3405   }
3406
3407   /**
3408    * Updates the designated column with a <code>RowId</code> value. The updater
3409    * methods are used to update column values in the current row or the insert
3410    * row. The updater methods do not update the underlying database; instead
3411    * the <code>updateRow</code> or <code>insertRow</code> methods are called
3412    * to update the database.
3413    *
3414    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3415    * @param x           the column value
3416    * @throws SQLException                    if the columnLabel is not valid;
3417    *                                         if a database access error occurs;
3418    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
3419    *                                         or this method is called on a closed result set
3420    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3421    *                                         this method
3422    * @since 1.6
3423    */
3424   @Override
3425   public void updateRowId(String columnLabel, RowId x) throws SQLException
3426   {
3427      mInnerResultSet.updateRowId(columnLabel, x);
3428   }
3429
3430   /**
3431    * Retrieves the holdability of this <code>ResultSet</code> object
3432    *
3433    * @return either <code>ResultSet.HOLD_CURSORS_OVER_COMMIT</code> or <code>ResultSet.CLOSE_CURSORS_AT_COMMIT</code>
3434    * @throws SQLException if a database access error occurs
3435    *                      or this method is called on a closed result set
3436    * @since 1.6
3437    */
3438   @Override
3439   public int getHoldability() throws SQLException
3440   {
3441      return mInnerResultSet.getHoldability();
3442   }
3443
3444   /**
3445    * Retrieves whether this <code>ResultSet</code> object has been closed. A <code>ResultSet</code> is closed if the
3446    * method close has been called on it, or if it is automatically closed.
3447    *
3448    * @return true if this <code>ResultSet</code> object is closed; false if it is still open
3449    * @throws SQLException if a database access error occurs
3450    * @since 1.6
3451    */
3452   @Override
3453   public boolean isClosed() throws SQLException
3454   {
3455      return mInnerResultSet.isClosed();
3456   }
3457
3458   /**
3459    * Updates the designated column with a <code>String</code> value.
3460    * It is intended for use when updating <code>NCHAR</code>,<code>NVARCHAR</code>
3461    * and <code>LONGNVARCHAR</code> columns.
3462    * The updater methods are used to update column values in the
3463    * current row or the insert row.  The updater methods do not
3464    * update the underlying database; instead the <code>updateRow</code> or
3465    * <code>insertRow</code> methods are called to update the database.
3466    *
3467    * @param columnIndex the first column is 1, the second 2, ...
3468    * @param nString     the value for the column to be updated
3469    * @throws SQLException                    if the columnIndex is not valid;
3470    *                                         if the driver does not support national
3471    *                                         character sets;  if the driver can detect that a data conversion
3472    *                                         error could occur; this method is called on a closed result set;
3473    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
3474    *                                         or if a database access error occurs
3475    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3476    *                                         this method
3477    * @since 1.6
3478    */
3479   @Override
3480   public void updateNString(int columnIndex, String nString) throws SQLException
3481   {
3482      mInnerResultSet.updateNString(columnIndex, nString);
3483   }
3484
3485   /**
3486    * Updates the designated column with a <code>String</code> value.
3487    * It is intended for use when updating <code>NCHAR</code>,<code>NVARCHAR</code>
3488    * and <code>LONGNVARCHAR</code> columns.
3489    * The updater methods are used to update column values in the
3490    * current row or the insert row.  The updater methods do not
3491    * update the underlying database; instead the <code>updateRow</code> or
3492    * <code>insertRow</code> methods are called to update the database.
3493    *
3494    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3495    * @param nString     the value for the column to be updated
3496    * @throws SQLException                    if the columnLabel is not valid;
3497    *                                         if the driver does not support national
3498    *                                         character sets;  if the driver can detect that a data conversion
3499    *                                         error could occur; this method is called on a closed result set;
3500    *                                         the result set concurrency is <CODE>CONCUR_READ_ONLY</code>
3501    *                                         or if a database access error occurs
3502    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3503    *                                         this method
3504    * @since 1.6
3505    */
3506   @Override
3507   public void updateNString(String columnLabel, String nString) throws SQLException
3508   {
3509      mInnerResultSet.updateNString(columnLabel, nString);
3510   }
3511
3512   /**
3513    * Updates the designated column with a <code>java.sql.NClob</code> value.
3514    * The updater methods are used to update column values in the
3515    * current row or the insert row.  The updater methods do not
3516    * update the underlying database; instead the <code>updateRow</code> or
3517    * <code>insertRow</code> methods are called to update the database.
3518    *
3519    * @param columnIndex the first column is 1, the second 2, ...
3520    * @param nClob       the value for the column to be updated
3521    * @throws SQLException                    if the columnIndex is not valid;
3522    *                                         if the driver does not support national
3523    *                                         character sets;  if the driver can detect that a data conversion
3524    *                                         error could occur; this method is called on a closed result set;
3525    *                                         if a database access error occurs or
3526    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
3527    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3528    *                                         this method
3529    * @since 1.6
3530    */
3531   @Override
3532   public void updateNClob(int columnIndex, NClob nClob) throws SQLException
3533   {
3534      mInnerResultSet.updateNClob(columnIndex, nClob);
3535   }
3536
3537   /**
3538    * Updates the designated column with a <code>java.sql.NClob</code> value.
3539    * The updater methods are used to update column values in the
3540    * current row or the insert row.  The updater methods do not
3541    * update the underlying database; instead the <code>updateRow</code> or
3542    * <code>insertRow</code> methods are called to update the database.
3543    *
3544    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3545    * @param nClob       the value for the column to be updated
3546    * @throws SQLException                    if the columnLabel is not valid;
3547    *                                         if the driver does not support national
3548    *                                         character sets;  if the driver can detect that a data conversion
3549    *                                         error could occur; this method is called on a closed result set;
3550    *                                         if a database access error occurs or
3551    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
3552    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3553    *                                         this method
3554    * @since 1.6
3555    */
3556   @Override
3557   public void updateNClob(String columnLabel, NClob nClob) throws SQLException
3558   {
3559      mInnerResultSet.updateNClob(columnLabel, nClob);
3560   }
3561
3562   /**
3563    * Retrieves the value of the designated column in the current row
3564    * of this <code>ResultSet</code> object as a <code>NClob</code> object
3565    * in the Java programming language.
3566    *
3567    * @param columnIndex the first column is 1, the second is 2, ...
3568    * @return a <code>NClob</code> object representing the SQL
3569    * <code>NCLOB</code> value in the specified column
3570    * @throws SQLException                    if the columnIndex is not valid;
3571    *                                         if the driver does not support national
3572    *                                         character sets;  if the driver can detect that a data conversion
3573    *                                         error could occur; this method is called on a closed result set
3574    *                                         or if a database access error occurs
3575    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3576    *                                         this method
3577    * @since 1.6
3578    */
3579   @Override
3580   public NClob getNClob(int columnIndex) throws SQLException
3581   {
3582      return mInnerResultSet.getNClob(columnIndex);
3583   }
3584
3585   /**
3586    * Retrieves the value of the designated column in the current row
3587    * of this <code>ResultSet</code> object as a <code>NClob</code> object
3588    * in the Java programming language.
3589    *
3590    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3591    * @return a <code>NClob</code> object representing the SQL <code>NCLOB</code>
3592    * value in the specified column
3593    * @throws SQLException                    if the columnLabel is not valid;
3594    *                                         if the driver does not support national
3595    *                                         character sets;  if the driver can detect that a data conversion
3596    *                                         error could occur; this method is called on a closed result set
3597    *                                         or if a database access error occurs
3598    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3599    *                                         this method
3600    * @since 1.6
3601    */
3602   @Override
3603   public NClob getNClob(String columnLabel) throws SQLException
3604   {
3605      return mInnerResultSet.getNClob(columnLabel);
3606   }
3607
3608   /**
3609    * Retrieves the value of the designated column in  the current row of
3610    * this <code>ResultSet</code> as a
3611    * <code>java.sql.SQLXML</code> object in the Java programming language.
3612    *
3613    * @param columnIndex the first column is 1, the second is 2, ...
3614    * @return a <code>SQLXML</code> object that maps an <code>SQL XML</code> value
3615    * @throws SQLException                    if the columnIndex is not valid;
3616    *                                         if a database access error occurs
3617    *                                         or this method is called on a closed result set
3618    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3619    *                                         this method
3620    * @since 1.6
3621    */
3622   @Override
3623   public SQLXML getSQLXML(int columnIndex) throws SQLException
3624   {
3625      return mInnerResultSet.getSQLXML(columnIndex);
3626   }
3627
3628   /**
3629    * Retrieves the value of the designated column in  the current row of
3630    * this <code>ResultSet</code> as a
3631    * <code>java.sql.SQLXML</code> object in the Java programming language.
3632    *
3633    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3634    * @return a <code>SQLXML</code> object that maps an <code>SQL XML</code> value
3635    * @throws SQLException                    if the columnLabel is not valid;
3636    *                                         if a database access error occurs
3637    *                                         or this method is called on a closed result set
3638    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3639    *                                         this method
3640    * @since 1.6
3641    */
3642   @Override
3643   public SQLXML getSQLXML(String columnLabel) throws SQLException
3644   {
3645      return mInnerResultSet.getSQLXML(columnLabel);
3646   }
3647
3648   /**
3649    * Updates the designated column with a <code>java.sql.SQLXML</code> value.
3650    * The updater
3651    * methods are used to update column values in the current row or the insert
3652    * row. The updater methods do not update the underlying database; instead
3653    * the <code>updateRow</code> or <code>insertRow</code> methods are called
3654    * to update the database.
3655    *
3656    * @param columnIndex the first column is 1, the second 2, ...
3657    * @param xmlObject   the value for the column to be updated
3658    * @throws SQLException                    if the columnIndex is not valid;
3659    *                                         if a database access error occurs; this method
3660    *                                         is called on a closed result set;
3661    *                                         the <code>java.xml.transform.Result</code>,
3662    *                                         <code>Writer</code> or <code>OutputStream</code> has not been closed
3663    *                                         for the <code>SQLXML</code> object;
3664    *                                         if there is an error processing the XML value or
3665    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>.  The <code>getCause</code> method
3666    *                                         of the exception may provide a more detailed exception, for example, if the
3667    *                                         stream does not contain valid XML.
3668    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3669    *                                         this method
3670    * @since 1.6
3671    */
3672   @Override
3673   public void updateSQLXML(int columnIndex, SQLXML xmlObject) throws SQLException
3674   {
3675      mInnerResultSet.updateSQLXML(columnIndex, xmlObject);
3676   }
3677
3678   /**
3679    * Updates the designated column with a <code>java.sql.SQLXML</code> value.
3680    * The updater
3681    * methods are used to update column values in the current row or the insert
3682    * row. The updater methods do not update the underlying database; instead
3683    * the <code>updateRow</code> or <code>insertRow</code> methods are called
3684    * to update the database.
3685    *
3686    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3687    * @param xmlObject   the column value
3688    * @throws SQLException                    if the columnLabel is not valid;
3689    *                                         if a database access error occurs; this method
3690    *                                         is called on a closed result set;
3691    *                                         the <code>java.xml.transform.Result</code>,
3692    *                                         <code>Writer</code> or <code>OutputStream</code> has not been closed
3693    *                                         for the <code>SQLXML</code> object;
3694    *                                         if there is an error processing the XML value or
3695    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>.  The <code>getCause</code> method
3696    *                                         of the exception may provide a more detailed exception, for example, if the
3697    *                                         stream does not contain valid XML.
3698    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3699    *                                         this method
3700    * @since 1.6
3701    */
3702   @Override
3703   public void updateSQLXML(String columnLabel, SQLXML xmlObject) throws SQLException
3704   {
3705      mInnerResultSet.updateSQLXML(columnLabel, xmlObject);
3706   }
3707
3708   /**
3709    * Retrieves the value of the designated column in the current row
3710    * of this <code>ResultSet</code> object as
3711    * a <code>String</code> in the Java programming language.
3712    * It is intended for use when
3713    * accessing  <code>NCHAR</code>,<code>NVARCHAR</code>
3714    * and <code>LONGNVARCHAR</code> columns.
3715    *
3716    * @param columnIndex the first column is 1, the second is 2, ...
3717    * @return the column value; if the value is SQL <code>NULL</code>, the
3718    * value returned is <code>null</code>
3719    * @throws SQLException                    if the columnIndex is not valid;
3720    *                                         if a database access error occurs
3721    *                                         or this method is called on a closed result set
3722    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3723    *                                         this method
3724    * @since 1.6
3725    */
3726   @Override
3727   public String getNString(int columnIndex) throws SQLException
3728   {
3729      return mInnerResultSet.getNString(columnIndex);
3730   }
3731
3732   /**
3733    * Retrieves the value of the designated column in the current row
3734    * of this <code>ResultSet</code> object as
3735    * a <code>String</code> in the Java programming language.
3736    * It is intended for use when
3737    * accessing  <code>NCHAR</code>,<code>NVARCHAR</code>
3738    * and <code>LONGNVARCHAR</code> columns.
3739    *
3740    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3741    * @return the column value; if the value is SQL <code>NULL</code>, the
3742    * value returned is <code>null</code>
3743    * @throws SQLException                    if the columnLabel is not valid;
3744    *                                         if a database access error occurs
3745    *                                         or this method is called on a closed result set
3746    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3747    *                                         this method
3748    * @since 1.6
3749    */
3750   @Override
3751   public String getNString(String columnLabel) throws SQLException
3752   {
3753      return mInnerResultSet.getNString(columnLabel);
3754   }
3755
3756   /**
3757    * Retrieves the value of the designated column in the current row
3758    * of this <code>ResultSet</code> object as a
3759    * <code>java.io.Reader</code> object.
3760    * It is intended for use when
3761    * accessing  <code>NCHAR</code>,<code>NVARCHAR</code>
3762    * and <code>LONGNVARCHAR</code> columns.
3763    *
3764    * @param columnIndex the first column is 1, the second is 2, ...
3765    * @return a <code>java.io.Reader</code> object that contains the column
3766    * value; if the value is SQL <code>NULL</code>, the value returned is
3767    * <code>null</code> in the Java programming language.
3768    * @throws SQLException                    if the columnIndex is not valid;
3769    *                                         if a database access error occurs
3770    *                                         or this method is called on a closed result set
3771    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3772    *                                         this method
3773    * @since 1.6
3774    */
3775   @Override
3776   public Reader getNCharacterStream(int columnIndex) throws SQLException
3777   {
3778      return mInnerResultSet.getNCharacterStream(columnIndex);
3779   }
3780
3781   /**
3782    * Retrieves the value of the designated column in the current row
3783    * of this <code>ResultSet</code> object as a
3784    * <code>java.io.Reader</code> object.
3785    * It is intended for use when
3786    * accessing  <code>NCHAR</code>,<code>NVARCHAR</code>
3787    * and <code>LONGNVARCHAR</code> columns.
3788    *
3789    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3790    * @return a <code>java.io.Reader</code> object that contains the column
3791    * value; if the value is SQL <code>NULL</code>, the value returned is
3792    * <code>null</code> in the Java programming language
3793    * @throws SQLException                    if the columnLabel is not valid;
3794    *                                         if a database access error occurs
3795    *                                         or this method is called on a closed result set
3796    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3797    *                                         this method
3798    * @since 1.6
3799    */
3800   @Override
3801   public Reader getNCharacterStream(String columnLabel) throws SQLException
3802   {
3803      return mInnerResultSet.getNCharacterStream(columnLabel);
3804   }
3805
3806   /**
3807    * Updates the designated column with a character stream value, which will have
3808    * the specified number of bytes.   The
3809    * driver does the necessary conversion from Java character format to
3810    * the national character set in the database.
3811    * It is intended for use when
3812    * updating  <code>NCHAR</code>,<code>NVARCHAR</code>
3813    * and <code>LONGNVARCHAR</code> columns.
3814    * <p>
3815    * The updater methods are used to update column values in the
3816    * current row or the insert row.  The updater methods do not
3817    * update the underlying database; instead the <code>updateRow</code> or
3818    * <code>insertRow</code> methods are called to update the database.
3819    *
3820    * @param columnIndex the first column is 1, the second is 2, ...
3821    * @param x           the new column value
3822    * @param length      the length of the stream
3823    * @throws SQLException                    if the columnIndex is not valid;
3824    *                                         if a database access error occurs;
3825    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code> or this method is called on a closed result set
3826    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3827    *                                         this method
3828    * @since 1.6
3829    */
3830   @Override
3831   public void updateNCharacterStream(int columnIndex, Reader x, long length) throws SQLException
3832   {
3833      mInnerResultSet.updateNCharacterStream(columnIndex, x, length);
3834   }
3835
3836   /**
3837    * Updates the designated column with a character stream value, which will have
3838    * the specified number of bytes.  The
3839    * driver does the necessary conversion from Java character format to
3840    * the national character set in the database.
3841    * It is intended for use when
3842    * updating  <code>NCHAR</code>,<code>NVARCHAR</code>
3843    * and <code>LONGNVARCHAR</code> columns.
3844    * <p>
3845    * The updater methods are used to update column values in the
3846    * current row or the insert row.  The updater methods do not
3847    * update the underlying database; instead the <code>updateRow</code> or
3848    * <code>insertRow</code> methods are called to update the database.
3849    *
3850    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3851    * @param reader      the <code>java.io.Reader</code> object containing
3852    *                    the new column value
3853    * @param length      the length of the stream
3854    * @throws SQLException                    if the columnLabel is not valid;
3855    *                                         if a database access error occurs;
3856    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code> or this method is called on a closed result set
3857    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3858    *                                         this method
3859    * @since 1.6
3860    */
3861   @Override
3862   public void updateNCharacterStream(String columnLabel, Reader reader, long length) throws SQLException
3863   {
3864      mInnerResultSet.updateNCharacterStream(columnLabel, reader, length);
3865   }
3866
3867   /**
3868    * Updates the designated column with an ascii stream value, which will have
3869    * the specified number of bytes.
3870    * <p>
3871    * The updater methods are used to update column values in the
3872    * current row or the insert row.  The updater methods do not
3873    * update the underlying database; instead the <code>updateRow</code> or
3874    * <code>insertRow</code> methods are called to update the database.
3875    *
3876    * @param columnIndex the first column is 1, the second is 2, ...
3877    * @param x           the new column value
3878    * @param length      the length of the stream
3879    * @throws SQLException                    if the columnIndex is not valid;
3880    *                                         if a database access error occurs;
3881    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
3882    *                                         or this method is called on a closed result set
3883    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3884    *                                         this method
3885    * @since 1.6
3886    */
3887   @Override
3888   public void updateAsciiStream(int columnIndex, InputStream x, long length) throws SQLException
3889   {
3890      mInnerResultSet.updateAsciiStream(columnIndex, x, length);
3891   }
3892
3893   /**
3894    * Updates the designated column with a binary stream value, which will have
3895    * the specified number of bytes.
3896    * <p>
3897    * The updater methods are used to update column values in the
3898    * current row or the insert row.  The updater methods do not
3899    * update the underlying database; instead the <code>updateRow</code> or
3900    * <code>insertRow</code> methods are called to update the database.
3901    *
3902    * @param columnIndex the first column is 1, the second is 2, ...
3903    * @param x           the new column value
3904    * @param length      the length of the stream
3905    * @throws SQLException                    if the columnIndex is not valid;
3906    *                                         if a database access error occurs;
3907    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
3908    *                                         or this method is called on a closed result set
3909    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3910    *                                         this method
3911    * @since 1.6
3912    */
3913   @Override
3914   public void updateBinaryStream(int columnIndex, InputStream x, long length) throws SQLException
3915   {
3916      mInnerResultSet.updateBinaryStream(columnIndex, x, length);
3917   }
3918
3919   /**
3920    * Updates the designated column with a character stream value, which will have
3921    * the specified number of bytes.
3922    * <p>
3923    * The updater methods are used to update column values in the
3924    * current row or the insert row.  The updater methods do not
3925    * update the underlying database; instead the <code>updateRow</code> or
3926    * <code>insertRow</code> methods are called to update the database.
3927    *
3928    * @param columnIndex the first column is 1, the second is 2, ...
3929    * @param x           the new column value
3930    * @param length      the length of the stream
3931    * @throws SQLException                    if the columnIndex is not valid;
3932    *                                         if a database access error occurs;
3933    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
3934    *                                         or this method is called on a closed result set
3935    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3936    *                                         this method
3937    * @since 1.6
3938    */
3939   @Override
3940   public void updateCharacterStream(int columnIndex, Reader x, long length) throws SQLException
3941   {
3942      mInnerResultSet.updateCharacterStream(columnIndex, x, length);
3943   }
3944
3945   /**
3946    * Updates the designated column with an ascii stream value, which will have
3947    * the specified number of bytes.
3948    * <p>
3949    * The updater methods are used to update column values in the
3950    * current row or the insert row.  The updater methods do not
3951    * update the underlying database; instead the <code>updateRow</code> or
3952    * <code>insertRow</code> methods are called to update the database.
3953    *
3954    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3955    * @param x           the new column value
3956    * @param length      the length of the stream
3957    * @throws SQLException                    if the columnLabel is not valid;
3958    *                                         if a database access error occurs;
3959    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
3960    *                                         or this method is called on a closed result set
3961    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3962    *                                         this method
3963    * @since 1.6
3964    */
3965   @Override
3966   public void updateAsciiStream(String columnLabel, InputStream x, long length) throws SQLException
3967   {
3968      mInnerResultSet.updateAsciiStream(columnLabel, x, length);
3969   }
3970
3971   /**
3972    * Updates the designated column with a binary stream value, which will have
3973    * the specified number of bytes.
3974    * <p>
3975    * The updater methods are used to update column values in the
3976    * current row or the insert row.  The updater methods do not
3977    * update the underlying database; instead the <code>updateRow</code> or
3978    * <code>insertRow</code> methods are called to update the database.
3979    *
3980    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
3981    * @param x           the new column value
3982    * @param length      the length of the stream
3983    * @throws SQLException                    if the columnLabel is not valid;
3984    *                                         if a database access error occurs;
3985    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
3986    *                                         or this method is called on a closed result set
3987    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
3988    *                                         this method
3989    * @since 1.6
3990    */
3991   @Override
3992   public void updateBinaryStream(String columnLabel, InputStream x, long length) throws SQLException
3993   {
3994      mInnerResultSet.updateBinaryStream(columnLabel, x, length);
3995   }
3996
3997   /**
3998    * Updates the designated column with a character stream value, which will have
3999    * the specified number of bytes.
4000    * <p>
4001    * The updater methods are used to update column values in the
4002    * current row or the insert row.  The updater methods do not
4003    * update the underlying database; instead the <code>updateRow</code> or
4004    * <code>insertRow</code> methods are called to update the database.
4005    *
4006    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
4007    * @param reader      the <code>java.io.Reader</code> object containing
4008    *                    the new column value
4009    * @param length      the length of the stream
4010    * @throws SQLException                    if the columnLabel is not valid;
4011    *                                         if a database access error occurs;
4012    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4013    *                                         or this method is called on a closed result set
4014    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4015    *                                         this method
4016    * @since 1.6
4017    */
4018   @Override
4019   public void updateCharacterStream(String columnLabel, Reader reader, long length) throws SQLException
4020   {
4021      mInnerResultSet.updateCharacterStream(columnLabel, reader, length);
4022   }
4023
4024   /**
4025    * Updates the designated column using the given input stream, which
4026    * will have the specified number of bytes.
4027    *
4028    * <p>
4029    * The updater methods are used to update column values in the
4030    * current row or the insert row.  The updater methods do not
4031    * update the underlying database; instead the <code>updateRow</code> or
4032    * <code>insertRow</code> methods are called to update the database.
4033    *
4034    * @param columnIndex the first column is 1, the second is 2, ...
4035    * @param inputStream An object that contains the data to set the parameter
4036    *                    value to.
4037    * @param length      the number of bytes in the parameter data.
4038    * @throws SQLException                    if the columnIndex is not valid;
4039    *                                         if a database access error occurs;
4040    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4041    *                                         or this method is called on a closed result set
4042    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4043    *                                         this method
4044    * @since 1.6
4045    */
4046   @Override
4047   public void updateBlob(int columnIndex, InputStream inputStream, long length) throws SQLException
4048   {
4049      mInnerResultSet.updateBlob(columnIndex, inputStream, length);
4050   }
4051
4052   /**
4053    * Updates the designated column using the given input stream, which
4054    * will have the specified number of bytes.
4055    *
4056    * <p>
4057    * The updater methods are used to update column values in the
4058    * current row or the insert row.  The updater methods do not
4059    * update the underlying database; instead the <code>updateRow</code> or
4060    * <code>insertRow</code> methods are called to update the database.
4061    *
4062    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
4063    * @param inputStream An object that contains the data to set the parameter
4064    *                    value to.
4065    * @param length      the number of bytes in the parameter data.
4066    * @throws SQLException                    if the columnLabel is not valid;
4067    *                                         if a database access error occurs;
4068    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4069    *                                         or this method is called on a closed result set
4070    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4071    *                                         this method
4072    * @since 1.6
4073    */
4074   @Override
4075   public void updateBlob(String columnLabel, InputStream inputStream, long length) throws SQLException
4076   {
4077      mInnerResultSet.updateBlob(columnLabel, inputStream, length);
4078   }
4079
4080   /**
4081    * Updates the designated column using the given <code>Reader</code>
4082    * object, which is the given number of characters long.
4083    * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
4084    * parameter, it may be more practical to send it via a
4085    * <code>java.io.Reader</code> object. The JDBC driver will
4086    * do any necessary conversion from UNICODE to the database char format.
4087    *
4088    * <p>
4089    * The updater methods are used to update column values in the
4090    * current row or the insert row.  The updater methods do not
4091    * update the underlying database; instead the <code>updateRow</code> or
4092    * <code>insertRow</code> methods are called to update the database.
4093    *
4094    * @param columnIndex the first column is 1, the second is 2, ...
4095    * @param reader      An object that contains the data to set the parameter value to.
4096    * @param length      the number of characters in the parameter data.
4097    * @throws SQLException                    if the columnIndex is not valid;
4098    *                                         if a database access error occurs;
4099    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4100    *                                         or this method is called on a closed result set
4101    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4102    *                                         this method
4103    * @since 1.6
4104    */
4105   @Override
4106   public void updateClob(int columnIndex, Reader reader, long length) throws SQLException
4107   {
4108      mInnerResultSet.updateClob(columnIndex, reader, length);
4109   }
4110
4111   /**
4112    * Updates the designated column using the given <code>Reader</code>
4113    * object, which is the given number of characters long.
4114    * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
4115    * parameter, it may be more practical to send it via a
4116    * <code>java.io.Reader</code> object.  The JDBC driver will
4117    * do any necessary conversion from UNICODE to the database char format.
4118    *
4119    * <p>
4120    * The updater methods are used to update column values in the
4121    * current row or the insert row.  The updater methods do not
4122    * update the underlying database; instead the <code>updateRow</code> or
4123    * <code>insertRow</code> methods are called to update the database.
4124    *
4125    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
4126    * @param reader      An object that contains the data to set the parameter value to.
4127    * @param length      the number of characters in the parameter data.
4128    * @throws SQLException                    if the columnLabel is not valid;
4129    *                                         if a database access error occurs;
4130    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4131    *                                         or this method is called on a closed result set
4132    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4133    *                                         this method
4134    * @since 1.6
4135    */
4136   @Override
4137   public void updateClob(String columnLabel, Reader reader, long length) throws SQLException
4138   {
4139      mInnerResultSet.updateClob(columnLabel, reader, length);
4140   }
4141
4142   /**
4143    * Updates the designated column using the given <code>Reader</code>
4144    * object, which is the given number of characters long.
4145    * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
4146    * parameter, it may be more practical to send it via a
4147    * <code>java.io.Reader</code> object. The JDBC driver will
4148    * do any necessary conversion from UNICODE to the database char format.
4149    *
4150    * <p>
4151    * The updater methods are used to update column values in the
4152    * current row or the insert row.  The updater methods do not
4153    * update the underlying database; instead the <code>updateRow</code> or
4154    * <code>insertRow</code> methods are called to update the database.
4155    *
4156    * @param columnIndex the first column is 1, the second 2, ...
4157    * @param reader      An object that contains the data to set the parameter value to.
4158    * @param length      the number of characters in the parameter data.
4159    * @throws SQLException                    if the columnIndex is not valid;
4160    *                                         if the driver does not support national
4161    *                                         character sets;  if the driver can detect that a data conversion
4162    *                                         error could occur; this method is called on a closed result set,
4163    *                                         if a database access error occurs or
4164    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4165    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4166    *                                         this method
4167    * @since 1.6
4168    */
4169   @Override
4170   public void updateNClob(int columnIndex, Reader reader, long length) throws SQLException
4171   {
4172      mInnerResultSet.updateNClob(columnIndex, reader, length);
4173   }
4174
4175   /**
4176    * Updates the designated column using the given <code>Reader</code>
4177    * object, which is the given number of characters long.
4178    * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
4179    * parameter, it may be more practical to send it via a
4180    * <code>java.io.Reader</code> object. The JDBC driver will
4181    * do any necessary conversion from UNICODE to the database char format.
4182    *
4183    * <p>
4184    * The updater methods are used to update column values in the
4185    * current row or the insert row.  The updater methods do not
4186    * update the underlying database; instead the <code>updateRow</code> or
4187    * <code>insertRow</code> methods are called to update the database.
4188    *
4189    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
4190    * @param reader      An object that contains the data to set the parameter value to.
4191    * @param length      the number of characters in the parameter data.
4192    * @throws SQLException                    if the columnLabel is not valid;
4193    *                                         if the driver does not support national
4194    *                                         character sets;  if the driver can detect that a data conversion
4195    *                                         error could occur; this method is called on a closed result set;
4196    *                                         if a database access error occurs or
4197    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4198    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4199    *                                         this method
4200    * @since 1.6
4201    */
4202   @Override
4203   public void updateNClob(String columnLabel, Reader reader, long length) throws SQLException
4204   {
4205      mInnerResultSet.updateNClob(columnLabel, reader, length);
4206   }
4207
4208   /**
4209    * Updates the designated column with a character stream value.
4210    * The data will be read from the stream
4211    * as needed until end-of-stream is reached.  The
4212    * driver does the necessary conversion from Java character format to
4213    * the national character set in the database.
4214    * It is intended for use when
4215    * updating  <code>NCHAR</code>,<code>NVARCHAR</code>
4216    * and <code>LONGNVARCHAR</code> columns.
4217    * <p>
4218    * The updater methods are used to update column values in the
4219    * current row or the insert row.  The updater methods do not
4220    * update the underlying database; instead the <code>updateRow</code> or
4221    * <code>insertRow</code> methods are called to update the database.
4222    *
4223    * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
4224    * it might be more efficient to use a version of
4225    * <code>updateNCharacterStream</code> which takes a length parameter.
4226    *
4227    * @param columnIndex the first column is 1, the second is 2, ...
4228    * @param x           the new column value
4229    * @throws SQLException                    if the columnIndex is not valid;
4230    *                                         if a database access error occurs;
4231    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code> or this method is called on a closed result set
4232    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4233    *                                         this method
4234    * @since 1.6
4235    */
4236   @Override
4237   public void updateNCharacterStream(int columnIndex, Reader x) throws SQLException
4238   {
4239      mInnerResultSet.updateNCharacterStream(columnIndex, x);
4240   }
4241
4242   /**
4243    * Updates the designated column with a character stream value.
4244    * The data will be read from the stream
4245    * as needed until end-of-stream is reached.  The
4246    * driver does the necessary conversion from Java character format to
4247    * the national character set in the database.
4248    * It is intended for use when
4249    * updating  <code>NCHAR</code>,<code>NVARCHAR</code>
4250    * and <code>LONGNVARCHAR</code> columns.
4251    * <p>
4252    * The updater methods are used to update column values in the
4253    * current row or the insert row.  The updater methods do not
4254    * update the underlying database; instead the <code>updateRow</code> or
4255    * <code>insertRow</code> methods are called to update the database.
4256    *
4257    * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
4258    * it might be more efficient to use a version of
4259    * <code>updateNCharacterStream</code> which takes a length parameter.
4260    *
4261    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
4262    * @param reader      the <code>java.io.Reader</code> object containing
4263    *                    the new column value
4264    * @throws SQLException                    if the columnLabel is not valid;
4265    *                                         if a database access error occurs;
4266    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code> or this method is called on a closed result set
4267    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4268    *                                         this method
4269    * @since 1.6
4270    */
4271   @Override
4272   public void updateNCharacterStream(String columnLabel, Reader reader) throws SQLException
4273   {
4274      mInnerResultSet.updateNCharacterStream(columnLabel, reader);
4275   }
4276
4277   /**
4278    * Updates the designated column with an ascii stream value.
4279    * The data will be read from the stream
4280    * as needed until end-of-stream is reached.
4281    * <p>
4282    * The updater methods are used to update column values in the
4283    * current row or the insert row.  The updater methods do not
4284    * update the underlying database; instead the <code>updateRow</code> or
4285    * <code>insertRow</code> methods are called to update the database.
4286    *
4287    * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
4288    * it might be more efficient to use a version of
4289    * <code>updateAsciiStream</code> which takes a length parameter.
4290    *
4291    * @param columnIndex the first column is 1, the second is 2, ...
4292    * @param x           the new column value
4293    * @throws SQLException                    if the columnIndex is not valid;
4294    *                                         if a database access error occurs;
4295    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4296    *                                         or this method is called on a closed result set
4297    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4298    *                                         this method
4299    * @since 1.6
4300    */
4301   @Override
4302   public void updateAsciiStream(int columnIndex, InputStream x) throws SQLException
4303   {
4304      mInnerResultSet.updateAsciiStream(columnIndex, x);
4305   }
4306
4307   /**
4308    * Updates the designated column with a binary stream value.
4309    * The data will be read from the stream
4310    * as needed until end-of-stream is reached.
4311    * <p>
4312    * The updater methods are used to update column values in the
4313    * current row or the insert row.  The updater methods do not
4314    * update the underlying database; instead the <code>updateRow</code> or
4315    * <code>insertRow</code> methods are called to update the database.
4316    *
4317    * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
4318    * it might be more efficient to use a version of
4319    * <code>updateBinaryStream</code> which takes a length parameter.
4320    *
4321    * @param columnIndex the first column is 1, the second is 2, ...
4322    * @param x           the new column value
4323    * @throws SQLException                    if the columnIndex is not valid;
4324    *                                         if a database access error occurs;
4325    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4326    *                                         or this method is called on a closed result set
4327    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4328    *                                         this method
4329    * @since 1.6
4330    */
4331   @Override
4332   public void updateBinaryStream(int columnIndex, InputStream x) throws SQLException
4333   {
4334      mInnerResultSet.updateBinaryStream(columnIndex, x);
4335   }
4336
4337   /**
4338    * Updates the designated column with a character stream value.
4339    * The data will be read from the stream
4340    * as needed until end-of-stream is reached.
4341    * <p>
4342    * The updater methods are used to update column values in the
4343    * current row or the insert row.  The updater methods do not
4344    * update the underlying database; instead the <code>updateRow</code> or
4345    * <code>insertRow</code> methods are called to update the database.
4346    *
4347    * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
4348    * it might be more efficient to use a version of
4349    * <code>updateCharacterStream</code> which takes a length parameter.
4350    *
4351    * @param columnIndex the first column is 1, the second is 2, ...
4352    * @param x           the new column value
4353    * @throws SQLException                    if the columnIndex is not valid;
4354    *                                         if a database access error occurs;
4355    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4356    *                                         or this method is called on a closed result set
4357    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4358    *                                         this method
4359    * @since 1.6
4360    */
4361   @Override
4362   public void updateCharacterStream(int columnIndex, Reader x) throws SQLException
4363   {
4364      mInnerResultSet.updateCharacterStream(columnIndex, x);
4365   }
4366
4367   /**
4368    * Updates the designated column with an ascii stream value.
4369    * The data will be read from the stream
4370    * as needed until end-of-stream is reached.
4371    * <p>
4372    * The updater methods are used to update column values in the
4373    * current row or the insert row.  The updater methods do not
4374    * update the underlying database; instead the <code>updateRow</code> or
4375    * <code>insertRow</code> methods are called to update the database.
4376    *
4377    * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
4378    * it might be more efficient to use a version of
4379    * <code>updateAsciiStream</code> which takes a length parameter.
4380    *
4381    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
4382    * @param x           the new column value
4383    * @throws SQLException                    if the columnLabel is not valid;
4384    *                                         if a database access error occurs;
4385    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4386    *                                         or this method is called on a closed result set
4387    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4388    *                                         this method
4389    * @since 1.6
4390    */
4391   @Override
4392   public void updateAsciiStream(String columnLabel, InputStream x) throws SQLException
4393   {
4394      mInnerResultSet.updateAsciiStream(columnLabel, x);
4395   }
4396
4397   /**
4398    * Updates the designated column with a binary stream value.
4399    * The data will be read from the stream
4400    * as needed until end-of-stream is reached.
4401    * <p>
4402    * The updater methods are used to update column values in the
4403    * current row or the insert row.  The updater methods do not
4404    * update the underlying database; instead the <code>updateRow</code> or
4405    * <code>insertRow</code> methods are called to update the database.
4406    *
4407    * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
4408    * it might be more efficient to use a version of
4409    * <code>updateBinaryStream</code> which takes a length parameter.
4410    *
4411    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
4412    * @param x           the new column value
4413    * @throws SQLException                    if the columnLabel is not valid;
4414    *                                         if a database access error occurs;
4415    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4416    *                                         or this method is called on a closed result set
4417    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4418    *                                         this method
4419    * @since 1.6
4420    */
4421   @Override
4422   public void updateBinaryStream(String columnLabel, InputStream x) throws SQLException
4423   {
4424      mInnerResultSet.updateBinaryStream(columnLabel, x);
4425   }
4426
4427   /**
4428    * Updates the designated column with a character stream value.
4429    * The data will be read from the stream
4430    * as needed until end-of-stream is reached.
4431    * <p>
4432    * The updater methods are used to update column values in the
4433    * current row or the insert row.  The updater methods do not
4434    * update the underlying database; instead the <code>updateRow</code> or
4435    * <code>insertRow</code> methods are called to update the database.
4436    *
4437    * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
4438    * it might be more efficient to use a version of
4439    * <code>updateCharacterStream</code> which takes a length parameter.
4440    *
4441    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
4442    * @param reader      the <code>java.io.Reader</code> object containing
4443    *                    the new column value
4444    * @throws SQLException                    if the columnLabel is not valid; if a database access error occurs;
4445    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4446    *                                         or this method is called on a closed result set
4447    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4448    *                                         this method
4449    * @since 1.6
4450    */
4451   @Override
4452   public void updateCharacterStream(String columnLabel, Reader reader) throws SQLException
4453   {
4454      mInnerResultSet.updateCharacterStream(columnLabel, reader);
4455   }
4456
4457   /**
4458    * Updates the designated column using the given input stream. The data will be read from the stream
4459    * as needed until end-of-stream is reached.
4460    * <p>
4461    * The updater methods are used to update column values in the
4462    * current row or the insert row.  The updater methods do not
4463    * update the underlying database; instead the <code>updateRow</code> or
4464    * <code>insertRow</code> methods are called to update the database.
4465    *
4466    * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
4467    * it might be more efficient to use a version of
4468    * <code>updateBlob</code> which takes a length parameter.
4469    *
4470    * @param columnIndex the first column is 1, the second is 2, ...
4471    * @param inputStream An object that contains the data to set the parameter
4472    *                    value to.
4473    * @throws SQLException                    if the columnIndex is not valid; if a database access error occurs;
4474    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4475    *                                         or this method is called on a closed result set
4476    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4477    *                                         this method
4478    * @since 1.6
4479    */
4480   @Override
4481   public void updateBlob(int columnIndex, InputStream inputStream) throws SQLException
4482   {
4483      mInnerResultSet.updateBlob(columnIndex, inputStream);
4484   }
4485
4486   /**
4487    * Updates the designated column using the given input stream. The data will be read from the stream
4488    * as needed until end-of-stream is reached.
4489    * <p>
4490    * The updater methods are used to update column values in the
4491    * current row or the insert row.  The updater methods do not
4492    * update the underlying database; instead the <code>updateRow</code> or
4493    * <code>insertRow</code> methods are called to update the database.
4494    *
4495    * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
4496    * it might be more efficient to use a version of
4497    * <code>updateBlob</code> which takes a length parameter.
4498    *
4499    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
4500    * @param inputStream An object that contains the data to set the parameter
4501    *                    value to.
4502    * @throws SQLException                    if the columnLabel is not valid; if a database access error occurs;
4503    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4504    *                                         or this method is called on a closed result set
4505    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4506    *                                         this method
4507    * @since 1.6
4508    */
4509   @Override
4510   public void updateBlob(String columnLabel, InputStream inputStream) throws SQLException
4511   {
4512      mInnerResultSet.updateBlob(columnLabel, inputStream);
4513   }
4514
4515   /**
4516    * Updates the designated column using the given <code>Reader</code>
4517    * object.
4518    * The data will be read from the stream
4519    * as needed until end-of-stream is reached.  The JDBC driver will
4520    * do any necessary conversion from UNICODE to the database char format.
4521    *
4522    * <p>
4523    * The updater methods are used to update column values in the
4524    * current row or the insert row.  The updater methods do not
4525    * update the underlying database; instead the <code>updateRow</code> or
4526    * <code>insertRow</code> methods are called to update the database.
4527    *
4528    * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
4529    * it might be more efficient to use a version of
4530    * <code>updateClob</code> which takes a length parameter.
4531    *
4532    * @param columnIndex the first column is 1, the second is 2, ...
4533    * @param reader      An object that contains the data to set the parameter value to.
4534    * @throws SQLException                    if the columnIndex is not valid;
4535    *                                         if a database access error occurs;
4536    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4537    *                                         or this method is called on a closed result set
4538    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4539    *                                         this method
4540    * @since 1.6
4541    */
4542   @Override
4543   public void updateClob(int columnIndex, Reader reader) throws SQLException
4544   {
4545      mInnerResultSet.updateClob(columnIndex, reader);
4546   }
4547
4548   /**
4549    * Updates the designated column using the given <code>Reader</code>
4550    * object.
4551    * The data will be read from the stream
4552    * as needed until end-of-stream is reached.  The JDBC driver will
4553    * do any necessary conversion from UNICODE to the database char format.
4554    *
4555    * <p>
4556    * The updater methods are used to update column values in the
4557    * current row or the insert row.  The updater methods do not
4558    * update the underlying database; instead the <code>updateRow</code> or
4559    * <code>insertRow</code> methods are called to update the database.
4560    *
4561    * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
4562    * it might be more efficient to use a version of
4563    * <code>updateClob</code> which takes a length parameter.
4564    *
4565    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
4566    * @param reader      An object that contains the data to set the parameter value to.
4567    * @throws SQLException                    if the columnLabel is not valid; if a database access error occurs;
4568    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4569    *                                         or this method is called on a closed result set
4570    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4571    *                                         this method
4572    * @since 1.6
4573    */
4574   @Override
4575   public void updateClob(String columnLabel, Reader reader) throws SQLException
4576   {
4577      mInnerResultSet.updateClob(columnLabel, reader);
4578   }
4579
4580   /**
4581    * Updates the designated column using the given <code>Reader</code>
4582    * <p>
4583    * The data will be read from the stream
4584    * as needed until end-of-stream is reached.  The JDBC driver will
4585    * do any necessary conversion from UNICODE to the database char format.
4586    *
4587    * <p>
4588    * The updater methods are used to update column values in the
4589    * current row or the insert row.  The updater methods do not
4590    * update the underlying database; instead the <code>updateRow</code> or
4591    * <code>insertRow</code> methods are called to update the database.
4592    *
4593    * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
4594    * it might be more efficient to use a version of
4595    * <code>updateNClob</code> which takes a length parameter.
4596    *
4597    * @param columnIndex the first column is 1, the second 2, ...
4598    * @param reader      An object that contains the data to set the parameter value to.
4599    * @throws SQLException                    if the columnIndex is not valid;
4600    *                                         if the driver does not support national
4601    *                                         character sets;  if the driver can detect that a data conversion
4602    *                                         error could occur; this method is called on a closed result set,
4603    *                                         if a database access error occurs or
4604    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4605    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4606    *                                         this method
4607    * @since 1.6
4608    */
4609   @Override
4610   public void updateNClob(int columnIndex, Reader reader) throws SQLException
4611   {
4612      mInnerResultSet.updateNClob(columnIndex, reader);
4613   }
4614
4615   /**
4616    * Updates the designated column using the given <code>Reader</code>
4617    * object.
4618    * The data will be read from the stream
4619    * as needed until end-of-stream is reached.  The JDBC driver will
4620    * do any necessary conversion from UNICODE to the database char format.
4621    *
4622    * <p>
4623    * The updater methods are used to update column values in the
4624    * current row or the insert row.  The updater methods do not
4625    * update the underlying database; instead the <code>updateRow</code> or
4626    * <code>insertRow</code> methods are called to update the database.
4627    *
4628    * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
4629    * it might be more efficient to use a version of
4630    * <code>updateNClob</code> which takes a length parameter.
4631    *
4632    * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
4633    * @param reader      An object that contains the data to set the parameter value to.
4634    * @throws SQLException                    if the columnLabel is not valid; if the driver does not support national
4635    *                                         character sets;  if the driver can detect that a data conversion
4636    *                                         error could occur; this method is called on a closed result set;
4637    *                                         if a database access error occurs or
4638    *                                         the result set concurrency is <code>CONCUR_READ_ONLY</code>
4639    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4640    *                                         this method
4641    * @since 1.6
4642    */
4643   @Override
4644   public void updateNClob(String columnLabel, Reader reader) throws SQLException
4645   {
4646      mInnerResultSet.updateNClob(columnLabel, reader);
4647   }
4648
4649   /**
4650    * <p>Retrieves the value of the designated column in the current row
4651    * of this <code>ResultSet</code> object and will convert from the
4652    * SQL type of the column to the requested Java data type, if the
4653    * conversion is supported. If the conversion is not
4654    * supported  or null is specified for the type, a
4655    * <code>SQLException</code> is thrown.
4656    * <p>
4657    * At a minimum, an implementation must support the conversions defined in
4658    * Appendix B, Table B-3 and conversion of appropriate user defined SQL
4659    * types to a Java type which implements {@code SQLData}, or {@code Struct}.
4660    * Additional conversions may be supported and are vendor defined.
4661    *
4662    * @param columnIndex the first column is 1, the second is 2, ...
4663    * @param type        Class representing the Java data type to convert the designated
4664    *                    column to.
4665    * @return an instance of {@code type} holding the column value
4666    * @throws SQLException                    if conversion is not supported, type is null or
4667    *                                         another error occurs. The getCause() method of the
4668    *                                         exception may provide a more detailed exception, for example, if
4669    *                                         a conversion error occurs
4670    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4671    *                                         this method
4672    * @since 1.7
4673    */
4674   @Override
4675   public <T> T getObject(int columnIndex, Class<T> type) throws SQLException
4676   {
4677      return mInnerResultSet.getObject(columnIndex, type);
4678   }
4679
4680   /**
4681    * <p>Retrieves the value of the designated column in the current row
4682    * of this <code>ResultSet</code> object and will convert from the
4683    * SQL type of the column to the requested Java data type, if the
4684    * conversion is supported. If the conversion is not
4685    * supported  or null is specified for the type, a
4686    * <code>SQLException</code> is thrown.
4687    * <p>
4688    * At a minimum, an implementation must support the conversions defined in
4689    * Appendix B, Table B-3 and conversion of appropriate user defined SQL
4690    * types to a Java type which implements {@code SQLData}, or {@code Struct}.
4691    * Additional conversions may be supported and are vendor defined.
4692    *
4693    * @param columnLabel the label for the column specified with the SQL AS clause.
4694    *                    If the SQL AS clause was not specified, then the label is the name
4695    *                    of the column
4696    * @param type        Class representing the Java data type to convert the designated
4697    *                    column to.
4698    * @return an instance of {@code type} holding the column value
4699    * @throws SQLException                    if conversion is not supported, type is null or
4700    *                                         another error occurs. The getCause() method of the
4701    *                                         exception may provide a more detailed exception, for example, if
4702    *                                         a conversion error occurs
4703    * @throws SQLFeatureNotSupportedException if the JDBC driver does not support
4704    *                                         this method
4705    * @since 1.7
4706    */
4707   @Override
4708   public <T> T getObject(String columnLabel, Class<T> type) throws SQLException
4709   {
4710      return mInnerResultSet.getObject(columnLabel, type);
4711   }
4712
4713   /**
4714    * Updates the designated column with an {@code Object} value.
4715    * <p>
4716    * The updater methods are used to update column values in the
4717    * current row or the insert row.  The updater methods do not
4718    * update the underlying database; instead the {@code updateRow} or
4719    * {@code insertRow} methods are called to update the database.
4720    * <p>
4721    * If the second argument is an {@code InputStream} then the stream must contain
4722    * the number of bytes specified by scaleOrLength.  If the second argument is a
4723    * {@code Reader} then the reader must contain the number of characters specified
4724    * by scaleOrLength. If these conditions are not true the driver will generate a
4725    * {@code SQLException} when the statement is executed.
4726    * <p>
4727    * The default implementation will throw {@code SQLFeatureNotSupportedException}
4728    *
4729    * @param columnIndex   the first column is 1, the second is 2, ...
4730    * @param x             the new column value
4731    * @param targetSqlType the SQL type to be sent to the database
4732    * @param scaleOrLength for an object of {@code java.math.BigDecimal} ,
4733    *                      this is the number of digits after the decimal point. For
4734    *                      Java Object types {@code InputStream} and {@code Reader},
4735    *                      this is the length
4736    *                      of the data in the stream or reader.  For all other types,
4737    *                      this value will be ignored.
4738    * @throws SQLException                    if the columnIndex is not valid;
4739    *                                         if a database access error occurs;
4740    *                                         the result set concurrency is {@code CONCUR_READ_ONLY}
4741    *                                         or this method is called on a closed result set
4742    * @throws SQLFeatureNotSupportedException if the JDBC driver does not
4743    *                                         support this method; if the JDBC driver does not support the specified targetSqlType
4744    * @see JDBCType
4745    * @see SQLType
4746    * @since 1.8
4747    */
4748   @Override
4749   public void updateObject(int columnIndex, Object x, SQLType targetSqlType, int scaleOrLength) throws SQLException
4750   {
4751      mInnerResultSet.updateObject(columnIndex, x, targetSqlType, scaleOrLength);
4752   }
4753
4754   /**
4755    * Updates the designated column with an {@code Object} value.
4756    * <p>
4757    * The updater methods are used to update column values in the
4758    * current row or the insert row.  The updater methods do not
4759    * update the underlying database; instead the {@code updateRow} or
4760    * {@code insertRow} methods are called to update the database.
4761    * <p>
4762    * If the second argument is an {@code InputStream} then the stream must
4763    * contain number of bytes specified by scaleOrLength.  If the second
4764    * argument is a {@code Reader} then the reader must contain the number
4765    * of characters specified by scaleOrLength. If these conditions are not
4766    * true the driver will generate a
4767    * {@code SQLException} when the statement is executed.
4768    * <p>
4769    * The default implementation will throw {@code SQLFeatureNotSupportedException}
4770    *
4771    * @param columnLabel   the label for the column specified with the SQL AS
4772    *                      clause.  If the SQL AS clause was not specified, then the label is
4773    *                      the name of the column
4774    * @param x             the new column value
4775    * @param targetSqlType the SQL type to be sent to the database
4776    * @param scaleOrLength for an object of {@code java.math.BigDecimal} ,
4777    *                      this is the number of digits after the decimal point. For
4778    *                      Java Object types {@code InputStream} and {@code Reader},
4779    *                      this is the length
4780    *                      of the data in the stream or reader.  For all other types,
4781    *                      this value will be ignored.
4782    * @throws SQLException                    if the columnLabel is not valid;
4783    *                                         if a database access error occurs;
4784    *                                         the result set concurrency is {@code CONCUR_READ_ONLY}
4785    *                                         or this method is called on a closed result set
4786    * @throws SQLFeatureNotSupportedException if the JDBC driver does not
4787    *                                         support this method; if the JDBC driver does not support the specified targetSqlType
4788    * @see JDBCType
4789    * @see SQLType
4790    * @since 1.8
4791    */
4792   @Override
4793   public void updateObject(String columnLabel, Object x, SQLType targetSqlType, int scaleOrLength) throws SQLException
4794   {
4795      mInnerResultSet.updateObject(columnLabel, x, targetSqlType, scaleOrLength);
4796   }
4797
4798   /**
4799    * Updates the designated column with an {@code Object} value.
4800    * <p>
4801    * The updater methods are used to update column values in the
4802    * current row or the insert row.  The updater methods do not
4803    * update the underlying database; instead the {@code updateRow} or
4804    * {@code insertRow} methods are called to update the database.
4805    * <p>
4806    * The default implementation will throw {@code SQLFeatureNotSupportedException}
4807    *
4808    * @param columnIndex   the first column is 1, the second is 2, ...
4809    * @param x             the new column value
4810    * @param targetSqlType the SQL type to be sent to the database
4811    * @throws SQLException                    if the columnIndex is not valid;
4812    *                                         if a database access error occurs;
4813    *                                         the result set concurrency is {@code CONCUR_READ_ONLY}
4814    *                                         or this method is called on a closed result set
4815    * @throws SQLFeatureNotSupportedException if the JDBC driver does not
4816    *                                         support this method; if the JDBC driver does not support the specified targetSqlType
4817    * @see JDBCType
4818    * @see SQLType
4819    * @since 1.8
4820    */
4821   @Override
4822   public void updateObject(int columnIndex, Object x, SQLType targetSqlType) throws SQLException
4823   {
4824      mInnerResultSet.updateObject(columnIndex, x, targetSqlType);
4825   }
4826
4827   /**
4828    * Updates the designated column with an {@code Object} value.
4829    * <p>
4830    * The updater methods are used to update column values in the
4831    * current row or the insert row.  The updater methods do not
4832    * update the underlying database; instead the {@code updateRow} or
4833    * {@code insertRow} methods are called to update the database.
4834    * <p>
4835    * The default implementation will throw {@code SQLFeatureNotSupportedException}
4836    *
4837    * @param columnLabel   the label for the column specified with the SQL AS
4838    *                      clause.  If the SQL AS clause was not specified, then the label is
4839    *                      the name of the column
4840    * @param x             the new column value
4841    * @param targetSqlType the SQL type to be sent to the database
4842    * @throws SQLException                    if the columnLabel is not valid;
4843    *                                         if a database access error occurs;
4844    *                                         the result set concurrency is {@code CONCUR_READ_ONLY}
4845    *                                         or this method is called on a closed result set
4846    * @throws SQLFeatureNotSupportedException if the JDBC driver does not
4847    *                                         support this method; if the JDBC driver does not support the specified targetSqlType
4848    * @see JDBCType
4849    * @see SQLType
4850    * @since 1.8
4851    */
4852   @Override
4853   public void updateObject(String columnLabel, Object x, SQLType targetSqlType) throws SQLException
4854   {
4855      mInnerResultSet.updateObject(columnLabel, x, targetSqlType);
4856   }
4857
4858   /**
4859    * Returns an object that implements the given interface to allow access to
4860    * non-standard methods, or standard methods not exposed by the proxy.
4861    * <p>
4862    * If the receiver implements the interface then the result is the receiver
4863    * or a proxy for the receiver. If the receiver is a wrapper
4864    * and the wrapped object implements the interface then the result is the
4865    * wrapped object or a proxy for the wrapped object. Otherwise return the
4866    * the result of calling <code>unwrap</code> recursively on the wrapped object
4867    * or a proxy for that result. If the receiver is not a
4868    * wrapper and does not implement the interface, then an <code>SQLException</code> is thrown.
4869    *
4870    * @param iface A Class defining an interface that the result must implement.
4871    * @return an object that implements the interface. May be a proxy for the actual implementing object.
4872    * @throws SQLException If no object found that implements the interface
4873    * @since 1.6
4874    */
4875   @Override
4876   public <T> T unwrap(Class<T> iface) throws SQLException
4877   {
4878      if (iface != mInnerResultSet.getClass())
4879      {
4880         throw new SQLException("No object found implementing " + iface.getName());
4881      }
4882
4883      return mInnerResultSet.unwrap(iface);
4884   }
4885
4886   /**
4887    * Returns true if this either implements the interface argument or is directly or indirectly a wrapper
4888    * for an object that does. Returns false otherwise. If this implements the interface then return true,
4889    * else if this is a wrapper then return the result of recursively calling <code>isWrapperFor</code> on the wrapped
4890    * object. If this does not implement the interface and is not a wrapper, return false.
4891    * This method should be implemented as a low-cost operation compared to <code>unwrap</code> so that
4892    * callers can use this method to avoid expensive <code>unwrap</code> calls that may fail. If this method
4893    * returns true then calling <code>unwrap</code> with the same argument should succeed.
4894    *
4895    * @param iface a Class defining an interface.
4896    * @return true if this implements the interface or directly or indirectly wraps an object that does.
4897    * @throws SQLException if an error occurs while determining whether this is a wrapper
4898    *                      for an object with the given interface.
4899    * @since 1.6
4900    */
4901   @Override
4902   public boolean isWrapperFor(Class<?> iface) throws SQLException
4903   {
4904      return (iface == mInnerResultSet.getClass());
4905   }
4906}