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 dj...@apache.org on 2007/03/07 04:40:10 UTC

svn commit: r515442 - in /db/derby/code/trunk/java/testing/org/apache/derbyTesting: functionTests/tests/lang/CurrentOfTest.java junit/BaseJDBCTestCase.java

Author: djd
Date: Tue Mar  6 19:40:09 2007
New Revision: 515442

URL: http://svn.apache.org/viewvc?view=rev&rev=515442
Log:
Add some additional test cases for positioned update and delete in CurrentOfTest.
Testing that the positioned statement successfully recompiles due to various changes.

Modified:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/CurrentOfTest.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseJDBCTestCase.java

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/CurrentOfTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/CurrentOfTest.java?view=diff&rev=515442&r1=515441&r2=515442
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/CurrentOfTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/CurrentOfTest.java Tue Mar  6 19:40:09 2007
@@ -27,6 +27,7 @@
 import junit.framework.Test;
 import junit.framework.TestSuite;
 import org.apache.derbyTesting.junit.BaseJDBCTestCase;
+import org.apache.derbyTesting.junit.JDBC;
 import org.apache.derbyTesting.junit.TestConfiguration;
 
 /** This tests the current of statements, i.e.
@@ -72,11 +73,8 @@
      * Tear-down the fixture by removing the tables
      */
 	protected void tearDown() throws Exception {
-		Statement stmt = createStatement();
-		stmt.executeUpdate("drop table t");
-		stmt.executeUpdate("drop table s");
-		stmt.close();
-		commit();
+        JDBC.dropSchema(getConnection().getMetaData(),
+                getTestConfiguration().getUserName());
 		super.tearDown();
 	}
 	
@@ -297,6 +295,132 @@
 		cursor.close();
 
 	}
+    
+    /**
+     * Test the positioned update correctly recompiles when an index is added.
+     */
+    public void testUpdateRecompileCreateIndex() throws Exception
+    {
+        recompile("UPDATE T SET I = I + 1 WHERE CURRENT OF ",
+                "CREATE INDEX IT ON T(I)", null);
+    }
+    
+    /**
+     * Test the positioned update correctly recompiles when the
+     * definition of a function is changed.
+     */
+    public void testUpdateRecompileChangeFunction() throws Exception
+    {
+        Statement s = createStatement();
+        s.execute("CREATE FUNCTION F(V INTEGER) RETURNS INTEGER " +
+                "NO SQL LANGUAGE JAVA PARAMETER STYLE JAVA " +
+                "EXTERNAL NAME '" + getClass().getName() + ".doubleValue'");
+        commit();
+        String changeSQL = "CREATE FUNCTION F(V INTEGER) RETURNS INTEGER " +
+            "NO SQL LANGUAGE JAVA PARAMETER STYLE JAVA " +
+            "EXTERNAL NAME '" + getClass().getName() + ".tripleValue'";
+        int firstI = recompile("UPDATE T SET I = F(I) WHERE CURRENT OF ",
+                "DROP FUNCTION F", changeSQL);
+        
+        String[][] values = new String[][]
+              {{"3"}, {"180"}, {"456"}, {"1956"}};
+        
+        if (firstI == 180)
+        {
+            // 180 doubled to 360
+            // 456 tripled to 1368
+            values[1] = new String[] {"360"};
+            values[2] = new String[] {"1368"};
+        }
+        else
+        {
+            // 456 doubled to 912
+            // 180 tripled to 540
+            values[1] = new String[] {"540"};
+            values[2] = new String[] {"912"};
+             
+        }
+
+        JDBC.assertFullResultSet(s.executeQuery("SELECT I FROM T ORDER BY I"),
+                values);
+        
+        s.close();
+    }    
+    /**
+     * Test the positioned delete correctly recompiles when an index is added.
+     */
+    public void testDeleteRecompileCreateIndex()  throws Exception
+    {
+        recompile("DELETE FROM T WHERE CURRENT OF ",
+                "CREATE INDEX IT ON T(I)", null);
+    }
+    
+    /**
+     * Execute a select and then the positioned statement against it.
+     * Then execute the changeSQL that should force a recompile of the
+     * positioned statement. Then execute the positioned statement
+     * again and finally check all is ok with check table.
+     * 
+     * The positioned statements are executed against the rows that
+     * have I=180 and I=456.
+     * 
+     * @return the value of I for the first row that had the positioned
+     * statement executed against it, ie. before the change SQl was executed.
+     */
+    private int recompile(String positionedSQL, String changeSQL1, String changeSQL2)
+         throws SQLException
+    {
+        Statement s = createStatement();
+        PreparedStatement select = prepareStatement("select I, C from t for update");
+        ResultSet cursor = select.executeQuery();
+        
+        
+        PreparedStatement update = prepareStatement(
+                positionedSQL + cursor.getCursorName());
+        
+        // Execute the positioned statement against one row,
+        // either i=180 or 456, which ever comes first.
+        int firstRowI = -1;
+        while (cursor.next())
+        {
+            int i = cursor.getInt(1);
+            if (i == 180 || i == 456) {
+                update.execute();
+                firstRowI = i;
+                break;
+            }
+        }
+        assertTrue(firstRowI == 180 || firstRowI == 456);
+ 
+        s.execute(changeSQL1);
+        if (changeSQL2 != null)
+            s.execute(changeSQL2);
+        
+        // And one more execute against one more row
+        // either 180 or 456.
+        int secondRowI = -1;
+        while (cursor.next())
+        {
+            int i = cursor.getInt(1);
+            if (i == 180 || i == 456) {
+                update.execute();
+                secondRowI = i;
+                break;
+            }
+        }
+        assertTrue(firstRowI !=secondRowI);
+        assertTrue(secondRowI == 180 || secondRowI == 456);
+        
+        update.close();
+        cursor.close();
+        select.close();
+        commit();
+        s.close();
+        
+        assertCheckTable("T");
+        
+        return firstRowI;
+    }
 
 	/**
 	 * Change the current cursor from the one the positioned
@@ -459,4 +583,17 @@
 		select.close();
 
 	}
+    
+    /*
+    ** Routines
+    */
+    
+    public static int doubleValue(int i)
+    {
+        return i * 2;
+    }
+    public static int tripleValue(int i)
+    {
+        return i * 3;
+    }
 }

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseJDBCTestCase.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseJDBCTestCase.java?view=diff&rev=515442&r1=515441&r2=515442
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseJDBCTestCase.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseJDBCTestCase.java Tue Mar  6 19:40:09 2007
@@ -588,6 +588,22 @@
     }
     
     /**
+     * Check the table using SYSCS_UTIL.SYSCS_CHECK_TABLE.
+     */
+    public void assertCheckTable(String table) throws SQLException
+    {
+        PreparedStatement ps = prepareStatement(
+                "VALUES SYSCS_UTIL.SYSCS_CHECK_TABLE(?, ?)");
+        
+        ps.setString(1, getTestConfiguration().getUserName());
+        ps.setString(2, table);
+        
+        ResultSet rs = ps.executeQuery();
+        JDBC.assertSingleValueResultSet(rs, "1");
+        ps.close();
+    }
+    
+    /**
      * Assert that the number of rows in a table is an expected value.
      * Query uses a SELECT COUNT(*) FROM "table".
      *