提交 810a0771 authored 作者: Noel Grandin's avatar Noel Grandin 提交者: GitHub

Merge pull request #563 from andreitokar/issue#556.2

Issue#556 close connections in tests (at least in case of successful execution)
...@@ -23,6 +23,7 @@ import java.util.concurrent.TimeUnit; ...@@ -23,6 +23,7 @@ import java.util.concurrent.TimeUnit;
import org.h2.fulltext.FullText; import org.h2.fulltext.FullText;
import org.h2.store.fs.FileUtils; import org.h2.store.fs.FileUtils;
import org.h2.test.TestBase; import org.h2.test.TestBase;
import org.h2.util.IOUtils;
import org.h2.util.Task; import org.h2.util.Task;
/** /**
...@@ -90,9 +91,9 @@ public class TestFullText extends TestBase { ...@@ -90,9 +91,9 @@ public class TestFullText extends TestBase {
deleteDb("fullTextReopen"); deleteDb("fullTextReopen");
} }
private static void close(Collection<Connection> list) throws SQLException { private static void close(Collection<Connection> list) {
for (Connection conn : list) { for (Connection conn : list) {
conn.close(); IOUtils.closeSilently(conn);
} }
} }
...@@ -491,8 +492,7 @@ public class TestFullText extends TestBase { ...@@ -491,8 +492,7 @@ public class TestFullText extends TestBase {
return; return;
} }
deleteDb("fullText"); deleteDb("fullText");
ArrayList<Connection> connList = new ArrayList<Connection>(); Connection conn = getConnection("fullText");
Connection conn = getConnection("fullText", connList);
String prefix = lucene ? "FTL_" : "FT_"; String prefix = lucene ? "FTL_" : "FT_";
Statement stat = conn.createStatement(); Statement stat = conn.createStatement();
String className = lucene ? "FullTextLucene" : "FullText"; String className = lucene ? "FullTextLucene" : "FullText";
...@@ -590,15 +590,15 @@ public class TestFullText extends TestBase { ...@@ -590,15 +590,15 @@ public class TestFullText extends TestBase {
if (!config.memory) { if (!config.memory) {
conn.close(); conn.close();
conn = getConnection("fullText");
} }
conn = getConnection("fullText", connList);
stat = conn.createStatement(); stat = conn.createStatement();
stat.executeQuery("SELECT * FROM " + prefix + "SEARCH('World', 0, 0)"); stat.executeQuery("SELECT * FROM " + prefix + "SEARCH('World', 0, 0)");
stat.execute("CALL " + prefix + "DROP_ALL()"); stat.execute("CALL " + prefix + "DROP_ALL()");
close(connList); conn.close();
} }
private void testDropIndex(boolean lucene) throws SQLException { private void testDropIndex(boolean lucene) throws SQLException {
...@@ -625,7 +625,6 @@ public class TestFullText extends TestBase { ...@@ -625,7 +625,6 @@ public class TestFullText extends TestBase {
"_CREATE_INDEX('PUBLIC', 'TEST', 'NAME1, NAME2')"); "_CREATE_INDEX('PUBLIC', 'TEST', 'NAME1, NAME2')");
stat.execute("UPDATE TEST SET NAME2=NULL WHERE ID=1"); stat.execute("UPDATE TEST SET NAME2=NULL WHERE ID=1");
stat.execute("UPDATE TEST SET NAME2='Hello World' WHERE ID=1"); stat.execute("UPDATE TEST SET NAME2='Hello World' WHERE ID=1");
conn.close();
conn.close(); conn.close();
FileUtils.deleteRecursive(getBaseDir() + "/fullTextDropIndex", false); FileUtils.deleteRecursive(getBaseDir() + "/fullTextDropIndex", false);
......
...@@ -1285,6 +1285,7 @@ public class TestFunctions extends TestBase implements AggregateFunction { ...@@ -1285,6 +1285,7 @@ public class TestFunctions extends TestBase implements AggregateFunction {
String.format("SELECT ORA_HASH('%s', 0) FROM DUAL", testStr)); String.format("SELECT ORA_HASH('%s', 0) FROM DUAL", testStr));
assertResult(String.valueOf("foo".hashCode()), stat, assertResult(String.valueOf("foo".hashCode()), stat,
String.format("SELECT ORA_HASH('%s', 0, 0) FROM DUAL", testStr)); String.format("SELECT ORA_HASH('%s', 0, 0) FROM DUAL", testStr));
conn.close();
} }
private void testToDateException() { private void testToDateException() {
...@@ -2058,6 +2059,7 @@ public class TestFunctions extends TestBase implements AggregateFunction { ...@@ -2058,6 +2059,7 @@ public class TestFunctions extends TestBase implements AggregateFunction {
assertFalse(parsed.before(before)); assertFalse(parsed.before(before));
assertFalse(parsed.after(after)); assertFalse(parsed.after(after));
conn.close();
} }
...@@ -2083,6 +2085,7 @@ public class TestFunctions extends TestBase implements AggregateFunction { ...@@ -2083,6 +2085,7 @@ public class TestFunctions extends TestBase implements AggregateFunction {
rs.close(); rs.close();
assertEquals(first, second); assertEquals(first, second);
conn.close();
} }
private void testThatCurrentTimestampUpdatesOutsideATransaction() private void testThatCurrentTimestampUpdatesOutsideATransaction()
...@@ -2107,26 +2110,26 @@ public class TestFunctions extends TestBase implements AggregateFunction { ...@@ -2107,26 +2110,26 @@ public class TestFunctions extends TestBase implements AggregateFunction {
rs.close(); rs.close();
assertTrue(second.after(first)); assertTrue(second.after(first));
conn.close();
} }
private void callCompiledFunction(String functionName) throws SQLException { private void callCompiledFunction(String functionName) throws SQLException {
deleteDb("functions"); deleteDb("functions");
Connection conn = getConnection("functions"); try (Connection conn = getConnection("functions")) {
Statement stat = conn.createStatement(); Statement stat = conn.createStatement();
ResultSet rs; ResultSet rs;
stat.execute("create alias " + functionName + " AS " stat.execute("create alias " + functionName + " AS "
+ "$$ boolean " + functionName + "() " + "$$ boolean " + functionName + "() "
+ "{ return true; } $$;"); + "{ return true; } $$;");
PreparedStatement stmt = conn.prepareStatement( PreparedStatement stmt = conn.prepareStatement(
"select " + functionName + "() from dual"); "select " + functionName + "() from dual");
rs = stmt.executeQuery(); rs = stmt.executeQuery();
rs.next(); rs.next();
assertEquals(Boolean.class.getName(), rs.getObject(1).getClass().getName()); assertEquals(Boolean.class.getName(), rs.getObject(1).getClass().getName());
stat.execute("drop alias " + functionName + "");
conn.close(); stat.execute("drop alias " + functionName + "");
}
} }
private void assertCallResult(String expected, Statement stat, String sql) private void assertCallResult(String expected, Statement stat, String sql)
......
...@@ -38,20 +38,15 @@ public class TestMultiThread extends TestBase implements Runnable { ...@@ -38,20 +38,15 @@ public class TestMultiThread extends TestBase implements Runnable {
private boolean stop; private boolean stop;
private TestMultiThread parent; private TestMultiThread parent;
private Random random; private Random random;
private Connection threadConn;
private Statement threadStat;
public TestMultiThread() { public TestMultiThread() {
// nothing to do // nothing to do
} }
private TestMultiThread(TestAll config, TestMultiThread parent) private TestMultiThread(TestAll config, TestMultiThread parent) {
throws SQLException {
this.config = config; this.config = config;
this.parent = parent; this.parent = parent;
random = new Random(); random = new Random();
threadConn = getConnection();
threadStat = threadConn.createStatement();
} }
/** /**
...@@ -81,64 +76,64 @@ public class TestMultiThread extends TestBase implements Runnable { ...@@ -81,64 +76,64 @@ public class TestMultiThread extends TestBase implements Runnable {
String db = getTestName(); String db = getTestName();
deleteDb(db); deleteDb(db);
final String url = getURL(db + ";MULTI_THREADED=1;LOCK_TIMEOUT=10000", true); final String url = getURL(db + ";MULTI_THREADED=1;LOCK_TIMEOUT=10000", true);
Connection conn = getConnection(url); try (Connection conn = getConnection(url)) {
Task[] tasks = new Task[2]; Task[] tasks = new Task[2];
for (int i = 0; i < tasks.length; i++) { for (int i = 0; i < tasks.length; i++) {
final int x = i; final int x = i;
Task t = new Task() { Task t = new Task() {
@Override @Override
public void call() throws Exception { public void call() throws Exception {
try (Connection c2 = getConnection(url)) { try (Connection c2 = getConnection(url)) {
Statement stat = c2.createStatement(); Statement stat = c2.createStatement();
for (int i = 0; !stop; i++) { for (int i = 0; !stop; i++) {
stat.execute("create table test" + x + "_" + i); stat.execute("create table test" + x + "_" + i);
c2.getMetaData().getTables(null, null, null, null); c2.getMetaData().getTables(null, null, null, null);
stat.execute("drop table test" + x + "_" + i); stat.execute("drop table test" + x + "_" + i);
}
} }
} }
} };
}; tasks[i] = t;
tasks[i] = t; t.execute();
t.execute(); }
} Thread.sleep(1000);
Thread.sleep(1000); for (Task t : tasks) {
for (Task t : tasks) { t.get();
t.get(); }
} }
conn.close();
} }
private void testConcurrentLobAdd() throws Exception { private void testConcurrentLobAdd() throws Exception {
String db = getTestName(); String db = getTestName();
deleteDb(db); deleteDb(db);
final String url = getURL(db + ";MULTI_THREADED=1", true); final String url = getURL(db + ";MULTI_THREADED=1", true);
Connection conn = getConnection(url); try (Connection conn = getConnection(url)) {
Statement stat = conn.createStatement(); Statement stat = conn.createStatement();
stat.execute("create table test(id identity, data clob)"); stat.execute("create table test(id identity, data clob)");
Task[] tasks = new Task[2]; Task[] tasks = new Task[2];
for (int i = 0; i < tasks.length; i++) { for (int i = 0; i < tasks.length; i++) {
Task t = new Task() { Task t = new Task() {
@Override @Override
public void call() throws Exception { public void call() throws Exception {
try (Connection c2 = getConnection(url)) { try (Connection c2 = getConnection(url)) {
PreparedStatement p2 = c2 PreparedStatement p2 = c2
.prepareStatement("insert into test(data) values(?)"); .prepareStatement("insert into test(data) values(?)");
while (!stop) { while (!stop) {
p2.setCharacterStream(1, new StringReader(new String( p2.setCharacterStream(1, new StringReader(new String(
new char[10 * 1024]))); new char[10 * 1024])));
p2.execute(); p2.execute();
}
} }
} }
} };
}; tasks[i] = t;
tasks[i] = t; t.execute();
t.execute(); }
} Thread.sleep(500);
Thread.sleep(500); for (Task t : tasks) {
for (Task t : tasks) { t.get();
t.get(); }
} }
conn.close();
} }
private void testConcurrentView() throws Exception { private void testConcurrentView() throws Exception {
...@@ -149,60 +144,60 @@ public class TestMultiThread extends TestBase implements Runnable { ...@@ -149,60 +144,60 @@ public class TestMultiThread extends TestBase implements Runnable {
deleteDb(db); deleteDb(db);
final String url = getURL(db + ";MULTI_THREADED=1", true); final String url = getURL(db + ";MULTI_THREADED=1", true);
final Random r = new Random(); final Random r = new Random();
Connection conn = getConnection(url); try (Connection conn = getConnection(url)) {
Statement stat = conn.createStatement(); Statement stat = conn.createStatement();
StringBuilder buff = new StringBuilder(); StringBuilder buff = new StringBuilder();
buff.append("create table test(id int"); buff.append("create table test(id int");
final int len = 3; final int len = 3;
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
buff.append(", x" + i + " int"); buff.append(", x" + i + " int");
} }
buff.append(")"); buff.append(")");
stat.execute(buff.toString()); stat.execute(buff.toString());
stat.execute("create view test_view as select * from test"); stat.execute("create view test_view as select * from test");
stat.execute("insert into test(id) select x from system_range(1, 2)"); stat.execute("insert into test(id) select x from system_range(1, 2)");
Task t = new Task() { Task t = new Task() {
@Override @Override
public void call() throws Exception { public void call() throws Exception {
Connection c2 = getConnection(url); Connection c2 = getConnection(url);
while (!stop) { while (!stop) {
c2.prepareStatement("select * from test_view where x" + c2.prepareStatement("select * from test_view where x" +
r.nextInt(len) + "=1"); r.nextInt(len) + "=1");
}
c2.close();
} }
c2.close(); };
t.execute();
SynchronizedVerifier.setDetect(SmallLRUCache.class, true);
for (int i = 0; i < 1000; i++) {
conn.prepareStatement("select * from test_view where x" +
r.nextInt(len) + "=1");
} }
}; t.get();
t.execute(); SynchronizedVerifier.setDetect(SmallLRUCache.class, false);
SynchronizedVerifier.setDetect(SmallLRUCache.class, true);
for (int i = 0; i < 1000; i++) {
conn.prepareStatement("select * from test_view where x" +
r.nextInt(len) + "=1");
} }
t.get();
SynchronizedVerifier.setDetect(SmallLRUCache.class, false);
conn.close();
} }
private void testConcurrentAlter() throws Exception { private void testConcurrentAlter() throws Exception {
deleteDb(getTestName()); deleteDb(getTestName());
final Connection conn = getConnection(getTestName()); try (final Connection conn = getConnection(getTestName())) {
Statement stat = conn.createStatement(); Statement stat = conn.createStatement();
Task t = new Task() { Task t = new Task() {
@Override @Override
public void call() throws Exception { public void call() throws Exception {
while (!stop) { while (!stop) {
conn.prepareStatement("select * from test"); conn.prepareStatement("select * from test");
}
} }
};
stat.execute("create table test(id int)");
t.execute();
for (int i = 0; i < 200; i++) {
stat.execute("alter table test add column x int");
stat.execute("alter table test drop column x");
} }
}; t.get();
stat.execute("create table test(id int)");
t.execute();
for (int i = 0; i < 200; i++) {
stat.execute("alter table test add column x int");
stat.execute("alter table test drop column x");
} }
t.get();
conn.close();
} }
private void testConcurrentAnalyze() throws Exception { private void testConcurrentAnalyze() throws Exception {
...@@ -211,53 +206,52 @@ public class TestMultiThread extends TestBase implements Runnable { ...@@ -211,53 +206,52 @@ public class TestMultiThread extends TestBase implements Runnable {
} }
deleteDb(getTestName()); deleteDb(getTestName());
final String url = getURL("concurrentAnalyze;MULTI_THREADED=1", true); final String url = getURL("concurrentAnalyze;MULTI_THREADED=1", true);
Connection conn = getConnection(url); try (Connection conn = getConnection(url)) {
Statement stat = conn.createStatement(); Statement stat = conn.createStatement();
stat.execute("create table test(id bigint primary key) " + stat.execute("create table test(id bigint primary key) " +
"as select x from system_range(1, 1000)"); "as select x from system_range(1, 1000)");
Task t = new Task() { Task t = new Task() {
@Override @Override
public void call() throws SQLException { public void call() throws SQLException {
Connection conn2; try (Connection conn2 = getConnection(url)) {
conn2 = getConnection(url); for (int i = 0; i < 1000; i++) {
for (int i = 0; i < 1000; i++) { conn2.createStatement().execute("analyze");
conn2.createStatement().execute("analyze"); }
}
} }
conn2.close(); };
t.execute();
Thread.yield();
for (int i = 0; i < 1000; i++) {
conn.createStatement().execute("analyze");
} }
}; t.get();
t.execute(); stat.execute("drop table test");
Thread.yield();
for (int i = 0; i < 1000; i++) {
conn.createStatement().execute("analyze");
} }
t.get();
stat.execute("drop table test");
conn.close();
} }
private void testConcurrentInsertUpdateSelect() throws Exception { private void testConcurrentInsertUpdateSelect() throws Exception {
threadConn = getConnection(); try (Connection conn = getConnection()) {
threadStat = threadConn.createStatement(); Statement stmt = conn.createStatement();
threadStat.execute("CREATE TABLE TEST(ID IDENTITY, NAME VARCHAR)"); stmt.execute("CREATE TABLE TEST(ID IDENTITY, NAME VARCHAR)");
int len = getSize(10, 200); int len = getSize(10, 200);
Thread[] threads = new Thread[len]; Thread[] threads = new Thread[len];
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
threads[i] = new Thread(new TestMultiThread(config, this)); threads[i] = new Thread(new TestMultiThread(config, this));
} }
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
threads[i].start(); threads[i].start();
} }
int sleep = getSize(400, 10000); int sleep = getSize(400, 10000);
Thread.sleep(sleep); Thread.sleep(sleep);
this.stop = true; this.stop = true;
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
threads[i].join(); threads[i].join();
}
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM TEST");
rs.next();
trace("max id=" + rs.getInt(1));
} }
ResultSet rs = threadStat.executeQuery("SELECT COUNT(*) FROM TEST");
rs.next();
trace("max id=" + rs.getInt(1));
threadConn.close();
} }
private Connection getConnection() throws SQLException { private Connection getConnection() throws SQLException {
...@@ -266,22 +260,22 @@ public class TestMultiThread extends TestBase implements Runnable { ...@@ -266,22 +260,22 @@ public class TestMultiThread extends TestBase implements Runnable {
@Override @Override
public void run() { public void run() {
try { try (Connection conn = getConnection()) {
Statement stmt = conn.createStatement();
while (!parent.stop) { while (!parent.stop) {
threadStat.execute("SELECT COUNT(*) FROM TEST"); stmt.execute("SELECT COUNT(*) FROM TEST");
threadStat.execute("INSERT INTO TEST VALUES(NULL, 'Hi')"); stmt.execute("INSERT INTO TEST VALUES(NULL, 'Hi')");
PreparedStatement prep = threadConn.prepareStatement( PreparedStatement prep = conn.prepareStatement(
"UPDATE TEST SET NAME='Hello' WHERE ID=?"); "UPDATE TEST SET NAME='Hello' WHERE ID=?");
prep.setInt(1, random.nextInt(10000)); prep.setInt(1, random.nextInt(10000));
prep.execute(); prep.execute();
prep = threadConn.prepareStatement("SELECT * FROM TEST WHERE ID=?"); prep = conn.prepareStatement("SELECT * FROM TEST WHERE ID=?");
prep.setInt(1, random.nextInt(10000)); prep.setInt(1, random.nextInt(10000));
ResultSet rs = prep.executeQuery(); ResultSet rs = prep.executeQuery();
while (rs.next()) { while (rs.next()) {
rs.getString("NAME"); rs.getString("NAME");
} }
} }
threadConn.close();
} catch (Exception e) { } catch (Exception e) {
logError("multi", e); logError("multi", e);
} }
...@@ -292,11 +286,11 @@ public class TestMultiThread extends TestBase implements Runnable { ...@@ -292,11 +286,11 @@ public class TestMultiThread extends TestBase implements Runnable {
// is not supported // is not supported
deleteDb("lockMode"); deleteDb("lockMode");
final String url = getURL("lockMode;MULTI_THREADED=1", true); final String url = getURL("lockMode;MULTI_THREADED=1", true);
Connection conn = getConnection(url); try (Connection conn = getConnection(url)) {
DatabaseMetaData meta = conn.getMetaData(); DatabaseMetaData meta = conn.getMetaData();
assertFalse(meta.supportsTransactionIsolationLevel( assertFalse(meta.supportsTransactionIsolationLevel(
Connection.TRANSACTION_READ_UNCOMMITTED)); Connection.TRANSACTION_READ_UNCOMMITTED));
conn.close(); }
deleteDb("lockMode"); deleteDb("lockMode");
} }
...@@ -307,55 +301,55 @@ public class TestMultiThread extends TestBase implements Runnable { ...@@ -307,55 +301,55 @@ public class TestMultiThread extends TestBase implements Runnable {
final String url = getURL("lockMode;MULTI_THREADED=1", true); final String url = getURL("lockMode;MULTI_THREADED=1", true);
// create some common tables and views // create some common tables and views
final Connection conn = getConnection(url); ExecutorService executor = Executors.newFixedThreadPool(8);
final Statement stat = conn.createStatement(); Connection conn = getConnection(url);
stat.execute(
"CREATE TABLE INVOICE(INVOICE_ID INT PRIMARY KEY, AMOUNT DECIMAL)");
stat.execute("CREATE VIEW INVOICE_VIEW as SELECT * FROM INVOICE");
stat.execute(
"CREATE TABLE INVOICE_DETAIL(DETAIL_ID INT PRIMARY KEY, " +
"INVOICE_ID INT, DESCRIPTION VARCHAR)");
stat.execute(
"CREATE VIEW INVOICE_DETAIL_VIEW as SELECT * FROM INVOICE_DETAIL");
stat.close();
// create views that reference the common views in different threads
final ExecutorService executor = Executors.newFixedThreadPool(8);
try { try {
final ArrayList<Future<Void>> jobs = new ArrayList<Future<Void>>(); Statement stat = conn.createStatement();
stat.execute(
"CREATE TABLE INVOICE(INVOICE_ID INT PRIMARY KEY, AMOUNT DECIMAL)");
stat.execute("CREATE VIEW INVOICE_VIEW as SELECT * FROM INVOICE");
stat.execute(
"CREATE TABLE INVOICE_DETAIL(DETAIL_ID INT PRIMARY KEY, " +
"INVOICE_ID INT, DESCRIPTION VARCHAR)");
stat.execute(
"CREATE VIEW INVOICE_DETAIL_VIEW as SELECT * FROM INVOICE_DETAIL");
stat.close();
// create views that reference the common views in different threads
ArrayList<Future<Void>> jobs = new ArrayList<Future<Void>>();
for (int i = 0; i < 1000; i++) { for (int i = 0; i < 1000; i++) {
final int j = i; final int j = i;
jobs.add(executor.submit(new Callable<Void>() { jobs.add(executor.submit(new Callable<Void>() {
@Override @Override
public Void call() throws Exception { public Void call() throws Exception {
final Connection conn2 = getConnection(url); try (Connection conn2 = getConnection(url)) {
Statement stat2 = conn2.createStatement(); Statement stat2 = conn2.createStatement();
stat2.execute("CREATE VIEW INVOICE_VIEW" + j stat2.execute("CREATE VIEW INVOICE_VIEW" + j
+ " as SELECT * FROM INVOICE_VIEW"); + " as SELECT * FROM INVOICE_VIEW");
// the following query intermittently results in a // the following query intermittently results in a
// NullPointerException // NullPointerException
stat2.execute("CREATE VIEW INVOICE_DETAIL_VIEW" + j stat2.execute("CREATE VIEW INVOICE_DETAIL_VIEW" + j
+ " as SELECT DTL.* FROM INVOICE_VIEW" + j + " as SELECT DTL.* FROM INVOICE_VIEW" + j
+ " INV JOIN INVOICE_DETAIL_VIEW DTL " + " INV JOIN INVOICE_DETAIL_VIEW DTL "
+ "ON INV.INVOICE_ID = DTL.INVOICE_ID" + "ON INV.INVOICE_ID = DTL.INVOICE_ID"
+ " WHERE DESCRIPTION='TEST'"); + " WHERE DESCRIPTION='TEST'");
ResultSet rs = stat2 ResultSet rs = stat2
.executeQuery("SELECT * FROM INVOICE_VIEW" + j); .executeQuery("SELECT * FROM INVOICE_VIEW" + j);
rs.next(); rs.next();
rs.close(); rs.close();
rs = stat2.executeQuery( rs = stat2.executeQuery(
"SELECT * FROM INVOICE_DETAIL_VIEW" + j); "SELECT * FROM INVOICE_DETAIL_VIEW" + j);
rs.next(); rs.next();
rs.close(); rs.close();
stat.close(); stat2.close();
conn.close(); }
return null; return null;
} }
})); }));
...@@ -388,37 +382,36 @@ public class TestMultiThread extends TestBase implements Runnable { ...@@ -388,37 +382,36 @@ public class TestMultiThread extends TestBase implements Runnable {
deleteDb("lockMode"); deleteDb("lockMode");
final String url = getURL("lockMode;MULTI_THREADED=1", true); final String url = getURL("lockMode;MULTI_THREADED=1", true);
final Connection conn = getConnection(url); int threadCount = 25;
conn.createStatement().execute( ExecutorService executor = Executors.newFixedThreadPool(threadCount);
"CREATE TABLE IF NOT EXISTS TRAN (ID NUMBER(18,0) not null PRIMARY KEY)"); Connection conn = getConnection(url);
try {
final int threadCount = 25; conn.createStatement().execute(
final ArrayList<Callable<Void>> callables = new ArrayList<Callable<Void>>(); "CREATE TABLE IF NOT EXISTS TRAN (ID NUMBER(18,0) not null PRIMARY KEY)");
for (int i = 0; i < threadCount; i++) {
final Connection taskConn = getConnection(url); final ArrayList<Callable<Void>> callables = new ArrayList<Callable<Void>>();
taskConn.setAutoCommit(false); for (int i = 0; i < threadCount; i++) {
final PreparedStatement insertTranStmt = taskConn final long initialTransactionId = i * 1000000L;
.prepareStatement("INSERT INTO tran (id) values(?)"); callables.add(new Callable<Void>() {
// to guarantee uniqueness @Override
final long initialTransactionId = i * 1000000L; public Void call() throws Exception {
callables.add(new Callable<Void>() { try (Connection taskConn = getConnection(url)) {
@Override taskConn.setAutoCommit(false);
public Void call() throws Exception { PreparedStatement insertTranStmt = taskConn
long tranId = initialTransactionId; .prepareStatement("INSERT INTO tran (id) VALUES(?)");
for (int j = 0; j < 1000; j++) { // to guarantee uniqueness
insertTranStmt.setLong(1, tranId++); long tranId = initialTransactionId;
insertTranStmt.execute(); for (int j = 0; j < 1000; j++) {
taskConn.commit(); insertTranStmt.setLong(1, tranId++);
insertTranStmt.execute();
taskConn.commit();
}
}
return null;
} }
taskConn.close(); });
return null; }
}
});
}
final ExecutorService executor = Executors
.newFixedThreadPool(threadCount);
try {
final ArrayList<Future<Void>> jobs = new ArrayList<Future<Void>>(); final ArrayList<Future<Void>> jobs = new ArrayList<Future<Void>>();
for (int i = 0; i < threadCount; i++) { for (int i = 0; i < threadCount; i++) {
jobs.add(executor.submit(callables.get(i))); jobs.add(executor.submit(callables.get(i)));
...@@ -441,42 +434,42 @@ public class TestMultiThread extends TestBase implements Runnable { ...@@ -441,42 +434,42 @@ public class TestMultiThread extends TestBase implements Runnable {
final int objectCount = 10000; final int objectCount = 10000;
final String url = getURL("lockMode;MULTI_THREADED=1;LOCK_TIMEOUT=10000", true); final String url = getURL("lockMode;MULTI_THREADED=1;LOCK_TIMEOUT=10000", true);
final Connection conn = getConnection(url); int threadCount = 25;
conn.createStatement().execute( ExecutorService executor = Executors.newFixedThreadPool(threadCount);
"CREATE TABLE IF NOT EXISTS ACCOUNT" + Connection conn = getConnection(url);
"(ID NUMBER(18,0) not null PRIMARY KEY, BALANCE NUMBER null)"); try {
final PreparedStatement mergeAcctStmt = conn conn.createStatement().execute(
.prepareStatement("MERGE INTO Account(id, balance) key (id) VALUES (?, ?)"); "CREATE TABLE IF NOT EXISTS ACCOUNT" +
for (int i = 0; i < objectCount; i++) { "(ID NUMBER(18,0) not null PRIMARY KEY, BALANCE NUMBER null)");
mergeAcctStmt.setLong(1, i); final PreparedStatement mergeAcctStmt = conn
mergeAcctStmt.setBigDecimal(2, BigDecimal.ZERO); .prepareStatement("MERGE INTO Account(id, balance) key (id) VALUES (?, ?)");
mergeAcctStmt.execute(); for (int i = 0; i < objectCount; i++) {
} mergeAcctStmt.setLong(1, i);
mergeAcctStmt.setBigDecimal(2, BigDecimal.ZERO);
mergeAcctStmt.execute();
}
final int threadCount = 25; final ArrayList<Callable<Void>> callables = new ArrayList<Callable<Void>>();
final ArrayList<Callable<Void>> callables = new ArrayList<Callable<Void>>(); for (int i = 0; i < threadCount; i++) {
for (int i = 0; i < threadCount; i++) { callables.add(new Callable<Void>() {
final Connection taskConn = getConnection(url); @Override
taskConn.setAutoCommit(false); public Void call() throws Exception {
final PreparedStatement updateAcctStmt = taskConn try (Connection taskConn = getConnection(url)) {
.prepareStatement("UPDATE account set balance = ? where id = ?"); taskConn.setAutoCommit(false);
callables.add(new Callable<Void>() { final PreparedStatement updateAcctStmt = taskConn
@Override .prepareStatement("UPDATE account SET balance = ? WHERE id = ?");
public Void call() throws Exception { for (int j = 0; j < 1000; j++) {
for (int j = 0; j < 1000; j++) { updateAcctStmt.setDouble(1, Math.random());
updateAcctStmt.setDouble(1, Math.random()); updateAcctStmt.setLong(2, (int) (Math.random() * objectCount));
updateAcctStmt.setLong(2, (int) (Math.random() * objectCount)); updateAcctStmt.execute();
updateAcctStmt.execute(); taskConn.commit();
taskConn.commit(); }
}
return null;
} }
taskConn.close(); });
return null; }
}
});
}
final ExecutorService executor = Executors.newFixedThreadPool(threadCount);
try {
final ArrayList<Future<Void>> jobs = new ArrayList<Future<Void>>(); final ArrayList<Future<Void>> jobs = new ArrayList<Future<Void>>();
for (int i = 0; i < threadCount; i++) { for (int i = 0; i < threadCount; i++) {
jobs.add(executor.submit(callables.get(i))); jobs.add(executor.submit(callables.get(i)));
......
...@@ -36,75 +36,75 @@ public class TestQueryCache extends TestBase { ...@@ -36,75 +36,75 @@ public class TestQueryCache extends TestBase {
} }
private void test1() throws Exception { private void test1() throws Exception {
Connection conn = getConnection("queryCache;QUERY_CACHE_SIZE=10"); try (Connection conn = getConnection("queryCache;QUERY_CACHE_SIZE=10")) {
Statement stat = conn.createStatement(); Statement stat = conn.createStatement();
stat.execute("create table test(id int, name varchar)"); stat.execute("create table test(id int, name varchar)");
PreparedStatement prep; PreparedStatement prep;
// query execution may be fast here but the parsing must be slow // query execution may be fast here but the parsing must be slow
StringBuilder queryBuilder = new StringBuilder("select count(*) from test t1 where \n"); StringBuilder queryBuilder = new StringBuilder("select count(*) from test t1 where \n");
for (int i = 0; i < 1000; i++) { for (int i = 0; i < 1000; i++) {
if (i != 0) { if (i != 0) {
queryBuilder.append(" and "); queryBuilder.append(" and ");
}
queryBuilder.append(" TIMESTAMP '2005-12-31 23:59:59' = TIMESTAMP '2005-12-31 23:59:59' ");
} }
queryBuilder.append(" TIMESTAMP '2005-12-31 23:59:59' = TIMESTAMP '2005-12-31 23:59:59' "); String query = queryBuilder.toString();
} conn.prepareStatement(query);
String query = queryBuilder.toString(); int firstGreater = 0;
conn.prepareStatement(query); int firstSmaller = 0;
int firstGreater = 0; long time;
int firstSmaller = 0; ResultSet rs;
long time; long first = 0;
ResultSet rs; // 1000 iterations to warm up and avoid JIT effects
long first = 0; for (int i = 0; i < 1005; i++) {
// 1000 iterations to warm up and avoid JIT effects // this should both ensure results are not re-used
for (int i = 0; i < 1005; i++) { // stat.execute("set mode regular");
// this should both ensure results are not re-used // stat.execute("create table x()");
// stat.execute("set mode regular"); // stat.execute("drop table x");
// stat.execute("create table x()"); time = System.nanoTime();
// stat.execute("drop table x");
time = System.nanoTime();
prep = conn.prepareStatement(query);
execute(prep);
prep.close();
rs = stat.executeQuery(query);
rs.next();
int c = rs.getInt(1);
rs.close();
assertEquals(0, c);
time = System.nanoTime() - time;
if (i == 1000) {
// take from cache and do not close, so that next iteration will have a cache miss
prep = conn.prepareStatement(query); prep = conn.prepareStatement(query);
} else if (i == 1001) { execute(prep);
first = time; prep.close();
// try to avoid pauses in subsequent iterations rs = stat.executeQuery(query);
System.gc(); rs.next();
} else if (i > 1001) { int c = rs.getInt(1);
if (first > time) { rs.close();
firstGreater++; assertEquals(0, c);
} else { time = System.nanoTime() - time;
firstSmaller++; if (i == 1000) {
// take from cache and do not close, so that next iteration will have a cache miss
prep = conn.prepareStatement(query);
} else if (i == 1001) {
first = time;
// try to avoid pauses in subsequent iterations
System.gc();
} else if (i > 1001) {
if (first > time) {
firstGreater++;
} else {
firstSmaller++;
}
} }
} }
// first prepare time must be always greater because of query cache,
// but JVM is too unpredictable to assert that, so just check that
// usually this is true
assertSmaller(firstSmaller, firstGreater);
stat.execute("drop table test");
} }
// first prepare time must be always greater because of query cache,
// but JVM is too unpredictable to assert that, so just check that
// usually this is true
assertSmaller(firstSmaller, firstGreater);
stat.execute("drop table test");
conn.close();
} }
private void testClearingCacheWithTableStructureChanges() throws Exception { private void testClearingCacheWithTableStructureChanges() throws Exception {
Connection conn = getConnection("queryCache;QUERY_CACHE_SIZE=10"); try (Connection conn = getConnection("queryCache;QUERY_CACHE_SIZE=10")) {
assertThrows(ErrorCode.TABLE_OR_VIEW_NOT_FOUND_1, conn). assertThrows(ErrorCode.TABLE_OR_VIEW_NOT_FOUND_1, conn).
prepareStatement("SELECT * FROM TEST"); prepareStatement("SELECT * FROM TEST");
Statement stat = conn.createStatement(); Statement stat = conn.createStatement();
stat.executeUpdate("CREATE TABLE TEST(col1 bigint, col2 varchar(255))"); stat.executeUpdate("CREATE TABLE TEST(col1 bigint, col2 varchar(255))");
PreparedStatement prep = conn.prepareStatement("SELECT * FROM TEST"); PreparedStatement prep = conn.prepareStatement("SELECT * FROM TEST");
prep.close(); prep.close();
stat.executeUpdate("DROP TABLE TEST"); stat.executeUpdate("DROP TABLE TEST");
assertThrows(ErrorCode.TABLE_OR_VIEW_NOT_FOUND_1, conn). assertThrows(ErrorCode.TABLE_OR_VIEW_NOT_FOUND_1, conn).
prepareStatement("SELECT * FROM TEST"); prepareStatement("SELECT * FROM TEST");
conn.close(); }
} }
} }
...@@ -33,34 +33,36 @@ public class TestShow extends TestBase { ...@@ -33,34 +33,36 @@ public class TestShow extends TestBase {
} }
private void testPgCompatibility() throws SQLException { private void testPgCompatibility() throws SQLException {
Connection conn = getConnection("mem:pg"); try (Connection conn = getConnection("mem:pg")) {
Statement stat = conn.createStatement(); Statement stat = conn.createStatement();
assertResult("UNICODE", stat, "SHOW CLIENT_ENCODING"); assertResult("UNICODE", stat, "SHOW CLIENT_ENCODING");
assertResult("read committed", stat, "SHOW DEFAULT_TRANSACTION_ISOLATION"); assertResult("read committed", stat, "SHOW DEFAULT_TRANSACTION_ISOLATION");
assertResult("read committed", stat, "SHOW TRANSACTION ISOLATION LEVEL"); assertResult("read committed", stat, "SHOW TRANSACTION ISOLATION LEVEL");
assertResult("ISO", stat, "SHOW DATESTYLE"); assertResult("ISO", stat, "SHOW DATESTYLE");
assertResult("8.1.4", stat, "SHOW SERVER_VERSION"); assertResult("8.1.4", stat, "SHOW SERVER_VERSION");
assertResult("UTF8", stat, "SHOW SERVER_ENCODING"); assertResult("UTF8", stat, "SHOW SERVER_ENCODING");
}
} }
private void testMysqlCompatibility() throws SQLException { private void testMysqlCompatibility() throws SQLException {
Connection conn = getConnection("mem:pg"); try (Connection conn = getConnection("mem:pg")) {
Statement stat = conn.createStatement(); Statement stat = conn.createStatement();
ResultSet rs; ResultSet rs;
// show tables without a schema // show tables without a schema
stat.execute("create table person(id int, name varchar)"); stat.execute("create table person(id int, name varchar)");
rs = stat.executeQuery("SHOW TABLES"); rs = stat.executeQuery("SHOW TABLES");
assertTrue(rs.next()); assertTrue(rs.next());
assertEquals("PERSON", rs.getString(1)); assertEquals("PERSON", rs.getString(1));
assertEquals("PUBLIC", rs.getString(2)); assertEquals("PUBLIC", rs.getString(2));
assertFalse(rs.next()); assertFalse(rs.next());
// show tables with a schema // show tables with a schema
assertResultRowCount(1, stat.executeQuery("SHOW TABLES FROM PUBLIC")); assertResultRowCount(1, stat.executeQuery("SHOW TABLES FROM PUBLIC"));
// columns // columns
assertResultRowCount(2, stat.executeQuery("SHOW COLUMNS FROM person")); assertResultRowCount(2, stat.executeQuery("SHOW COLUMNS FROM person"));
}
} }
} }
...@@ -1064,96 +1064,99 @@ public class TestSpatial extends TestBase { ...@@ -1064,96 +1064,99 @@ public class TestSpatial extends TestBase {
private void testInsertNull() throws SQLException { private void testInsertNull() throws SQLException {
deleteDb("spatial"); deleteDb("spatial");
Connection conn = getConnection(URL); try (Connection conn = getConnection(URL)) {
Statement stat = conn.createStatement(); Statement stat = conn.createStatement();
stat.execute("\n" + stat.execute("\n" +
"drop table if exists PUBLIC.DUMMY_12;\n" + "drop table if exists PUBLIC.DUMMY_12;\n" +
"CREATE TABLE PUBLIC.DUMMY_12 (\n" + "CREATE TABLE PUBLIC.DUMMY_12 (\n" +
" \"fid\" serial,\n" + " \"fid\" serial,\n" +
" Z_ID INTEGER,\n" + " Z_ID INTEGER,\n" +
" GEOM GEOMETRY,\n" + " GEOM GEOMETRY,\n" +
" CONSTRAINT CONSTRAINT_DUMMY_12 PRIMARY KEY (\"fid\")\n" + " CONSTRAINT CONSTRAINT_DUMMY_12 PRIMARY KEY (\"fid\")\n" +
");\n" + ");\n" +
"CREATE INDEX PRIMARY_KEY_DUMMY_12 ON PUBLIC.DUMMY_12 (\"fid\");\n" + "CREATE INDEX PRIMARY_KEY_DUMMY_12 ON PUBLIC.DUMMY_12 (\"fid\");\n" +
"CREATE spatial INDEX PUBLIC_DUMMY_12_SPATIAL_INDEX_ ON PUBLIC.DUMMY_12 (GEOM);\n" + "CREATE spatial INDEX PUBLIC_DUMMY_12_SPATIAL_INDEX_ ON PUBLIC.DUMMY_12 (GEOM);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (123,3125163,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (123,3125163,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (124,3125164,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (124,3125164,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (125,3125173,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (125,3125173,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (126,3125174,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (126,3125174,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (127,3125175,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (127,3125175,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (128,3125176,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (128,3125176,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (129,3125177,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (129,3125177,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (130,3125178,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (130,3125178,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (131,3125179,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (131,3125179,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (132,3125180,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (132,3125180,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (133,3125335,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (133,3125335,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (134,3125336,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (134,3125336,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (135,3125165,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (135,3125165,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (136,3125337,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (136,3125337,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (137,3125338,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (137,3125338,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (138,3125339,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (138,3125339,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (139,3125340,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (139,3125340,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (140,3125341,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (140,3125341,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (141,3125342,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (141,3125342,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (142,3125343,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (142,3125343,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (143,3125344,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (143,3125344,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (144,3125345,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (144,3125345,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (145,3125346,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (145,3125346,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (146,3125166,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (146,3125166,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (147,3125347,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (147,3125347,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (148,3125348,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (148,3125348,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (149,3125349,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (149,3125349,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (150,3125350,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (150,3125350,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (151,3125351,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (151,3125351,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (152,3125352,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (152,3125352,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (153,3125353,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (153,3125353,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (154,3125354,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (154,3125354,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (155,3125355,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (155,3125355,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (156,3125356,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (156,3125356,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (157,3125167,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (157,3125167,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (158,3125357,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (158,3125357,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (159,3125358,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (159,3125358,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (160,3125359,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (160,3125359,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (161,3125360,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (161,3125360,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (162,3125361,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (162,3125361,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (163,3125362,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (163,3125362,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (164,3125363,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (164,3125363,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (165,3125364,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (165,3125364,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (166,3125365,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (166,3125365,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (167,3125366,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (167,3125366,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (168,3125168,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (168,3125168,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (169,3125367,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (169,3125367,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (170,3125368,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (170,3125368,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (171,3125369,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (171,3125369,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (172,3125370,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (172,3125370,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (173,3125169,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (173,3125169,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (174,3125170,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (174,3125170,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (175,3125171,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (175,3125171,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (176,3125172,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (176,3125172,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (177,-2,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (177,-2,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (178,-1,NULL);\n" + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (178,-1,NULL);\n" +
"INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (179," + "INSERT INTO PUBLIC.DUMMY_12 (\"fid\",Z_ID,GEOM) VALUES (179," +
"-1,NULL);"); "-1,NULL);");
try (ResultSet rs = stat.executeQuery("select * from DUMMY_12")) { try (ResultSet rs = stat.executeQuery("select * from DUMMY_12")) {
assertTrue(rs.next()); assertTrue(rs.next());
}
} }
deleteDb("spatial");
} }
private void testSpatialIndexWithOrder() throws SQLException { private void testSpatialIndexWithOrder() throws SQLException {
deleteDb("spatial"); deleteDb("spatial");
Connection conn = getConnection(URL); try (Connection conn = getConnection(URL)) {
Statement stat = conn.createStatement(); Statement stat = conn.createStatement();
stat.execute("DROP TABLE IF EXISTS BUILDINGS;" + stat.execute("DROP TABLE IF EXISTS BUILDINGS;" +
"CREATE TABLE BUILDINGS (PK serial, THE_GEOM geometry);" + "CREATE TABLE BUILDINGS (PK serial, THE_GEOM geometry);" +
"insert into buildings(the_geom) SELECT 'POINT(1 1)" + "insert into buildings(the_geom) SELECT 'POINT(1 1)" +
"'::geometry from SYSTEM_RANGE(1,10000);\n" + "'::geometry from SYSTEM_RANGE(1,10000);\n" +
"CREATE SPATIAL INDEX ON PUBLIC.BUILDINGS(THE_GEOM);\n"); "CREATE SPATIAL INDEX ON PUBLIC.BUILDINGS(THE_GEOM);\n");
try (ResultSet rs = stat.executeQuery("EXPLAIN SELECT * FROM " + try (ResultSet rs = stat.executeQuery("EXPLAIN SELECT * FROM " +
"BUILDINGS ORDER BY PK LIMIT 51;")) { "BUILDINGS ORDER BY PK LIMIT 51;")) {
assertTrue(rs.next()); assertTrue(rs.next());
assertTrue(rs.getString(1).contains("PRIMARY_KEY")); assertTrue(rs.getString(1).contains("PRIMARY_KEY"));
}
} }
deleteDb("spatial");
} }
} }
...@@ -45,6 +45,7 @@ public class TestConnection extends TestBase { ...@@ -45,6 +45,7 @@ public class TestConnection extends TestBase {
assertThrows(SQLClientInfoException.class, conn).setClientInfo("numServers", "SomeValue"); assertThrows(SQLClientInfoException.class, conn).setClientInfo("numServers", "SomeValue");
assertThrows(SQLClientInfoException.class, conn).setClientInfo("server23", "SomeValue"); assertThrows(SQLClientInfoException.class, conn).setClientInfo("server23", "SomeValue");
conn.close();
} }
private void testSetUnsupportedClientInfoProperties() throws SQLException { private void testSetUnsupportedClientInfoProperties() throws SQLException {
...@@ -54,6 +55,7 @@ public class TestConnection extends TestBase { ...@@ -54,6 +55,7 @@ public class TestConnection extends TestBase {
properties.put("ClientUser", "someUser"); properties.put("ClientUser", "someUser");
assertThrows(SQLClientInfoException.class, conn).setClientInfo(properties); assertThrows(SQLClientInfoException.class, conn).setClientInfo(properties);
conn.close();
} }
private void testSetSupportedClientInfoProperties() throws SQLException { private void testSetSupportedClientInfoProperties() throws SQLException {
...@@ -67,6 +69,7 @@ public class TestConnection extends TestBase { ...@@ -67,6 +69,7 @@ public class TestConnection extends TestBase {
assertNull(conn.getClientInfo("ApplicationName")); assertNull(conn.getClientInfo("ApplicationName"));
// new property has been set // new property has been set
assertEquals(conn.getClientInfo("ClientUser"), "someUser"); assertEquals(conn.getClientInfo("ClientUser"), "someUser");
conn.close();
} }
private void testSetSupportedClientInfo() throws SQLException { private void testSetSupportedClientInfo() throws SQLException {
...@@ -74,17 +77,20 @@ public class TestConnection extends TestBase { ...@@ -74,17 +77,20 @@ public class TestConnection extends TestBase {
conn.setClientInfo("ApplicationName", "Connection Test"); conn.setClientInfo("ApplicationName", "Connection Test");
assertEquals(conn.getClientInfo("ApplicationName"), "Connection Test"); assertEquals(conn.getClientInfo("ApplicationName"), "Connection Test");
conn.close();
} }
private void testSetUnsupportedClientInfo() throws SQLException { private void testSetUnsupportedClientInfo() throws SQLException {
Connection conn = getConnection("clientInfoDB2;MODE=DB2"); Connection conn = getConnection("clientInfoDB2;MODE=DB2");
assertThrows(SQLClientInfoException.class, conn).setClientInfo( assertThrows(SQLClientInfoException.class, conn).setClientInfo(
"UnsupportedName", "SomeValue"); "UnsupportedName", "SomeValue");
conn.close();
} }
private void testGetUnsupportedClientInfo() throws SQLException { private void testGetUnsupportedClientInfo() throws SQLException {
Connection conn = getConnection("clientInfo"); Connection conn = getConnection("clientInfo");
assertNull(conn.getClientInfo("UnknownProperty")); assertNull(conn.getClientInfo("UnknownProperty"));
conn.close();
} }
private void testSetGetSchema() throws SQLException { private void testSetGetSchema() throws SQLException {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论