/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.test.db;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.h2.test.TestBase;
/**
* Tests the sequence feature of this database.
*/
public class TestSequence extends TestBase {
/**
* Run just this test.
*
* @param a ignored
*/
public static void main(String... a) throws Exception {
TestBase.createCaller().init().test();
}
public void test() throws SQLException {
testSchemaSearchPath();
testAlterSequenceColumn();
testAlterSequence();
testCache();
testTwo();
deleteDb("sequence");
}
private void testSchemaSearchPath() throws SQLException {
deleteDb("sequence");
Connection conn = getConnection("sequence");
Statement stat = conn.createStatement();
stat.execute("CREATE SCHEMA TEST");
stat.execute("CREATE SEQUENCE TEST.TEST_SEQ");
stat.execute("SET SCHEMA_SEARCH_PATH PUBLIC, TEST");
stat.execute("CALL TEST_SEQ.NEXTVAL");
stat.execute("CALL TEST_SEQ.CURRVAL");
conn.close();
}
private void testAlterSequenceColumn() throws SQLException {
deleteDb("sequence");
Connection conn = getConnection("sequence");
Statement stat = conn.createStatement();
stat.execute("CREATE TABLE TEST(ID INT , NAME VARCHAR(255))");
stat.execute("INSERT INTO TEST VALUES(1, 'Hello')");
stat.execute("ALTER TABLE TEST ALTER COLUMN ID INT IDENTITY");
stat.execute("ALTER TABLE test ALTER COLUMN ID RESTART WITH 3");
stat.execute("INSERT INTO TEST (name) VALUES('Other World')");
conn.close();
}
private void testAlterSequence() throws SQLException {
deleteDb("sequence");
Connection conn = getConnection("sequence");
Statement stat = conn.createStatement();
stat.execute("create sequence test");
conn.setAutoCommit(false);
stat.execute("alter sequence test restart with 1");
for (int i = 0; i < 40; i++) {
stat.execute("select nextval('test')");
}
conn.close();
}
private void testCache() throws SQLException {
if (config.memory) {
return;
}
deleteDb("sequence");
Connection conn = getConnection("sequence");
Statement stat = conn.createStatement();
stat.execute("create sequence test_Sequence");
stat.execute("create sequence test_Sequence3 cache 3");
conn.close();
conn = getConnection("sequence");
stat = conn.createStatement();
stat.execute("call next value for test_Sequence");
stat.execute("call next value for test_Sequence3");
ResultSet rs = stat.executeQuery("select * from information_schema.sequences order by sequence_name");
rs.next();
assertEquals("TEST_SEQUENCE", rs.getString("SEQUENCE_NAME"));
assertEquals("32", rs.getString("CACHE"));
rs.next();
assertEquals("TEST_SEQUENCE3", rs.getString("SEQUENCE_NAME"));
assertEquals("3", rs.getString("CACHE"));
assertFalse(rs.next());
conn.close();
}
private void testTwo() throws SQLException {
deleteDb("sequence");
Connection conn = getConnection("sequence");
Statement stat = conn.createStatement();
stat.execute("create sequence testSequence");
conn.setAutoCommit(false);
Connection conn2 = getConnection("sequence");
Statement stat2 = conn2.createStatement();
conn2.setAutoCommit(false);
long last = 0;
for (int i = 0; i < 100; i++) {
long v1 = getNext(stat);
assertTrue(v1 > last);
last = v1;
for (int j = 0; j < 100; j++) {
long v2 = getNext(stat2);
assertTrue(v2 > last);
last = v2;
}
}
conn2.close();
conn.close();
}
private static long getNext(Statement stat) throws SQLException {
ResultSet rs = stat.executeQuery("call next value for testSequence");
rs.next();
long value = rs.getLong(1);
return value;
}
}