1 /*
2  * Copyright (C) 2007 Google Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package libcore.java.sql;
18 
19 import java.io.InputStream;
20 import java.io.InputStreamReader;
21 import java.io.OutputStream;
22 import java.io.Reader;
23 import java.io.Writer;
24 import java.math.BigDecimal;
25 import java.net.URL;
26 import java.sql.Array;
27 import java.sql.Blob;
28 import java.sql.Clob;
29 import java.sql.Date;
30 import java.sql.PreparedStatement;
31 import java.sql.Ref;
32 import java.sql.ResultSet;
33 import java.sql.ResultSetMetaData;
34 import java.sql.SQLException;
35 import java.sql.Statement;
36 import java.sql.Time;
37 import java.sql.Timestamp;
38 import java.sql.Types;
39 import java.util.Calendar;
40 import java.util.GregorianCalendar;
41 import java.util.Locale;
42 import java.util.Map;
43 import java.util.TimeZone;
44 
45 public final class OldPreparedStatementTest extends OldSQLTest {
46 
47     String queryAllSelect = "select * from type";
48 
49     String[] queries = {
50             "create table type (" +
51 
52             " BoolVal BOOLEAN," + " IntVal INT," + " LongVal LONG,"
53                     + " Bint BIGINT," + " Tint TINYINT," + " Sint SMALLINT,"
54                     + " Mint MEDIUMINT, " +
55 
56                     " IntegerVal INTEGER, " + " RealVal REAL, "
57                     + " DoubleVal DOUBLE, " + " FloatVal FLOAT, "
58                     + " DecVal DECIMAL, " +
59 
60                     " NumVal NUMERIC, " + " charStr CHAR(20), "
61                     + " dateVal DATE, " + " timeVal TIME, " + " TS TIMESTAMP, "
62                     +
63 
64                     " DT DATETIME, " + " TBlob TINYBLOB, " + " BlobVal BLOB, "
65                     + " MBlob MEDIUMBLOB, " + " LBlob LONGBLOB, " +
66 
67                     " TText TINYTEXT, " + " TextVal TEXT, "
68                     + " MText MEDIUMTEXT, " + " LText LONGTEXT " + ");",
69 
70             "insert into type (BoolVal, IntVal, LongVal, Bint, Tint, Sint, Mint,"
71                     + "IntegerVal, RealVal, DoubleVal, FloatVal, DecVal,"
72                     + "NumVal, charStr, dateVal, timeVal, TS,"
73                     + "DT, TBlob, BlobVal, MBlob, LBlob,"
74                     + "TText, TextVal, MText, LText"
75                     + ") "
76                     + "values (1, -1, 22, 2, 33,"
77                     + "3, 1, 2, 3.9, 23.2, 33.3, 44,"
78                     + "5, 'test string', '1799-05-26', '12:35:45', '2007-10-09 14:28:02.0',"
79                     + "'1221-09-22 10:11:55', 1, 2, 3, 4,"
80                     + "'Test text message tiny', 'Test text message', 'Test text message medium', 'Test text message long');" };
81 
setUp()82     public void setUp() throws Exception {
83         super.setUp();
84         Statement st = null;
85         try {
86             st = conn.createStatement();
87             for (int i = 0; i < queries.length; i++) {
88                 st.execute(queries[i]);
89             }
90         } finally {
91             try {
92                 st.close();
93             } catch (Exception ee) {
94             }
95         }
96     }
97 
tearDown()98     public void tearDown() throws SQLException {
99         Statement st = null;
100         try {
101             st = conn.createStatement();
102             st.execute("drop table if exists type");
103         } finally {
104             try {
105                 st.close();
106             } catch (SQLException ee) {
107             }
108         }
109         super.tearDown();
110     }
111 
testAddBatch()112     public void testAddBatch() throws SQLException {
113         PreparedStatement ps = null;
114         try {
115             ps = conn
116                     .prepareStatement("INSERT INTO zoo VALUES (3,'Tuzik', ?);");
117             ps.addBatch("INSERT INTO zoo VALUES (?,'Burenka', ?); ");
118             ps.addBatch("INSERT INTO zoo VALUES (?,'Mashka','cat')");
119             try {
120                 ps.executeBatch();
121             } catch (SQLException sqle) {
122                 fail("SQLException is thrown for executeBatch()");
123             }
124             ps.setString(1, "dog");
125             Statement st = null;
126             try {
127                 ps.executeBatch();
128                 st = conn.createStatement();
129                 st.execute("select * from zoo");
130                 ResultSet rs = st.getResultSet();
131                 assertEquals(2, getCount(rs));
132             } catch (SQLException sqle) {
133                 fail("SQLException is thrown for executeBatch()");
134             } finally {
135                 try {
136                     st.close();
137                 } catch (SQLException ee) {
138                 }
139             }
140         } finally {
141             try {
142                 ps.close();
143             } catch (SQLException ee) {
144             }
145         }
146 
147         try {
148             ps = conn
149                     .prepareStatement("INSERT INTO zoo VALUES (3,'Tuzik', ?);");
150             ps.addBatch("");
151         } catch (SQLException e) {
152             // expected
153         } finally {
154             try {
155                 ps.close();
156             } catch (SQLException ee) {
157             }
158         }
159 
160         try {
161             ps = conn
162                     .prepareStatement("INSERT INTO zoo VALUES (3,'Tuzik', ?);");
163             ps.addBatch(null);
164         } catch (SQLException e) {
165             // expected
166         } finally {
167             try {
168                 ps.close();
169             } catch (SQLException ee) {
170             }
171         }
172     }
173 
174 
175     // preparedStatement.execute() does not return false on update.
testExecute()176     public void testExecute() throws SQLException {
177         Statement st = null;
178         PreparedStatement ps = null;
179         try {
180             //update
181             String query = "insert into zoo(id, family, name) values(?, ?, 'unknown animal')";
182             ps = conn.prepareStatement(query);
183             ps.setInt(1, 3);
184             ps.setString(2, "No name");
185             assertFalse(ps.execute());
186             assertEquals(1,ps.getUpdateCount());
187 
188             // select
189             ps = conn.prepareStatement("select * from zoo");
190             assertTrue(ps.execute());
191             assertEquals(3, getCount(ps.getResultSet()));
192         } finally {
193             try {
194                 ps.close();
195             } catch (Exception ee) {
196             }
197         }
198 
199         try {
200             String query = "update zoo set name='Masha', family=? where id=?;";
201             ps = conn.prepareStatement(query);
202             ps.setString(1, "cat");
203             ps.setInt(2, 2);
204             assertFalse(ps.execute());
205             assertEquals(1, ps.getUpdateCount());
206             st = conn.createStatement();
207             st.execute("select family from zoo where id=2");
208             ResultSet rs = st.getResultSet();
209             rs.next();
210             assertEquals("cat", rs.getString(1));
211         } finally {
212             try {
213                 ps.close();
214                 st.close();
215             } catch (Exception ee) {
216             }
217         }
218 
219         try {
220             conn.createStatement().execute("drop table if exists hutch");
221             String query = "create table hutch (id integer not null, animal_id integer, address char(20), primary key (id));";
222             ps = conn.prepareStatement(query);
223             assertFalse(ps.execute());
224             assertTrue(ps.getUpdateCount() > 0);
225         } finally {
226             try {
227                 ps.close();
228             } catch (Exception ee) {
229             }
230         }
231 
232         try {
233             String query = "select name, family from zoo where id = ?";
234             ps = conn.prepareStatement(query);
235             ps.setInt(1, 1);
236             assertTrue(ps.execute());
237         } finally {
238             try {
239                 ps.close();
240             } catch (Exception ee) {
241             }
242         }
243 
244         try {
245             String query = "select name, family from zoo where id = ?";
246             ps = conn.prepareStatement(query);
247             ps.execute();
248         } finally {
249             try {
250                 ps.close();
251             } catch (Exception ee) {
252             }
253         }
254         //Exception test
255         try {
256             String query = "update zoo set name='Masha', family=? where id=?;";
257             ps = conn.prepareStatement(query);
258             ps.setString(1, "cat");
259             ps.setInt(2, 2);
260             assertTrue(ps.execute("update zoo set name='Masha', family='cat' where id=2;"));
261         } catch (SQLException e) {
262             // ok Should not provide string argument for a prepared Statement
263         } finally {
264             try {
265                 ps.close();
266             } catch (Exception ee) {
267             }
268         }
269     }
270 
testExecuteQuery()271     public void testExecuteQuery() throws SQLException {
272         String[] queries2 = {
273                 "update zoo set name='Masha', family='cat' where id=;",
274                 "insert into hutch (id, animal_id, address) values (1, ?,'Birds-house, 1');",
275                 "insert into hutch (id, animal_id, address) values (?, 1, 'Horse-house, 5');",
276                 "create view address as select address from hutch where animal_id=?"};
277 
278         for (int i = 0; i < queries2.length; i++) {
279             PreparedStatement ps = null;
280             try {
281                 ps = conn.prepareStatement(queries2[i]);
282                 ps.executeQuery();
283                 fail("SQLException is not thrown for query: " + queries2[i]);
284             } catch (SQLException sqle) {
285                 // expected
286             } finally {
287                 try {
288                     ps.close();
289                 } catch (Exception ee) {
290                 }
291             }
292         }
293 
294         String query = "select * from zoo where id = ?";
295         PreparedStatement ps = null;
296         try {
297             ps = conn.prepareStatement(query);
298             ps.setInt(1, 1);
299             ResultSet rs = ps.executeQuery();
300             rs.next();
301             assertEquals(1, rs.getInt(1));
302             assertEquals("Kesha", rs.getString(2));
303             assertEquals("parrot", rs.getString(3));
304         } finally {
305             try {
306                 ps.close();
307             } catch (Exception ee) {
308             }
309         }
310 
311         try {
312             ps = conn.prepareStatement(query);
313             ps.setInt(1, 5);
314             ResultSet rs = ps.executeQuery();
315             assertNotNull(rs);
316             assertFalse(rs.next());
317         } finally {
318             try {
319                 ps.close();
320             } catch (Exception ee) {
321             }
322         }
323     }
324 
325     // TODO Crashes VM. Fix later.
testExecuteUpdate()326     public void testExecuteUpdate() throws SQLException {
327           String[] queries1 = { "insert into hutch (id, animal_id, address) values (1, ?, 'Birds-house, 1');",
328                               "insert into hutch (id, animal_id, address) values (?, 1, 'Horse-house, 5');",
329                               "create view address as select address from hutch where animal_id=2" };
330 
331           for (int i = 0; i < queries1.length; i++) {
332               PreparedStatement ps = null;
333               try {
334                   ps = conn.prepareStatement(queries1[i]);
335                   ps.executeUpdate();
336                   fail("SQLException is not thrown for query: " + queries1[i]);
337           } catch(SQLException sqle) {
338               // expected
339           } finally {
340               try {
341                   ps.close();
342               } catch(Exception ee) {}
343           }
344       }
345 
346           String query = "update zoo set name='Masha', family='cat' where id=?;";
347           PreparedStatement ps = null;
348           try {
349               ps = conn.prepareStatement(query);
350               ps.setInt(1, 2);
351               int updateCount = ps.executeUpdate();
352               assertEquals(1, updateCount);
353               ps.setInt(1, 1);
354               int updateCount1 = ps.executeUpdate();
355               assertEquals(1, updateCount1);
356           } finally {
357               try {
358                   ps.close();
359               } catch(Exception ee) {}
360           }
361       }
362 
363     /**
364      * TODO Doesn't pass. according to spec, it is possible to invoke the
365      * method getMetaData on a PreparedStatement object before it is executed.
366      */
testGetMetaData()367     public void testGetMetaData() throws SQLException {
368         PreparedStatement ps = null;
369 
370         // Specification testing
371 
372         try {
373             String query = "update zoo set name='Masha', family='cat' where id=?;";
374             ps = conn.prepareStatement(query);
375             assertNotNull(ps);
376             ResultSetMetaData meta = ps.getMetaData();
377             assertNotNull(meta);
378         } finally {
379             try {
380                 ps.close();
381             } catch (SQLException ee) {
382             }
383         }
384 
385         try {
386             String query = "select * from zoo where id = ?";
387             ps = conn.prepareStatement(query);
388             ResultSetMetaData rsmd = ps.getMetaData();
389             assertNotNull(rsmd);
390             assertEquals(3, rsmd.getColumnCount());
391             assertEquals("id", rsmd.getColumnName(1));
392         } finally {
393             try {
394                 ps.close();
395             } catch (SQLException ee) {
396             }
397         }
398 
399         // ps closed
400         try {
401             ps.getMetaData();
402             fail("SQLException expected");
403         } catch (SQLException e) {
404             // ok
405         }
406     }
407 
testGetParameterMetaData()408     public void testGetParameterMetaData() throws SQLException {
409         PreparedStatement ps = null;
410         String query = "select * from zoo where id = ?";
411         ps = conn.prepareStatement(query);
412 
413         try {
414             ps.getParameterMetaData();
415             fail();
416         } catch (SQLException e) {
417             assertEquals("not supported",e.getMessage());
418         } finally {
419             try {
420                 ps.close();
421             } catch (SQLException ee) {
422             }
423         }
424 
425         ps.close();
426 
427         try {
428             ps.getParameterMetaData();
429             fail("SQLException expected");
430         } catch (SQLException e) {
431             // ok
432         }
433     }
434 
435 
436     /**
437      * Test fails: clearparameters should be implemented with Stmt.reset()
438      */
testClearParameters()439     public void testClearParameters() throws SQLException {
440         PreparedStatement ps = null;
441         try {
442             String query = "select * from zoo where id = ? and family=?";
443             ps = conn.prepareStatement(query);
444             ps.clearParameters();
445             try {
446                 ps.execute();
447                 fail("SQLException is not thrown during execute method after calling clearParameters()");
448             } catch (SQLException sql) {
449             }
450             ps.setInt(1, 2);
451             ps.setString(2, "dog");
452             ps.clearParameters();
453             try {
454                 ps.execute();
455                 fail("SQLException is not thrown during execute method after calling clearParameters()");
456             } catch (SQLException sqle) {
457                 // expected
458             }
459             ps.setInt(1, 2);
460             ps.clearParameters();
461             try {
462                 ps.execute();
463                 fail("SQLException is not thrown during execute method after calling clearParameters()");
464             } catch (SQLException sqle) {
465                 // expected
466             }
467             ps.setInt(1, 2);
468             ps.setString(2, "cat");
469 
470             try {
471                 ps.execute();
472             } catch (SQLException sqle) {
473                 fail("SQLException is thrown during execute method after calling clearParameters() twice");
474             }
475         } finally {
476             try {
477                 ps.close();
478             } catch (SQLException ee) {
479             }
480         }
481     }
482 
483     // exception test fails
testSetInt()484     public void testSetInt() throws SQLException {
485 
486         PreparedStatement ps = null;
487         Statement st = null;
488         try {
489             String query = "insert into type (IntVal) values (?);";
490             ps = conn.prepareStatement(query);
491             try {
492                 ps.setInt(1, Integer.MAX_VALUE);
493                 ps.execute();
494                 st = conn.createStatement();
495                 st.execute("select * from type where IntVal="
496                         + Integer.MAX_VALUE);
497                 ResultSet rs = st.getResultSet();
498                 assertEquals(1, getCount(rs));
499             } finally {
500                 try {
501                     ps.close();
502                     st.close();
503                 } catch (Exception ee) {
504                 }
505             }
506             ps = conn.prepareStatement(query);
507             try {
508                 ps.setInt(1, Integer.MIN_VALUE);
509                 ps.execute();
510                 st = conn.createStatement();
511                 st.execute("select * from type where IntVal="
512                         + Integer.MAX_VALUE);
513                 ResultSet rs = st.getResultSet();
514                 assertEquals(1, getCount(rs));
515             } finally {
516                 try {
517                     ps.close();
518                     st.close();
519                 } catch (SQLException ee) {
520                 }
521             }
522             ps = conn.prepareStatement(query);
523             ps.close();
524             try {
525                 ps.setInt(1, Integer.MIN_VALUE);
526                 fail("SQLException is not thrown");
527             } catch (SQLException sqle) {
528                 // expected
529             }
530         } finally {
531             try {
532 
533                 ps.close();
534             } catch (SQLException ee) {
535             }
536         }
537     }
538 
539     // exception test fails
testSetLong()540     public void testSetLong() throws SQLException {
541 
542         PreparedStatement ps = null;
543         try {
544             String query = "insert into type (LongVal) values (?);";
545             ps = conn.prepareStatement(query);
546             Statement st = null;
547             try {
548                 ps.setLong(1, Long.MAX_VALUE);
549                 ps.execute();
550                 st = conn.createStatement();
551                 st.execute("select * from type where LongVal=" + Long.MAX_VALUE);
552                 ResultSet rs = st.getResultSet();
553                 assertEquals(1, getCount(rs));
554             } finally {
555                 try {
556                     st.close();
557                 } catch (Exception ee) {
558                 }
559             }
560 
561             try {
562                 ps.setLong(1, Long.MIN_VALUE);
563                 ps.execute();
564                 st = conn.createStatement();
565                 st.execute("select * from type where LongVal=" + Long.MAX_VALUE);
566                 ResultSet rs = st.getResultSet();
567                 assertEquals(1, getCount(rs));
568             } finally {
569                 try {
570                     st.close();
571                 } catch (SQLException ee) {
572                 }
573             }
574 
575             ps.close();
576             try {
577                 ps.setLong(1, Long.MIN_VALUE);
578                 fail("SQLException is not thrown");
579             } catch (SQLException sqle) {
580                 // expected
581             }
582         } finally {
583             try {
584                 ps.close();
585             } catch (SQLException ee) {
586             }
587         }
588 
589     }
590 
591     // exception test fails
testSetFloat()592     public void testSetFloat() throws SQLException {
593         float value1 = 12345678.12345689f;
594         float value2 = -12345678.12345689f;
595 
596         PreparedStatement ps = null;
597         String query = "insert into type (FloatVal) values (?);";
598         ps = conn.prepareStatement(query);
599 
600         try {
601 
602             Statement st = null;
603             try {
604                 ps.setFloat(1, value1);
605                 ps.execute();
606                 st = conn.createStatement();
607                 st.execute("select * from type where FloatVal=" + value1);
608                 ResultSet rs = st.getResultSet();
609                 assertEquals(1, getCount(rs));
610             } finally {
611                 try {
612                     st.close();
613                 } catch (Exception ee) {
614                 }
615             }
616 
617             try {
618                 ps.setFloat(1, value2);
619                 ps.execute();
620                 st = conn.createStatement();
621                 st.execute("select * from type where FloatVal=" + value2);
622                 ResultSet rs = st.getResultSet();
623                 assertEquals(1, getCount(rs));
624             } finally {
625                 try {
626                     st.close();
627                 } catch (SQLException ee) {
628 
629                 }
630             }
631             ps.close();
632             try {
633                 ps.setFloat(1, Float.MIN_VALUE);
634                 fail("SQLException is not thrown");
635             } catch (SQLException sqle) {
636                 // expected
637             }
638         } finally {
639             try {
640 
641                 ps.close();
642             } catch (SQLException ee) {
643             }
644         }
645     }
646 
647     // exception test fails
testSetDouble()648     public void testSetDouble() throws SQLException {
649         PreparedStatement ps = null;
650         String query = "insert into type (DoubleVal) values (?);";
651         ps = conn.prepareStatement(query);
652 
653         try {
654 
655             Statement st = null;
656             try {
657                 ps.setDouble(1, Double.MAX_VALUE);
658                 ps.execute();
659                 st = conn.createStatement();
660                 st.execute("select * from type where DoubleVal="
661                         + Double.MAX_VALUE);
662                 ResultSet rs = st.getResultSet();
663                 assertEquals(1, getCount(rs));
664             } finally {
665                 try {
666                     st.close();
667                 } catch (Exception ee) {
668                 }
669             }
670 
671             try {
672                 ps.setDouble(1, Double.MIN_VALUE);
673                 ps.execute();
674                 st = conn.createStatement();
675                 st.execute("select * from type where DoubleVal="
676                         + Double.MIN_VALUE);
677                 ResultSet rs = st.getResultSet();
678                 assertEquals(1, getCount(rs));
679             } finally {
680                 try {
681                     st.close();
682                 } catch (SQLException ee) {
683                 }
684             }
685 
686             ps.close();
687             try {
688                 ps.setDouble(1, 2.0);
689                 fail("SQLException is not thrown");
690             } catch (SQLException sqle) {
691                 // expected
692             }
693         } finally {
694             try {
695 
696                 ps.close();
697             } catch (SQLException ee) {
698             }
699         }
700     }
701 
702     // exception test fails
testSetString_charField()703     public void testSetString_charField() throws SQLException {
704         PreparedStatement ps = null;
705         try {
706             String query = "insert into type (charStr) values (?);";
707             ps = conn.prepareStatement(query);
708 
709             String str = "test^text$test%";
710             Statement st = null;
711             try {
712                 ps.setString(1, str);
713                 ps.execute();
714                 st = conn.createStatement();
715                 st.execute("select * from type where charStr='" + str + "'");
716                 ResultSet rs = st.getResultSet();
717                 assertEquals(1, getCount(rs));
718             } finally {
719                 try {
720                     st.close();
721                 } catch (Exception ee) {
722                 }
723             }
724 
725             try {
726                 ps.setString(1, "");
727                 ps.execute();
728                 st = conn.createStatement();
729                 st.execute("select * from type where charStr=''");
730                 ResultSet rs = st.getResultSet();
731                 assertEquals(1, getCount(rs));
732             } finally {
733                 try {
734                     st.close();
735                 } catch (SQLException ee) {
736                 }
737             }
738 
739             try {
740                 ps.setString(1, "                   ");
741                 ps.execute();
742                 st = conn.createStatement();
743                 st.execute("select * from type where charStr='                   '");
744                 ResultSet rs = st.getResultSet();
745                 assertEquals(1, getCount(rs));
746             } finally {
747                 try {
748                     st.close();
749                 } catch (SQLException ee) {
750                 }
751             }
752 
753             ps.setString(1, " test & text * test % text * test ^ text ");
754             ps.execute();
755             ps.setString(1, null);
756             ps.execute();
757             ps.close();
758 
759             try {
760                 ps.setString(1, "test text");
761                 fail("SQLException is not thrown");
762             } catch (SQLException sqle) {
763                 // expected
764             }
765         } finally {
766             try {
767                 ps.close();
768             } catch (SQLException ee) {
769             }
770         }
771     }
772 
773     // statment.close() does not wrap up
testSetString_tinyTextField()774     public void testSetString_tinyTextField() throws SQLException {
775         PreparedStatement ps = null;
776         try {
777             String str = "test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test/test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test";
778             String query = "insert into type (TText) values (?);";
779             ps = conn.prepareStatement(query);
780             Statement st = null;
781             try {
782                 ps.setString(1, str);
783                 ps.execute();
784                 st = conn.createStatement();
785                 st.execute("select * from type where TText='" + str + "'");
786                 ResultSet rs = st.getResultSet();
787                 assertEquals(1, getCount(rs));
788             } finally {
789                 try {
790                     st.close();
791                 } catch (Exception ee) {
792                 }
793             }
794 
795             try {
796                 ps.setString(1, "");
797                 ps.execute();
798                 st = conn.createStatement();
799                 st.execute("select * from type where TText=''");
800                 ResultSet rs = st.getResultSet();
801                 assertEquals(1, getCount(rs));
802             } finally {
803                 try {
804                     st.close();
805                 } catch (SQLException ee) {
806                 }
807             }
808 
809             try {
810                 ps.setString(1, "                   ");
811                 ps.execute();
812                 st = conn.createStatement();
813                 st.execute("select * from type where TText='                   '");
814                 ResultSet rs = st.getResultSet();
815                 assertEquals(1, getCount(rs));
816             } finally {
817                 try {
818                     st.close();
819                 } catch (SQLException ee) {
820                 }
821             }
822 
823             try {
824                 ps.setString(1,
825                         "test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test/test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test*test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test/test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test-test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test/test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test/test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test+test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test/test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test?test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test/test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test#test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test/test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test ");
826                 ps.execute();
827             } catch (SQLException sqle) {
828                 fail("SQLException is thrown");
829             }
830 
831             try {
832                 ps.setString(1, null);
833                 ps.execute();
834             } catch (SQLException sqle) {
835                 fail("SQLException is thrown: " + sqle.getMessage());
836             }
837 
838             ps.close();
839 
840             try {
841                 ps.setString(1, "test text");
842                 fail("SQLException is not thrown");
843             } catch (SQLException sqle) {
844                 // expected
845             }
846         } finally {
847             try {
848                 ps.close();
849             } catch (SQLException ee) {
850             }
851         }
852     }
853 
testSetString_textField()854     public void testSetString_textField() throws SQLException {
855         PreparedStatement ps = null;
856         try {
857             String str = "test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test/test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test";
858             String query = "insert into type (TextVal) values (?);";
859             ps = conn.prepareStatement(query);
860             Statement st = null;
861             try {
862                 ps.setString(1, str);
863                 ps.execute();
864                 st = conn.createStatement();
865                 st.execute("select * from type where TextVal='" + str + "'");
866                 ResultSet rs = st.getResultSet();
867                 assertEquals(1, getCount(rs));
868             } finally {
869                 try {
870                     st.close();
871                 } catch (Exception ee) {
872                 }
873             }
874 
875             try {
876                 ps.setString(1, "");
877                 ps.execute();
878                 st = conn.createStatement();
879                 st.execute("select * from type where TextVal=''");
880                 ResultSet rs = st.getResultSet();
881                 assertEquals(1, getCount(rs));
882             } finally {
883                 try {
884                     st.close();
885                 } catch (SQLException ee) {
886                 }
887             }
888 
889             try {
890                 ps.setString(1, "                   ");
891                 ps.execute();
892                 st = conn.createStatement();
893                 st.execute("select * from type where TextVal='                   '");
894                 ResultSet rs = st.getResultSet();
895                 assertEquals(1, getCount(rs));
896             } finally {
897                 try {
898                     st.close();
899                 } catch (SQLException ee) {
900                 }
901             }
902 
903             String longString = " test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test/";
904             for (int i = 0; i < 10; i++) {
905                 longString += longString;
906             }
907             ps.setString(1, longString);
908             ps.execute();
909 
910             ps.setString(1, null);
911             ps.execute();
912 
913             ps.close();
914 
915             try {
916                 ps.setString(2, "test text");
917                 fail("SQLException is not thrown");
918             } catch (SQLException sqle) {
919                 // expected
920             }
921         } finally {
922             try {
923                 ps.close();
924             } catch (SQLException ee) {
925             }
926         }
927     }
928 
testSetString_mediumTextField()929     public void testSetString_mediumTextField() throws SQLException {
930         PreparedStatement ps = null;
931         try {
932             String str = "test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test/test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test";
933             String query = "insert into type (MText) values (?);";
934             ps = conn.prepareStatement(query);
935             Statement st = null;
936             try {
937                 ps.setString(1, str);
938                 ps.execute();
939                 st = conn.createStatement();
940                 st.execute("select * from type where MText='" + str + "'");
941                 ResultSet rs = st.getResultSet();
942                 assertEquals(1, getCount(rs));
943             } finally {
944                 try {
945                     st.close();
946                 } catch (Exception ee) {
947                 }
948             }
949 
950             try {
951                 ps.setString(1, "");
952                 ps.execute();
953                 st = conn.createStatement();
954                 st.execute("select * from type where MText=''");
955                 ResultSet rs = st.getResultSet();
956                 assertEquals(1, getCount(rs));
957             } finally {
958                 try {
959                     st.close();
960                 } catch (Exception ee) {
961                 }
962             }
963 
964             try {
965                 ps.setString(1, "                   ");
966                 ps.execute();
967                 st = conn.createStatement();
968                 st
969                         .execute("select * from type where MText='                   '");
970                 ResultSet rs = st.getResultSet();
971                 assertEquals(1, getCount(rs));
972             } finally {
973                 try {
974                     st.close();
975                 } catch (Exception ee) {
976                 }
977             }
978 
979             ps.setString(1, null);
980             ps.execute();
981             ps.close();
982 
983             try {
984                 ps.setString(2, "test text");
985                 fail("SQLException is not thrown");
986             } catch (SQLException sqle) {
987                 // expected
988             }
989         } finally {
990             try {
991                 ps.close();
992             } catch (Exception ee) {
993             }
994         }
995     }
996 
997     // exception test fails
testSetString_longTextField()998     public void testSetString_longTextField() throws SQLException {
999         PreparedStatement ps = null;
1000         try {
1001             String str = "test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test/test^text$test%test(text)test@text5test~test^text$test%test(text)test@text5test";
1002             String query = "insert into type (LText) values (?);";
1003             ps = conn.prepareStatement(query);
1004             Statement st = null;
1005             try {
1006                 ps.setString(1, str);
1007                 ps.execute();
1008                 st = conn.createStatement();
1009                 st.execute("select * from type where LText='" + str + "'");
1010                 ResultSet rs = st.getResultSet();
1011                 assertEquals(1, getCount(rs));
1012             } finally {
1013                 try {
1014                     st.close();
1015                 } catch (Exception ee) {
1016                 }
1017             }
1018 
1019             try {
1020                 ps.setString(1, "");
1021                 ps.execute();
1022                 st = conn.createStatement();
1023                 st.execute("select * from type where LText=''");
1024                 ResultSet rs = st.getResultSet();
1025                 assertEquals(1, getCount(rs));
1026             } finally {
1027                 try {
1028                     st.close();
1029                 } catch (Exception ee) {
1030                 }
1031             }
1032 
1033             try {
1034                 ps.setString(1, "                   ");
1035                 ps.execute();
1036                 st = conn.createStatement();
1037                 st.execute("select * from type where LText='                   '");
1038                 ResultSet rs = st.getResultSet();
1039                 assertEquals(1, getCount(rs));
1040             } finally {
1041                 try {
1042                     st.close();
1043                 } catch (Exception ee) {
1044                 }
1045             }
1046 
1047             ps.setString(1, null);
1048             ps.execute();
1049             ps.close();
1050 
1051             try {
1052                 ps.setString(1, "test text");
1053                 fail("SQLException is not thrown");
1054             } catch (SQLException sqle) {
1055                 // expected
1056             }
1057         } finally {
1058             try {
1059                 ps.close();
1060             } catch (Exception ee) {
1061             }
1062         }
1063     }
1064 
1065     // exception test fails
testSetShort()1066     public void testSetShort() throws SQLException {
1067         PreparedStatement ps = null;
1068         PreparedStatement ps1 = null;
1069         PreparedStatement ps2 = null;
1070         try {
1071             String query = "insert into type (Sint) values (?);";
1072             ps = conn.prepareStatement(query);
1073             Statement st = null;
1074             try {
1075                 ps.setShort(1, Short.MAX_VALUE);
1076                 ps.execute();
1077                 st = conn.createStatement();
1078                 st.execute("select * from type where Sint=" + Short.MAX_VALUE);
1079                 ResultSet rs = st.getResultSet();
1080                 assertEquals(1, getCount(rs));
1081             } finally {
1082                 try {
1083                     st.close();
1084                 } catch (Exception ee) {
1085                 }
1086             }
1087 
1088             try {
1089                 ps.setShort(1, Short.MIN_VALUE);
1090                 ps.execute();
1091                 st = conn.createStatement();
1092                 st.execute("select * from type where Sint=" + Short.MIN_VALUE);
1093                 ResultSet rs = st.getResultSet();
1094                 assertEquals(1, getCount(rs));
1095             } finally {
1096                 try {
1097                     st.close();
1098                 } catch (Exception ee) {
1099                 }
1100             }
1101 
1102             ps.close();
1103 
1104             try {
1105                 ps.setShort(1, Short.MIN_VALUE);
1106                 fail("SQLException is not thrown");
1107             } catch (SQLException sqle) {
1108                 // expected
1109             }
1110 
1111             String query1 = "insert into type (Tint) values (?);";
1112             ps1 = conn.prepareStatement(query1);
1113             ps1.setShort(1, Short.MAX_VALUE);
1114 
1115             String query2 = "insert into type (IntVal) values (?);";
1116             ps2 = conn.prepareStatement(query2);
1117             ps2.setShort(1, Short.MAX_VALUE);
1118             ps2.execute();
1119             st = conn.createStatement();
1120             st.execute("select * from type where IntVal=" + Short.MAX_VALUE);
1121             ResultSet rs = st.getResultSet();
1122             assertEquals(1, getCount(rs));
1123         } finally {
1124             try {
1125 
1126                 ps.close();
1127                 ps1.close();
1128                 ps2.close();
1129             } catch (Exception ee) {
1130             }
1131         }
1132     }
1133 
1134     // exception test fails
testSetBoolean()1135     public void testSetBoolean() throws SQLException {
1136         PreparedStatement ps = null;
1137         PreparedStatement ps1 = null;
1138         try {
1139             String query = "insert into type (BoolVal) values (?);";
1140             ps = conn.prepareStatement(query);
1141             Statement st = null;
1142             try {
1143                 ps.setBoolean(1, false);
1144                 ps.execute();
1145                 st = conn.createStatement();
1146                 st.execute("select * from type where BoolVal = 0");
1147                 ResultSet rs = st.getResultSet();
1148                 assertEquals(1, getCount(rs));
1149             } finally {
1150                 try {
1151                     st.close();
1152                 } catch (Exception ee) {
1153                 }
1154             }
1155 
1156             try {
1157                 ps.setBoolean(1, true);
1158                 ps.execute();
1159                 st = conn.createStatement();
1160                 st.execute("select * from type where BoolVal= 1");
1161                 ResultSet rs = st.getResultSet();
1162                 assertEquals(2, getCount(rs));
1163             } finally {
1164                 try {
1165                     st.close();
1166                 } catch (Exception ee) {
1167                 }
1168             }
1169 
1170             ps.close();
1171 
1172             try {
1173                 ps.setBoolean(1, false);
1174                 fail("SQLException is not thrown");
1175             } catch (SQLException sqle) {
1176                 // expected
1177             }
1178 
1179             String query1 = "insert into type (Tint) values (?);";
1180             ps1 = conn.prepareStatement(query1);
1181             ps1.setBoolean(1, true);
1182             ps1.execute();
1183         } finally {
1184             try {
1185 
1186                 ps.close();
1187                 ps1.close();
1188             } catch (Exception ee) {
1189             }
1190         }
1191     }
1192 
1193     // exception test fails
testSetByte()1194     public void testSetByte() throws SQLException {
1195         PreparedStatement ps = null;
1196         PreparedStatement ps1 = null;
1197         try {
1198             String query = "insert into type (Tint) values (?);";
1199             ps = conn.prepareStatement(query);
1200             Statement st = null;
1201             try {
1202                 ps.setByte(1, Byte.MAX_VALUE);
1203                 ps.execute();
1204                 st = conn.createStatement();
1205                 st.execute("select * from type where Tint=" + Byte.MAX_VALUE);
1206                 ResultSet rs = st.getResultSet();
1207                 assertEquals(1, getCount(rs));
1208             } finally {
1209                 try {
1210                     st.close();
1211                 } catch (SQLException ee) {
1212                 }
1213             }
1214 
1215             try {
1216                 ps.setByte(1, Byte.MIN_VALUE);
1217                 ps.execute();
1218                 st = conn.createStatement();
1219                 st.execute("select * from type where Tint=" + Byte.MIN_VALUE);
1220                 ResultSet rs = st.getResultSet();
1221                 assertEquals(1, getCount(rs));
1222             } finally {
1223                 try {
1224                     st.close();
1225                 } catch (SQLException ee) {
1226                 }
1227             }
1228 
1229             try {
1230                 ps.setByte(2, Byte.MAX_VALUE);
1231                 fail("SQLException is not thrown");
1232             } catch (Exception sqle) {
1233                 // expected
1234             }
1235 
1236             ps.close();
1237 
1238             try {
1239                 ps.setByte(1, Byte.MIN_VALUE);
1240                 fail("SQLException is not thrown");
1241             } catch (SQLException sqle) {
1242                 // expected
1243             }
1244 
1245             String query1 = "insert into type (IntVal) values (?);";
1246             ps1 = conn.prepareStatement(query1);
1247             ps1.setByte(1, Byte.MAX_VALUE);
1248             ps1.execute();
1249         } finally {
1250             try {
1251 
1252                 ps.close();
1253                 ps1.close();
1254             } catch (Exception ee) {
1255             }
1256         }
1257     }
1258 
1259     // preparedStatement.execute() does not return false on update.
testSetBytes()1260     public void testSetBytes() throws SQLException {
1261         byte[] bytesArray = {1, 0};
1262         PreparedStatement ps = null;
1263         PreparedStatement ps1 = null;
1264         try {
1265             String query = "insert into type (LBlob) values (?);";
1266             ps = conn.prepareStatement(query);
1267 
1268             try {
1269                 ps.setBytes(1, bytesArray);
1270                 assertFalse(ps.execute());
1271                 assertTrue(ps.getUpdateCount() > 0);
1272             } catch (SQLException sqle) {
1273                 fail("SQLException is thrown: " + sqle.getMessage());
1274             }
1275 
1276             try {
1277                 ps.setBytes(2, bytesArray);
1278                 fail("SQLException is not thrown");
1279             } catch (Exception sqle) {
1280                 // expected RuntimeException or SQLException
1281             }
1282 
1283             ps.close();
1284 
1285             try {
1286                 ps.setBytes(1, bytesArray);
1287                 fail("SQLException is not thrown");
1288             } catch (SQLException sqle) {
1289                 // expected
1290             }
1291             String query1 = "insert into type (TBlob) values (?);";
1292             ps1 = conn.prepareStatement(query1);
1293 
1294             ps.setBytes(1, bytesArray);
1295             assertFalse(ps.execute());
1296             assertTrue(ps.getUpdateCount() > 0);
1297         } finally {
1298             try {
1299 
1300                 if (ps != null) ps.close();
1301                 if (ps1 != null) ps1.close();
1302             } catch (Exception ee) {
1303             }
1304         }
1305     }
1306 
1307     // preparedStatement.execute() does not return false on update.
testSetBigDecimal()1308     public void testSetBigDecimal() throws SQLException {
1309         BigDecimal bd = new BigDecimal("50");
1310         PreparedStatement ps = null;
1311         PreparedStatement ps1 = null;
1312         try {
1313             String query = "insert into type (DecVal) values (?);";
1314             ps = conn.prepareStatement(query);
1315             Statement st = null;
1316             ps.setBigDecimal(1, bd);
1317             assertFalse(ps.execute());
1318             assertTrue(ps.getUpdateCount() > 0);
1319 
1320             try {
1321                 ps.setBigDecimal(2, bd);
1322                 fail("SQLException is not thrown");
1323             } catch (SQLException sqle) {
1324                 // expected
1325                 assertEquals("bad parameter index", sqle.getMessage());
1326             }
1327 
1328             try {
1329                 ps.setBigDecimal(-2, bd);
1330                 fail("SQLException is not thrown");
1331             } catch (SQLException sqle) {
1332                 // expected
1333                 assertEquals("bad parameter index", sqle.getMessage());
1334             }
1335             String query1 = "insert into type (Tint) values (?);";
1336             ps1 = conn.prepareStatement(query1);
1337 
1338             ps1.setBigDecimal(1, bd);
1339         } finally {
1340             try {
1341                 if (ps != null) ps.close();
1342                 if (ps1 != null) ps1.close();
1343             } catch (SQLException ee) {
1344             }
1345         }
1346     }
1347 
1348     /**
1349      * preparedStatement.execute() does not return false on update. Setting a
1350      * data for a declared INTEGER should throw Exception
1351      */
testSetDate_int_Date()1352     public void testSetDate_int_Date() throws SQLException {
1353         Calendar cal = new GregorianCalendar(1799, 5, 26);
1354         Date[] dates = {
1355                 new Date(cal.getTimeInMillis()), new Date(Integer.MAX_VALUE),
1356                 new Date(123456789)};
1357 
1358         PreparedStatement ps = null;
1359         PreparedStatement ps1 = null;
1360         try {
1361             String query = "insert into type (dateVal) values (?);";
1362             ps = conn.prepareStatement(query);
1363 
1364             for (int i = 0; i < dates.length; i++) {
1365                 ps.setDate(1, dates[i]);
1366                 assertFalse(ps.execute());
1367                 assertTrue(ps.getUpdateCount() > 0);
1368             }
1369 
1370             try {
1371                 ps.setDate(2, dates[0]);
1372                 fail("SQLException is not thrown");
1373             } catch (Exception sqle) {
1374                 // expected
1375             }
1376 
1377             ps.close();
1378 
1379             try {
1380                 ps.setDate(1, dates[0]);
1381                 fail("SQLException is not thrown");
1382             } catch (SQLException sqle) {
1383                 // expected
1384             }
1385 
1386             String query1 = "insert into type (Tint) values (?);";
1387             ps1 = conn.prepareStatement(query1);
1388 
1389             try {
1390                 ps1.setDate(1, dates[0]);
1391                 fail("SQLException is not thrown");
1392             } catch (SQLException sqle) {
1393                 // expected
1394                 assertEquals("SQLite.Exception: error in prepare", sqle
1395                         .getMessage());
1396             }
1397         } finally {
1398             try {
1399                 if (ps != null) ps.close();
1400                 if (ps1 != null) ps1.close();
1401             } catch (SQLException ee) {
1402             }
1403         }
1404     }
1405 
1406     // preparedStatement.execute() does not return false on update.
testSetDate_int_Date_Calendar()1407     public void testSetDate_int_Date_Calendar() throws SQLException {
1408         Calendar[] cals = { Calendar.getInstance(),
1409                 Calendar.getInstance(Locale.GERMANY),
1410                 Calendar.getInstance(TimeZone.getDefault()) };
1411         Calendar cal = new GregorianCalendar(1799,5,26);
1412 
1413         Date[] dates = { new Date(cal.getTimeInMillis()), new Date(Integer.MAX_VALUE),
1414                 new Date(123456789) };
1415 
1416         PreparedStatement ps = null;
1417         PreparedStatement ps1 = null;
1418         try {
1419             String query = "insert into type (dateVal) values (?);";
1420             ps = conn.prepareStatement(query);
1421 
1422             for (int i = 0; i < dates.length; i++) {
1423                 ps.setDate(1, dates[i], cals[i]);
1424                 assertFalse(ps.execute());
1425                 assertTrue(ps.getUpdateCount() > 0);
1426             }
1427 
1428             try {
1429                 ps.setDate(2, dates[0], cals[0]);
1430                 ps.execute();
1431                 fail("SQLException is not thrown");
1432             } catch (Exception sqle) {
1433                 // expected
1434             }
1435 
1436             ps.close();
1437 
1438             try {
1439                 ps.setDate(1, dates[0], cals[1]);
1440                 fail("SQLException is not thrown");
1441             } catch (Exception sqle) {
1442                 // expected
1443             }
1444             String query1 = "insert into type (Tint) values (?);";
1445             ps1 = conn.prepareStatement(query1);
1446 
1447             ps1.setDate(1, dates[0], cals[2]);
1448             ps1.execute();
1449         } finally {
1450             try {
1451                 if (ps != null) ps.close();
1452                 if (ps1 != null) ps1.close();
1453             } catch (SQLException ee) {
1454             }
1455         }
1456     }
1457 
1458     /**
1459      * This test doesn't pass on RI
1460      */
testSetNull_int_int()1461     public void testSetNull_int_int() throws SQLException {
1462         PreparedStatement ps = null;
1463         try {
1464             String query = "insert into type (BoolVal, IntVal) values ('true', ?);";
1465             ps = conn.prepareStatement(query);
1466             Statement st = null;
1467             try {
1468                 ps.setNull(1, Types.INTEGER);
1469                 ps.execute();
1470             } finally {
1471                 try {
1472                     ps.close();
1473                 } catch (Exception ee) {
1474                 }
1475             }
1476 
1477             query = "insert into type (BoolVal, LongVal) values ('true', ?);";
1478             ps = conn.prepareStatement(query);
1479 
1480             try {
1481                 ps.setNull(1, Types.BIGINT);
1482                 ps.execute();
1483             } finally {
1484                 try {
1485                     ps.close();
1486                 } catch (Exception ee) {
1487                 }
1488             }
1489 
1490             query = "insert into type (BoolVal, DecVal) values ('true', ?)";
1491             ps = conn.prepareStatement(query);
1492 
1493             try {
1494                 ps.setNull(1, Types.DECIMAL);
1495                 ps.execute();
1496             } finally {
1497                 try {
1498                     ps.close();
1499                 } catch (Exception ee) {
1500                 }
1501             }
1502 
1503             query = "insert into type (BoolVal, dateVal) values ('true', ?);";
1504             ps = conn.prepareStatement(query);
1505 
1506             try {
1507                 ps.setNull(1, Types.DATE);
1508                 ps.execute();
1509             } finally {
1510                 try {
1511                     ps.close();
1512                 } catch (Exception ee) {
1513                 }
1514             }
1515 
1516             query = "insert into type (BoolVal, BlobVal) values ('true', ?);";
1517             ps = conn.prepareStatement(query);
1518 
1519             try {
1520                 ps.setNull(1, Types.BLOB);
1521                 ps.execute();
1522             } finally {
1523                 try {
1524                     ps.close();
1525                 } catch (Exception ee) {
1526                 }
1527             }
1528 
1529             query = "insert into type (BoolVal, TextVal) values ('true', ?);";
1530             ps = conn.prepareStatement(query);
1531             ps.setNull(1, Types.CHAR);
1532             ps.execute();
1533         } finally {
1534             try {
1535                 ps.close();
1536             } catch (Exception ee) {
1537             }
1538         }
1539     }
1540 
1541     /**
1542      * UDTs and Ref types not supported in SQLite v 3
1543      */
testSetNullIntintString()1544     public void testSetNullIntintString() throws SQLException {
1545         // test UDT
1546         String typeCreationStmtUDT = "CREATE TYPE addressType AS "
1547                 + "( street INTEGER, zip TEXT);";
1548         String personTableCreateUDT = "CREATE TABLE person (name TEXT, address addressType);";
1549         Statement st = null;
1550         PreparedStatement ps = null;
1551         try {
1552             st = conn.createStatement();
1553             st.execute(typeCreationStmtUDT);
1554             st.execute(personTableCreateUDT);
1555             fail("UDTs and Ref Types not supported");
1556             String query = "insert into person (name, address) values ('Hans', ?);";
1557             ps = conn.prepareStatement(query);
1558             try {
1559                 ps.setNull(1, Types.DATALINK);
1560                 ps.execute();
1561             } catch (SQLException sqle) {
1562                 fail("SQLException is thrown: " + sqle.getMessage());
1563                 sqle.printStackTrace();
1564             } finally {
1565                 try {
1566                     st.close();
1567                 } catch (Exception ee) {
1568                 }
1569             }
1570         } catch (SQLException e) {
1571             // UDTs or Ref types not supported
1572             // ok
1573         } finally {
1574             try {
1575                 st.execute("drop table if exists person");
1576                 ps.close();
1577             } catch (Exception ee) {
1578             }
1579         }
1580 
1581         // test non UDT REF type Exception checking
1582         String personTableCreate = "create table person (name TEXT, Address TEXT)";
1583         try {
1584             st = conn.createStatement();
1585             st.execute(personTableCreate);
1586             String insert
1587                     = "insert into person (name, address) values (?, '1600 Amphitheatre Mountain View');";
1588             ps = conn.prepareStatement(insert);
1589             try {
1590                 ps.setNull(1, 1, "");
1591                 ps.execute();
1592             } catch (SQLException sqle) {
1593                 assertEquals("SQLite.Exception: error in step", sqle.getMessage());
1594             } finally {
1595                 try {
1596                     st.close();
1597                 } catch (Exception ee) {
1598                 }
1599             }
1600         } finally {
1601             try {
1602                 st.execute("drop table if exists person");
1603                 ps.close();
1604             } catch (Exception ee) {
1605             }
1606         }
1607 
1608         // test non UDT REF type OK
1609 
1610         personTableCreate = "create table person (name TEXT, Address TEXT)";
1611         try {
1612             st = conn.createStatement();
1613             st.execute("drop table if exists person");
1614             st.execute(personTableCreate);
1615             String insert
1616                     = "insert into person (name, address) values (?, '1600 Amphitheatre Mountain View');";
1617             ps = conn.prepareStatement(insert);
1618             try {
1619                 ps.setNull(1, 1, "");
1620                 ps.execute();
1621             } finally {
1622                 try {
1623                     st.close();
1624                 } catch (Exception ee) {
1625                 }
1626             }
1627         } finally {
1628             try {
1629                 st.execute("drop table if exists person");
1630                 ps.close();
1631             } catch (Exception ee) {
1632             }
1633         }
1634     }
1635 
1636     // exception test fails
testSetObject_int_Object()1637     public void testSetObject_int_Object() throws SQLException {
1638         PreparedStatement ps = null;
1639         try {
1640             String query = "insert into type (IntVal) values (?);";
1641             ps = conn.prepareStatement(query);
1642             Statement st = null;
1643             try {
1644                 ps.setObject(1, Integer.MAX_VALUE);
1645                 ps.execute();
1646                 st = conn.createStatement();
1647                 st.execute("select * from type where IntVal="
1648                         + Integer.MAX_VALUE);
1649                 ResultSet rs = st.getResultSet();
1650                 assertEquals(1, getCount(rs));
1651             } finally {
1652                 try {
1653                     st.close();
1654                 } catch (Exception ee) {
1655                 }
1656             }
1657 
1658             query = "insert into type (LongVal) values (?);";
1659             ps = conn.prepareStatement(query);
1660 
1661             try {
1662                 ps.setObject(1, "test text");
1663                 ps.execute();
1664                 st = conn.createStatement();
1665                 st.execute("select * from type where LongVal='test text';");
1666                 ResultSet rs = st.getResultSet();
1667                 assertEquals(1, getCount(rs));
1668             } finally {
1669                 try {
1670                     st.close();
1671                 } catch (SQLException ee) {
1672                 }
1673             }
1674 
1675             query = "insert into type (DecVal) values (?);";
1676             ps = conn.prepareStatement(query);
1677 
1678             try {
1679                 ps.setObject(1, new Object());
1680                 ps.execute();
1681             } catch (SQLException sqle) {
1682                 fail("SQLException is thrown");
1683             }
1684 
1685             query = "insert into type (dateVal) values (?);";
1686             ps = conn.prepareStatement(query);
1687             Date d = new Date(123456789);
1688 
1689             try {
1690                 ps.setObject(1, d);
1691                 ps.execute();
1692                 st = conn.createStatement();
1693                 st.execute("select * from type where dateVal='"
1694                         + d.getTime() + "';");
1695                 ResultSet rs = st.getResultSet();
1696                 assertEquals(1, getCount(rs));
1697             } finally {
1698                 try {
1699                     st.close();
1700                 } catch (Exception ee) {
1701                 }
1702             }
1703 
1704             // this sub test doesn't pass on RI
1705             query = "insert into type (BlobVal) values (?);";
1706             ps = conn.prepareStatement(query);
1707 
1708             try {
1709                 ps.setObject(1, null);
1710                 ps.execute();
1711             } finally {
1712                 try {
1713                     st.close();
1714                 } catch (SQLException ee) {
1715                 }
1716             }
1717 
1718         } finally {
1719             try {
1720                 ps.close();
1721             } catch (Exception ee) {
1722             }
1723         }
1724         try {
1725             ps.setObject(1, "test text");
1726             fail("Exception not thrown");
1727         } catch (SQLException e) {
1728             // ok
1729         }
1730 
1731     }
1732 
1733      /**
1734       * This test doesn't pass on RI
1735       */
testSetObject_int_Object_int()1736     public void testSetObject_int_Object_int() throws SQLException {
1737         PreparedStatement ps = null;
1738         try {
1739             String query = "insert into type (IntVal) values (?);";
1740             ps = conn.prepareStatement(query);
1741             Statement st = null;
1742             try {
1743                 ps.setObject(1, Integer.MAX_VALUE, Types.INTEGER);
1744                 ps.execute();
1745                 st = conn.createStatement();
1746                 st.execute("select * from type where IntVal="
1747                         + Integer.MAX_VALUE);
1748                 ResultSet rs = st.getResultSet();
1749                 assertEquals(1, getCount(rs));
1750             } finally {
1751                 try {
1752                     st.close();
1753                 } catch (Exception ee) {
1754                 }
1755             }
1756 
1757             query = "insert into type (LongVal) values (?);";
1758             ps = conn.prepareStatement(query);
1759 
1760             try {
1761                 ps.setObject(1, "test text", Types.CHAR);
1762                 ps.execute();
1763                 st = conn.createStatement();
1764                 st.execute("select * from type where LongVal='test text';");
1765                 ResultSet rs = st.getResultSet();
1766                 assertEquals(1, getCount(rs));
1767             } finally {
1768                 try {
1769                     st.close();
1770                 } catch (Exception ee) {
1771                 }
1772             }
1773 
1774             query = "insert into type (DecVal) values (?);";
1775             ps = conn.prepareStatement(query);
1776             ps.setObject(1, new Object(), Types.DECIMAL);
1777             ps.execute();
1778 
1779             query = "insert into type (dateVal) values (?);";
1780             ps = conn.prepareStatement(query);
1781             Date d = new Date(123456789);
1782 
1783             try {
1784                 ps.setObject(1, d, Types.DATE);
1785                 ps.execute();
1786                 st = conn.createStatement();
1787                 st.execute("select * from type where dateVal='"
1788                         + d.getTime() + "';");
1789                 ResultSet rs = st.getResultSet();
1790                 assertEquals(1, getCount(rs));
1791             } finally {
1792                 try {
1793                     st.close();
1794                 } catch (Exception ee) {
1795                 }
1796             }
1797 
1798             // this sub test doesn't pass on RI
1799             query = "insert into type (BlobVal) values (?);";
1800             ps = conn.prepareStatement(query);
1801 
1802             try {
1803                 ps.setObject(1, "", Types.BLOB);
1804                 ps.execute();
1805             } finally {
1806                 try {
1807                     st.close();
1808                 } catch (Exception ee) {
1809                 }
1810             }
1811         } finally {
1812             try {
1813                 ps.close();
1814             } catch (Exception ee) {
1815             }
1816         }
1817 
1818         try {
1819             ps.setObject(1, Integer.MAX_VALUE, Types.INTEGER);
1820             fail("Exception not thrown");
1821         } catch (SQLException e) {
1822             // ok
1823         }
1824     }
1825 
1826     /**
1827      * This test doesn't pass on RI; Fails for Types.DATE
1828      */
testSetObject_int_Object_int_int()1829     public void testSetObject_int_Object_int_int() throws SQLException {
1830         PreparedStatement ps = null;
1831         try {
1832             String query = "insert into type (IntVal) values (?);";
1833             ps = conn.prepareStatement(query);
1834             Statement st = null;
1835             try {
1836                 ps.setObject(1, Integer.MAX_VALUE, Types.INTEGER,
1837                         Integer.MAX_VALUE);
1838                 ps.execute();
1839                 st = conn.createStatement();
1840                 st.execute("select * from type where IntVal="
1841                         + Integer.MAX_VALUE);
1842                 ResultSet rs = st.getResultSet();
1843                 assertEquals(1, getCount(rs));
1844             } finally {
1845                 try {
1846                     st.close();
1847                 } catch (Exception ee) {
1848                 }
1849             }
1850 
1851             query = "insert into type (LongVal) values (?);";
1852             ps = conn.prepareStatement(query);
1853 
1854             try {
1855                 ps.setObject(1, "test text", Types.CHAR, Integer.MIN_VALUE);
1856                 ps.execute();
1857                 st = conn.createStatement();
1858                 st.execute("select * from type where LongVal='test text';");
1859                 ResultSet rs = st.getResultSet();
1860                 assertEquals(1, getCount(rs));
1861             } finally {
1862                 try {
1863                     st.close();
1864                 } catch (Exception ee) {
1865                 }
1866             }
1867 
1868             query = "insert into type (DecVal) values (?);";
1869             ps = conn.prepareStatement(query);
1870             BigDecimal bd2 = new BigDecimal("12.21");
1871             ps.setObject(1, bd2, Types.DECIMAL, 2);
1872             ps.execute();
1873 
1874             query = "insert into type (dateVal) values (?);";
1875             ps = conn.prepareStatement(query);
1876             Date d = new Date(123456789);
1877             try {
1878                 ps.setObject(1, d , Types.DATE, -1);
1879                 ps.execute();
1880                 st = conn.createStatement();
1881                 st.execute("select * from type where dateVal='"
1882                         + d.getTime() + "';");
1883                 ResultSet rs = st.getResultSet();
1884                 assertEquals(1, getCount(rs));
1885             } finally {
1886                 try {
1887                     st.close();
1888                 } catch (Exception ee) {
1889                 }
1890             }
1891 
1892             // this sub test doesn't pass on RI
1893             query = "insert into type(BlobVal) values (?);";
1894             ps = conn.prepareStatement(query);
1895 
1896             try {
1897                 ps.setObject(1, "", Types.BLOB, 0);
1898                 ps.execute();
1899             } finally {
1900                 try {
1901                     st.close();
1902                 } catch (Exception ee) {
1903                 }
1904             }
1905         } finally {
1906             try {
1907                 ps.close();
1908             } catch (Exception ee) {
1909             }
1910         }
1911 
1912         try {
1913             ps.setObject(1, "test text", Types.CHAR, Integer.MIN_VALUE);
1914             fail("Exception not thrown");
1915         } catch (SQLException e) {
1916             // ok
1917         }
1918     }
1919 
1920     // statement.close() does not wrap up
testSetTimeint_Time()1921     public void testSetTimeint_Time() throws SQLException {
1922         Time[] times = { new Time(24, 25, 26), new Time(Integer.MAX_VALUE),
1923                 new Time(123456789) };
1924 
1925         PreparedStatement ps = null;
1926         PreparedStatement ps1 = null;
1927         try {
1928             String query = "insert into type (timeVal) values (?);";
1929             ps = conn.prepareStatement(query);
1930             Statement st = null;
1931             for (int i = 0; i < times.length; i++) {
1932                 try {
1933                     ps.setTime(1, times[i]);
1934                     ps.execute();
1935                     st = conn.createStatement();
1936                     st.execute("select * from type where timeVal='"
1937                             + times[i].getTime() + "'");
1938                     ResultSet rs = st.getResultSet();
1939                     assertEquals(1, getCount(rs));
1940                 } finally {
1941                     try {
1942                         st.close();
1943                     } catch (Exception ee) {
1944                     }
1945                 }
1946             }
1947 
1948             try {
1949                 ps.setTime(2, times[0]);
1950                 fail("SQLException is not thrown");
1951             } catch (Exception sqle) {
1952                 // expected index out of bounds
1953             }
1954 
1955             ps.close();
1956 
1957             try {
1958                 ps.setTime(1, times[0]);
1959                 fail("SQLException is not thrown");
1960             } catch (SQLException sqle) {
1961                 // expected
1962             }
1963             String query1 = "insert into type (Tint) values (?)";
1964             ps1 = conn.prepareStatement(query1);
1965             ps1.setTime(1, times[0]);
1966             ps1.execute();
1967         } finally {
1968             try {
1969                 ps.close();
1970                 ps1.close();
1971             } catch (Exception ee) {
1972             }
1973         }
1974     }
1975 
1976     // preparedStatement.execute() does not return False on update.
testSetTime_int_Time_Calendar()1977     public void testSetTime_int_Time_Calendar() throws SQLException {
1978         Calendar[] cals = { Calendar.getInstance(),
1979                 Calendar.getInstance(Locale.GERMANY),
1980                 Calendar.getInstance(TimeZone.getDefault()) };
1981 
1982         Time[] times = { new Time(24, 25, 26), new Time(Integer.MAX_VALUE),
1983                 new Time(123456789) };
1984 
1985         PreparedStatement ps = null;
1986         PreparedStatement ps1 = null;
1987         try {
1988             String query = "insert into type (timeVal) values (?);";
1989             ps = conn.prepareStatement(query);
1990             Statement st = null;
1991             for (int i = 0; i < times.length; i++) {
1992                 try {
1993                     ps.setTime(1, times[i], cals[i]);
1994                     assertFalse(ps.execute());
1995                     assertTrue(ps.getUpdateCount() > 0);
1996                 } finally {
1997                     try {
1998                         st.close();
1999                     } catch (Exception ee) {
2000                     }
2001                 }
2002             }
2003 
2004             try {
2005                 ps.setTime(2, times[0], cals[0]);
2006                 fail("SQLException is not thrown");
2007             } catch (Exception sqle) {
2008                 // expected
2009             }
2010 
2011             ps.close();
2012 
2013             try {
2014                 ps.setTime(-2, times[0], cals[1]);
2015                 fail("SQLException is not thrown");
2016             } catch (Exception sqle) {
2017                 // expected
2018             }
2019             String query1 = "insert into type (Tint) values (?);";
2020             ps1 = conn.prepareStatement(query1);
2021             ps1.setTime(1, times[0], cals[2]);
2022             ps1.execute();
2023         } finally {
2024             try {
2025                 ps.close();
2026                 ps1.close();
2027             } catch (Exception ee) {
2028             }
2029         }
2030     }
2031 
2032     // preparedStatement.execute() does not return false on update.
testSetTimestamp_int_Timestamp()2033     public void testSetTimestamp_int_Timestamp() throws SQLException {
2034         Timestamp[] timestamps = { new Timestamp(2007, 10, 17, 19, 06, 50, 23),
2035                 new Timestamp(123) };
2036 
2037         PreparedStatement ps = null;
2038         PreparedStatement ps1 = null;
2039         try {
2040             String query = "insert into type (TS) values (?);";
2041             ps = conn.prepareStatement(query);
2042 
2043             for (int i = 0; i < timestamps.length; i++) {
2044                 ps.setTimestamp(1, timestamps[i]);
2045                 assertFalse(ps.execute());
2046                 assertTrue(ps.getUpdateCount() > 0);
2047             }
2048 
2049             try {
2050                 ps.setTimestamp(2, timestamps[0]);
2051                 fail("SQLException is not thrown");
2052             } catch (Exception sqle) {
2053                 // expected
2054             }
2055 
2056             try {
2057                 ps.setTimestamp(-2, timestamps[0]);
2058                 fail("SQLException is not thrown");
2059             } catch (Exception sqle) {
2060                 // expected
2061             }
2062             String query1 = "insert into type (Tint) values (?);";
2063             ps1 = conn.prepareStatement(query1);
2064             ps1.setTimestamp(1, timestamps[0]);
2065             ps1.execute();
2066         } finally {
2067             try {
2068                 ps.close();
2069                 ps1.close();
2070             } catch (Exception ee) {
2071             }
2072         }
2073     }
2074 
testSetBlob()2075     public void testSetBlob() {
2076         ResultSet res = null;
2077         PreparedStatement ps = null;
2078         Blob mock = new MockBlob();
2079         try {
2080             String neverExecutedQuery = "select TBlob from type;";
2081             ps = conn.prepareStatement(neverExecutedQuery);
2082             ps.setBlob(1,mock);
2083             fail("Exception expected not supported");
2084         } catch (SQLException e) {
2085             //ok
2086         }
2087     }
2088 
testSetClob()2089     public void testSetClob() {
2090         ResultSet res = null;
2091         PreparedStatement ps = null;
2092         Clob mock = new MockClob();
2093         try {
2094             String neverExecutedQuery = "select TBlob from type;";
2095             ps = conn.prepareStatement(neverExecutedQuery);
2096             ps.setClob(1,mock);
2097             fail("Exception expected not supported");
2098         } catch (SQLException e) {
2099             //ok
2100         }
2101     }
2102 
2103     // preparedStatement.execute() does not return false on update.
testSetTimestampIntTimestampCalendar()2104     public void testSetTimestampIntTimestampCalendar() throws SQLException {
2105         Calendar[] cals = { Calendar.getInstance(),
2106                 Calendar.getInstance(Locale.GERMANY),
2107                 Calendar.getInstance(TimeZone.getDefault()) };
2108 
2109         Timestamp[] timestamps = { new Timestamp(2007, 10, 17, 19, 06, 50, 23),
2110                 new Timestamp(123) };
2111 
2112         PreparedStatement ps = null;
2113         PreparedStatement ps1 = null;
2114         try {
2115             String query = "insert into type (timeVal) values (?);";
2116             ps = conn.prepareStatement(query);
2117             Statement st = null;
2118             for (int i = 0; i < timestamps.length; i++) {
2119                 try {
2120                     ps.setTimestamp(1, timestamps[i], cals[i]);
2121                     assertFalse(ps.execute());
2122                     assertTrue(ps.getUpdateCount() > 0);
2123                 } finally {
2124                     try {
2125                         st.close();
2126                     } catch (Exception ee) {
2127                     }
2128                 }
2129             }
2130 
2131             try {
2132                 ps.setTimestamp(2, timestamps[0], cals[0]);
2133                 ps.execute();
2134                 fail("SQLException is not thrown");
2135             } catch (Exception sqle) {
2136                 // expected
2137             }
2138             ps.close();
2139             try {
2140                 ps.setTimestamp(1, timestamps[0], cals[1]);
2141                 ps.execute();
2142                 fail("SQLException is not thrown");
2143             } catch (SQLException sqle) {
2144                 // expected
2145             }
2146             String query1 = "insert into type (Tint) values (?);";
2147             ps1 = conn.prepareStatement(query1);
2148             ps1.setTimestamp(1, timestamps[0], cals[2]);
2149             ps1.execute();
2150         } finally {
2151             try {
2152                 ps.close();
2153                 ps1.close();
2154             } catch (Exception ee) {
2155             }
2156         }
2157     }
2158 
testSetURL()2159     public void testSetURL() {
2160         ResultSet res = null;
2161         PreparedStatement ps = null;
2162         try {
2163             String query = "insert into type (TText) values (?);";
2164             ps = conn.prepareStatement(query);
2165             ps.setURL(1, new URL("http://www.android.com"));
2166             fail("Exception expected not supported");
2167         } catch (SQLException e) {
2168            //ok
2169         } catch (Exception e) {
2170             fail("Error in test setup "+e.getMessage());
2171             e.printStackTrace();
2172         }
2173 
2174     }
2175 
testSetArray()2176     public void testSetArray() {
2177         ResultSet res = null;
2178         PreparedStatement ps = null;
2179         Array a = new MockArray();
2180         try {
2181             String query = "insert into type (TText) values (?);";
2182             ps = conn.prepareStatement(query);
2183             ps.setArray(1, new MockArray());
2184             fail("Exception expected not supported");
2185         } catch (SQLException e) {
2186             //ok
2187         } catch (Exception e) {
2188             fail("Error in test setup "+e.getMessage());
2189             e.printStackTrace();
2190         }
2191 
2192     }
2193 
testSetRef()2194     public void testSetRef() {
2195         ResultSet res = null;
2196         PreparedStatement ps = null;
2197         Ref mock = new MockRef();
2198         try {
2199             String neverExecutedQuery = "select TBlob from type;";
2200             ps = conn.prepareStatement(neverExecutedQuery);
2201             ps.setRef(1,mock);
2202             fail("Exception expected not supported");
2203         } catch (SQLException e) {
2204             //ok
2205         }
2206 
2207     }
2208 
testSetUnicodestream()2209     public void testSetUnicodestream() {
2210         ResultSet res = null;
2211         PreparedStatement ps = null;
2212         try {
2213             String query = "insert into type (TText) values (?);";
2214             ps = conn.prepareStatement(query);
2215             InputStream file = Class.forName(this.getClass().getName())
2216             .getResourceAsStream("/blob.c");
2217             ps.setUnicodeStream(0, file, 100);
2218             fail("Exception expected not supported");
2219         } catch (SQLException e) {
2220             //ok
2221         } catch (Exception e) {
2222             fail("Error in test setup "+e.getMessage());
2223             e.printStackTrace();
2224         }
2225     }
2226 
testSetCharacterSteam()2227     public void testSetCharacterSteam() throws SQLException {
2228         String query = "insert into type (TText) values (?);";
2229         PreparedStatement ps = conn.prepareStatement(query);
2230         InputStream file = OldPreparedStatementTest.class.getResourceAsStream("/blob.c");
2231         assertNotNull("Error in test setup: file not found",file);
2232         Reader reader = new InputStreamReader(file);
2233         ps.setCharacterStream(1, reader, 100);
2234     }
2235 
testSetAsciiStream()2236     public void testSetAsciiStream() {
2237         ResultSet res = null;
2238         try {
2239             String query = "insert into type (TText) values (?);";
2240             PreparedStatement ps = conn.prepareStatement(query);
2241             InputStream file = OldPreparedStatementTest.class.getResourceAsStream("/blob.c");
2242             ps.setAsciiStream(0, file, 100);
2243             fail("Exception expected not supported");
2244         } catch (SQLException e) {
2245             // ok
2246         } catch (Exception e) {
2247             fail("Error in test setup "+e.getMessage());
2248             e.printStackTrace();
2249         }
2250     }
2251 
testSetBinaryStream()2252     public void testSetBinaryStream() throws Exception {
2253         try {
2254             String query = "insert into type (TText) values (?);";
2255             PreparedStatement ps = conn.prepareStatement(query);
2256             InputStream file = OldPreparedStatementTest.class.getResourceAsStream("/blob.c");
2257             ps.setBinaryStream(0, file, 100);
2258             fail("Exception expected not supported");
2259         } catch (SQLException expected) {
2260         }
2261     }
2262 
2263     private class MockRef implements Ref {
getBaseTypeName()2264         public String getBaseTypeName() throws SQLException {
2265             return null;
2266         }
2267 
getObject()2268         public Object getObject() throws SQLException {
2269             return null;
2270         }
2271 
getObject(Map<String, Class<?>> map)2272         public Object getObject(Map<String, Class<?>> map) throws SQLException {
2273             return null;
2274         }
2275 
setObject(Object value)2276         public void setObject(Object value) throws SQLException {}
2277     }
2278 
2279     private class MockArray implements Array {
2280 
getArray()2281         public Object getArray() throws SQLException {
2282             return null;
2283         }
2284 
getArray(long index, int count)2285         public Object getArray(long index, int count) throws SQLException {
2286             return null;
2287         }
2288 
getArray(long index, int count, Map<String, Class<?>> map)2289         public Object getArray(long index, int count, Map<String, Class<?>> map)
2290                 throws SQLException {
2291             return null;
2292         }
2293 
getArray(Map<String, Class<?>> map)2294         public Object getArray(Map<String, Class<?>> map) throws SQLException {
2295             return null;
2296         }
2297 
getBaseType()2298         public int getBaseType() throws SQLException {
2299             return 0;
2300         }
2301 
getBaseTypeName()2302         public String getBaseTypeName() throws SQLException {
2303             return null;
2304         }
2305 
getResultSet()2306         public ResultSet getResultSet() throws SQLException {
2307             return null;
2308         }
2309 
getResultSet(long index, int count)2310         public ResultSet getResultSet(long index, int count)
2311                 throws SQLException {
2312             return null;
2313         }
2314 
getResultSet(long index, int count, Map<String, Class<?>> map)2315         public ResultSet getResultSet(long index, int count,
2316                 Map<String, Class<?>> map) throws SQLException {
2317             return null;
2318         }
2319 
getResultSet(Map<String, Class<?>> map)2320         public ResultSet getResultSet(Map<String, Class<?>> map)
2321                 throws SQLException {
2322             return null;
2323         }
2324 
free()2325         public void free() throws SQLException {}
2326     }
2327 
2328     private class MockBlob implements Blob {
2329 
getBinaryStream()2330         public InputStream getBinaryStream() throws SQLException {
2331             return null;
2332         }
2333 
getBytes(long pos, int length)2334         public byte[] getBytes(long pos, int length) throws SQLException {
2335             return null;
2336         }
2337 
length()2338         public long length() throws SQLException {
2339             return 0;
2340         }
2341 
position(Blob pattern, long start)2342         public long position(Blob pattern, long start) throws SQLException {
2343             return 0;
2344         }
2345 
position(byte[] pattern, long start)2346         public long position(byte[] pattern, long start) throws SQLException {
2347             return 0;
2348         }
2349 
setBinaryStream(long pos)2350         public OutputStream setBinaryStream(long pos) throws SQLException {
2351             return null;
2352         }
2353 
setBytes(long pos, byte[] theBytes)2354         public int setBytes(long pos, byte[] theBytes) throws SQLException {
2355             return 0;
2356         }
2357 
setBytes(long pos, byte[] theBytes, int offset, int len)2358         public int setBytes(long pos, byte[] theBytes, int offset, int len)
2359                 throws SQLException {
2360             return 0;
2361         }
2362 
truncate(long len)2363         public void truncate(long len) throws SQLException {
2364 
2365         }
2366 
free()2367         public void free() throws SQLException {}
2368 
getBinaryStream(long pos, long length)2369         public InputStream getBinaryStream(long pos, long length) throws SQLException {
2370             return null;
2371         }
2372     }
2373 
2374     private class MockClob implements Clob {
2375 
getAsciiStream()2376         public InputStream getAsciiStream() throws SQLException {
2377             return null;
2378         }
2379 
getCharacterStream()2380         public Reader getCharacterStream() throws SQLException {
2381             return null;
2382         }
2383 
getSubString(long pos, int length)2384         public String getSubString(long pos, int length) throws SQLException {
2385             return null;
2386         }
2387 
length()2388         public long length() throws SQLException {
2389             return 0;
2390         }
2391 
position(Clob searchstr, long start)2392         public long position(Clob searchstr, long start) throws SQLException {
2393             return 0;
2394         }
2395 
position(String searchstr, long start)2396         public long position(String searchstr, long start) throws SQLException {
2397             return 0;
2398         }
2399 
setAsciiStream(long pos)2400         public OutputStream setAsciiStream(long pos) throws SQLException {
2401             return null;
2402         }
2403 
setCharacterStream(long pos)2404         public Writer setCharacterStream(long pos) throws SQLException {
2405             return null;
2406         }
2407 
setString(long pos, String str)2408         public int setString(long pos, String str) throws SQLException {
2409             return 0;
2410         }
2411 
setString(long pos, String str, int offset, int len)2412         public int setString(long pos, String str, int offset, int len)
2413                 throws SQLException {
2414             return 0;
2415         }
2416 
truncate(long len)2417         public void truncate(long len) throws SQLException {}
2418 
free()2419         public void free() throws SQLException {}
2420 
getCharacterStream(long pos, long length)2421         public Reader getCharacterStream(long pos, long length) throws SQLException {
2422             return null;
2423         }
2424     }
2425 }
2426