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 km...@apache.org on 2007/05/03 21:29:26 UTC

svn commit: r534969 - in /db/derby/code/branches/10.1/java: drda/org/apache/derby/impl/drda/ testing/org/apache/derbyTesting/functionTests/master/ testing/org/apache/derbyTesting/functionTests/master/DerbyNet/jdk15/ testing/org/apache/derbyTesting/func...

Author: kmarsden
Date: Thu May  3 12:29:25 2007
New Revision: 534969

URL: http://svn.apache.org/viewvc?view=rev&rev=534969
Log:
DERBY-1533 ArrayIndexOutOfBoundsException in DDMReader, on a specific data size


Modified:
    db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DDMReader.java
    db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/jdk15/prepStmt.out
    db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk15/prepStmt.out
    db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/prepStmt.out
    db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/prepStmt.java

Modified: db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DDMReader.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DDMReader.java?view=diff&rev=534969&r1=534968&r2=534969
==============================================================================
--- db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DDMReader.java (original)
+++ db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DDMReader.java Thu May  3 12:29:25 2007
@@ -1335,7 +1335,7 @@
 	{
 		byte[] b;
 
-		if (length < dssLength)
+		if (length < DssConstants.MAX_DSS_LENGTH)
 		{
 			ensureBLayerDataInBuffer (length, ADJUST_LENGTHS);
 		    b = new byte[length];
@@ -1609,22 +1609,21 @@
 							   DRDAProtocolException.NO_CODPNT_ARG);
 			}
 
-			newdssLength += continueHeaderLength;
+			newdssLength += (continueHeaderLength-2);
 
 			// calculate the number of bytes to shift
-			if (i == (continueDssHeaderCount - 1))
+			if (i != (continueDssHeaderCount - 1))
 				bytesToShift = DssConstants.MAX_DSS_LENGTH;
 			else
 				bytesToShift = dssLength;
 
-			tempPos -= (shiftSize - 1);
-			System.arraycopy(buffer, tempPos, buffer, tempPos - bytesToShift +
-							 shiftSize , bytesToShift);
-			tempPos -= bytesToShift;
-			tempPos += (shiftSize + 1);
+			tempPos -= (bytesToShift - 2);
+			System.arraycopy(buffer, tempPos - shiftSize, buffer, tempPos,
+							 bytesToShift);
 		}
 		// reposition the start of the data after the final DSS shift.
 		pos = tempPos;
