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 ma...@apache.org on 2012/06/09 01:20:08 UTC

svn commit: r1348275 - in /db/derby/code/trunk/java: engine/org/apache/derby/catalog/ engine/org/apache/derby/iapi/sql/dictionary/ engine/org/apache/derby/impl/sql/catalog/ storeless/org/apache/derby/impl/storeless/ testing/org/apache/derbyTesting/func...

Author: mamta
Date: Fri Jun  8 23:20:07 2012
New Revision: 1348275

URL: http://svn.apache.org/viewvc?rev=1348275&view=rev
Log:
DERBY-5578 Provide a way to invalidate stored prepared statements 

Commiting changes for adding a new procedure(SYSCS_UTIL.SYSCS_INVALIDATE_STORED_STATEMENTS) which will allow users to invalidate all the stored statements inside SYS.SYSSTATEMENTS. At this point, there are only two types of stored statements in SYS.SYSSTATEMENTS system table - statements for metadata calls and statements for trigger action plans. I have also added test cases including the regression tests and upgrade tests. Upgrade tests show that this procedure is available only after hard upgrade. Regression test show how the procedure can be executed only by dba unless dba grants execute permission to other users. Additionally, it has test cases showing statements getting invalidated by the procedure call and subsequent execution of metadata call or trigger causing their corresponding statements to become valid. 

Since these changes fiddle around with system tables, this jira can't be backported to released branches. 


Added:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_10.java   (with props)
Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/catalog/SystemProcedures.java
    db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/DataDictionary.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DataDictionaryImpl.java
    db/derby/code/trunk/java/storeless/org/apache/derby/impl/storeless/EmptyDictionary.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/GrantRevokeDDLTest.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/TriggerTest.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/UpgradeRun.java

Modified: db/derby/code/trunk/java/engine/org/apache/derby/catalog/SystemProcedures.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/catalog/SystemProcedures.java?rev=1348275&r1=1348274&r2=1348275&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/catalog/SystemProcedures.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/catalog/SystemProcedures.java Fri Jun  8 23:20:07 2012
@@ -1925,6 +1925,23 @@ public class SystemProcedures  {
             throw PublicAPI.wrapStandardException(se);
         }
     }
+        
+    /**
+     * Invalidate all the stored statements so they will get recompiled when
+     *  executed next time around.
+     */
+    public static void SYSCS_INVALIDATE_STORED_STATEMENTS()
+       throws SQLException
+    {
+    	LanguageConnectionContext lcc = ConnectionUtil.getCurrentLCC();
+        
+        DataDictionary dd = lcc.getDataDictionary();
+        try {
+        	dd.invalidateAllSPSPlans(lcc);
+        } catch (StandardException se) {
+            throw PublicAPI.wrapStandardException(se);
+        }
+    }
     
     /**
      * Empty as much of the cache as possible. It is not guaranteed 

Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/DataDictionary.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/DataDictionary.java?rev=1348275&r1=1348274&r2=1348275&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/DataDictionary.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/DataDictionary.java Fri Jun  8 23:20:07 2012
@@ -1158,6 +1158,13 @@ public interface DataDictionary
 	) throws StandardException;
 
 	/**
+	 * Invalidate all the stored plans in SYS.SYSSTATEMENTS for
+	 *  the given language connection context.
+	 * @exception StandardException		Thrown on error
+	 */
+	public void invalidateAllSPSPlans(LanguageConnectionContext lcc) throws StandardException;
+
+	/**
 	 * Invalidate all the stored plans in SYS.SYSSTATEMENTS. 
 	 * @exception StandardException		Thrown on error
 	 */

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DataDictionaryImpl.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DataDictionaryImpl.java?rev=1348275&r1=1348274&r2=1348275&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DataDictionaryImpl.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DataDictionaryImpl.java Fri Jun  8 23:20:07 2012
@@ -4573,6 +4573,15 @@ public final class	DataDictionaryImpl
 	{
 		LanguageConnectionContext lcc = (LanguageConnectionContext) 
 			ContextService.getContext(LanguageConnectionContext.CONTEXT_ID);
+		invalidateAllSPSPlans(lcc);
+	}
+
+	/**
+	 * @see DataDictionary#invalidateAllSPSPlans
+	 * @exception StandardException		Thrown on error
+	 */
+	public void invalidateAllSPSPlans(LanguageConnectionContext lcc) throws StandardException
+	{
 		startWriting(lcc);
 
 		for (java.util.Iterator li = getAllSPSDescriptors().iterator(); li.hasNext(); )
@@ -13258,6 +13267,22 @@ public final class	DataDictionaryImpl
                 newlyCreatedRoutines,
                 tc);
         }
