Bug 50173

Summary: JDBCSampler discards ResultSet from a PreparedStatement.
Product: JMeter Reporter: whitingjr <jeremy.whiting>
Component: MainAssignee: JMeter issues mailing list <issues>
Severity: normal    
Priority: P2    
Version: 2.4   
Target Milestone: ---   
Hardware: All   
OS: All   
Attachments: File with SVN diff patch details.

Description whitingjr 2010-10-28 10:14:39 UTC
 I am using JMeter with a Test Plan that uses a JDBC Request with a PreparedStatement query type.
 When running this I am getting the following error in the jmeter.log file

2010/10/28 11:30:31 INFO  - jmeter.threads.JMeterThread: Thread started: JDBC Users 1-1 
2010/10/28 12:13:38 ERROR - jmeter.threads.JMeterThread: Error while processing sampler 'PREPARED SELECT Customer JDBC Request' : java.lang.NullPointerException
	at org.apache.jmeter.protocol.jdbc.sampler.JDBCSampler.getStringFromResultSet(JDBCSampler.java:415)
	at org.apache.jmeter.protocol.jdbc.sampler.JDBCSampler.resultSetsToString(JDBCSampler.java:268)
	at org.apache.jmeter.protocol.jdbc.sampler.JDBCSampler.sample(JDBCSampler.java:208)
	at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:348)
	at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:243)
	at java.lang.Thread.run(Thread.java:619)

 The query (below) can be expected to return a number of records 
the param is set to 1

 If I use instead a SelectStatement results are returned so the query itself is not at fault.

 I have retrieved the code for the v2_4 tag to identify the root cause for the NPE and create a patch. This bug report includes a patch against trunk as the issue is also in trunk. 
 The root cause is due to:
org.apache.jmeter.protocol.jdbc.sampler.JDBCSampler.sample(Entry e)
 The code path for PreparedStatements types starting on line 204 has in it a call to
which returns a ResultSet. The side effect of the call is to set the JDBCPreparedStatement.currentResultSet field member to null.
 JDBCSampler does not keep the ResultSet reference. Instead it is discarded.

 The call on the next line (208)
String sb = resultSetsToString(pstmt,true,null)
 again tries to get the ResultSet on line 267. This causes a NullPointerException because the JDBCPreparedStatement.currentResultSet field was set to null earlier.

 Looking at the code path for a CALLABLE statement type (line 190) shows better handling for queries that return ResultSet.

 The two lines 

 replaced with
                boolean hasResultSet = pstmt.execute();
                String sb = resultSetsToString(pstmt,hasResultSet,null);
 fixes the defect.

Jeremy Whiting
Red Hat
Comment 1 whitingjr 2010-10-28 10:18:29 UTC
Created attachment 26222 [details]
File with SVN diff patch details.

Attempted to run the Ant test target but this failed.

JMeter-trunk/build.xml:1723: <fixcrlf> error: srcdir does not exist: 'JMeter-trunk/bin/testfiles'
Comment 2 Sebb 2010-10-28 18:07:31 UTC
(In reply to comment #1)
> Attempted to run the Ant test target but this failed.
> JMeter-trunk/build.xml:1723: <fixcrlf> error: srcdir does not exist:
> 'JMeter-trunk/bin/testfiles'

In that case, you have not downloaded the full source.
Comment 3 Sebb 2010-10-28 18:14:00 UTC
Thanks for the patch, applied to SVN:

URL: http://svn.apache.org/viewvc?rev=1028518&view=rev
Bug 50173 - JDBCSampler discards ResultSet from a PreparedStatement