package org.apache.derbyTesting.functionTests.tests.largedata; | |
import java.sql.Connection; | |
import java.sql.PreparedStatement; | |
import java.sql.SQLException; | |
import java.sql.Statement; | |
import junit.framework.Test; | |
import org.apache.derbyTesting.junit.BaseJDBCTestCase; | |
import org.apache.derbyTesting.junit.BaseTestSuite; | |
import org.apache.derbyTesting.junit.CleanDatabaseTestSetup; | |
import org.apache.derbyTesting.junit.JDBC; | |
/* | |
Class org.apache.derbyTesting.functionTests.tests.store.Derby5624Test | |
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. | |
*/ | |
/** | |
Test to reproduce DERBY-5624, a recursion during DropOnCommit causes out | |
of stack space for operations that generate a lot of objects to be dropped | |
at commit time. | |
This test reproduces the problem by creating a table with 1000 columns, then | |
an index on each of those columns, loads some data and then call compress | |
will drop and recreate each of those indexes. At commit time each index | |
drop will have registered itself onto the Observer list for processing at | |
commit time. Before fix this would fail with out of disk space in at least | |
XP, ibm16 default jvm configuration. | |
**/ | |
public class Derby5624Test extends BaseJDBCTestCase | |
{ | |
/************************************************************************** | |
* Fields of the class | |
************************************************************************** | |
*/ | |
/************************************************************************** | |
* Constructors for This class: | |
************************************************************************** | |
*/ | |
/************************************************************************** | |
* Private/Protected methods of This class: | |
************************************************************************** | |
*/ | |
/************************************************************************** | |
* Public Methods of This class: | |
************************************************************************** | |
*/ | |
/************************************************************************** | |
* Public Methods of XXXX class: | |
************************************************************************** | |
*/ | |
public Derby5624Test(String name) | |
{ | |
super(name); | |
} | |
/** | |
* DERBY-5624 test case | |
* <p> | |
* | |
**/ | |
public void testDERBY_5624() | |
throws SQLException | |
{ | |
Statement stmt = createStatement(); | |
PreparedStatement insert_stmt = | |
prepareStatement( | |
"INSERT INTO TESTBIGTABLE (col1, col2, col3) VALUES(?, ?, ?)"); | |
for (int i = 0; i < 3000; i++) | |
{ | |
insert_stmt.setInt(1, i); | |
insert_stmt.setInt(2, -(i)); | |
insert_stmt.setInt(3, i); | |
insert_stmt.executeUpdate(); | |
} | |
commit(); | |
// create index on each column | |
for (int i = 0; i < 1000; i++) | |
{ | |
stmt.executeUpdate( | |
"CREATE INDEX INDEXBIG" + i + | |
" on TESTBIGTABLE (col" + i + ")"); | |
} | |
commit(); | |
// see if compress succeeeds | |
stmt.executeUpdate( | |
"call SYSCS_UTIL.SYSCS_COMPRESS_TABLE('APP', 'TESTBIGTABLE', 0)"); | |
commit(); | |
// verify access to table after the commit, previous to fix the | |
// commit would fail with an out of memory or out of stack space error. | |
JDBC.assertUnorderedResultSet( | |
prepareStatement( | |
"select col1, col2 from TESTBIGTABLE where col1 = 10").executeQuery(), | |
new String[][] {{"10", "-10"}}); | |
} | |
protected static Test baseSuite(String name) | |
{ | |
BaseTestSuite suite = new BaseTestSuite(name); | |
suite.addTestSuite(Derby5624Test.class); | |
return new CleanDatabaseTestSetup(suite) | |
{ | |
/** | |
* Creates the tables used in the test cases. | |
* @exception SQLException if a database error occurs | |
*/ | |
protected void decorateSQL(Statement stmt) throws SQLException | |
{ | |
Connection conn = stmt.getConnection(); | |
// create table with 1000 columns | |
StringBuffer create_table_qry = new StringBuffer(10000); | |
create_table_qry.append("CREATE TABLE TESTBIGTABLE (col0 int"); | |
for (int colnum = 1; colnum < 1000; colnum++) | |
{ | |
create_table_qry.append(", col" + colnum + " int"); | |
} | |
create_table_qry.append(")"); | |
// CREATE TABLE TESTBIGTABLE ( | |
// col0 int, col1 int, ... , col999 int) | |
stmt.executeUpdate(create_table_qry.toString()); | |
conn.setAutoCommit(false); | |
} | |
}; | |
} | |
public static Test suite() | |
{ | |
BaseTestSuite suite = new BaseTestSuite("Derby5624Test"); | |
suite.addTest(baseSuite("Derby5624Test:embedded")); | |
return suite; | |
} | |
} |