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 2006/08/21 01:22:05 UTC
svn commit: r433085 - in
/db/derby/code/trunk/java/testing/org/apache/derbyTesting:
functionTests/suites/ functionTests/tests/lang/ junit/
Author: djd
Date: Sun Aug 20 16:22:04 2006
New Revision: 433085
URL: http://svn.apache.org/viewvc?rev=433085&view=rev
Log:
DERBY-766 DERBY-1714 Convert largeCodeGen to a JUnit test, add it to the lang._Suite and add that to
the derbylang.runall old harness suite. Added tests for insert a large number of rows with a VALUES
clause. Test needs further improvements due to errors from DERBY-1315 and stack overflow with
a large INSERT VALUES clause.
Removed:
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/largeCodeGen_app.properties
Modified:
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/largeDataTests.runall
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/largeCodeGen.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/JDBC.java
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall?rev=433085&r1=433084&r2=433085&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall Sun Aug 20 16:22:04 2006
@@ -150,3 +150,4 @@
lang/views.sql
lang/wisconsin.java
lang/ShutdownDatabase.java
+lang/_Suite.junit
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/largeDataTests.runall
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/largeDataTests.runall?rev=433085&r1=433084&r2=433085&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/largeDataTests.runall (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/largeDataTests.runall Sun Aug 20 16:22:04 2006
@@ -1,3 +1,2 @@
-lang/largeCodeGen.java
largedata/lobLengthTests.java
largedata/LobLimits.java
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java?rev=433085&r1=433084&r2=433085&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java Sun Aug 20 16:22:04 2006
@@ -44,6 +44,8 @@
public static Test suite() {
TestSuite suite = new TestSuite("lang");
+
+ suite.addTest(largeCodeGen.suite());
// suite.addTest(PrepareExecuteDDL.suite());
// suite.addTest(LangScripts.suite());
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/largeCodeGen.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/largeCodeGen.java?rev=433085&r1=433084&r2=433085&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/largeCodeGen.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/largeCodeGen.java Sun Aug 20 16:22:04 2006
@@ -18,10 +18,15 @@
package org.apache.derbyTesting.functionTests.tests.lang;
-import java.sql.Connection;
import java.sql.*;
+import java.util.Random;
-import org.apache.derby.tools.ij;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.derbyTesting.junit.BaseJDBCTestCase;
+import org.apache.derbyTesting.junit.CleanDatabaseTestSetup;
+import org.apache.derbyTesting.junit.JDBC;
// This test tries to push byte code generation to the limit.
@@ -30,42 +35,49 @@
// There are only a few types of cases now. Other areas need to be tested such as large in clauses, etc.
//
-public class largeCodeGen
+public class largeCodeGen extends BaseJDBCTestCase
{
private static boolean TEST_QUERY_EXECUTION = true;
- private static boolean PRINT_FAILURE_EXCEPTION = false;
-
- public static void main(String argv[])
- throws Exception
+
+
+
+ public largeCodeGen(String name)
{
- ij.getPropertyArg(argv);
- Connection con = ij.startJBMS();
- con.setAutoCommit(false);
- createTestTable(con);
- testLogicalOperators(con);
- testInClause(con);
- testUnions(con);
- con.commit();
- con.close();
+ super(name);
}
- private static void createTestTable(Connection con) throws SQLException
+ public static Test suite() {
+ TestSuite suite = new TestSuite();
+
+ // Code generation test, just invoke on embedded
+ // as the main function is to test the byte code compiler.
+ if (usingEmbedded()) {
+ suite.addTestSuite(largeCodeGen.class);
+ return new CleanDatabaseTestSetup(suite);
+ }
+ return suite;
+ }
+
+ protected void setUp() throws SQLException
{
- Statement stmt = null;
- stmt = con.createStatement();
- try {
- stmt.executeUpdate("drop table t0 ");
- }catch (SQLException se)
- {
- // drop error ok.
- if (!se.getSQLState().equals("42Y55"))
- throw se;
- }
+ getXConnection().setAutoCommit(false);
+ Statement stmt = createStatement();
String createSQL = "create table t0 " +
"(si smallint,i int, bi bigint, r real, f float, d double precision, n5_2 numeric(5,2), dec10_3 decimal(10,3), ch20 char(3),vc varchar(20), lvc long varchar)";
stmt.executeUpdate(createSQL);
stmt.executeUpdate("insert into t0 values(2,3,4,5.3,5.3,5.3,31.13,123456.123, 'one','one','one')");
+ stmt.close();
+ commit();
+ }
+
+ protected void tearDown() throws Exception
+ {
+ Statement stmt = createStatement();
+ stmt.execute("DROP TABLE T0");
+ stmt.close();
+ commit();
+ super.tearDown();
}
@@ -74,19 +86,17 @@
* The assumption is that the query will always return our one row
* of data inserted into the t0 table.
*
- * @param con
* @param testName
* @param sqlBuffer - StringBuffer with SQL Text
* @param numParams - Number of parameters
* @param paramValue - Parameter value
* @return true if the check fails
*/
- private static boolean checkT0Query(Connection con, String testName,
+ private boolean checkT0Query(String testName,
StringBuffer sqlBuffer, int numParams, int paramValue) {
PreparedStatement ps;
try {
- ps = con.prepareStatement(sqlBuffer.toString());
- System.out.println("PASS: PREPARE: " + testName);
+ ps = prepareStatement(sqlBuffer.toString());
if (TEST_QUERY_EXECUTION)
{
for (int i = 1; i <= numParams; i++)
@@ -99,32 +109,41 @@
rs.close();
}
ps.close();
- System.out.println("PASS: " + testName);
+ commit();
return false;
- }catch (Exception e)
+ }catch (SQLException e)
{
- reportFailure(testName, e);
+ // The top level exception is expected to be
+ // the "user-friendly" query is too complex
+ // rather than some linkage error.
+ JDBC.assertSQLState("42ZA0", e);
return true;
}
}
/**
- * Test many parameters in the where clause
- * e.g.
- * @param con
+ * Test many logical operators in the where clause.
*/
- private static void testLogicalOperators(Connection con) throws SQLException {
+ public void testLogicalOperators() throws SQLException {
- // svn 372388 trunk - passed @ 400
- // Fix to DERBY-921 - passed @ 800
- // DERBY-921 - support 32bit branch offsets
- for (int count = 200; count <= 10000 ; count += 100)
+ int passCount = 0;
+ for (int count = 700; count <= 10000 ; count += 100)
{
- // keep testing until it fails with linkage error
- if (testLogicalOperators(con, count))
+ // keep testing until it fails
+ if (logicalOperators(count))
break;
+
+ passCount = count;
}
+
+ // svn 372388 trunk - passed @ 400
+ // Fix to DERBY-921 - passed @ 800
+ // DERBY-921 - support 32bit branch offsets
+ assertEquals("logical operators change from previous limit",
+ 800, passCount);
+
+
// 10,000 causes Stack overflow and database corruption
//testLogicalOperators(con, 10000);
}
@@ -133,11 +152,9 @@
/**
* Tests numParam parameter markers in a where clause
*
- * @param con
* @param numOperands
*/
- private static boolean testLogicalOperators(Connection con,
- int numOperands) throws SQLException {
+ private boolean logicalOperators(int numOperands) throws SQLException {
// First with parameters
String pred = "(si = ? AND si = ? )";
@@ -148,26 +165,32 @@
{
sqlBuffer.append(" OR " + pred);
}
- return checkT0Query(con, testName, sqlBuffer, numOperands, 2);
+ return checkT0Query(testName, sqlBuffer, numOperands, 2);
}
- private static void testInClause(Connection con) throws SQLException {
+ public void testInClause() throws SQLException {
// DERBY-739 raised number of parameters from 2700 to 3400
// svn 372388 trunk - passed @ 3400
- // fixes for DERBY-766 to split methods with individual statements
- // bumps the limit to 98,000 parameters.
- testInClause(con, 3400);
+ // So perform a quick check there.
+ assertFalse("IN clause with 3400 parameters ", inClause(3400));
+
+ int passCount = 0;
for (int count = 97000; count <= 200000 ; count += 1000)
{
- // keep testing until it fails.
- if (testInClause(con, count))
+ // keep testing until it fails.
+ if (inClause(count))
break;
+ passCount = count;
}
+
+ // fixes for DERBY-766 to split methods with individual statements
+ // bumps the limit to 98,000 parameters.
+ assertEquals("IN clause change from previous limit", 98000, passCount);
}
/**
@@ -178,7 +201,7 @@
* @return true if the test fails
* @throws SQLException
*/
- private static boolean testInClause(Connection con, int numParams) throws SQLException {
+ private boolean inClause(int numParams) throws SQLException {
String testName = "IN clause with " + numParams + " parameters";
StringBuffer sqlBuffer = new StringBuffer((numParams * 20) + 512);
sqlBuffer.append("SELECT * FROM T0 WHERE SI IN (" );
@@ -187,27 +210,14 @@
sqlBuffer.append("?, ");
}
sqlBuffer.append("?)");
- return checkT0Query(con, testName, sqlBuffer, numParams, 2);
+ return checkT0Query(testName, sqlBuffer, numParams, 2);
}
- private static void testUnions(Connection con) throws Exception
- {
- Statement stmt = null;
- PreparedStatement pstmt = null;
- createTestTable(con);
-
+ public void testUnions() throws SQLException
+ {
String viewName = "v0";
- stmt = con.createStatement();
-
-
- try {
- stmt.executeUpdate("drop view " + viewName);
- }catch (SQLException se)
- {
- // drop error ok.
- }
-
-
+ Statement stmt = createStatement();
+
StringBuffer createView = new StringBuffer("create view " + viewName +
" as select * from t0 " );
for (int i = 1; i < 100; i ++)
@@ -216,24 +226,39 @@
}
//System.out.println(createViewString);
stmt.executeUpdate(createView.toString());
+ commit();
- // svn 372388 trunk - passed @ 900
- for (int count = 800; count <= 10000; count += 100)
+ int passCount = 0;
+ for (int count = 1000; count <= 1000; count += 1000)
{
- // keep testing until it fails
- if (largeUnionSelect(con, viewName, count))
+ // keep testing until it fails
+ if (largeUnionSelect(viewName, count))
break;
+ passCount = count;
+
}
- // 10000 gives a different constant pool error
- largeUnionSelect(con, viewName, 10000);
+
+ // 10000 gives a different constant pool error
+ // DERBY-1315 gives out of memory error.
+ //assertTrue("10000 UNION passed!",
+ // largeUnionSelect(viewName, 10000));
+
+ createStatement().executeUpdate("DROP VIEW " + viewName);
+
+ // svn 372388 trunk - passed @ 900
+ // trunk now back to 700
+ //
+ assertEquals("UNION operators change from previous limit",
+ 1000, passCount);
+
+
}
- private static boolean largeUnionSelect(Connection con, String viewName,
- int numUnions) throws Exception
+ private boolean largeUnionSelect(String viewName,
+ int numUnions) throws SQLException
{
// There are 100 unions in each view so round to the nearest 100
- String testName = "SELECT with " + numUnions/100 * 100 + " unions";
String unionClause = " UNION ALL (SELECT * FROM " + viewName + ")";
@@ -251,12 +276,10 @@
// Ready to execute the problematic query
String selectSQL = selectSQLBuffer.toString();
//System.out.println(selectSQL);
- PreparedStatement pstmt = con.prepareStatement(selectSQL);
- System.out.println("PASS: PREPARE: " + testName);
+ PreparedStatement pstmt = prepareStatement(selectSQL);
if (largeCodeGen.TEST_QUERY_EXECUTION)
{
ResultSet rs = pstmt.executeQuery();
- int numRowsExpected = (numUnions/100 * 100);
int numRows = 0;
while (rs.next())
{
@@ -264,15 +287,19 @@
if ((numRows % 100) == 0)
checkRowData(rs);
}
- System.out.println("PASS: EXECUTE " + testName + " Row data check ok");
- con.commit();
+ rs.close();
+ commit();
}
pstmt.close();
return false;
} catch (SQLException sqle)
{
- reportFailure(testName, sqle);
+ // The top level exception is expected to be
+ // the "user-friendly" query is too complex
+ // rather than some linkage error.
+ JDBC.assertSQLState("42ZA0", sqle);
+
return true;
}
@@ -280,41 +307,113 @@
}
// Check the data on the positioned row against what we inserted.
- private static void checkRowData(ResultSet rs) throws Exception
+ private static void checkRowData(ResultSet rs) throws SQLException
{
//" values(2,3,4,5.3,5.3,5.3,31.13,123456.123, 'one','one','one')");
String[] values = {"2", "3", "4", "5.3","5.3","5.3","31.13","123456.123",
"one","one","one"};
for (int i = 1; i <= 11; i ++)
{
- String rsValue = rs.getString(i);
- String expectedValue = values[i - 1];
- if (!rsValue.equals(values[i-1]))
- throw new Exception("Result set data value: " + rsValue +
- " does not match " + values[i-1] +
- " for column " + i);
+ assertEquals("Result set data value: ",
+ values[i-1], rs.getString(i));
}
}
+
+ /**
+ * Test an INSERT statement with a large number of rows in the VALUES clause.
+ * Reported as DERBY-1714.
+ * @throws SQLException
+ *
+ */
+ public void testInsertValues() throws SQLException {
+ int passCount = 0;
+ for (int count = 1500; count <= 1700; count += 200) {
+ // keep testing until it fails
+ if (insertValues(count))
+ break;
+ passCount = count;
- /**
- * Show failure message and exception stack trace
- * @param testName
- * @param e
- */
- private static void reportFailure(String testName, Exception e)
- {
- System.out.println("FAILED QUERY: " + testName +".");
- if (e instanceof SQLException)
- {
- SQLException se = (SQLException) e;
- while (se != null && PRINT_FAILURE_EXCEPTION)
- {
- se.printStackTrace(System.out);
- se = se.getNextException();
- }
- }
- else e.printStackTrace();
-
- }
-
+ }
+
+ // Final fixes for DERBY-766 pushed the limit to 1700
+ // Beyond that a StackOverflow occurs.
+ assertEquals("INSERT VALUES change from previous limit", 1700, passCount);
+ }
+
+ /**
+ * Create a large insert statement with rowCount rows all with
+ * constants. Prepare and execute it and then rollback to leave
+ * the table unchanged.
+ * @param rowCount
+ * @return
+ * @throws SQLException
+ */
+ private boolean insertValues(int rowCount) throws SQLException {
+ Random r = new Random(3457245435L);
+
+ StringBuffer insertSQL = new StringBuffer(
+ "INSERT INTO T0(SI,I,BI,R,F,D,N5_2,DEC10_3,CH20,VC,LVC) VALUES\n");
+
+ for (int i = 0; i < rowCount; i++) {
+ if (i != 0)
+ insertSQL.append(',');
+
+ insertSQL.append('(');
+
+ insertSQL.append(((short) r.nextInt()));
+ insertSQL.append(',');
+ insertSQL.append(i);
+ insertSQL.append(',');
+ insertSQL.append(r.nextLong());
+ insertSQL.append(',');
+
+ insertSQL.append(r.nextFloat());
+ insertSQL.append(',');
+ insertSQL.append(r.nextFloat());
+ insertSQL.append(',');
+ insertSQL.append(r.nextDouble());
+ insertSQL.append(',');
+
+ insertSQL.append("462.54");
+ insertSQL.append(',');
+ insertSQL.append("9324324.34");
+ insertSQL.append(',');
+
+ insertSQL.append('\'');
+ insertSQL.append("c");
+ insertSQL.append(r.nextInt() % 10);
+ insertSQL.append('\'');
+ insertSQL.append(',');
+
+ insertSQL.append('\'');
+ insertSQL.append("vc");
+ insertSQL.append(r.nextInt() % 1000000);
+ insertSQL.append('\'');
+ insertSQL.append(',');
+
+ insertSQL.append('\'');
+ insertSQL.append("lvc");
+ insertSQL.append(r.nextInt());
+ insertSQL.append('\'');
+
+ insertSQL.append(')');
+
+ insertSQL.append('\n');
+ }
+
+ try {
+ PreparedStatement ps = prepareStatement(insertSQL.toString());
+ assertEquals("Incorrect update count", rowCount, ps.executeUpdate());
+ ps.close();
+ rollback();
+ return false;
+ } catch (SQLException e) {
+ // The top level exception is expected to be
+ // the "user-friendly" query is too complex
+ // rather than some linkage error.
+ JDBC.assertSQLState("42ZA0", e);
+ }
+
+ return true;
+ }
}
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/JDBC.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/JDBC.java?rev=433085&r1=433084&r2=433085&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/JDBC.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/JDBC.java Sun Aug 20 16:22:04 2006
@@ -299,7 +299,7 @@
* rows and columns. Each column is accessed using
* getString() and asserted that the returned value
* matches the state of ResultSet.wasNull().
- * Provides simple testing of the ResultSet when then contents
+ * Provides simple testing of the ResultSet when the contents
* are not important.
* @param rs
* @throws SQLException
@@ -318,6 +318,16 @@
}
rs.close();
}
+
+ /**
+ * Assert a SQL state is the expected value.
+ * @param expected Expected SQLState.
+ * @param sqle SQLException caught
+ */
+ public static void assertSQLState(String expected, SQLException sqle)
+ {
+ Assert.assertEquals("Unexpected SQL State", expected, sqle.getSQLState());
+ }
/**
* Escape a non-qualified name so that it is suitable