Index: java/engine/org/apache/derby/impl/jdbc/EmbedResultSet.java
===================================================================
--- java/engine/org/apache/derby/impl/jdbc/EmbedResultSet.java	(revision 349716)
+++ java/engine/org/apache/derby/impl/jdbc/EmbedResultSet.java	(working copy)
@@ -52,6 +52,7 @@
 import org.apache.derby.iapi.reference.JDBC20Translation;
 import org.apache.derby.iapi.reference.SQLState;
 import org.apache.derby.iapi.util.StringUtil;
+import org.apache.derby.iapi.types.Resetable;
 
 /* can't import these due to name overlap:
 import java.sql.ResultSet;
@@ -3707,7 +3708,7 @@
 	 * Documented behaviour for streams is that they are implicitly closed on
 	 * the next get*() method call.
 	 */
-	protected final void closeCurrentStream() {
+	protected final void closeCurrentStream() throws SQLException {
 
 		if (currentStream != null) {
 			try {
@@ -3715,12 +3716,19 @@
 				synchronized(this)
 				{
 					if (currentStream != null) {
+
+					    if(currentStream instanceof Resetable)
+						    ((Resetable) currentStream).resetStream();
+
 						if (currentStream instanceof java.io.Reader)
 							((java.io.Reader) currentStream).close();
 						else
 							((java.io.InputStream) currentStream).close();
 					}
 				}
+			} catch(StandardException e){
+			    throw handleException(e);
+			    
 			} catch (IOException ioe) {
 				// just ignore, caller has already read the data they require
 			} finally {
Index: java/engine/org/apache/derby/impl/jdbc/UTF8Reader.java
===================================================================
--- java/engine/org/apache/derby/impl/jdbc/UTF8Reader.java	(revision 349718)
+++ java/engine/org/apache/derby/impl/jdbc/UTF8Reader.java	(working copy)
@@ -36,7 +36,7 @@
  * because the source InputStream can be shared.
  *
  */
-public final class UTF8Reader extends Reader
+public final class UTF8Reader extends Reader implements Resetable
 {
 
 	private InputStream in;
@@ -221,22 +221,13 @@
 
 	private void closeIn() throws IOException {
 		if (in != null) {
-			try {
-			    
-			    if(in instanceof Resetable){
-				((Resetable) in).resetStream();
-				
-			    }else{
-				in.close();
-			    }
-			    
-			} catch (StandardException e) {
-			    e.printStackTrace();
-			    throw new IOException(e.getMessage());
-			    
-			} finally {
-				in = null;
-			}
+		    try {
+			in.close();
+
+		    } finally {
+			if( ! (in instanceof Resetable) ) // in needs to be hold to be reset by resultset, if in is Resetable.
+			    in = null;
+		    }
 		}
 	}
 	private IOException utfFormatException(String s) throws IOException {
@@ -368,4 +359,33 @@
 
 		return (ch1 << 8) + (ch2 << 0);
 	}
+    
+    
+    public void resetStream() 
+	throws IOException,
+	       StandardException {
+	
+	if(in instanceof Resetable)
+	    ((Resetable) in).resetStream();
+	
+    }
+
+
+    public void initStream()
+	throws StandardException {
+	
+	if(in instanceof Resetable)
+	    ((Resetable) in).initStream();
+
+    }
+
+
+    public void closeStream() {
+	
+	if(in instanceof Resetable)
+	    ((Resetable) in).closeStream();
+
+    }
+
+
 }
Index: java/engine/org/apache/derby/impl/jdbc/BinaryToRawStream.java
===================================================================
--- java/engine/org/apache/derby/impl/jdbc/BinaryToRawStream.java	(revision 349716)
+++ java/engine/org/apache/derby/impl/jdbc/BinaryToRawStream.java	(working copy)
@@ -32,14 +32,9 @@
 	Converts a stream containing the Cloudscape stored binary form
 	to one that just contains the application's data.
 	Simply remove the length information.
-
-	If source stream implements Resetable interface , 
-	the source can be shared among other objects and 
-	not closed when close method of this class was called.
-
 */
 final class BinaryToRawStream
-extends java.io.FilterInputStream
+extends java.io.FilterInputStream implements Resetable
 {
 
     // used by caller to insure that parent can not be GC'd until this
@@ -106,23 +101,34 @@
     
     
     public void close() throws IOException{
+	super.close();
+    }
+    
+
+    public void resetStream() 
+	throws StandardException,
+	       IOException {
 	
-	//Escape from closing source InputStream ,
-	//because source InputStream can be shared between other stream.
+	if(in instanceof Resetable)
+	    ((Resetable) in).resetStream();
 	
-	if(in instanceof Resetable){
-	    try{
-		((Resetable) in).resetStream();
-		
-	    }catch(StandardException e){
-		e.printStackTrace();
-		throw new IOException(e.getMessage());
-	    }
-	    
-	}else{
-	    super.close();
-	    
-	}
     }
     
+    
+    public void initStream()
+	throws StandardException {
+	
+	if(in instanceof Resetable)
+	    ((Resetable) in).initStream();
+	
+    }
+    
+    
+    public void closeStream() {
+	
+	if(in instanceof Resetable)
+	    ((Resetable) in).closeStream();
+
+    }
+
 }
