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 2011/06/03 06:12:28 UTC

svn commit: r1130895 - in /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests: BasicSetup.java Changes10_8.java

Author: mamta
Date: Fri Jun  3 04:12:28 2011
New Revision: 1130895

URL: http://svn.apache.org/viewvc?rev=1130895&view=rev
Log:
DERBY-1482/DERBY-5121

Rick Hillegas contributed a trigger test for DERBY-1482/DERBY-5121. With revision 1125453, that test was added to Changes10_8 but this test really is applicable for upgrades from all releases and should not be added into a specific version upgrade test. As a result, I am moving the test from Changes10_8.java to BasicSetup.java. This will ensure that the trigger test will get run for upgrades from all previous releases.


Modified:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/BasicSetup.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_8.java

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/BasicSetup.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/BasicSetup.java?rev=1130895&r1=1130894&r2=1130895&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/BasicSetup.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/BasicSetup.java Fri Jun  3 04:12:28 2011
@@ -25,11 +25,10 @@ import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
+import java.util.ArrayList;
 
-import org.apache.derby.iapi.services.io.DerbyIOException;
 import org.apache.derbyTesting.junit.JDBC;
 import org.apache.derbyTesting.junit.TestConfiguration;
-import org.apache.derbyTesting.junit.Utilities;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
@@ -313,4 +312,462 @@ public class BasicSetup extends UpgradeC
         }
 
     }
