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

                 Key: DERBY-3243
                 URL: https://issues.apache.org/jira/browse/DERBY-3243
             Project: Derby
          Issue Type: Bug
          Components: JDBC
    Affects Versions: 10.3.1.5
         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 -----------------
------------------------------------------------------

            Reporter: Oliver Seidel
            Priority: Critical


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); };
        };

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


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to