safetest.java
来自「jtds的源码 是你学习java的好东西」· Java 代码 · 共 1,764 行 · 第 1/5 页
JAVA
1,764 行
final Object o1=new Object(), o2=new Object();
int threadCount = 25;
Thread threads[] = new Thread[threadCount];
started = done = 0;
failed = false;
for (int i=0; i<threadCount; i++) {
threads[i] = new Thread() {
public void run() {
ResultSet rs;
Statement stmt = null;
try {
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery("SELECT * FROM #SAfe0003");
assertEquals(null, rs.getWarnings());
assertEquals(null, stmt.getWarnings());
// Synchronize all threads
synchronized (o2) {
synchronized(o1) {
started++;
o1.notify();
}
try {
o2.wait();
} catch (InterruptedException e) {
}
}
assertNotNull("executeQuery should not return null", rs);
assertTrue(rs.next());
assertTrue(rs.next());
assertTrue(!rs.next());
assertTrue(rs.previous());
assertTrue(rs.previous());
assertTrue(!rs.previous());
} catch (SQLException e) {
e.printStackTrace();
synchronized (o1) {
failed = true;
}
fail("An SQL Exception occured: "+e);
} finally {
if (stmt != null) {
try {
stmt.close();
} 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();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?