+		dssLength += newdssLength;
 	}
 
 	/**

Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/jdk15/prepStmt.out
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/jdk15/prepStmt.out?view=diff&rev=534969&r1=534968&r2=534969
==============================================================================
--- db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/jdk15/prepStmt.out (original)
+++ db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/jdk15/prepStmt.out Thu May  3 12:29:25 2007
@@ -85,4 +85,6 @@
 Fetched a row, c2.length=12750
 JIRA-1454 repro with c2 len=12749
 Fetched a row, c2.length=12749
+JIRA Test 1533(a) successful (no exception)
+JIRA Test 1533(b) successful (no exception)
 prepStmt Test Ends

Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk15/prepStmt.out
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk15/prepStmt.out?view=diff&rev=534969&r1=534968&r2=534969
==============================================================================
--- db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk15/prepStmt.out (original)
+++ db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk15/prepStmt.out Thu May  3 12:29:25 2007
@@ -85,4 +85,6 @@
 Fetched a row, c2.length=12750
 JIRA-1454 repro with c2 len=12749
 Fetched a row, c2.length=12749
+JIRA Test 1533(a) successful (no exception)
+JIRA Test 1533(b) successful (no exception)
 prepStmt Test Ends

Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/prepStmt.out
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/prepStmt.out?view=diff&rev=534969&r1=534968&r2=534969
==============================================================================
--- db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/prepStmt.out (original)
+++ db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/prepStmt.out Thu May  3 12:29:25 2007
@@ -85,4 +85,6 @@
 Fetched a row, c2.length=12750
 JIRA-1454 repro with c2 len=12749
 Fetched a row, c2.length=12749
+JIRA Test 1533(a) successful (no exception)
+JIRA Test 1533(b) successful (no exception)
 prepStmt Test Ends

Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/prepStmt.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/prepStmt.java?view=diff&rev=534969&r1=534968&r2=534969
==============================================================================
--- db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/prepStmt.java (original)
+++ db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/prepStmt.java Thu May  3 12:29:25 2007
@@ -45,6 +45,15 @@
 {
 	private static Connection conn = null;
 
+
+    private static String[] testObjects =  // string array for cleaning up
+        {"table t1", "table tab1", "table t2", "table bigtab", "table tstab",
+         "table doubletab", "table numtab", "table Numeric_Tab", "table jira614", 
+	 "table jira614_a", "table jira428", "table jira125", 
+         "table jira125125125125125125125125125125125125125125125125125125125125125125125125125125125125125125125",
+         "table jira1533_a", "table jira1533_b"};
+
+
 	public static void main (String args[])
 	{
 		try
@@ -307,6 +316,8 @@
 			jira125Test(conn);
 			jira1454Test(conn);
 			jira428Test(conn);
+                        jira1533Test_a(conn);
+                        jira1533Test_b(conn);
 			conn.close();
 			System.out.println("prepStmt Test Ends");
         }
@@ -990,6 +1001,107 @@
         while (rs.next());
         System.out.println("Iteration 1 successful: " + (nCols + 1) +
 			" parameter markers successfully prepared and executed.");
+    }
+    // Jira 1533 involves two different bugs regarding the handling of large
+    // amounts of parameter data: first, the Network Server was incorrectly
+    // handling the desegmentation of continued DSS segements, and second,
+    // the Network Server was using the wrong heuristic to determine whether
+    // long string data was being flowed in-line or externalized.
+    //
+    // Tests "a" and "b" provoke two different forms of this problem, one
+    // with just a single continued segement, and one with several continuations
+    private static void jira1533Test_a(Connection conn)
+        throws Exception
+    {
+        Statement stmt = conn.createStatement();
+        PreparedStatement ps ;
+        try { stmt.execute("drop table jira1533_a"); } catch (Throwable t) { }
+        stmt.execute("create table jira1533_a (aa BIGINT NOT NULL, "+
+                "bbbbbb BIGINT DEFAULT 0 NOT NULL,"+
+                " cccc  VARCHAR(40), ddddddddddd BIGINT, eeeeee VARCHAR(128),"+
+                " ffffffffffffffffff VARCHAR(128),"+
+                "ggggggggg  BLOB(2G), hhhhhhhhh VARCHAR(128), "+
+                "iiiiiiii VARCHAR(128), jjjjjjjjjjjjjj BIGINT,"+
+                "kkkkkkkk CHAR(1) DEFAULT 'f', "+
+                "llllllll CHAR(1) DEFAULT 'f', "+
+                "mmmmmmmmmmmmm  CHAR(1) DEFAULT 'f')");
+        stmt.close();
+        ps = conn.prepareStatement(
+                "INSERT INTO jira1533_a (aa,bbbbbb,cccc,ddddddddddd,eeeeee,"+
+                " ffffffffffffffffff,"+
+                "ggggggggg,hhhhhhhhh,iiiiiiii,jjjjjjjjjjjjjj,kkkkkkkk,"+
+                "llllllll,mmmmmmmmmmmmm)"+
+                " VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)");
+        String blobStr = makeString(32584);
+        ps.setLong(1,5);
+        ps.setLong(2,1);
+        ps.setString(3,"AAAAAAAAAAA");
+        ps.setLong(4,30000);
+        ps.setString(5,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
+        ps.setString(6,"AAAAAAAAAAA");
+        ps.setBytes(7,blobStr.getBytes());
+        ps.setString(8,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
+        ps.setString(9,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
+        ps.setLong(10,1);
+        ps.setString(11,"1");
+        ps.setString(12,"1");
+        ps.setString(13,"1");
+        ps.execute();
+        ps.close();
+        System.out.println("JIRA Test 1533(a) successful (no exception)");
+    }
+    private static void jira1533Test_b(Connection conn)
+        throws Exception
+    {
+        Statement stmt = conn.createStatement();
+        PreparedStatement ps ;
+        try { stmt.execute("drop table jira1533_b"); } catch (Throwable t) { }
+        stmt.execute("create table jira1533_b (aa BIGINT NOT NULL, "+
+                "bbbbbb BIGINT DEFAULT 0 NOT NULL,"+
+                " cccc  VARCHAR(40), ddddddddddd BIGINT, eeeeee VARCHAR(128),"+
+                " ffffffffffffffffff VARCHAR(128),"+
+                "g1 BLOB(2G),g2 BLOB(2G),g3 BLOB(2G),g4 BLOB(2G),"+
+                "ggggggggg  BLOB(2G), hhhhhhhhh VARCHAR(128), "+
+                "iiiiiiii VARCHAR(128), jjjjjjjjjjjjjj BIGINT,"+
+                "kkkkkkkk CHAR(1) DEFAULT 'f', "+
+                "llllllll CHAR(1) DEFAULT 'f', "+
+                "mmmmmmmmmmmmm  CHAR(1) DEFAULT 'f')");
+        stmt.close();
+        ps = conn.prepareStatement(
+                "INSERT INTO jira1533_b (aa,bbbbbb,cccc,ddddddddddd,eeeeee,"+
+                " ffffffffffffffffff,"+
+                "g1,g2,g3,g4,"+
+                "ggggggggg,hhhhhhhhh,iiiiiiii,jjjjjjjjjjjjjj,kkkkkkkk,"+
+                "llllllll,mmmmmmmmmmmmm)"+
+                " VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
+        String blobStr = makeString(32584);
+        ps.setLong(1,5);
+        ps.setLong(2,1);
+        ps.setString(3,"AAAAAAAAAAA");
+        ps.setLong(4,30000);
+        ps.setString(5,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
+        ps.setString(6,"AAAAAAAAAAA");
+        ps.setBytes(7,blobStr.getBytes());
+        ps.setBytes(8,blobStr.getBytes());
+        ps.setBytes(9,blobStr.getBytes());
+        ps.setBytes(10,blobStr.getBytes());
+        ps.setBytes(11,blobStr.getBytes());
+        ps.setString(12,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
+        ps.setString(13,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
+        ps.setLong(14,1);
+        ps.setString(15,"1");
+        ps.setString(16,"1");
+        ps.setString(17,"1");
+        ps.execute();
+        ps.close();
+        System.out.println("JIRA Test 1533(b) successful (no exception)");
+    }
+    private static String makeString(int length)
+    {
+        StringBuffer buf = new StringBuffer();
+        for (int i = 0; i < length; i++)
+            buf.append("X");
+        return buf.toString();
     }
     // Jira 428 involves large batch sizes for Statement.addBatch and
     // Statement.executeBatch. Currently, there is a hard DRDA limit of