Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
10.1.3.1, 10.2.2.0, 10.3.3.0, 10.4.2.0, 10.5.1.1, 10.5.2.0, 10.6.1.0
-
Urgent
-
High Value Fix, Repro attached, Workaround attached
-
Embedded/Client difference, Wrong query result
Description
If a user attempts to reuse a stream set as a parameter to a prepared statement, the statement execution should fail with SQL State XJ001. Instead client fails with a protocol error and inserts wrong data. See the attached java program ReproReuseStream.java for a reproduction.
[C:/kmarsden/repro/reusestream] java ReproReuseStream
Insert row 1
Try to insert row 2 with reused streams
java.sql.SQLException: Network protocol error: end of stream prematurely reached, parameter #4. Remaining data has been
padded with 0x0.
at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:96)
at org.apache.derby.client.am.SqlException.getSQLException(SqlException.java:358)
at org.apache.derby.client.am.PreparedStatement.executeUpdate(PreparedStatement.java:399)
at ReproReuseStream.main(ReproReuseStream.java:41)
Caused by: org.apache.derby.client.am.SqlException: Network protocol error: end of stream prematurely reached, parameter
#4. Remaining data has been padded with 0x0.
at org.apache.derby.client.net.Request.writePlainScalarStream(Request.java:490)
at org.apache.derby.client.net.Request.writeScalarStream(Request.java:264)
at org.apache.derby.client.net.NetStatementRequest.buildEXTDTA(NetStatementRequest.java:951)
at org.apache.derby.client.net.NetStatementRequest.writeExecute(NetStatementRequest.java:147)
at org.apache.derby.client.net.NetPreparedStatement.writeExecute_(NetPreparedStatement.java:178)
at org.apache.derby.client.am.PreparedStatement.writeExecute(PreparedStatement.java:1801)
at org.apache.derby.client.am.PreparedStatement.flowExecute(PreparedStatement.java:2031)
at org.apache.derby.client.am.PreparedStatement.executeUpdateX(PreparedStatement.java:404)
at org.apache.derby.client.am.PreparedStatement.executeUpdate(PreparedStatement.java:390)
... 1 more
Go ahead and commit so we can see the wrong data.
ID |MNAME
MVALUE | BYTEDATA |
CHARDATA |
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------
1 |mname
0 | 636363636363636363636363636363636363636363636363636363636363636363636363636363636363636 3636363636363636363636363636363636363636& |
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccc& 2 |
mname |
0 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000& |
&
To workaround the issue users should not attempt to reuse streams but we should give a better message and not insert wrong data.
The code was extracted from StreamingColumnTest testDerby500 but the commits were removed.
Attachments
Attachments
Issue Links
- is part of
-
DERBY-2017 Client driver can insert and commit partial data when a LOB stream throws IOException or does not match the specified length
- Closed
- relates to
-
DERBY-4312 SQLException XJ215 on insert with setCharacterStream() and autocommit off in mailjdbc test
- Closed