/luni/src/test/java/tests/java/sql/InsertFunctionalityTest.java

https://bitbucket.org/aways/android_libcore · Java · 225 lines · 161 code · 18 blank · 46 comment · 12 complexity · 8ac2dc959442a494676200b0ba144e8b MD5 · raw file

  1. /*
  2. * Copyright (C) 2007 The Android Open Source Project
  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. package tests.java.sql;
  17. import java.sql.Connection;
  18. import java.sql.DatabaseMetaData;
  19. import java.sql.PreparedStatement;
  20. import java.sql.ResultSet;
  21. import java.sql.SQLException;
  22. import java.sql.Statement;
  23. import tests.support.Support_SQL;
  24. import tests.support.DatabaseCreator;
  25. import junit.extensions.TestSetup;
  26. import junit.framework.Test;
  27. import junit.framework.TestCase;
  28. import junit.framework.TestSuite;
  29. public class InsertFunctionalityTest extends TestCase {
  30. private static Connection conn = null;
  31. private static Statement statement = null;
  32. public void setUp() throws Exception {
  33. super.setUp();
  34. Support_SQL.loadDriver();
  35. conn = Support_SQL.getConnection();
  36. statement = conn.createStatement();
  37. createTestTables();
  38. }
  39. public void tearDown() throws Exception {
  40. deleteTestTables();
  41. statement.close();
  42. conn.close();
  43. super.tearDown();
  44. }
  45. public void createTestTables() {
  46. try {
  47. DatabaseMetaData meta = conn.getMetaData();
  48. ResultSet userTab = meta.getTables(null, null, null, null);
  49. while (userTab.next()) {
  50. String tableName = userTab.getString("TABLE_NAME");
  51. if (tableName.equals(DatabaseCreator.PARENT_TABLE)) {
  52. statement
  53. .execute(DatabaseCreator.DROP_TABLE_PARENT);
  54. } else if (tableName
  55. .equals(DatabaseCreator.FKCASCADE_TABLE)) {
  56. statement
  57. .execute(DatabaseCreator.DROP_TABLE_FKCASCADE);
  58. } else if (tableName
  59. .equals(DatabaseCreator.FKSTRICT_TABLE)) {
  60. statement
  61. .execute(DatabaseCreator.DROP_TABLE_FKSTRICT);
  62. } else if (tableName
  63. .equals(DatabaseCreator.SIMPLE_TABLE1)) {
  64. statement
  65. .execute(DatabaseCreator.DROP_TABLE_SIMPLE1);
  66. } else if (tableName
  67. .equals(DatabaseCreator.SIMPLE_TABLE2)) {
  68. statement
  69. .execute(DatabaseCreator.DROP_TABLE_SIMPLE2);
  70. } else if (tableName
  71. .equals(DatabaseCreator.TEST_TABLE5)) {
  72. statement.execute(DatabaseCreator.DROP_TABLE5);
  73. }
  74. }
  75. userTab.close();
  76. statement.execute(DatabaseCreator.CREATE_TABLE_PARENT);
  77. statement.execute(DatabaseCreator.CREATE_TABLE_FKSTRICT);
  78. statement.execute(DatabaseCreator.CREATE_TABLE_FKCASCADE);
  79. statement.execute(DatabaseCreator.CREATE_TABLE_SIMPLE2);
  80. statement.execute(DatabaseCreator.CREATE_TABLE_SIMPLE1);
  81. statement.execute(DatabaseCreator.CREATE_TABLE5);
  82. } catch (SQLException e) {
  83. fail("Unexpected SQLException " + e.toString());
  84. }
  85. }
  86. public void deleteTestTables() {
  87. try {
  88. statement.execute(DatabaseCreator.DROP_TABLE_FKCASCADE);
  89. statement.execute(DatabaseCreator.DROP_TABLE_FKSTRICT);
  90. statement.execute(DatabaseCreator.DROP_TABLE_PARENT);
  91. statement.execute(DatabaseCreator.DROP_TABLE_SIMPLE2);
  92. statement.execute(DatabaseCreator.DROP_TABLE_SIMPLE1);
  93. statement.execute(DatabaseCreator.DROP_TABLE5);
  94. } catch (SQLException e) {
  95. fail("Unexpected SQLException " + e.toString());
  96. }
  97. }
  98. /**
  99. * InsertFunctionalityTest#testInsert1(). Attempts to insert row into
  100. * table with integrity checking
  101. */
  102. public void testInsert1() throws SQLException {
  103. DatabaseCreator.fillParentTable(conn);
  104. DatabaseCreator.fillFKStrictTable(conn);
  105. DatabaseCreator.fillFKCascadeTable(conn);
  106. statement.execute("INSERT INTO " + DatabaseCreator.FKSTRICT_TABLE
  107. + " VALUES(4, 1, 'testInsert')");
  108. statement.execute("INSERT INTO " + DatabaseCreator.FKCASCADE_TABLE
  109. + " VALUES(4, 1, 'testInsert')");
  110. }
  111. /**
  112. * InsertFunctionalityTest#testInsert2(). Attempts to insert row into
  113. * table with integrity checking when row has incorrect foreign key
  114. * value - expecting SQLException
  115. */
  116. public void testInsert2() throws SQLException {
  117. DatabaseCreator.fillParentTable(conn);
  118. DatabaseCreator.fillFKStrictTable(conn);
  119. DatabaseCreator.fillFKCascadeTable(conn);
  120. try {
  121. statement.execute("INSERT INTO " + DatabaseCreator.FKSTRICT_TABLE
  122. + " VALUES(4, 4, 'testInsert')");
  123. // TODO Foreign key functionality isn't supported
  124. // fail("expecting SQLException");
  125. } catch (SQLException ex) {
  126. // expected
  127. }
  128. try {
  129. statement.execute("INSERT INTO " + DatabaseCreator.FKCASCADE_TABLE
  130. + " VALUES(4, 4, 'testInsert')");
  131. // TODO Foreign key functionality isn't supported
  132. // fail("expecting SQLException");
  133. } catch (SQLException ex) {
  134. // expected
  135. }
  136. }
  137. /**
  138. * InsertFunctionalityTest#testInsert3(). Tests INSERT ... SELECT
  139. * functionality
  140. */
  141. public void testInsert3() throws SQLException {
  142. DatabaseCreator.fillParentTable(conn);
  143. DatabaseCreator.fillFKStrictTable(conn);
  144. statement.execute("INSERT INTO " + DatabaseCreator.TEST_TABLE5
  145. + " SELECT id AS testId, value AS testValue " + "FROM "
  146. + DatabaseCreator.FKSTRICT_TABLE + " WHERE name_id = 1");
  147. ResultSet r = statement.executeQuery("SELECT COUNT(*) FROM "
  148. + DatabaseCreator.TEST_TABLE5);
  149. r.next();
  150. assertEquals("Should be 2 rows", 2, r.getInt(1));
  151. r.close();
  152. }
  153. /**
  154. * InsertFunctionalityTest#testInsert4(). Tests INSERT ... SELECT
  155. * with expressions in SELECT query
  156. */
  157. public void testInsert4() throws SQLException {
  158. DatabaseCreator.fillSimpleTable1(conn);
  159. statement.execute("INSERT INTO " + DatabaseCreator.SIMPLE_TABLE2
  160. + " SELECT id, speed*10 AS speed, size-1 AS size FROM "
  161. + DatabaseCreator.SIMPLE_TABLE1);
  162. ResultSet r = statement.executeQuery("SELECT COUNT(*) FROM "
  163. + DatabaseCreator.SIMPLE_TABLE2 + " AS a JOIN "
  164. + DatabaseCreator.SIMPLE_TABLE1
  165. + " AS b ON a.speed = 10*b.speed AND a.size = b.size-1");
  166. r.next();
  167. assertEquals("Should be 2 rows", 2, r.getInt(1));
  168. r.close();
  169. }
  170. /**
  171. * InsertFunctionalityTest#testInsert5(). Inserts multiple rows using
  172. * UNION ALL
  173. */
  174. public void testInsert5() throws SQLException {
  175. statement.execute("INSERT INTO " + DatabaseCreator.TEST_TABLE5
  176. + " SELECT 1 as testId, 2 as testValue "
  177. + "UNION SELECT 2 as testId, 3 as testValue "
  178. + "UNION SELECT 3 as testId, 4 as testValue");
  179. ResultSet r = statement.executeQuery("SELECT COUNT(*) FROM "
  180. + DatabaseCreator.TEST_TABLE5);
  181. r.next();
  182. assertEquals("Should be 3 rows", 3, r.getInt(1));
  183. r.close();
  184. }
  185. /**
  186. * InsertFunctionalityTest#testInsert6(). Tests INSERT with
  187. * PreparedStatement
  188. */
  189. public void testInsertPrepared() throws SQLException {
  190. PreparedStatement stat = conn.prepareStatement("INSERT INTO "
  191. + DatabaseCreator.TEST_TABLE5 + " VALUES(?, ?)");
  192. stat.setInt(1, 1);
  193. stat.setString(2, "1");
  194. stat.execute();
  195. stat.setInt(1, 2);
  196. stat.setString(2, "3");
  197. stat.execute();
  198. ResultSet r = statement.executeQuery("SELECT COUNT(*) FROM "
  199. + DatabaseCreator.TEST_TABLE5
  200. + " WHERE (testId = 1 AND testValue = '1') "
  201. + "OR (testId = 2 AND testValue = '3')");
  202. r.next();
  203. assertEquals("Incorrect number of records", 2, r.getInt(1));
  204. r.close();
  205. stat.close();
  206. }
  207. }