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 2006/04/13 15:15:06 UTC

svn commit: r393798 - 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/ testing/org/apache/derbyTesting/functionTe...

Author: kmarsden
Date: Thu Apr 13 06:14:26 2006
New Revision: 393798

URL: http://svn.apache.org/viewcvs?rev=393798&view=rev
Log:
DERBY-614 Protocol error when entire result set is not retrieved.

Port from trunk:

355689 - Fixes the split logic when data passes the blksize boundary.
Details of the fix are in spec.html attached to DERBY-614

378552 - clear splitQRYTDA field for reuse of the resultset

Contributed by Bryan Pendleton


Modified:
    db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAConnThread.java
    db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAResultSet.java
    db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAStatement.java
    db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/big.out
    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/big.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
    db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/lang/big.sql
    db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/util/ProcedureTest.java

Modified: db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAConnThread.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAConnThread.java?rev=393798&r1=393797&r2=393798&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAConnThread.java (original)
+++ db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAConnThread.java Thu Apr 13 06:14:26 2006
@@ -5841,7 +5841,43 @@
 	/**
 	 * Write QRYDTA - Query Answer Set Data
 	 *  Contains some or all of the answer set data resulting from a query
-	 *  returns true if there is more data, false if we reached the end
+	 *  If the client is not using rowset processing, this routine attempts
+	 *  to pack as much data into the QRYDTA as it can. This may result in
+	 *  splitting the last row across the block, in which case when the
+	 *  client calls CNTQRY we will return the remainder of the row.
+	 *
+	 *  Splitting a QRYDTA block is expensive, for several reasons:
+	 *  - extra logic must be run, on both client and server side
+	 *  - more network round-trips are involved
+	 *  - the QRYDTA block which contains the continuation of the split
+	 *    row is generally wasteful, since it contains the remainder of
+	 *    the split row but no additional rows.
+	 *  Since splitting is expensive, the server makes some attempt to
+	 *  avoid it. Currently, the server's algorithm for this is to
+	 *  compute the length of the current row, and to stop trying to pack
+	 *  more rows into this buffer if another row of that length would
+	 *  not fit. However, since rows can vary substantially in length,
+	 *  this algorithm is often ineffective at preventing splits. For
+	 *  example, if a short row near the end of the buffer is then
+	 *  followed by a long row, that long row will be split. It is possible
+	 *  to improve this algorithm substantially:
+	 *  - instead of just using the length of the previous row as a guide
+	 *    for whether to attempt packing another row in, use some sort of
+	 *    overall average row size computed over multiple rows (e.g., all
+	 *    the rows we've placed into this QRYDTA block, or all the rows
+	 *    we've process for this result set)
+	 *  - when we discover that the next row will not fit, rather than
+	 *    splitting the row across QRYDTA blocks, if it is relatively
+	 *    small, we could just hold the entire row in a buffer to place
+	 *    it entirely into the next QRYDTA block, or reset the result
+	 *    set cursor back one row to "unread" this row.
+	 *  - when splitting a row across QRYDTA blocks, we tend to copy
+	 *    data around multiple times. Careful coding could remove some
+	 *    of these copies.
+	 *  However, it is important not to over-complicate this code: it is
+	 *  better to be correct than to be efficient, and there have been
+	 *  several bugs in the split logic already.
+	 *
 	 * Instance Variables
 	 *   Byte string
 	 *
@@ -5859,13 +5895,29 @@
 		if (SanityManager.DEBUG) 
 			trace("Write QRYDTA");
 		writer.startDdm(CodePoint.QRYDTA);
+		// Check to see if there was leftover data from splitting
+		// the previous QRYDTA for this result set. If there was, and
+		// if we have now sent all of it, send any EXTDTA for that row
+		// and increment the rowCount which we failed to increment in
+		// writeFDODTA when we realized the row needed to be split.
+		if (processLeftoverQRYDTA(stmt))
+		{
+			if (stmt.getSplitQRYDTA() == null)
+			{
+				stmt.rowCount += 1;
+				if (stmt.getExtDtaObjects() != null)
+					writeEXTDTA(stmt);
+			}
+			return;
+		}
 		
 		while(getMoreData)
 		{			
 			sentExtData = false;
 			getMoreData = writeFDODTA(stmt);
 
-			if (stmt.getExtDtaObjects() != null)
+			if (stmt.getExtDtaObjects() != null &&
+					stmt.getSplitQRYDTA() == null)
 			{
 				writer.endDdmAndDss();
 				writeEXTDTA(stmt);
@@ -5899,6 +5951,48 @@
 		}
 	}
 
+	/**
+	 * This routine places some data into the current QRYDTA block using
+	 * FDODTA (Formatted Data Object DaTA rules).
+	 *
+	 * There are 3 basic types of processing flow for this routine:
+	 * - In normal non-rowset, non-scrollable cursor flow, this routine
+	 *   places a single row into the QRYDTA block and returns TRUE,
+	 *   indicating that the caller can call us back to place another
+	 *   row into the result set if he wishes. (The caller may need to
+	 *   send Externalized Data, which would be a reason for him NOT to
+	 *   place any more rows into the QRYDTA).
+	 * - In ROWSET processing, this routine places an entire ROWSET of
+	 *   rows into the QRYDTA block and returns FALSE, indicating that
+	 *   the QRYDTA block is full and should now be sent.
+	 * - In callable statement processing, this routine places the
+	 *   results from the output parameters of the called procedure into
+	 *   the QRYDTA block. This code path is really dramatically
+	 *   different from the other two paths and shares only a very small
+	 *   amount of common code in this routine.
+	 *
+	 * In all cases, it is possible that the data we wish to return may
+	 * not fit into the QRYDTA block, in which case we call splitQRYDTA
+	 * to split the data and remember the remainder data in the result set.
+	 * Splitting the data is relatively rare in the normal cursor case,
+	 * because our caller (writeQRYDTA) uses a coarse estimation
+	 * technique to avoid calling us if he thinks a split is likely.
+	 *
+	 * The overall structure of this routine is implemented as two
+	 * loops:
+	 * - the outer "do ... while ... " loop processes a ROWSET, one row
+	 *   at a time. For non-ROWSET cursors, and for callable statements,
+	 *   this loop executes only once.
+	 * - the inner "for ... i < numCols ..." loop processes each column
+	 *   in the current row, or each output parmeter in the procedure.
+	 *
+	 * Most column data is written directly inline in the QRYDTA block.
+	 * Some data, however, is written as Externalized Data. This is
+	 * commonly used for Large Objects. In that case, an Externalized
+	 * Data Pointer is written into the QRYDTA block, and the actual
+	 * data flows in separate EXTDTA blocks which are returned
+	 * after this QRYDTA block.
+	 */
 	private boolean writeFDODTA (DRDAStatement stmt) 
 		throws DRDAProtocolException, SQLException
 	{
@@ -6068,7 +6162,7 @@
 			if (writer.getOffset() >= blksize)
 			{
 				splitQRYDTA(stmt, blksize);
-				moreData = false;
+				return false;
 			}
 
 			if (rs == null)
@@ -6105,6 +6199,11 @@
 	/**
 	 * Split QRYDTA into blksize chunks
 	 *
+	 * This routine is called if the QRYDTA data will not fit. It writes
+	 * as much data as it can, then stores the remainder in the result
+	 * set. At some later point, when the client returns with a CNTQRY,
+	 * we will call processLeftoverQRYDTA to handle that data.
+	 *
 	 * @param stmt DRDA statment
 	 * @param blksize size of query block
 	 * 
@@ -6117,36 +6216,54 @@
 		byte [] temp = writer.copyDataToEnd(blksize);
 		// truncate to end of blocksize
 		writer.setOffset(blksize);
-		int remain = temp.length;
-		int start = 0;
-		int dataLen = blksize - 10; //DSS header + QRYDTA and length
-		while (remain > 0)
+		if (temp.length == 0)
+			agentError("LMTBLKPRC violation: splitQRYDTA was " +
+				"called to split a QRYDTA block, but the " +
+				"entire row fit successfully into the " +
+				"current block. Server rowsize computation " +
+				"was probably incorrect (perhaps an off-by-" +
+				"one bug?). QRYDTA blocksize: " + blksize);
+		stmt.setSplitQRYDTA(temp);
+	}
+	/*
+	 * Process remainder data resulting from a split.
+	 *
+	 * This routine is called at the start of building each QRYDTA block.
+	 * Normally, it observes that there is no remainder data from the
+	 * previous QRYDTA block, and returns FALSE, indicating that there
+	 * was nothing to do.
+	 *
+	 * However, if it discovers that the previous QRYDTA block was split,
+	 * then it retrieves the remainder data from the result set, writes
+	 * as much of it as will fit into the QRYDTA block (hopefully all of
+	 * it will fit, but the row may be very long), and returns TRUE,
+	 * indicating that this QRYDTA block has been filled with remainder
+	 * data and should now be sent immediately.
+	 */
+	private boolean processLeftoverQRYDTA(DRDAStatement stmt)
+		throws SQLException,DRDAProtocolException
+	{
+		byte []leftovers = stmt.getSplitQRYDTA();
+		if (leftovers == null)
+			return false;
+		int blksize = stmt.getBlksize() > 0 ? stmt.getBlksize() : CodePoint.QRYBLKSZ_MAX;
+		blksize = blksize - 10; //DSS header + QRYDTA and length
+		if (leftovers.length < blksize)
 		{
-			// finish off query block and send
-			writer.endDdmAndDss();
-			finalizeChain();
-			// read CNTQRY - not sure why JCC sends this
-			correlationID = reader.readDssHeader();
-			int codePoint = reader.readLengthAndCodePoint();
-			DRDAStatement contstmt = parseCNTQRY();
-			if (stmt != contstmt)
-				agentError("continued query stmt not the same");
-			// start a new query block for the next row
-			writer.createDssObject();
-			writer.startDdm(CodePoint.QRYDTA);
-			// write out remaining data
-			if (remain > blksize)
-			{
-				writer.writeBytes(temp, start, dataLen);
-				remain -= dataLen; //DSS header + QRYDTA and length
-				start += dataLen;
-			}
-			else
-			{
-				writer.writeBytes(temp, start, remain);
-				remain = 0;
-			}
+			writer.writeBytes(leftovers, 0, leftovers.length);
+			stmt.setSplitQRYDTA(null);
+		}
+		else
+		{
+			writer.writeBytes(leftovers, 0, blksize);
+			byte []newLeftovers = new byte[leftovers.length-blksize];
+			for (int i = 0; i < newLeftovers.length; i++)
+				newLeftovers[i] = leftovers[blksize+i];
+			stmt.setSplitQRYDTA(newLeftovers);
 		}
+		// finish off query block and send
+		writer.endDdmAndDss();
+		return true;
 	}
 	/**
 	 * Done data

Modified: db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAResultSet.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAResultSet.java?rev=393798&r1=393797&r2=393798&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAResultSet.java (original)
+++ db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAResultSet.java Thu Apr 13 06:14:26 2006
@@ -84,6 +84,13 @@
 
 
 
+	// splitQRYDTA is normally null. If it is non-null, it means that
+	// the last QRYDTA response which was sent for this statement was
+	// split according to the LMTBLKPRC protocol, and this array contains
+	// the bytes that didn't fit. These bytes should be the first bytes
+	// emitted in the next QRYDTA response to a CNTQRY request.
+	private byte []splitQRYDTA;
+
 	protected DRDAResultSet(ResultSet rs) throws SQLException
 	{
 		setResultSet(rs);
@@ -135,6 +142,15 @@
 		return rs;
 	}
 
+	public void setSplitQRYDTA(byte []data)
+	{
+		splitQRYDTA = data;
+	}
+	public byte[]getSplitQRYDTA()
+	{
+		return splitQRYDTA;
+	}
+
 	/** 
 	 * Set ResultSet DRDA DataTypes
 	 * @param value drdaTypes for columns.
@@ -349,9 +365,11 @@
 		rsPrecision = null;
 		rsScale = null;
 		extDtaObjects = null;
+		splitQRYDTA = null;
 		rsExtPositions = null;
 		state=NOT_OPENED;
 		hasdata = true;
+		splitQRYDTA = null;
 	}
 
 
@@ -518,4 +536,4 @@
 		this.qryclsimp = (qryclsimpl == CodePoint.QRYCLSIMP_SERVER_CHOICE)
 			? DRDAResultSet.QRYCLSIMP_DEFAULT : qryclsimpl;
 	}
-}
\ No newline at end of file
+}

Modified: db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAStatement.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAStatement.java?rev=393798&r1=393797&r2=393798&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAStatement.java (original)
+++ db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAStatement.java Thu Apr 13 06:14:26 2006
@@ -224,6 +224,15 @@
 	{
 		currentDrdaRs.setExtDtaObjects(a);
 	}
+
+	public void setSplitQRYDTA(byte []data)
+	{
+		currentDrdaRs.setSplitQRYDTA(data);
+	}
+	public byte[]getSplitQRYDTA()
+	{
+		return currentDrdaRs.getSplitQRYDTA();
+	}
 	
    	/**
 	 * Add extDtaObject

Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/big.out
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/big.out?rev=393798&r1=393797&r2=393798&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/big.out (original)
+++ db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/big.out Thu Apr 13 06:14:26 2006
@@ -34,7 +34,83 @@
 C1 |C2                                                                                                                              
 -----
 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb&
-ij> -- what happens when the row + the ending SQLCARD is too big
+ij> -- Various tests for JIRA-614: handling of rows which span QRYDTA blocks.
+----- what happens when the SplitQRYDTA has to span 3+ blocks
+drop table big;
+0 rows inserted/updated/deleted
+ij> create table big(c1 varchar(32672), c2 varchar(32672), c3 varchar(32672), c4 varchar(32672));
+0 rows inserted/updated/deleted
+ij> execute p1 using 'values 9';
+IJ WARNING: Autocommit may close using result set
+Statement executed.
+ij> select * from big;
+C1 |C2 |C3 |C4                                                                                                                              
+-----
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+ij> execute p1 using 'values 9';
+IJ WARNING: Autocommit may close using result set
+Statement executed.
+ij> execute p1 using 'values 9';
+IJ WARNING: Autocommit may close using result set
+Statement executed.
+ij> select * from big;
+C1 |C2 |C3 |C4                                                                                                                              
+-----
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+ij> get scroll insensitive cursor c1 as 'select * from big';
+ij> first c1;
+C1 |C2 |C3 |C4                                                                                                                              
+-----
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+ij> next c1;
+C1 |C2 |C3 |C4                                                                                                                              
+-----
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+ij> previous c1;
+C1 |C2 |C3 |C4                                                                                                                              
+-----
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+ij> last c1;
+C1 |C2 |C3 |C4                                                                                                                              
+-----
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+ij> close c1;
+ij> drop table big;
+0 rows inserted/updated/deleted
+ij> -- Mix clob and varchar in the table.
+create table big(c1 clob(32672), c2 varchar(32672), c3 varchar(32672), c4 clob(32672));
+0 rows inserted/updated/deleted
+ij> execute p1 using 'values 9';
+IJ WARNING: Autocommit may close using result set
+Statement executed.
+ij> select * from big;
+C1 |C2 |C3 |C4                                                                                                                              
+-----
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+ij> execute p1 using 'values 9';
+IJ WARNING: Autocommit may close using result set
+Statement executed.
+ij> execute p1 using 'values 9';
+IJ WARNING: Autocommit may close using result set
+Statement executed.
+ij> select * from big;
+C1 |C2 |C3 |C4                                                                                                                              
+-----
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+ij> -- This seems to reveal some sort of different problem than JIRA 614. I get a
+----- DRDAProtocolException, but it isn't one which involves splitQRYDTA.
+----- get scroll insensitive cursor c1 as 'select * from big';
+----- first c1;
+----- next c1;
+----- previous c1;
+----- last c1;
+----- close c1;
+----- End of the JIRA-614 tests.
+----- what happens when the row + the ending SQLCARD is too big
 drop table big;
 0 rows inserted/updated/deleted
 ij> create table big(c1 varchar(30000), c2 varchar(2750));

Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/jdk15/prepStmt.out
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/jdk15/prepStmt.out?rev=393798&r1=393797&r2=393798&view=diff
==============================================================================
--- 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 Apr 13 06:14:26 2006
@@ -75,4 +75,5 @@
 setObject Method sets the designated parameter with the Object
 Negative test setString with Invalid Timestamp:20
 SQLState: 22007 message: The syntax of the string representation of a datetime value is incorrect.
+Test jira614 completed successfully -- no Distributed Protocol Exception occurred
 prepStmt Test Ends

Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/big.out
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/big.out?rev=393798&r1=393797&r2=393798&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/big.out (original)
+++ db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/big.out Thu Apr 13 06:14:26 2006
@@ -34,7 +34,83 @@
 C1 |C2                                                                                                                              
 -----
 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb&
-ij> -- what happens when the row + the ending SQLCARD is too big
+ij> -- Various tests for JIRA-614: handling of rows which span QRYDTA blocks.
+----- what happens when the SplitQRYDTA has to span 3+ blocks
+drop table big;
+0 rows inserted/updated/deleted
+ij> create table big(c1 varchar(32672), c2 varchar(32672), c3 varchar(32672), c4 varchar(32672));
+0 rows inserted/updated/deleted
+ij> execute p1 using 'values 9';
+IJ WARNING: Autocommit may close using result set
+Statement executed.
+ij> select * from big;
+C1 |C2 |C3 |C4                                                                                                                              
+-----
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+ij> execute p1 using 'values 9';
+IJ WARNING: Autocommit may close using result set
+Statement executed.
+ij> execute p1 using 'values 9';
+IJ WARNING: Autocommit may close using result set
+Statement executed.
+ij> select * from big;
+C1 |C2 |C3 |C4                                                                                                                              
+-----
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+ij> get scroll insensitive cursor c1 as 'select * from big';
+ij> first c1;
+C1 |C2 |C3 |C4                                                                                                                              
+-----
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+ij> next c1;
+C1 |C2 |C3 |C4                                                                                                                              
+-----
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+ij> previous c1;
+C1 |C2 |C3 |C4                                                                                                                              
+-----
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+ij> last c1;
+C1 |C2 |C3 |C4                                                                                                                              
+-----
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+ij> close c1;
+ij> drop table big;
+0 rows inserted/updated/deleted
+ij> -- Mix clob and varchar in the table.
+create table big(c1 clob(32672), c2 varchar(32672), c3 varchar(32672), c4 clob(32672));
+0 rows inserted/updated/deleted
+ij> execute p1 using 'values 9';
+IJ WARNING: Autocommit may close using result set
+Statement executed.
+ij> select * from big;
+C1 |C2 |C3 |C4                                                                                                                              
+-----
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+ij> execute p1 using 'values 9';
+IJ WARNING: Autocommit may close using result set
+Statement executed.
+ij> execute p1 using 'values 9';
+IJ WARNING: Autocommit may close using result set
+Statement executed.
+ij> select * from big;
+C1 |C2 |C3 |C4                                                                                                                              
+-----
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa& |bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb& |ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc& |ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&
+ij> -- This seems to reveal some sort of different problem than JIRA 614. I get a
+----- DRDAProtocolException, but it isn't one which involves splitQRYDTA.
+----- get scroll insensitive cursor c1 as 'select * from big';
+----- first c1;
+----- next c1;
+----- previous c1;
+----- last c1;
+----- close c1;
+----- End of the JIRA-614 tests.
+----- what happens when the row + the ending SQLCARD is too big
 drop table big;
 0 rows inserted/updated/deleted
 ij> create table big(c1 varchar(30000), c2 varchar(2750));

Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk15/prepStmt.out
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk15/prepStmt.out?rev=393798&r1=393797&r2=393798&view=diff
==============================================================================
--- 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 Apr 13 06:14:26 2006
@@ -75,4 +75,5 @@
 setObject Method sets the designated parameter with the Object
 Negative test setString with Invalid Timestamp:20
 SQLState: 22007 message: The syntax of the string representation of a datetime value is incorrect.
+Test jira614 completed successfully -- no Distributed Protocol Exception occurred
 prepStmt Test Ends

Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/prepStmt.out
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/prepStmt.out?rev=393798&r1=393797&r2=393798&view=diff
==============================================================================
--- 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 Apr 13 06:14:26 2006
@@ -75,4 +75,5 @@
 setObject Method sets the designated parameter with the Object
 Negative test setString with Invalid Timestamp:20
 SQLState: 22007 message: The syntax of the string representation of a datetime value is incorrect.
+Test jira614 completed successfully -- no Distributed Protocol Exception occurred
 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/viewcvs/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/prepStmt.java?rev=393798&r1=393797&r2=393798&view=diff
==============================================================================
--- 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 Apr 13 06:14:26 2006
@@ -44,6 +44,7 @@
 {
 	private static Connection conn = null;
 
+
 	public static void main (String args[])
 	{
 		try
@@ -300,6 +301,8 @@
 			test4975(conn);
 			test5130(conn);
 			test5172(conn);
+			jira614Test(conn);
+			jira614Test_a(conn);
 			conn.close();
 			System.out.println("prepStmt Test Ends");
         }
@@ -684,5 +687,93 @@
 	}
 
 	
+	// Derby bug 614 has to do with how the server responds when the
+	// client closes the statement in between split QRYDTA blocks. We
+	// have to cause a split QRYDTA block, which we can do by having a
+	// bunch of moderately-sized rows which mostly fill a 32K block
+	// followed by a single giant row which overflows the block. Then,
+	// we fetch some of the rows, then close the result set.
+    private static void jira614Test(Connection conn)
+	    throws Exception
+    {
+	    Statement stmt = conn.createStatement();
+            PreparedStatement ps ;
+	    try {
+		    stmt.execute("drop table jira614");
+	    } catch (Throwable t) { }
+	    ps = conn.prepareStatement(
+			    "create table jira614 (c1 varchar(10000))");
+	    ps.executeUpdate();
+	    String workString = genString("a", 150);
+	    ps = conn.prepareStatement("insert into jira614 values (?)");
+	    ps.setString(1, workString);
+	    for (int row = 0; row < 210; row++)
+		    ps.executeUpdate();
+	    workString = genString("b", 10000);
+	    ps.setString(1, workString);
+	    ps.executeUpdate();
+	    ps = conn.prepareStatement("select * from jira614");
+            ResultSet rs = ps.executeQuery();
+
+            int rowNum = 0;
+            while (rs.next())
+            {
+                rowNum++;
+                if (rowNum == 26)
+                    break;
+            }
+            rs.close(); // This statement actually triggers the bug.
+	    System.out.println("Test jira614 completed successfully -- no Distributed Protocol Exception occurred");
+    }
+    private static String genString(String c, int howMany)
+    {
+	    StringBuffer buf = new StringBuffer();
+	    for (int i = 0; i < howMany; i++)
+		    buf.append(c);
+	    return buf.toString();
+    }
+
+
+	// Part two of the regression test for bug 614 verifies that the
+	// server-side statement state is cleaned up when a statement is
+	// re-used. Specifically, we set up a statement which has a non-null
+	// splitQRYDTA value, then we close that statement and re-use it for
+	// a totally unrelated query. If the splitQRYDTA wasn't cleaned up
+	// properly, it comes flooding back as the response to that unrelated
+	// query, causing a protocol parsing exception on the client.
+	private static void jira614Test_a(Connection conn)
+		throws Exception
+	{
+		// 1: set up a second table to use for an unrelated query:
+	    Statement stmt = conn.createStatement();
+		PreparedStatement ps ;
+	    try { stmt.execute("drop table jira614_a"); } catch (Throwable t) { }
+	    stmt.execute("create table jira614_a (c1 int)");
+	    ps = conn.prepareStatement("insert into jira614_a values (?)");
+	    for (int row = 1; row <= 5; row++)
+		{
+			ps.setInt(1, row);
+		    ps.executeUpdate();
+		}
+
+		// 2: get the first statement into a splitQRYDTA state:
+		ResultSet rs = stmt.executeQuery("select * from jira614");
+		int rowNum = 0;
+		while (rs.next())
+		{
+			rowNum++;
+			if (rowNum == 26)
+				break;
+		}
+		// 3: Now re-use the statement for some totally different purpose:
+		stmt.close();
+		stmt = conn.createStatement();
+		rs = stmt.executeQuery("select * from jira614_a");
+		while (rs.next());
+		ps.close();
+		rs.close();
+		stmt.close();
+	}
+
 }
 

Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/lang/big.sql
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/lang/big.sql?rev=393798&r1=393797&r2=393798&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/lang/big.sql (original)
+++ db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/lang/big.sql Thu Apr 13 06:14:26 2006
@@ -17,6 +17,39 @@
 execute p1 using 'values 5';
 select * from big;
 
+-- Various tests for JIRA-614: handling of rows which span QRYDTA blocks.
+-- what happens when the SplitQRYDTA has to span 3+ blocks
+drop table big;
+create table big(c1 varchar(32672), c2 varchar(32672), c3 varchar(32672), c4 varchar(32672));
+execute p1 using 'values 9';
+select * from big;
+execute p1 using 'values 9';
+execute p1 using 'values 9';
+select * from big;
+get scroll insensitive cursor c1 as 'select * from big';
+first c1;
+next c1;
+previous c1;
+last c1;
+close c1;
+drop table big;
+-- Mix clob and varchar in the table.
+create table big(c1 clob(32672), c2 varchar(32672), c3 varchar(32672), c4 clob(32672));
+execute p1 using 'values 9';
+select * from big;
+execute p1 using 'values 9';
+execute p1 using 'values 9';
+select * from big;
+-- This seems to reveal some sort of different problem than JIRA 614. I get a
+-- DRDAProtocolException, but it isn't one which involves splitQRYDTA.
+-- get scroll insensitive cursor c1 as 'select * from big';
+-- first c1;
+-- next c1;
+-- previous c1;
+-- last c1;
+-- close c1;
+-- End of the JIRA-614 tests.
+
 -- what happens when the row + the ending SQLCARD is too big
 drop table big;
 create table big(c1 varchar(30000), c2 varchar(2750));

Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/util/ProcedureTest.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/util/ProcedureTest.java?rev=393798&r1=393797&r2=393798&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/util/ProcedureTest.java (original)
+++ db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/util/ProcedureTest.java Thu Apr 13 06:14:26 2006
@@ -214,6 +214,13 @@
 				ps.executeUpdate();
 				ps.close();
 				break;
+			case 9:
+				String lStringA32672 = new String(Formatters.repeatChar("a",32672));
+				String lStringB32672 = new String(Formatters.repeatChar("b",32672));
+				String lStringC32672 = new String(Formatters.repeatChar("c",32672));
+				String lStringD32672 = new String(Formatters.repeatChar("d",32672));
+				insertInBig(conn, lStringA32672, lStringB32672, lStringC32672, lStringD32672);
+				break;
 		}
 		conn.close();
 	}