Return-Path: Delivered-To: apmail-db-derby-dev-archive@www.apache.org Received: (qmail 82453 invoked from network); 15 Jul 2009 12:45:33 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 15 Jul 2009 12:45:33 -0000 Received: (qmail 70942 invoked by uid 500); 15 Jul 2009 12:45:43 -0000 Delivered-To: apmail-db-derby-dev-archive@db.apache.org Received: (qmail 70909 invoked by uid 500); 15 Jul 2009 12:45:43 -0000 Mailing-List: contact derby-dev-help@db.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: Delivered-To: mailing list derby-dev@db.apache.org Received: (qmail 70901 invoked by uid 99); 15 Jul 2009 12:45:42 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 15 Jul 2009 12:45:42 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.140] (HELO brutus.apache.org) (140.211.11.140) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 15 Jul 2009 12:45:34 +0000 Received: from brutus (localhost [127.0.0.1]) by brutus.apache.org (Postfix) with ESMTP id E09F8234C04B for ; Wed, 15 Jul 2009 05:45:14 -0700 (PDT) Message-ID: <1653334446.1247661914919.JavaMail.jira@brutus> Date: Wed, 15 Jul 2009 05:45:14 -0700 (PDT) From: "Myrna van Lunteren (JIRA)" To: derby-dev@db.apache.org Subject: [jira] Updated: (DERBY-1511) SELECT clause without a WHERE, causes an Exception when extracting a Blob from a database In-Reply-To: <21325122.1152897675447.JavaMail.jira@brutus> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 X-Virus-Checked: Checked by ClamAV on apache.org [ https://issues.apache.org/jira/browse/DERBY-1511?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Myrna van Lunteren updated DERBY-1511: -------------------------------------- Urgency: Normal > SELECT clause without a WHERE, causes an Exception when extracting a Blob from a database > ----------------------------------------------------------------------------------------- > > Key: DERBY-1511 > URL: https://issues.apache.org/jira/browse/DERBY-1511 > Project: Derby > Issue Type: Bug > Components: Miscellaneous > Affects Versions: 10.1.2.1 > Environment: Windows XP > Reporter: David Heath > Priority: Minor > > An exception occurs when extracting a Blob from a database. > The following code, will ALWAYS fail with the Exception: > java.io.IOException: ERROR 40XD0: Container has been closed > at org.apache.derby.impl.store.raw.data.OverflowInputStream.fillByteHold > er(Unknown Source) > at org.apache.derby.impl.store.raw.data.BufferedByteHolderInputStream.re > ad(Unknown Source) > at java.io.DataInputStream.read(Unknown Source) > at java.io.FilterInputStream.read(Unknown Source) > at java.io.ObjectInputStream$PeekInputStream.read(Unknown Source) > at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source) > at java.io.ObjectInputStream$BlockDataInputStream.readDoubles(Unknown So > urce) > at java.io.ObjectInputStream.readArray(Unknown Source) > at java.io.ObjectInputStream.readObject0(Unknown Source) > at java.io.ObjectInputStream.readObject(Unknown Source) > at BlobTest.readRows(BlobTest.java:82) > at BlobTest.main(BlobTest.java:24) > CODE: > import java.io.*; > import java.sql.*; > import java.util.*; > public class BlobTest > { > private static final String TABLE1 = "CREATE TABLE TABLE_1 ( " > + "ID INTEGER NOT NULL, " > + "COL_2 INTEGER NOT NULL, " > + "PRIMARY KEY (ID) )"; > private static final String TABLE2 = "CREATE TABLE TABLE_2 ( " > + "ID INTEGER NOT NULL, " > + "COL_BLOB BLOB, " > + "PRIMARY KEY (ID) )"; > public static void main(String... args) { > try { > createDBandTables(); > Connection con = getConnection(); > addRows(con, 10000, 1); > addRows(con, 10000, 2); > readRows(con, 1); > con.close(); > } > catch(Exception exp) { > exp.printStackTrace(); > } > } > private static void addRows(Connection con, int size, int id) > throws Exception > { > String sql = "INSERT INTO TABLE_1 VALUES(?, ?)"; > PreparedStatement pstmt = con.prepareStatement(sql); > pstmt.setInt(1, id); > pstmt.setInt(2, 2); > pstmt.executeUpdate(); > pstmt.close(); > double[] array = new double[size]; > array[size-1] = 1.23; > sql = "INSERT INTO TABLE_2 VALUES(?, ?)"; > pstmt = con.prepareStatement(sql); > pstmt.setInt(1, id); > ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); > ObjectOutputStream objStream = new ObjectOutputStream(byteStream); > objStream.writeObject(array); // Convert object to byte stream > objStream.flush(); > objStream.close(); > byte[] bytes = byteStream.toByteArray(); > ByteArrayInputStream inStream = new ByteArrayInputStream(bytes); > pstmt.setBinaryStream(2, inStream, bytes.length); > pstmt.executeUpdate(); > pstmt.close(); > } > private static void readRows(Connection con, int id) throws Exception > { > String sql = "SELECT * FROM TABLE_2"; > // String sql = "SELECT * FROM TABLE_2 WHERE ID > 0"; > Statement stmt = con.createStatement(); > ResultSet rs = stmt.executeQuery(sql); > while (rs.next()) { > rs.getInt(1); > InputStream stream = rs.getBinaryStream(2); > ObjectInputStream objStream = new ObjectInputStream(stream); > Object obj = objStream.readObject(); > double[] array = (double[]) obj; > System.out.println(array.length); > readTable1(con, id); > } > rs.close(); > stmt.close(); > } > private static void readTable1(Connection con, int id) throws Exception { > String sql = "SELECT ID FROM TABLE_1 WHERE ID=" + id; > Statement stmt = con.createStatement(); > ResultSet rs = stmt.executeQuery(sql); > if (rs.next()) { > } > rs.close(); > stmt.close(); > } > > private static Connection getConnection() throws Exception { > String driver="org.apache.derby.jdbc.EmbeddedDriver"; > Properties p = System.getProperties(); > p.put("derby.system.home", "C:\\databases\\sample"); > > Class.forName(driver); > String url = "jdbc:derby:derbyBlob"; > Connection con = DriverManager.getConnection(url); > return con; > } > private static void createDBandTables() throws Exception { > String driver="org.apache.derby.jdbc.EmbeddedDriver"; > Properties p = System.getProperties(); > p.put("derby.system.home", "C:\\databases\\sample"); > > Class.forName(driver); > String url = "jdbc:derby:derbyBlob;create=true"; > Connection con = DriverManager.getConnection(url); > Statement stmt = con.createStatement(); > stmt.execute(TABLE1); > stmt.execute(TABLE2); > stmt.close(); > con.close(); > } > } > However if the selection clause is changed from: > String sql = "SELECT * FROM TABLE_2"; > TO > String sql = "SELECT * FROM TABLE_2 WHERE ID > 0"; > The code works without Exception. > Output from: java org.apache.derby.tools.sysinfo > ------------------ Java Information ------------------ > Java Version: 1.5.0_05 > Java Vendor: Sun Microsystems Inc. > Java home: C:\Program Files\Java\jre1.5.0_05 > Java classpath: C:\tools\derby\db-derby-10.1.2.1-bin\lib\derby.jar;C:\tools\der > by\db-derby-10.1.2.1-bin\lib\derbytools.jar; > OS name: Windows XP > OS architecture: x86 > OS version: 5.1 > Java user name: David > Java user home: C:\Documents and Settings\David > Java user dir: C:\david\novice\derby > java.specification.name: Java Platform API Specification > java.specification.version: 1.5 > --------- Derby Information -------- > JRE - JDBC: J2SE 5.0 - JDBC 3.0 > [C:\tools\derby\db-derby-10.1.2.1-bin\lib\derby.jar] 10.1.2.1 - (330608) > [C:\tools\derby\db-derby-10.1.2.1-bin\lib\derbytools.jar] 10.1.2.1 - (330608) > ------------------------------------------------------ > ----------------- Locale Information ----------------- > ------------------------------------------------------ -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.