+        
+        // void SYSCS_UTIL.SYSCS_INVALIDATE_STORED_STATEMENTS()
+        {               
+            createSystemProcedureOrFunction(
+                "SYSCS_INVALIDATE_STORED_STATEMENTS",
+                sysUtilUUID,
+                (String[]) null,
+                (TypeDescriptor[]) null,
+                0,
+                0,
+                RoutineAliasInfo.NO_SQL,
+                false,
+                (TypeDescriptor) null,
+                newlyCreatedRoutines,
+                tc);
+        }
     }
 
 

Modified: db/derby/code/trunk/java/storeless/org/apache/derby/impl/storeless/EmptyDictionary.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/storeless/org/apache/derby/impl/storeless/EmptyDictionary.java?rev=1348275&r1=1348274&r2=1348275&view=diff
==============================================================================
--- db/derby/code/trunk/java/storeless/org/apache/derby/impl/storeless/EmptyDictionary.java (original)
+++ db/derby/code/trunk/java/storeless/org/apache/derby/impl/storeless/EmptyDictionary.java Fri Jun  8 23:20:07 2012
@@ -499,6 +499,12 @@ public class EmptyDictionary implements 
 
 	}
 
+	public void invalidateAllSPSPlans(LanguageConnectionContext lcc) 
+			throws StandardException{
+		// Auto-generated method stub
+
+	}
+
 	public String getTriggerActionString(
 			Visitable actionStmt,
 			String oldReferencingName,

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/GrantRevokeDDLTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/GrantRevokeDDLTest.java?rev=1348275&r1=1348274&r2=1348275&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/GrantRevokeDDLTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/GrantRevokeDDLTest.java Fri Jun  8 23:20:07 2012
@@ -82,9 +82,45 @@ public final class GrantRevokeDDLTest ex
         String [][] expRS;
         String [] expColNames;
         
+        // Invalidating all the stored statements by dbo will work
+        cSt = prepareCall(
+            "call SYSCS_UTIL.SYSCS_INVALIDATE_STORED_STATEMENTS()");
+        assertUpdateCount(cSt, 0);
+        cSt.close();
+        
         Connection satConnection = openUserConnection("satheesh");
         Statement st_satConnection = satConnection.createStatement();
         
+        // Try invalidating all the stored statements by user other than the
+        //  dbo. That will fail because dbo has not granted execute permission
+        //  to any one yet on 
+        //  SYSCS_UTIL.SYSCS_INVALIDATE_STORED_STATEMENTS
+        cSt = satConnection.prepareCall(
+            "call SYSCS_UTIL.SYSCS_INVALIDATE_STORED_STATEMENTS()");
+        assertStatementError("42504", cSt);
+        cSt.close();
+
+        //Have dbo grant execute permission on 
+        // SYSCS_UTIL.SYSCS_INVALIDATE_STORED_STATEMENTS()
+        // to one user
+        st.executeUpdate(
+                " grant execute on procedure "
+                + "SYSCS_UTIL.SYSCS_INVALIDATE_STORED_STATEMENTS to satheesh");
+        cSt = satConnection.prepareCall(
+                "call SYSCS_UTIL.SYSCS_INVALIDATE_STORED_STATEMENTS()");
+        assertUpdateCount(cSt, 0);
+        cSt.close();
+        //Have the dbo revoke the execute privilege on 
+        // SYSCS_UTIL.SYSCS_INVALIDATE_STORED_STATEMENTS()
+        st.executeUpdate(
+                "revoke execute on procedure " +
+                "SYSCS_UTIL.SYSCS_INVALIDATE_STORED_STATEMENTS " +
+                "from satheesh restrict");
+        cSt = satConnection.prepareCall(
+                "call SYSCS_UTIL.SYSCS_INVALIDATE_STORED_STATEMENTS()");
+        assertStatementError("42504", cSt);
+        cSt.close();
+        
         // Test table privileges
         
         st = createStatement();

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/TriggerTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/TriggerTest.java?rev=1348275&r1=1348274&r2=1348275&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/TriggerTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/TriggerTest.java Fri Jun  8 23:20:07 2012
@@ -21,8 +21,11 @@
 package org.apache.derbyTesting.functionTests.tests.lang;
 
 import java.io.IOException;
+
 import java.io.InputStream;
+import java.sql.CallableStatement;
 import java.sql.Connection;
+import java.sql.DatabaseMetaData;
 import java.sql.Date;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -107,6 +110,134 @@ public class TriggerTest extends BaseJDB
     }
     
     /**
+     * Test that invalidating stored statements marks the statement invalid
+     *  in SYS.SYSSTATEMENTS. And when one of those invalid statements is
+     *  executed next, it is recompiled and as part of that process, it gets
+     *  marked valid in SYS.SYSSTATEMENTS.
+     * 
+     * @throws SQLException 
+     * 
+     */
+    public void testDerby5578InvalidateAllStatementsProc() throws SQLException
+    {
+        Statement s = createStatement();
+        CallableStatement cSt;
+
+        //Invalidate all the statements in SYS.SYSSTATEMENTS.
+        cSt = prepareCall(
+                "call SYSCS_UTIL.SYSCS_INVALIDATE_STORED_STATEMENTS()");
+        assertUpdateCount(cSt, 0);
+        cSt.close();
+        int numOfRowsInSystatementsBeforeTestStart =
+        		numberOfRowsInSysstatements(s);
+        int numOfInvalidSystatementsBeforeTestStart =
+        		numberOfInvalidStatementsInSysstatements(s);
+        int numOfValidSystatementsBeforeTestStart =
+        		numberOfValidStatementsInSysstatements(s);
+
+        assertEquals("All statements should be invalid in SYS.SYSSTATEMENTS ",
+        		numOfInvalidSystatementsBeforeTestStart,
+        		numOfRowsInSystatementsBeforeTestStart);
+        assertEquals("No statement should be valid in SYS.SYSSTATEMENTS ",
+        		numOfValidSystatementsBeforeTestStart,
+        		0);
+
+        //Create the required tables with data. There will be no change to 
+        // SYS.SYSSTATEMENTS as of yet.
+        s.executeUpdate("create table atdc_16_tab1 (a1 integer, b1 integer, c1 integer)");
+        s.executeUpdate("create table atdc_16_tab2 (a2 integer, b2 integer, c2 integer)");
+        s.executeUpdate("insert into atdc_16_tab1 values(1,11,111)");
+        s.executeUpdate("insert into atdc_16_tab2 values(1,11,111)");
+        assertEquals("# of valid statements in SYS.SYSSTATEMENTS should not change",
+        		numberOfValidStatementsInSysstatements(s),
+        		numOfValidSystatementsBeforeTestStart);
+        assertEquals("# of invalid statements in SYS.SYSSTATEMENTS should not change",
+        		numberOfInvalidStatementsInSysstatements(s),
+        		numOfInvalidSystatementsBeforeTestStart);
+
+        //Create a trigger. Its trigger action plan will result into a new 
+        // stored statement in SYS.SYSSTATEMENTS. The stored statement for
+        // trigger action will have a valid status
+        s.executeUpdate("create trigger atdc_16_trigger_1 "+ 
+                "after update of b1 on atdc_16_tab1 " +
+                "REFERENCING NEW AS newt "+
+                "for each row "+
+                "update atdc_16_tab2 set c2 = newt.c1");
+        assertEquals("# of valid rows in SYS.SYSSTATEMENTS should be up by "+
+                "1 for trigger",
+        		numberOfValidStatementsInSysstatements(s),
+        		numOfValidSystatementsBeforeTestStart+1);
+        assertEquals("# of invalid statements in SYS.SYSSTATEMENTS should not change",
+        		numberOfInvalidStatementsInSysstatements(s),
+        		numOfInvalidSystatementsBeforeTestStart);
+
+        //Following procedure call will mark all the stored statements 
+        // including the one for trigger action plan invalid
+        cSt = prepareCall(
+                "call SYSCS_UTIL.SYSCS_INVALIDATE_STORED_STATEMENTS()");
+        assertUpdateCount(cSt, 0);
+        cSt.close();
+        assertEquals("All statements should be invalid in SYS.SYSSTATEMENTS ",
+        		numberOfInvalidStatementsInSysstatements(s),
+        		numOfRowsInSystatementsBeforeTestStart+1);
+
+        //Following will cause the trigger to fire. Since it is in invalid
+        // state, it will be compiled and marked valid again in 
+        // SYS.SYSSTATEMENTS table
+        s.executeUpdate("update atdc_16_tab1 set b1=22,c1=222");
+        assertEquals("# of valid rows in SYS.SYSSTATEMENTS should only be 1 ",
+        		numberOfValidStatementsInSysstatements(s),
+        		1);
+        assertEquals("# of invalid statements in SYS.SYSSTATEMENTS should not change",
+        		numberOfInvalidStatementsInSysstatements(s),
+        		numOfInvalidSystatementsBeforeTestStart);
+
+        //Now let's test metadata related stored statement. Executing it will
+        // cause the metadata's stored statement to compile and hence it will
+        // be marked valid in SYS.SYSSTATEMENTS table. Now, we will have two
+        // stored statements in valid state, one for getTables() metadata and
+        // other for trigger action plan
+        DatabaseMetaData dbmd = getConnection().getMetaData();
+        JDBC.assertDrainResults(dbmd.getTables(null, "APP", "ATDC_16_TAB1", null));
+        assertEquals("# of valid rows in SYS.SYSSTATEMENTS should only be 2 ",
+        		numberOfValidStatementsInSysstatements(s),
+        		2);
+        assertEquals("# of invalid statements in SYS.SYSSTATEMENTS should not change",
+        		numberOfInvalidStatementsInSysstatements(s),
+        		numOfInvalidSystatementsBeforeTestStart-1);
+        
+        s.executeUpdate("drop table ATDC_16_TAB1");
+    }
+
+    //Get a count of number of invalid statements in SYS.SYSSTATEMENTS
+    private int numberOfInvalidStatementsInSysstatements(Statement st)
+    		throws SQLException {
+    	ResultSet rs = st.executeQuery(
+    			"SELECT COUNT(*) FROM SYS.SYSSTATEMENTS "+
+        		"WHERE VALID = false");
+    	rs.next();
+    	return(rs.getInt(1));
+    }
+
+    //Get a count of number of valid statements in SYS.SYSSTATEMENTS
+    private int numberOfValidStatementsInSysstatements(Statement st)
+    		throws SQLException {
+    	ResultSet rs = st.executeQuery(
+    			"SELECT COUNT(*) FROM SYS.SYSSTATEMENTS "+
+        		"WHERE VALID = TRUE");
+    	rs.next();
+    	return(rs.getInt(1));
+    }
+
+    //Get a count of number of rows in SYS.SYSSTATEMENTS
+    private int numberOfRowsInSysstatements(Statement st)
+    		throws SQLException {
+    	ResultSet rs = st.executeQuery("SELECT COUNT(*) FROM SYS.SYSSTATEMENTS");
+    	rs.next();
+    	return(rs.getInt(1));
+    }
+    
+    /**
      * Altering the column length should regenerate the trigger
      * action plan which is saved in SYSSTATEMENTS. DERBY-4874
      * 

Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_10.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_10.java?rev=1348275&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_10.java (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_10.java Fri Jun  8 23:20:07 2012
@@ -0,0 +1,167 @@
+/*
+
+Derby - Class org.apache.derbyTesting.functionTests.tests.upgradeTests.Changes10_10
+
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+*/
+package org.apache.derbyTesting.functionTests.tests.upgradeTests;
+
+import java.io.File;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.sql.CallableStatement;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.sql.DataSource;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.derbyTesting.functionTests.tests.upgradeTests.helpers.DisposableIndexStatistics;
+import org.apache.derbyTesting.junit.IndexStatsUtil;
+import org.apache.derbyTesting.junit.JDBC;
+import org.apache.derbyTesting.junit.JDBCDataSource;
+import org.apache.derbyTesting.junit.SupportFilesSetup;
+import org.apache.derbyTesting.junit.TestConfiguration;
+
+
+/**
+ * Upgrade test cases for 10.10.
+ */
+public class Changes10_10 extends UpgradeChange
+{
+    ///////////////////////////////////////////////////////////////////////////////////
+    //
+    // CONSTANTS
+    //
+    ///////////////////////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////////////////////
+    //
+    // STATE
+    //
+    ///////////////////////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////////////////////
+    //
+    // CONSTRUCTOR
+    //
+    ///////////////////////////////////////////////////////////////////////////////////
+
+    public Changes10_10(String name)
+    {
+        super(name);
+    }
+
+    ///////////////////////////////////////////////////////////////////////////////////
+    //
+    // JUnit BEHAVIOR
+    //
+    ///////////////////////////////////////////////////////////////////////////////////
+    
+    /**
+     * Return the suite of tests to test the changes made in 10.10.
+     * @param phase an integer that indicates the current phase in
+     *              the upgrade test.
+     * @return the test suite created.
+     */
+    public static Test suite(int phase) {
+        TestSuite suite = new TestSuite("Upgrade test for 10.9");
+
+        suite.addTestSuite(Changes10_10.class);
+        
+        return new SupportFilesSetup((Test) suite);
+    }
+
+    ///////////////////////////////////////////////////////////////////////////////////
+    //
+    // TESTS
+    //
+    ///////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * Make sure that the following procedure(s) which are new to 10.10 are 
+     *  only available after hard-upgrade
+     *  1)invalidate stored statements 
+     *    SYCS_UTIL.SYSCS_INVALIDATE_STORED_STATEMENTS
+     */
+    public  void    testProcsNewTo10_10()  throws Exception
+    {
+        Statement s = createStatement();
+
+        switch ( getPhase() )
+        {
+        case PH_CREATE: // create with old version
+            vetProcs(s, "call syscs_util.SYSCS_INVALIDATE_STORED_STATEMENTS()", 
+            		false, 
+            		"syscs_util.SYSCS_INVALIDATE_STORED_STATEMENTS should not exist.");
+            break;
+            
+        case PH_SOFT_UPGRADE: // boot with new version and soft-upgrade
+            vetProcs(s, "call syscs_util.SYSCS_INVALIDATE_STORED_STATEMENTS()", 
+            		false, 
+            		"syscs_util.SYSCS_INVALIDATE_STORED_STATEMENTS should not exist.");
+            break;
+            
+        case PH_POST_SOFT_UPGRADE: // soft-downgrade: boot with old version after soft-upgrade
+            vetProcs(s, "call syscs_util.SYSCS_INVALIDATE_STORED_STATEMENTS()", 
+            		false, 
+            		"syscs_util.SYSCS_INVALIDATE_STORED_STATEMENTS should not exist.");
+            break;
+
+        case PH_HARD_UPGRADE: // boot with new version and hard-upgrade
+            vetProcs(s, "call syscs_util.SYSCS_INVALIDATE_STORED_STATEMENTS()", 
+            		true, 
+            		null);
+            break;
+        }
+        
+        s.close();
+    	
+    }
+    
+    private void    vetProcs( Statement s, String procCall, 
+    		boolean shouldExist,
+    		String errorMessage) throws Exception
+    {
+        try {
+            s.execute( procCall );
+            
+            if ( !shouldExist )
+            {
+                fail( errorMessage );
+            }
+        } catch (SQLException se )
+        {
+            if ( shouldExist )
+            {
+                assertSQLState( "4251K", se );
+            }
+            else
+            {
+                assertSQLState( "42Y03", se );
+            }
+        }
+    }
+}

Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_10.java
------------------------------------------------------------------------------
    svn:eol-style = native

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=1348275&r1=1348274&r2=1348275&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 Fri Jun  8 23:20:07 2012
@@ -190,6 +190,8 @@ class UpgradeRun extends UpgradeClassLoa
                 	suite.addTest(Changes10_7.suite(phase));
                 if (oldMinor < 9)
                 	suite.addTest(Changes10_9.suite(phase));
+                if (oldMinor < 10)
+                	suite.addTest(Changes10_10.suite(phase));
             }
             
             // Add DatabaseMetaData tests. Since metadata