+    final   int TEST_COUNT = 0;
+    final   int FAILURES = TEST_COUNT + 1;
+    final   String  A_COL = "a";
+    final   String  B_COL = "b";
+
+    //This test has been contributed by Rick Hillegas for DERBY-5121
+    // The test exhaustively walks through all subsets and permutations 
+    // of columns for a trigger which inserts into a side table based on 
+    // updates to a master table.
+    public void testExhuastivePermutationOfTriggerColumns() throws Exception
+    {
+        final   int STATUS_COUNTERS = FAILURES + 1;
+        int columnCount = 3;
+        int[][]   powerSet = constructPowerSet( columnCount );
+        int[][] permutations = permute( powerSet );
+        int[]   statusCounters = new int[ STATUS_COUNTERS ];
+
+        switch ( getPhase() )
+        {
+        case PH_CREATE: // create with old version
+            for ( int triggerCols = 0; triggerCols < powerSet.length; triggerCols++ )
+            {
+                for ( int perm = 0; perm < permutations.length; perm++ )
+                {
+                    createT1( powerSet[ triggerCols ], permutations[ perm ] );
+                    createT2( columnCount, powerSet[ triggerCols ], permutations[ perm ]  );
+                    createTrigger( powerSet[ triggerCols ], permutations[ perm ] );
+                }
+            }
+        	break;
+
+        case PH_SOFT_UPGRADE:
+            for ( int triggerCols = 0; triggerCols < powerSet.length; triggerCols++ )
+            {
+                for ( int perm = 0; perm < permutations.length; perm++ )
+                {
+                    for ( int i = 0; i < permutations.length; i++ )
+                    {
+                        runTrigger( statusCounters, columnCount, powerSet[ triggerCols ], permutations[ perm ], permutations[ i ] );
+                    }
+                }
+            }
+        	break;
+        }
+        summarize( statusCounters );
+    }
+    
+    //Start of helper methods for testExhuastivePermutationOfTriggerColumns
+
+    ////////////////////////
+    //
+    // make power set of N
+    //
+    ////////////////////////
+
+    private int[][] constructPowerSet( int count )
+    {
+    	java.util.ArrayList list = new java.util.ArrayList();
+        boolean[]           inclusions = new boolean[ count ];
+
+        include( list, 0, inclusions );
+        
+        int[][] result = new int[ list.size() ][];
+        list.toArray( result );
+
+        return result;
+    }
+
+    private void    include( ArrayList list, int idx, boolean[] inclusions )
+    {
+        if ( idx >= inclusions.length )
+        {
+            int totalLength = inclusions.length;
+            int count = 0;
+            for ( int i = 0; i < totalLength; i++ )
+            {
+                if ( inclusions[ i ] ) { count++; }
+            }
+
+            if ( count > 0 )
+            {
+                int[]   result = new int[ count ];
+                int     index = 0;
+                for ( int i = 0; i < totalLength; i++ )
+                {
+                    if ( inclusions[ i ] ) { result[ index++ ] = i; }
+                }
+                
+                list.add( result );
+            }
+
+            return;
+        }
+
+        include( list, idx, inclusions, false );
+        include( list, idx, inclusions, true );
+    }
+
+    private void    include( ArrayList list, int idx, boolean[] inclusions, boolean currentCell )
+    {
+        inclusions[ idx++ ] = currentCell;
+
+        // this is where the recursion happens
+        include( list, idx, inclusions );
+    }
+
+    ////////////////////////////////////////////////
+    //
+    // create all permutations of an array of numbers
+    //
+    ////////////////////////////////////////////////
+    private int[][] permute( int[][] original )
+    {
+        ArrayList list = new ArrayList();
+
+        for ( int i = 0; i < original.length; i++ )
+        {
+            permute( list, new int[0], original[ i ] );
+        }
+        
+        int[][] result = new int[ list.size() ][];
+        list.toArray( result );
+
+        return result;
+    }
+
+    private void   permute( ArrayList list, int[] start, int[] remainder )
+    {
+        int startLength = start.length;
+        int remainderLength = remainder.length;
+        
+        for ( int idx = 0; idx < remainder.length; idx++ )
+        {
+            int[] newStart = new int[ startLength + 1 ];
+            for ( int i = 0; i < startLength; i++ ) { newStart[ i ] = start[ i ]; }
+            newStart[ startLength ] = remainder[ idx ];
+
+            if ( remainderLength <= 1 ) { list.add( newStart ); }
+            else
+            {
+                int[]   newRemainder = new int[ remainderLength - 1 ];
+                int     index = 0;
+                for ( int i = 0; i < remainderLength; i++ )
+                {
+                    if ( i != idx ) { newRemainder[ index++ ] = remainder[ i ]; }
+                }
+
+                // this is where the recursion happens
+                permute( list, newStart, newRemainder );
+            }
+        }   // end loop through all remainder elements
+    }
+
+    private String  columnName( String stub, int idx ) { return (stub + '_' + idx ); }
+
+    private void createT1(int[] triggerCols, int[] permutation )
+    throws Exception
+    {
+        StringBuffer   buffer = new StringBuffer();
+        buffer.append( "create table " + makeTableName( "t1", triggerCols, permutation ) + "( " );
+        for ( int i = 0; i < permutation.length; i++ )
+        {
+            if ( i > 0 ) { buffer.append( ", " ); }
+            buffer.append( columnName( B_COL, i ) );
+            buffer.append( " int" );
+        }
+        buffer.append( " )" );
+        Statement s = createStatement();
+        s.execute(buffer.toString());
+    }    
+    
+    private void    createT2(int columnCount, int[] triggerCols, int[] permutation  )
+    throws Exception
+    {
+        StringBuffer   buffer = new StringBuffer();
+        buffer.append( "create table " + makeTableName( "t2", triggerCols, permutation ) + "( " );
+        for ( int i = 0; i < columnCount; i++ )
+        {
+            if ( i > 0 ) { buffer.append( ", " ); }
+            buffer.append( columnName( A_COL, i ) );
+            buffer.append( " int" );
+        }
+        buffer.append( " )" );
+        Statement s = createStatement();
+        s.execute(buffer.toString());
+    }
+
+    private String  makeTableName( String stub, int[] triggerCols, int[] permutation )
+    {
+        StringBuffer   buffer = new StringBuffer();
+
+        buffer.append( stub );
+        for ( int i = 0; i < triggerCols.length; i++ )
+        {
+            buffer.append( "_" );
+            buffer.append( triggerCols[ i ] );
+        }
+       buffer.append( "__" );
+        for ( int i = 0; i < permutation.length; i++ )
+        {
+            buffer.append( "_" );
+            buffer.append( permutation[ i ] );
+        }
+
+        return buffer.toString();
+    }
+
+    private void    createTrigger(int[] triggerCols, int[] permutation )
+    throws Exception
+    {
+        boolean modeDb2SqlOptional = oldAtLeast(10, 3);
+        StringBuffer   buffer = new StringBuffer();
+        buffer.append( "create trigger " + makeTriggerName( "UTrg", triggerCols, permutation ) + " after update of " );
+        for ( int i = 0; i < triggerCols.length; i++ )
+        {
+            if ( i > 0 ) { buffer.append( ", " ); }
+            buffer.append( columnName( A_COL, triggerCols[ i ] ) );
+        }
+        		
+        buffer.append( "\n\ton " + makeTableName( "t2", triggerCols, permutation ) + " referencing new as nr for each row " );
+        buffer.append( modeDb2SqlOptional?"":"\n\tMODE DB2SQL ");
+        buffer.append( "\n\tinsert into " + makeTableName( "t1", triggerCols, permutation ) + " values ( " );
+        for ( int i = 0; i < permutation.length; i++ )
+        {
+            if ( i > 0 ) { buffer.append( ", " ); }
+            buffer.append( "nr." + columnName( A_COL, permutation[ i ] ) );
+        }
+        buffer.append( " )" );
+
+        Statement s = createStatement();
+        s.execute(buffer.toString());
+    }
+
+    private String  makeTriggerName( String stub, int[] triggerCols, int[] permutation )
+    {
+        StringBuffer   buffer = new StringBuffer();
+
+        buffer.append( stub );
+        for ( int i = 0; i < triggerCols.length; i++ )
+        {
+            buffer.append( "_" );
+            buffer.append( triggerCols[ i ] );
+        }
+        buffer.append( "__" );
+        for ( int i = 0; i < permutation.length; i++ )
+        {
+            buffer.append( "_" );
+            buffer.append( permutation[ i ] );
+        }
+        
+        return buffer.toString();
+    }
+
+    private int[]   getResults( int rowLength, String text )
+        throws Exception
+    {
+        PreparedStatement   ps = prepareStatement(text );
+        ResultSet               rs = ps.executeQuery();
+
+        if ( !rs.next() ) { return new int[0]; }
+
+        int[]                       result = new int[ rowLength ];
+        for ( int i = 0; i < rowLength; i++ )
+        {
+            result[ i ] = rs.getInt( i + 1 );
+        }
+
+        rs.close();
+        ps.close();
+
+        return result;
+    }
+
+    private boolean overlap( int[] left, int[] right )
+    {
+        for ( int i = 0; i < left.length; i++ )
+        {
+            for ( int j = 0; j < right.length; j++ )
+            {
+                if ( left[ i ] == right[ j ] )
+                {
+                    //println( true, stringify( left ) + " overlaps " + stringify( right ) );
+                    return true;
+                }
+            }
+        }
+
+        //println( true, stringify( left ) + " DOES NOT overlap " + stringify( right ) );
+        return false;
+    }
+
+    private void    vetData
+    ( int[] statusCounters, int[] triggerCols, int[] permutation, int[] updateColumns, String updateStatement )
+    throws Exception
+    {
+        String  t1Name = makeTableName( "t1", triggerCols, permutation );
+        String  t2Name = makeTableName( "t2", triggerCols, permutation );
+        int     rowLength = permutation.length;
+        int[]   t1Row = getResults( rowLength, "select * from " + t1Name );
+
+        if ( !overlap( triggerCols, updateColumns ) )
+        {
+            if ( t1Row.length != 0 )
+            {
+                fail
+                    (
+                     statusCounters,
+                     triggerCols,
+                     permutation,
+                     updateColumns,
+                     "No row should have been inserted into t1! updateStatement = '" + updateStatement + "' and t1Row = " + stringify( t1Row )
+                     );
+            }
+
+            return;
+        }
+        
+        StringBuffer   buffer = new StringBuffer();
+        buffer.append( "select " );
+        for ( int i = 0; i < permutation.length; i++ )
+        {
+            if ( i > 0 ) { buffer.append( ", " ); }
+            buffer.append( columnName( A_COL, permutation[ i ] ) );
+        }
+        buffer.append( " from " + t2Name );
+        int[]   t2Row = getResults( rowLength, buffer.toString() );
+
+        if ( !stringify( t1Row ).equals( stringify( t2Row ) ) )
+        {
+            String  detail = "Wrong data inserted into t1! " +
+                "updateStatement = '" + updateStatement + "'. " +
+                "Expected " + stringify( t2Row ) +
+                " but found " + stringify( t1Row );
+                
+            fail( statusCounters, triggerCols, permutation, updateColumns, detail );
+        }
+    }
+
+    private void    runTrigger( int[] statusCounters, int columnCount, int[] triggerCols, int[] permutation, int[] updateColumns )
+    throws Exception
+    {
+        statusCounters[ TEST_COUNT ]++;
+
+        loadData( columnCount, triggerCols, permutation );
+        String  updateStatement = updateData( statusCounters, triggerCols, permutation, updateColumns );
+        vetData( statusCounters, triggerCols, permutation, updateColumns, updateStatement );
+    }
+
+    private void    loadData( int columnCount, int[] triggerCols, int[] permutation )
+    throws Exception
+    {
+        String  t1Name = makeTableName( "t1", triggerCols, permutation );
+        String  t2Name = makeTableName( "t2", triggerCols, permutation );
+        Statement s = createStatement();
+        s.execute("delete from " + t1Name);
+        s.execute("delete from " + t2Name);
+        
+        StringBuffer   buffer = new StringBuffer();
+        buffer.append( "insert into " + t2Name + " values ( " );
+        for ( int i = 0; i < columnCount; i++ )
+        {
+            if ( i > 0 ) { buffer.append( ", " ); }
+            buffer.append( i );
+        }
+        buffer.append( " )" );
+        s.execute(buffer.toString());
+    }
+    
+    private String    updateData( int[] statusCounters, int[] triggerCols, int[] permutation, int[] updateColumns )
+    throws Exception
+    {
+        String  t2Name = makeTableName( "t2", triggerCols, permutation );
+
+        StringBuffer   buffer = new StringBuffer();
+        buffer.append( "update " + t2Name + " set " );
+        for ( int i = 0; i < updateColumns.length; i++ )
+        {
+            if ( i > 0 ) { buffer.append( ", " ); }
+            buffer.append( columnName( A_COL, updateColumns[ i ] ) );
+            buffer.append( " = " );
+            buffer.append( (100 + i) );
+        }
+
+        String  updateStatement = buffer.toString();
+
+        try {
+            Statement s = createStatement();
+            s.execute(updateStatement);
+        }
+        catch (SQLException se)
+        {
+            fail
+                (
+                 statusCounters,
+                 triggerCols,
+                 permutation,
+                 updateColumns,
+                 "Update statement failed! updateStatement = '" + updateStatement
+                 );
+        }
+
+        return updateStatement;
+    }
+
+    private void    fail( int[] statusCounters, int[] triggerCols, int[] permutation, int[] updateColumns, String detail )
+    {
+        statusCounters[ FAILURES ]++;
+        
+        String  message = "FAILED for triggerCols = " +
+            stringify( triggerCols ) +
+            " and permutation = " + stringify( permutation ) +
+            " and updateColumns = " + stringify( updateColumns ) +
+            ". " + detail;
+
+        System.out.println( message );
+    }
+    
+    private void    summarize( int[] statusCounters )
+    {
+        int testCount = statusCounters[ TEST_COUNT ];
+        int failures = statusCounters[ FAILURES ];
+
+        if ( failures != 0 )
+        {
+        	System.out.println( "FAILURE! " + testCount + " test cases run, of which " + failures + " failed." );
+        }
+    }
+
+    private String    stringify( int[][] array )
+    {
+        StringBuffer   buffer = new StringBuffer();
+
+        buffer.append( "[" );
+        for ( int i = 0; i < array.length; i++ )
+        {
+            buffer.append( "\n\t" );
+            buffer.append( stringify( array[ i ] ) );
+        }
+        buffer.append( "\n]\n" );
+
+        return buffer.toString();
+    }
+
+    private String  stringify( int[] array )
+    {
+        StringBuffer   buffer = new StringBuffer();
+
+        buffer.append( "[" );
+        for ( int j = 0; j < array.length; j++ )
+        {
+            if ( j > 0 ) { buffer.append( ", " ); }
+            buffer.append( array[ j ] );
+        }
+        buffer.append( "]" );
+
+        return buffer.toString();
     }
