/*
* 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 org.h2.constant.ErrorCode;
import org.h2.test.TestBase;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* Test ALTER SCHEMA RENAME statements.
*/
public class TestAlterSchemaRename extends TestBase {
private Connection conn;
private Statement stat;
/**
* Run just this test.
*
* @param a ignored
*/
public static void main(String... a) throws Exception {
TestBase.createCaller().init().test();
}
public void test() throws Exception {
deleteDb("alter");
conn = getConnection("alter");
stat = conn.createStatement();
testTryToRenameSystemSchemas();
testSimpleRename();
testRenameToExistingSchema();
testCrossSchemaViews();
testAlias();
conn.close();
deleteDb("alter");
}
private void testTryToRenameSystemSchemas() throws SQLException {
assertThrows(ErrorCode.SCHEMA_CAN_NOT_BE_DROPPED_1, stat).
execute("alter schema information_schema rename to test_info");
stat.execute("create sequence test_sequence");
assertThrows(ErrorCode.SCHEMA_CAN_NOT_BE_DROPPED_1, stat).
execute("alter schema public rename to test_schema");
}
private void testSimpleRename() throws SQLException {
stat.execute("create schema s1");
stat.execute("create table s1.tab(val int)");
stat.execute("insert into s1.tab(val) values (3)");
ResultSet rs = stat.executeQuery("select * from s1.tab");
assertTrue(rs.next());
assertEquals(3, rs.getInt(1));
stat.execute("alter schema s1 rename to s2");
rs = stat.executeQuery("select * from s2.tab");
assertTrue(rs.next());
assertEquals(3, rs.getInt(1));
stat.execute("drop schema s2");
}
private void testRenameToExistingSchema() throws SQLException {
stat.execute("create schema s1");
stat.execute("create schema s2");
assertThrows(ErrorCode.SCHEMA_ALREADY_EXISTS_1, stat).
execute("alter schema s1 rename to s2");
stat.execute("drop schema s1");
stat.execute("drop schema s2");
}
private void testCrossSchemaViews() throws SQLException {
stat.execute("create schema s1");
stat.execute("create schema s2");
stat.execute("create table s1.tab(val int)");
stat.execute("insert into s1.tab(val) values (3)");
stat.execute("create view s1.v1 as select * from s1.tab");
stat.execute("create view s2.v1 as select val * 2 from s1.tab");
stat.execute("alter schema s2 rename to s2_new");
ResultSet rs = stat.executeQuery("select * from s1.v1");
assertTrue(rs.next());
assertEquals(3, rs.getInt(1));
rs = stat.executeQuery("select * from s2_new.v1");
assertTrue(rs.next());
assertEquals(6, rs.getInt(1));
if (!config.memory) {
conn.close();
conn = getConnection("alter");
stat = conn.createStatement();
stat.executeQuery("select * from s2_new.v1");
}
stat.execute("drop schema s1");
stat.execute("drop schema s2_new");
}
/**
* Check that aliases in the schema got moved
*/
private void testAlias() throws SQLException {
stat.execute("create schema s1");
stat.execute("CREATE ALIAS S1.REVERSE AS $$ " +
"String reverse(String s) {" +
" return new StringBuilder(s).reverse().toString();" +
"} $$;");
stat.execute("alter schema s1 rename to s2");
ResultSet rs = stat.executeQuery("CALL S2.REVERSE('1234')");
assertTrue(rs.next());
assertEquals("4321", rs.getString(1));
if (!config.memory) {
conn.close();
conn = getConnection("alter");
stat = conn.createStatement();
stat.executeQuery("CALL S2.REVERSE('1234')");
}
stat.execute("drop schema s2");
}
}