📄 safetest.java
字号:
} catch (SQLException e) { } } // Notify that we're done synchronized (o1) { done++; o1.notify(); } } } }; threads[i].start(); } while (true) { synchronized (o1) { if (started == threadCount) { break; } o1.wait(); } } synchronized (o2) { o2.notifyAll(); } boolean passed = true; for (int i = 0; i < threadCount; i++) { stmt0 = con.createStatement(); ResultSet rs = stmt0.executeQuery("SELECT 1234"); passed &= rs.next(); passed &= !rs.next(); stmt0.close(); } while (true) { synchronized (o1) { if (done == threadCount) { break; } o1.wait(); } } for (int i = 0; i < threadCount; i++) { threads[i].join(); } stmt0.close(); assertTrue(passed); assertTrue(!failed); } /** * Check that meta data information is fetched even for empty cursor-based result sets (bug #613199). * * @throws Exception */ public void testCursorResultSetEmpty0004() throws Exception { Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery("SELECT 5 Value WHERE 1=0"); assertEquals(null, stmt.getWarnings()); assertEquals(null, rs.getWarnings()); assertEquals("Value", rs.getMetaData().getColumnName(1)); assertTrue(!rs.isBeforeFirst()); assertTrue(!rs.isAfterLast()); assertTrue(!rs.isFirst()); assertTrue(!rs.isLast()); rs.next(); assertTrue(!rs.isBeforeFirst()); assertTrue(!rs.isAfterLast()); assertTrue(!rs.isFirst()); assertTrue(!rs.isLast()); rs.close(); stmt.close(); } /** * Check that the <code>isBeforeFirst</code>, <code>isAfterLast</code>, * <code>isFirst</code> and <code>isLast</code> methods work for * forward-only, read-only result sets (bug [1039876] MS SQL * JtdsResultSet.isAfterLast() always returns false). * * @throws Exception if an error condition occurs */ public void testPlainResultSetPosition0004() throws Exception { Statement stmt = con.createStatement(); // Try with an empty ResultSet ResultSet rs = stmt.executeQuery("SELECT 5 Value WHERE 1=0"); assertEquals(null, stmt.getWarnings()); assertEquals(null, rs.getWarnings()); assertEquals("Value", rs.getMetaData().getColumnName(1)); assertTrue(!rs.isBeforeFirst()); assertTrue(!rs.isAfterLast()); assertTrue(!rs.isFirst()); assertTrue(!rs.isLast()); rs.next(); assertTrue(!rs.isBeforeFirst()); assertTrue(!rs.isAfterLast()); assertTrue(!rs.isFirst()); assertTrue(!rs.isLast()); rs.close(); // Try with a non-empty ResultSet rs = stmt.executeQuery("SELECT 5 Value"); assertEquals(null, stmt.getWarnings()); assertEquals(null, rs.getWarnings()); assertEquals("Value", rs.getMetaData().getColumnName(1)); assertTrue(rs.isBeforeFirst()); assertTrue(!rs.isAfterLast()); assertTrue(!rs.isFirst()); assertTrue(!rs.isLast()); rs.next(); assertTrue(!rs.isBeforeFirst()); assertTrue(!rs.isAfterLast()); assertTrue(rs.isFirst()); assertTrue(rs.isLast()); rs.next(); assertTrue(!rs.isBeforeFirst()); assertTrue(rs.isAfterLast()); assertTrue(!rs.isFirst()); assertTrue(!rs.isLast()); rs.close(); stmt.close(); } /** * Check that values returned from bit fields are correct (not just 0) (bug #841670). * * @throws Exception */ public void testBitFields0005() throws Exception { Statement stmt = con.createStatement(); stmt.execute( "create table #SAfe0005(id int primary key, bit1 bit not null, bit2 bit not null)"); stmt.execute( "insert into #SAfe0005 values (0, 0, 0) "+ "insert into #SAfe0005 values (1, 1, 1) "+ "insert into #SAfe0005 values (2, 0, 0)"); while (stmt.getMoreResults() || stmt.getUpdateCount() != -1); ResultSet rs = stmt.executeQuery("SELECT * FROM #SAfe0005"); while (rs.next()) { int id = rs.getInt(1); int bit1 = rs.getInt(2); int bit2 = rs.getInt(3); assertTrue("id: " + id + "; bit1: " + bit1 + "; bit2: " + bit2, bit1 == id % 2 && (bit2 == id || id == 2 && bit2 == 0)); } rs.close(); stmt.close(); } /** * Test that <code>CallableStatement</code>s with return values work correctly. * * @throws Exception */ public void testCallableStatement0006() throws Exception { final int myVal = 13; Statement stmt = con.createStatement(); stmt.execute("CREATE PROCEDURE #SAfe0006 @p1 INT, @p2 VARCHAR(20) OUT AS " + "SELECT @p2=CONVERT(VARCHAR(20), @p1-1) " + "SELECT @p1 AS value " + "RETURN @p1+1"); stmt.close(); // Try all formats: escaped, w/ exec and w/o exec String[] sql = {"{?=call #SAfe0006(?,?)}", "exec ?=#SAfe0006 ?,?", "?=#SAfe0006 ?,?"}; for (int i = 0; i < sql.length; i++) { // Execute it using executeQuery CallableStatement cs = con.prepareCall(sql[i]); cs.registerOutParameter(1, Types.INTEGER); cs.setInt(2, myVal); cs.registerOutParameter(3, Types.VARCHAR); cs.executeQuery().close(); assertFalse(cs.getMoreResults()); assertEquals(-1, cs.getUpdateCount()); assertEquals(myVal+1, cs.getInt(1)); assertEquals(String.valueOf(myVal-1), cs.getString(3)); cs.close(); // Now use execute cs = con.prepareCall(sql[i]); cs.registerOutParameter(1, Types.INTEGER); cs.setInt(2, myVal); cs.registerOutParameter(3, Types.VARCHAR); assertTrue(cs.execute()); cs.getResultSet().close(); assertFalse(cs.getMoreResults()); assertEquals(-1, cs.getUpdateCount()); assertEquals(myVal+1, cs.getInt(1)); assertEquals(String.valueOf(myVal-1), cs.getString(3)); cs.close(); } } /** * Helper method for <code>testBigDecimal0007</code>. Inserts a BigDecimal * value obtained from a double value. * * @param stmt <code>PreparedStatement</code> instance * @param val the <code>double</code> value to insert * @param scaleFlag if <code>true</code> scale the value to 4, otherwise * leave it as it is */ private static void insertBigDecimal(PreparedStatement stmt, double val, boolean scaleFlag) throws Exception { BigDecimal bd = new BigDecimal(val); if (scaleFlag) { bd = bd.setScale(4, BigDecimal.ROUND_HALF_EVEN); } stmt.setBigDecimal(1, bd); stmt.execute(); int rowCount = stmt.getUpdateCount(); assertEquals(1, rowCount); assertTrue(stmt.getMoreResults()); ResultSet rs = stmt.getResultSet(); assertTrue(rs.next()); assertEquals("Values don't match.", val, rs.getDouble(1), 0); } /** * Test <code>BigDecimal</code>s created from double values (i.e with very * large scales). */ public void testBigDecimal0007() throws Exception { Statement createStmt = con.createStatement(); createStmt.execute("CREATE TABLE #SAfe0007(value MONEY)"); createStmt.close(); PreparedStatement stmt = con.prepareStatement( "INSERT INTO #SAfe0007(value) VALUES (?) " + "SELECT * FROM #SAfe0007 DELETE #SAfe0007"); // Now test with certain values. insertBigDecimal(stmt, 1.1, false); insertBigDecimal(stmt, 0.1, false); insertBigDecimal(stmt, 0.1, true); insertBigDecimal(stmt, 0.01, false); insertBigDecimal(stmt, 0.01, true); insertBigDecimal(stmt, 0.02, false); insertBigDecimal(stmt, 0.02, true); insertBigDecimal(stmt, 0.25, false); stmt.close(); } /** * Test writing <code>long</code> values to VARCHAR fields. There was a * regression introduced in release 0.6 that caused <code>long</code> * fields to be sent with non-zero scale and appear with decimals when * written into VARCHAR fields. */ public void testLongToVarchar0008() throws Exception { long myVal = 13; Statement createStmt = con.createStatement(); createStmt.execute("CREATE TABLE #SAfe0008(value VARCHAR(255))"); createStmt.close(); PreparedStatement stmt = con.prepareStatement( "INSERT INTO #SAfe0008(value) values (CONVERT(VARCHAR(255), ?)) " + "SELECT * FROM #SAfe0008 DELETE #SAfe0008"); stmt.setLong(1, myVal); stmt.execute(); int rowCount = stmt.getUpdateCount(); assertEquals(1, rowCount); assertTrue(stmt.getMoreResults()); ResultSet rs = stmt.getResultSet(); assertTrue(rs.next()); assertEquals("Values don't match.", String.valueOf(myVal), rs.getString(1)); stmt.close(); } /** * Test <code>ResultSet.deleteRow()</code> on updateable result sets. */ public void testDeleteRow0009() throws Exception { Statement stmt = con.createStatement(); stmt.execute("CREATE TABLE #SAfe0009(value VARCHAR(255) PRIMARY KEY)"); stmt.close(); PreparedStatement insStmt = con.prepareStatement( "INSERT INTO #SAfe0009(value) values (?)"); insStmt.setString(1, "Row 1"); assertEquals(1, insStmt.executeUpdate()); insStmt.setString(1, "Row 2"); assertEquals(1, insStmt.executeUpdate()); insStmt.close(); stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmt.executeQuery("SELECT * FROM #SAfe0009 ORDER BY 1"); assertEquals(null, stmt.getWarnings()); assertEquals(null, rs.getWarnings()); assertTrue(rs.last()); assertTrue(!rs.rowDeleted()); rs.deleteRow(); assertTrue(rs.rowDeleted()); rs.close(); rs = stmt.executeQuery("SELECT * FROM #SAfe0009"); assertTrue(rs.next()); assertEquals("Row 1", rs.getString(1)); assertTrue(!rs.next()); rs.close(); stmt.close(); } /** * Test VARCHAR output parameters returned by CallableStatements. * <p> * An issue existed, caused by the fact that the parameter was sent to SQL * Server as a short VARCHAR (not XORed with 0x80) limiting its length to * 255 characters. See bug [815348] for more details.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -