Issue Details (XML | Word | Printable)

Key: DERBY-3243
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Critical Critical
Assignee: Kathey Marsden
Reporter: Oliver Seidel
Votes: 1
Watchers: 1
Operations

If you were logged in you would be able to see more operations.
Derby

(jdbc net client) exception during normal iteration through "ResultSet" of "select * from t"

Created: 02/Dec/07 07:02 PM   Updated: 30/Jun/09 03:55 PM
Return to search
Component/s: JDBC
Affects Version/s: 10.3.2.1
Fix Version/s: 10.3.3.0, 10.4.1.3

Time Tracking:
Not Specified

File Attachments:
  Size
Text File Licensed for inclusion in ASF works derby-3243_diff.txt 2008-01-31 09:50 PM Kathey Marsden 2 kB
Text File Licensed for inclusion in ASF works derby-3243_diff2.txt 2008-02-01 05:48 PM Kathey Marsden 3 kB
Text File Licensed for inclusion in ASF works derby-3243_fix_double_hashmap_entry_diff.txt 2008-01-26 08:40 PM Kathey Marsden 7 kB
Text File Licensed for inclusion in ASF works derby-3243_fix_double_hashmap_entry_diff2.txt 2008-01-29 09:06 PM Kathey Marsden 8 kB
Text File Licensed for inclusion in ASF works derby-3243_fix_double_hashmap_entry_stat.txt 2008-01-26 08:40 PM Kathey Marsden 0.4 kB
Text File Licensed for inclusion in ASF works derby-3243_stat.txt 2008-01-31 09:50 PM Kathey Marsden 0.1 kB
Environment:
------------------ Java Information ------------------
Java Version: 1.4.2_03
Java Vendor: Sun Microsystems Inc.
Java home: C:\Programme\Java\j2re1.4.2_03
Java classpath: derbyclient.jar
OS name: Windows XP
OS architecture: x86
OS version: 5.1
Java user name: cbdqok
Java user home: C:\Dokumente und Einstellungen\cbdqok
Java user dir: D:\users\cbdqok\privat\osj\lib_derby_net\lib
java.specification.name: Java Platform API Specification
java.specification.version: 1.4
--------- Derby Information --------
JRE - JDBC: J2SE 1.4.2 - JDBC 3.0
[D:\users\cbdqok\privat\osj\lib_derby_net\lib\derbyclient.jar] 10.3.1.4 - (561794)
------------------------------------------------------
----------------- Locale Information -----------------
------------------------------------------------------
Issue Links:
Reference

Urgency: Low
Issue & fix info: Patch Available
Bug behavior facts: Regression
Resolution Date: 05/Feb/08 04:13 PM


 Description  « Hide
Thanks again to the DERBY developers.

For my convenience I use the client/server variant of DERBY. This is where the error occurs. I have temporarily alleviated the problem for my case by using the embedded version.

I'm forced to use outlook and have built a program which siphons the messages into a derby database (phase 1 -- table has two varchar fields and a clob). When reading them back (phase 2 -- simple select of all records in no particular order, all 3 attributes), it has developed an exception. This is a result of data volume. I have reduced the problem to a single demonstration program.

This behaviour, and the fact that the error is not a "DERBY Exception", but a proper exception coming back from the JDBC call, leads me to the diagnosis that it is a derby network client jdbc problem.

The problem has been reproduced once by Bryan Pendleton: http://www.nabble.com/IndexOutOfBoundsException-t4926228.html

I'll try to attach the code "error.java"; it can also be found on: http://www.os10000.net/error.java

Please use as follows:

javac -classpath derby.jar:derbynet.jar error.java
java -cp .:derby.jar:derbynet.jar error

It will create a directory "test_db" and fill it with approx 120mb data.
Then you will observe the failure.

/* -*- Mode:Java; c-basic-offset:8 -*- */

// --------------------------------------------------------------------------------

public class error {

// ------------------------------------------------------------------------

public static final int port = 1527;
public static final String host = "127.0.0.1";

// ------------------------------------------------------------------------

public static void log(String x) { System.out.println(x); };

// ------------------------------------------------------------------------

public static void log_stacktrace(Exception e) {
                java.io.StringWriter sw = new java.io.StringWriter();
                java.io.PrintWriter pw = new java.io.PrintWriter(sw);
                e.printStackTrace(pw);
                log(sw.toString());
};

// ------------------------------------------------------------------------

public static void start_server() {
try {
org.apache.derby.drda.NetworkServerControl server =
new org.apache.derby.drda.NetworkServerControl(java.net.InetAddress.getByName(host),port);
server.start(null);
try { java.lang.Thread.sleep(5000); } catch (Exception e) { };
log("started DERBY on host "+host+" port "+Integer.toString(port)+".");
} catch (Exception e) {
log_stacktrace(e);
};
};

// ------------------------------------------------------------------------

public static java.sql.Connection con()
throws java.sql.SQLException, java.lang.ClassNotFoundException {
Class.forName("org.apache.derby.jdbc.ClientDriver");
String x_dbse = "test_db";
String x_user = ";user=os10000";
String x_pass = ";password=ding";
String x_crte = ";create=true";
String x_msgs = ";retrieveMessagesFromServerOnGetMessage=true";
String connect = "jdbc:derby://"+host+":"+port+"/"+x_dbse+x_user+x_crte+x_msgs;
return java.sql.DriverManager.getConnection(connect);
};

// ----------------------------------------------------------------------

public static String getclob(java.sql.Clob b) {
java.io.CharArrayWriter caw = new java.io.CharArrayWriter();
try {
java.io.Reader rd = b.getCharacterStream();
char cb[] = new char[4096];
int off=0, bts = rd.read(cb);
while (bts>0) { caw.write(cb,off,bts); off+=bts; bts=rd.read(cb); };
rd.close();
} catch(Exception e) {};
String res = caw.toString();
caw.close();
return res;
};

// ----------------------------------------------------------------------

public static class myclob implements java.sql.Clob {
String v;
public myclob(String z) { v=z; };
public java.io.InputStream getAsciiStream() { return new java.io.ByteArrayInputStream(v.getBytes()); };
public java.io.Reader getCharacterStream() { return new java.io.CharArrayReader(v.toCharArray()); };
public String getSubString(long pos, int length) { return v.substring((int)pos,(int)(pos+length)); };
public long length() { return v.length(); };
public long position(java.sql.Clob pattern, long start) { return 0; };
public long position(String pattern, long start) { return 0; };
public java.io.OutputStream setAsciiStream(long pos) {
new java.sql.SQLException("setAsciiStream not implemented."); return null; };
public java.io.Writer setCharacterStream(long pos) {
new java.sql.SQLException("setCharacterStream not implemented."); return null; };
public int setString(long pos, String s) {
new java.sql.SQLException("setString not implemented."); return -1; };
public int setString(long pos, String s, int offset, int len) {
new java.sql.SQLException("setString not implemented."); return -1; };
public void truncate(long len) {
new java.sql.SQLException("truncate not implemented."); };
};

public static java.sql.Clob putclob(String x) { return new myclob(x); };

// ------------------------------------------------------------------------

public static String getLob(java.sql.ResultSet rs, int arg)
throws java.sql.SQLException { return getclob(rs.getClob(arg)); };
public static void setLob(java.sql.PreparedStatement ps, int arg, String val)
throws java.sql.SQLException { ps.setClob(arg,putclob(val)); };

// ------------------------------------------------------------------------

public static String clean_string(String x) {
return x.replaceAll("[\0\r\\\\]","").replaceAll("'","\\\"").replaceAll(",+",",");
};

// ------------------------------------------------------------------------

public static String make_string(int digits) {
double dl = (Math.random()) * (Math.pow(10.0,digits*Math.random()));
int len = (int) dl;
byte buf[] = new byte[len];
while (len>0) {
double db = 256*Math.random();
buf[--len] = (byte)db;
};
return clean_string(new String(buf));
};

// ------------------------------------------------------------------------

public static void update(java.sql.Connection c, String cmd)
throws java.sql.SQLException {
c.createStatement().execute(cmd);
};

// ------------------------------------------------------------------------

public static final int entries=100000;

public static void fill_db(java.sql.Connection c)
throws java.sql.SQLException {
try { update(c,"drop table mail_raw"); } catch (Exception e) {};

try { update(c,"create table mail_raw ( msg varchar(999), att varchar(100), val clob )"); }
catch (Exception e) { log_stacktrace(e); };

java.sql.PreparedStatement pstmt = null;

try { pstmt = c.prepareStatement("insert into mail_raw values ( ?, ?, ? )"); }
catch (Exception e) { log_stacktrace(e); };

for (int i=0; i<entries; i++) {
pstmt.setString(1,make_string(3));
pstmt.setString(2,"5 body");
setLob(pstmt,3,make_string(4));
pstmt.executeUpdate();
if (i%100==0) log("step "+i+"/"+entries);
};
};

// ------------------------------------------------------------------------

public static void dump_db(java.sql.Connection c)
throws java.sql.SQLException {
log("performing dump.");
java.sql.ResultSet rs = c.createStatement().executeQuery("select * from mail_raw");
while (rs.next()) {
String msg = rs.getString(1);
String att = rs.getString(2);
String val = getLob(rs,3);
};
};

// ------------------------------------------------------------------------

public static void main(String args[]) {
start_server();
try {
java.sql.Connection c = con();
fill_db(c);
dump_db(c);
} catch (Exception e) { log_stacktrace(e); };
};

// ------------------------------------------------------------------------
};


 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
No work has yet been logged on this issue.