+    //End of helper methods for testExhuastivePermutationOfTriggerColumns
+}

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_8.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_8.java?rev=1130895&r1=1130894&r2=1130895&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_8.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/upgradeTests/Changes10_8.java Fri Jun  3 04:12:28 2011
@@ -96,465 +96,6 @@ public class Changes10_8 extends Upgrade
     // TESTS
     //
     ///////////////////////////////////////////////////////////////////////////////////
-    final   int TEST_COUNT = 0;
-    final   int FAILURES = TEST_COUNT + 1;
-    final   String  A_COL = "a";
-    final   String  B_COL = "b";
-
-    //This test has been contributed by Rick Hillegas for DERBY-5121
-    // The test exhaustively walks through all subsets and permutations 
-    // of columns for a trigger which inserts into a side table based on 
-    // updates to a master table.
-    public void testExhuastivePermutationOfTriggerColumns() throws Exception
-    {
-        final   int STATUS_COUNTERS = FAILURES + 1;
-        int columnCount = 3;
-        int[][]   powerSet = constructPowerSet( columnCount );
-        int[][] permutations = permute( powerSet );
-        int[]   statusCounters = new int[ STATUS_COUNTERS ];
-
-        switch ( getPhase() )
-        {
-        case PH_CREATE: // create with old version
-            for ( int triggerCols = 0; triggerCols < powerSet.length; triggerCols++ )
-            {
-                for ( int perm = 0; perm < permutations.length; perm++ )
-                {
-                    createT1( powerSet[ triggerCols ], permutations[ perm ] );
-                    createT2( columnCount, powerSet[ triggerCols ], permutations[ perm ]  );
-                    createTrigger( powerSet[ triggerCols ], permutations[ perm ] );
-                }
-            }
-        	break;
-
-        case PH_SOFT_UPGRADE:
-            for ( int triggerCols = 0; triggerCols < powerSet.length; triggerCols++ )
-            {
-                for ( int perm = 0; perm < permutations.length; perm++ )
-                {
-                    for ( int i = 0; i < permutations.length; i++ )
-                    {
-                        runTrigger( statusCounters, columnCount, powerSet[ triggerCols ], permutations[ perm ], permutations[ i ] );
-                    }
-                }
-            }
-        	break;
-        }
-        summarize( statusCounters );
-    }
-    
-    //Start of helper methods for testExhuastivePermutationOfTriggerColumns
-
-    ////////////////////////
-    //
-    // make power set of N
-    //
-    ////////////////////////
-
-    private int[][] constructPowerSet( int count )
-    {
-    	java.util.ArrayList list = new java.util.ArrayList();
-        boolean[]           inclusions = new boolean[ count ];
-
-        include( list, 0, inclusions );
-        
-        int[][] result = new int[ list.size() ][];
-        list.toArray( result );
-
-        return result;
-    }
-
-    private void    include( ArrayList list, int idx, boolean[] inclusions )
-    {
-        if ( idx >= inclusions.length )
-        {
-            int totalLength = inclusions.length;
-            int count = 0;
-            for ( int i = 0; i < totalLength; i++ )
-            {
-                if ( inclusions[ i ] ) { count++; }
-            }
-
-            if ( count > 0 )
-            {
-                int[]   result = new int[ count ];
-                int     index = 0;
-                for ( int i = 0; i < totalLength; i++ )
-                {
-                    if ( inclusions[ i ] ) { result[ index++ ] = i; }
-                }
-                
-                list.add( result );
-            }
-
-            return;
-        }
-
-        include( list, idx, inclusions, false );
-        include( list, idx, inclusions, true );
-    }
-
-    private void    include( ArrayList list, int idx, boolean[] inclusions, boolean currentCell )
-    {
-        inclusions[ idx++ ] = currentCell;
-
-        // this is where the recursion happens
-        include( list, idx, inclusions );
-    }
-
-    ////////////////////////////////////////////////
-    //
-    // create all permutations of an array of numbers
-    //
-    ////////////////////////////////////////////////
-    private int[][] permute( int[][] original )
-    {
-        ArrayList list = new ArrayList();
-
-        for ( int i = 0; i < original.length; i++ )
-        {
-            permute( list, new int[0], original[ i ] );
-        }
-        
-        int[][] result = new int[ list.size() ][];
-        list.toArray( result );
-
-        return result;
-    }
-
-    private void   permute( ArrayList list, int[] start, int[] remainder )
-    {
-        int startLength = start.length;
-        int remainderLength = remainder.length;
-        
-        for ( int idx = 0; idx < remainder.length; idx++ )
-        {
-            int[] newStart = new int[ startLength + 1 ];
-            for ( int i = 0; i < startLength; i++ ) { newStart[ i ] = start[ i ]; }
-            newStart[ startLength ] = remainder[ idx ];
-
-            if ( remainderLength <= 1 ) { list.add( newStart ); }
-            else
-            {
-                int[]   newRemainder = new int[ remainderLength - 1 ];
-                int     index = 0;
-                for ( int i = 0; i < remainderLength; i++ )
-                {
-                    if ( i != idx ) { newRemainder[ index++ ] = remainder[ i ]; }
-                }
-
-                // this is where the recursion happens
-                permute( list, newStart, newRemainder );
-            }
-        }   // end loop through all remainder elements
-    }
-
-    private String  columnName( String stub, int idx ) { return (stub + '_' + idx ); }
-
-    private void createT1(int[] triggerCols, int[] permutation )
-    throws Exception
-    {
-        StringBuffer   buffer = new StringBuffer();
-        buffer.append( "create table " + makeTableName( "t1", triggerCols, permutation ) + "( " );
-        for ( int i = 0; i < permutation.length; i++ )
-        {
-            if ( i > 0 ) { buffer.append( ", " ); }
-            buffer.append( columnName( B_COL, i ) );
-            buffer.append( " int" );
-        }
-        buffer.append( " )" );
-        Statement s = createStatement();
-        s.execute(buffer.toString());
-    }    
-    
-    private void    createT2(int columnCount, int[] triggerCols, int[] permutation  )
-    throws Exception
-    {
-        StringBuffer   buffer = new StringBuffer();
-        buffer.append( "create table " + makeTableName( "t2", triggerCols, permutation ) + "( " );
-        for ( int i = 0; i < columnCount; i++ )
-        {
-            if ( i > 0 ) { buffer.append( ", " ); }
-            buffer.append( columnName( A_COL, i ) );
-            buffer.append( " int" );
-        }
-        buffer.append( " )" );
-        Statement s = createStatement();
-        s.execute(buffer.toString());
-    }
-
-    private String  makeTableName( String stub, int[] triggerCols, int[] permutation )
-    {
-        StringBuffer   buffer = new StringBuffer();
-
-        buffer.append( stub );
-        for ( int i = 0; i < triggerCols.length; i++ )
-        {
-            buffer.append( "_" );
-            buffer.append( triggerCols[ i ] );
-        }
-       buffer.append( "__" );
-        for ( int i = 0; i < permutation.length; i++ )
-        {
-            buffer.append( "_" );
-            buffer.append( permutation[ i ] );
-        }
-
-        return buffer.toString();
-    }
-
-    private void    createTrigger(int[] triggerCols, int[] permutation )
-    throws Exception
-    {
-        boolean modeDb2SqlOptional = oldAtLeast(10, 3);
-        StringBuffer   buffer = new StringBuffer();
-        buffer.append( "create trigger " + makeTriggerName( "UTrg", triggerCols, permutation ) + " after update of " );
-        for ( int i = 0; i < triggerCols.length; i++ )
-        {
-            if ( i > 0 ) { buffer.append( ", " ); }
-            buffer.append( columnName( A_COL, triggerCols[ i ] ) );
-        }
-        		
-        buffer.append( "\n\ton " + makeTableName( "t2", triggerCols, permutation ) + " referencing new as nr for each row " );
-        buffer.append( modeDb2SqlOptional?"":"\n\tMODE DB2SQL ");
-        buffer.append( "\n\tinsert into " + makeTableName( "t1", triggerCols, permutation ) + " values ( " );
-        for ( int i = 0; i < permutation.length; i++ )
-        {
-            if ( i > 0 ) { buffer.append( ", " ); }
-            buffer.append( "nr." + columnName( A_COL, permutation[ i ] ) );
-        }
-        buffer.append( " )" );
-
-        Statement s = createStatement();
-        s.execute(buffer.toString());
-    }
-
-    private String  makeTriggerName( String stub, int[] triggerCols, int[] permutation )
-    {
-        StringBuffer   buffer = new StringBuffer();
-
-        buffer.append( stub );
-        for ( int i = 0; i < triggerCols.length; i++ )
-        {
-            buffer.append( "_" );
-            buffer.append( triggerCols[ i ] );
-        }
-        buffer.append( "__" );
-        for ( int i = 0; i < permutation.length; i++ )
-        {
-            buffer.append( "_" );
-            buffer.append( permutation[ i ] );
-        }
-        
-        return buffer.toString();
-    }
-
-    private int[]   getResults( int rowLength, String text )
-        throws Exception
-    {
-        PreparedStatement   ps = prepareStatement(text );
-        ResultSet               rs = ps.executeQuery();
-
-        if ( !rs.next() ) { return new int[0]; }
-
-        int[]                       result = new int[ rowLength ];
-        for ( int i = 0; i < rowLength; i++ )
-        {
-            result[ i ] = rs.getInt( i + 1 );
-        }
-
-        rs.close();
-        ps.close();
-
-        return result;
-    }
-
-    private boolean overlap( int[] left, int[] right )
-    {
-        for ( int i = 0; i < left.length; i++ )
-        {
-            for ( int j = 0; j < right.length; j++ )
-            {
-                if ( left[ i ] == right[ j ] )
-                {
-                    //println( true, stringify( left ) + " overlaps " + stringify( right ) );
-                    return true;
-                }
-            }
-        }
-
-        //println( true, stringify( left ) + " DOES NOT overlap " + stringify( right ) );
-        return false;
-    }
-
-    private void    vetData
-    ( int[] statusCounters, int[] triggerCols, int[] permutation, int[] updateColumns, String updateStatement )
-    throws Exception
-    {
-        String  t1Name = makeTableName( "t1", triggerCols, permutation );
-        String  t2Name = makeTableName( "t2", triggerCols, permutation );
-        int     rowLength = permutation.length;
-        int[]   t1Row = getResults( rowLength, "select * from " + t1Name );
-
-        if ( !overlap( triggerCols, updateColumns ) )
-        {
-            if ( t1Row.length != 0 )
-            {
-                fail
-                    (
-                     statusCounters,
-                     triggerCols,
-                     permutation,
-                     updateColumns,
-                     "No row should have been inserted into t1! updateStatement = '" + updateStatement + "' and t1Row = " + stringify( t1Row )
-                     );
-            }
-
-            return;
-        }
-        
-        StringBuffer   buffer = new StringBuffer();
-        buffer.append( "select " );
-        for ( int i = 0; i < permutation.length; i++ )
-        {
-            if ( i > 0 ) { buffer.append( ", " ); }
-            buffer.append( columnName( A_COL, permutation[ i ] ) );
-        }
-        buffer.append( " from " + t2Name );
-        int[]   t2Row = getResults( rowLength, buffer.toString() );
-
-        if ( !stringify( t1Row ).equals( stringify( t2Row ) ) )
-        {
-            String  detail = "Wrong data inserted into t1! " +
-                "updateStatement = '" + updateStatement + "'. " +
-                "Expected " + stringify( t2Row ) +
-                " but found " + stringify( t1Row );
-                
-            fail( statusCounters, triggerCols, permutation, updateColumns, detail );
-        }
-    }
-
-    private void    runTrigger( int[] statusCounters, int columnCount, int[] triggerCols, int[] permutation, int[] updateColumns )
-    throws Exception
-    {
-        statusCounters[ TEST_COUNT ]++;
-
-        loadData( columnCount, triggerCols, permutation );
-        String  updateStatement = updateData( statusCounters, triggerCols, permutation, updateColumns );
-        vetData( statusCounters, triggerCols, permutation, updateColumns, updateStatement );
-    }
-
-    private void    loadData( int columnCount, int[] triggerCols, int[] permutation )
-    throws Exception
-    {
-        String  t1Name = makeTableName( "t1", triggerCols, permutation );
-        String  t2Name = makeTableName( "t2", triggerCols, permutation );
-        Statement s = createStatement();
-        s.execute("delete from " + t1Name);
-        s.execute("delete from " + t2Name);
-        
-        StringBuffer   buffer = new StringBuffer();
-        buffer.append( "insert into " + t2Name + " values ( " );
-        for ( int i = 0; i < columnCount; i++ )
-        {
-            if ( i > 0 ) { buffer.append( ", " ); }
-            buffer.append( i );
-        }
-        buffer.append( " )" );
-        s.execute(buffer.toString());
-    }
-    
-    private String    updateData( int[] statusCounters, int[] triggerCols, int[] permutation, int[] updateColumns )
-    throws Exception
-    {
-        String  t2Name = makeTableName( "t2", triggerCols, permutation );
-
-        StringBuffer   buffer = new StringBuffer();
-        buffer.append( "update " + t2Name + " set " );
-        for ( int i = 0; i < updateColumns.length; i++ )
-        {
-            if ( i > 0 ) { buffer.append( ", " ); }
-            buffer.append( columnName( A_COL, updateColumns[ i ] ) );
-            buffer.append( " = " );
-            buffer.append( (100 + i) );
-        }
-
-        String  updateStatement = buffer.toString();
-
-        try {
-            Statement s = createStatement();
-            s.execute(updateStatement);
-        }
-        catch (SQLException se)
-        {
-            fail
-                (
-                 statusCounters,
-                 triggerCols,
-                 permutation,
-                 updateColumns,
-                 "Update statement failed! updateStatement = '" + updateStatement
-                 );
-        }
-
-        return updateStatement;
-    }
-
-    private void    fail( int[] statusCounters, int[] triggerCols, int[] permutation, int[] updateColumns, String detail )
-    {
-        statusCounters[ FAILURES ]++;
-        
-        String  message = "FAILED for triggerCols = " +
-            stringify( triggerCols ) +
-            " and permutation = " + stringify( permutation ) +
-            " and updateColumns = " + stringify( updateColumns ) +
-            ". " + detail;
-
-        System.out.println( message );
-    }
-    
-    private void    summarize( int[] statusCounters )
-    {
-        int testCount = statusCounters[ TEST_COUNT ];
-        int failures = statusCounters[ FAILURES ];
-
-        if ( failures != 0 )
-        {
-        	System.out.println( "FAILURE! " + testCount + " test cases run, of which " + failures + " failed." );
-        }
-    }
-
-    private String    stringify( int[][] array )
-    {
-        StringBuffer   buffer = new StringBuffer();
-
-        buffer.append( "[" );
-        for ( int i = 0; i < array.length; i++ )
-        {
-            buffer.append( "\n\t" );
-            buffer.append( stringify( array[ i ] ) );
-        }
-        buffer.append( "\n]\n" );
-
-        return buffer.toString();
-    }
-
-    private String  stringify( int[] array )
-    {
-        StringBuffer   buffer = new StringBuffer();
-
-        buffer.append( "[" );
-        for ( int j = 0; j < array.length; j++ )
-        {
-            if ( j > 0 ) { buffer.append( ", " ); }
-            buffer.append( array[ j ] );
-        }
-        buffer.append( "]" );
-
-        return buffer.toString();
-    }
-    //End of helper methods for testExhuastivePermutationOfTriggerColumns
-
     public void testDERBY5121TriggerTest2() throws Exception
     {
         Statement s = createStatement();