You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by da...@apache.org on 2007/11/22 14:49:02 UTC
svn commit: r597409 - in /db/derby/code/trunk/java:
engine/org/apache/derby/impl/sql/catalog/
testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/
testing/org/apache/derbyTesting/junit/
Author: dag
Date: Thu Nov 22 05:48:57 2007
New Revision: 597409
URL: http://svn.apache.org/viewvc?rev=597409&view=rev
Log:
DERBY-3191 SQL roles: add upgrade support
Patch DERBY-3191b; adds hard upgrade code for the new roles system table SYS.SYSROLES,
plus tests for this functionality to the upgrade tests.
Modified:
db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DD_Version.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_4.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/PhaseChanger.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/UpgradeRun.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/TestConfiguration.java
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DD_Version.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DD_Version.java?rev=597409&r1=597408&r2=597409&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DD_Version.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DD_Version.java Thu Nov 22 05:48:57 2007
@@ -363,6 +363,13 @@
*/
+ if (fromMajorVersionNumber <= DataDictionary.DD_VERSION_DERBY_10_3)
+ {
+ // Add new system catalogs created for roles
+ bootingDictionary.upgradeMakeCatalog(
+ tc, DataDictionary.SYSROLES_CATALOG_NUM);
+ }
+
if (fromMajorVersionNumber <= DataDictionary.DD_VERSION_DERBY_10_1)
{
// add catalogs 1st, subsequent procedure adding may depend on
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_4.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_4.java?rev=597409&r1=597408&r2=597409&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_4.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_4.java Thu Nov 22 05:48:57 2007
@@ -29,6 +29,7 @@
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
+import java.sql.CallableStatement;
import javax.sql.DataSource;
@@ -180,4 +181,170 @@
s.close();
}
+ /**
+ * Check that you must be hard-upgraded to 10.4 or later in order to use
+ * SQL roles
+ * @throws SQLException
+ *
+ */
+ public void testSQLRolesBasic() throws SQLException
+ {
+ // The standard upgrade database doesn't have sqlAuthorization
+ // set, so we can only check if the system tables for roles is
+ // present.
+
+ Statement s = createStatement();
+ String createRoleText = "create role foo";
+
+ switch (getPhase())
+ {
+ case PH_CREATE:
+ assertStatementError("42X01", s, createRoleText );
+ break;
+
+ case PH_SOFT_UPGRADE:
+ // needs hard upgrade
+ assertStatementError("XCL47", s, createRoleText );
+ break;
+
+ case PH_POST_SOFT_UPGRADE:
+ assertStatementError("42X01", s, createRoleText );
+ break;
+
+ case PH_HARD_UPGRADE:
+ case PH_POST_HARD_UPGRADE:
+ // not supported because SQL authorization not set
+ assertStatementError("42Z60", s, createRoleText );
+ break;
+ }
+
+ s.close();
+ }
+
+ /**
+ * Check that when hard-upgraded to 10.4 or later SQL roles can be
+ * declared if DB has sqlAuthorization.
+ * @throws SQLException
+ *
+ */
+ public void testSQLRoles() throws SQLException
+ {
+ // Do rudimentary sanity checking: that we can create and drop roles
+ // when we are database owner. If so, we can presume SYS.SYSROLES
+ // has been upgraded correctly.
+
+ DataSource ds = JDBCDataSource.getDataSourceLogical("ROLES_10_4");
+ String createRoleText = "create role foo";
+ String dropRoleText = "drop role foo";
+ Connection conn = null;
+ Statement s = null;
+ boolean supportSqlAuthorization = oldAtLeast(10, 2);
+
+ JDBCDataSource.setBeanProperty(ds, "user", "garfield");
+ JDBCDataSource.setBeanProperty(ds, "password", "theCat");
+
+ switch (getPhase()) {
+ case PH_CREATE:
+ // create the database if it was not already created.
+ JDBCDataSource.setBeanProperty(ds, "createDatabase", "create");
+ conn = ds.getConnection();
+
+ // Make the database have std security, and define
+ // a database user for the database owner).
+ CallableStatement cs = conn.prepareCall(
+ "call syscs_util.syscs_set_database_property(?,?)");
+
+ cs.setString(1, "derby.connection.requireAuthentication");
+ cs.setString(2, "true");
+ cs.execute();
+
+ cs.setString(1, "derby.authentication.provider");
+ cs.setString(2, "BUILTIN");
+ cs.execute();
+
+ cs.setString(1, "derby.database.sqlAuthorization");
+ cs.setString(2, "true");
+ cs.execute();
+
+ cs.setString(1, "derby.database.propertiesOnly");
+ cs.setString(2, "true");
+ cs.execute();
+
+ cs.setString(1, "derby.user.garfield");
+ cs.setString(2, "theCat");
+ cs.execute();
+
+ conn.close();
+
+ JDBCDataSource.shutdownDatabase(ds);
+ break;
+
+ case PH_SOFT_UPGRADE:
+ /* We can't always do soft upgrade, because when
+ * sqlAuthorization is set and we are coming from a
+ * pre-10.2 database, connecting will fail with a message
+ * to hard upgrade before setting sqlAuthorization, so we
+ * skip this step.
+ */
+ if (oldAtLeast(10,2)) {
+ // needs hard upgrade
+ conn = ds.getConnection();
+ s = conn.createStatement();
+
+ assertStatementError("XCL47", s, createRoleText );
+ conn.close();
+
+ JDBCDataSource.shutdownDatabase(ds);
+ }
+ break;
+
+ case PH_POST_SOFT_UPGRADE:
+ conn = ds.getConnection();
+ s = conn.createStatement();
+
+ // syntax error
+ assertStatementError("42X01", s, createRoleText );
+ conn.close();
+
+ JDBCDataSource.shutdownDatabase(ds);
+ break;
+
+ case PH_HARD_UPGRADE:
+ JDBCDataSource.setBeanProperty(
+ ds, "connectionAttributes", "upgrade=true");
+ conn = ds.getConnection();
+ s = conn.createStatement();
+
+ // should work now
+ try {
+ s.execute(createRoleText);
+ } catch (SQLException e) {
+ fail("can't create role on hard upgrade");
+ }
+
+ s.execute(dropRoleText);
+ conn.close();
+
+ JDBCDataSource.clearStringBeanProperty(ds, "connectionAttributes");
+ JDBCDataSource.shutdownDatabase(ds);
+ break;
+
+ case PH_POST_HARD_UPGRADE:
+ conn = ds.getConnection();
+ s = conn.createStatement();
+
+ // should work now
+ try {
+ s.execute(createRoleText);
+ } catch (SQLException e) {
+ fail("can't create role post hard upgrade");
+ }
+
+ s.execute(dropRoleText);
+ conn.close();
+
+ JDBCDataSource.shutdownDatabase(ds);
+ break;
+ }
+ }
}
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/PhaseChanger.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/PhaseChanger.java?rev=597409&r1=597408&r2=597409&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/PhaseChanger.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/PhaseChanger.java Thu Nov 22 05:48:57 2007
@@ -109,21 +109,25 @@
for (int i = 0; i < UpgradeRun.ADDITIONAL_DBS.length; i++)
{
ds = JDBCDataSource.getDataSourceLogical(
- UpgradeRun.ADDITIONAL_DBS[i]);
-
- boolean shutdown = true;
- try {
- ds.getConnection().close();
- } catch (SQLException e) {
- // if the database was never created
- // don't bother shutting it down
- String sqlState = e.getSQLState();
- if ("XJ004".equals(sqlState) || "XJ040".equals(sqlState))
- shutdown = false;
- }
-
- if (shutdown)
- JDBCDataSource.shutdownDatabase(ds);
+ UpgradeRun.ADDITIONAL_DBS[i].logicalName);
+
+ if (UpgradeRun.ADDITIONAL_DBS[i].shutDown) {
+ boolean shutdown = true;
+ try {
+ ds.getConnection().close();
+ } catch (SQLException e) {
+ // if the database was never created
+ // don't bother shutting it down
+ String sqlState = e.getSQLState();
+ if ("XJ004".equals(sqlState) ||
+ "XJ040".equals(sqlState)) {
+ shutdown = false;
+ }
+ }
+
+ if (shutdown)
+ JDBCDataSource.shutdownDatabase(ds);
+ } // else done by test
}
}
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/UpgradeRun.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/UpgradeRun.java?rev=597409&r1=597408&r2=597409&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/UpgradeRun.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/UpgradeRun.java Thu Nov 22 05:48:57 2007
@@ -64,14 +64,22 @@
* They are only created if a test opens a
* connection against them. In hard upgrade the test
* must explictly upgrade the database.
- * The databases are shutdown at the end of each phase.
+ * The databases are shutdown at the end of each phase, unless
+ * "NoShutDown" is specified. The latter is used by databases
+ * which need sqlAuthorization (specified by test). This thwarts
+ * normal shutdown since credentials are required so shutdown is
+ * done in test, not by the tearDown methods. See
+ * Changes10_4#testSQLRoles for example.
*/
- static final String[] ADDITIONAL_DBS = {
- "COLLATED_DB_10_3",//db with territory based collation
- "NO_ENCRYPT_10_2",
- "ENCRYPT_10_2"
+
+ static final AdditionalDb[] ADDITIONAL_DBS = {
+ new AdditionalDb("COLLATED_DB_10_3", true), // db with territory
+ // based collation
+ new AdditionalDb("NO_ENCRYPT_10_2", true),
+ new AdditionalDb("ENCRYPT_10_2", true),
+ new AdditionalDb("ROLES_10_4", false)
};
-
+
private static String getTextVersion(int[] iv)
{
String version = iv[0] + "." + iv[1] +
@@ -81,7 +89,6 @@
public final static Test suite(final int[] version) {
-
ClassLoader oldLoader = (ClassLoader )AccessController.doPrivileged
(new java.security.PrivilegedAction(){
@@ -135,8 +142,13 @@
for (int i = 0; i < ADDITIONAL_DBS.length; i++)
{
- setup = TestConfiguration.additionalDatabaseDecorator(setup,
- ADDITIONAL_DBS[i]);
+ if (ADDITIONAL_DBS[i].shutDown) {
+ setup = TestConfiguration.additionalDatabaseDecorator(
+ setup, ADDITIONAL_DBS[i].logicalName);
+ } else {
+ setup = TestConfiguration.additionalDatabaseDecoratorNoShutdown(
+ setup, ADDITIONAL_DBS[i].logicalName);
+ }
}
Properties preReleaseUpgrade = new Properties();
@@ -385,5 +397,17 @@
suite.addTest(new DatabaseMetaDataTest(name));
}
}
+ }
+
+}
+
+class AdditionalDb
+{
+ final String logicalName;
+ final boolean shutDown;
+ public AdditionalDb(String logicalName, boolean shutDown)
+ {
+ this.logicalName = logicalName;
+ this.shutDown = shutDown;
}
}
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/TestConfiguration.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/TestConfiguration.java?rev=597409&r1=597408&r2=597409&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/TestConfiguration.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/TestConfiguration.java Thu Nov 22 05:48:57 2007
@@ -435,6 +435,35 @@
}
/**
+ * Similar to additionalDatabaseDecorator except the database will
+ * not be shutdown, only deleted. It is the responsibility of the
+ * test to shut it down.
+ *
+ * @param test Test to be decorated
+ * @param logicalDbName The logical database name. This name is
+ * used to identify the database in
+ * openConnection(String logicalDatabaseName)
+ * method calls.
+ * @return decorated test.
+ */
+ public static TestSetup additionalDatabaseDecoratorNoShutdown(
+ Test test,
+ String logicalDbName)
+ {
+ return new DatabaseChangeSetup(
+ new DropDatabaseSetup(test, logicalDbName)
+ {
+ protected void tearDown() throws Exception {
+ // the test is responsible for shutdown
+ removeDatabase();
+ }
+ },
+ logicalDbName,
+ generateUniqueDatabaseName(),
+ false);
+ }
+
+ /**
* Decorate a test changing the default user name and password.
* Typically used along with DatabasePropertyTestSetup.builtinAuthentication.
* The tearDown method resets the default user and password value to