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 kr...@apache.org on 2008/08/01 15:54:26 UTC
svn commit: r681694 - in /db/derby/code/trunk/java:
client/org/apache/derby/client/am/CallableLocatorProcedures.java
testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/J2EEDataSourceTest.java
Author: kristwaa
Date: Fri Aug 1 06:54:25 2008
New Revision: 681694
URL: http://svn.apache.org/viewvc?rev=681694&view=rev
Log:
DERBY-3799: NullPointerException when accessing a clob through a pooled connection.
Verify that the LOB stored procedure statements are open (not only non-null).
Patch file: derby-3799-1a-checkIfClosed.diff
Modified:
db/derby/code/trunk/java/client/org/apache/derby/client/am/CallableLocatorProcedures.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/J2EEDataSourceTest.java
Modified: db/derby/code/trunk/java/client/org/apache/derby/client/am/CallableLocatorProcedures.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/client/org/apache/derby/client/am/CallableLocatorProcedures.java?rev=681694&r1=681693&r2=681694&view=diff
==============================================================================
--- db/derby/code/trunk/java/client/org/apache/derby/client/am/CallableLocatorProcedures.java (original)
+++ db/derby/code/trunk/java/client/org/apache/derby/client/am/CallableLocatorProcedures.java Fri Aug 1 06:54:25 2008
@@ -113,7 +113,8 @@
}
try {
- if (blobCreateLocatorCall == null) {
+ if (blobCreateLocatorCall == null ||
+ !blobCreateLocatorCall.openOnClient_) {
blobCreateLocatorCall = connection.prepareCallX
("? = CALL SYSIBM.BLOBCREATELOCATOR()",
java.sql.ResultSet.TYPE_FORWARD_ONLY,
@@ -164,7 +165,8 @@
*/
void blobReleaseLocator(int locator) throws SqlException
{
- if (blobReleaseLocatorCall == null) {
+ if (blobReleaseLocatorCall == null ||
+ !blobReleaseLocatorCall.openOnClient_) {
blobReleaseLocatorCall = connection.prepareCallX
("CALL SYSIBM.BLOBRELEASELOCATOR(?)",
java.sql.ResultSet.TYPE_FORWARD_ONLY,
@@ -200,7 +202,8 @@
int searchLocator,
long fromPosition) throws SqlException
{
- if (blobGetPositionFromLocatorCall == null) {
+ if (blobGetPositionFromLocatorCall == null ||
+ !blobGetPositionFromLocatorCall.openOnClient_) {
blobGetPositionFromLocatorCall = connection.prepareCallX
("? = CALL SYSIBM.BLOBGETPOSITIONFROMLOCATOR(?, ?, ?)",
java.sql.ResultSet.TYPE_FORWARD_ONLY,
@@ -327,7 +330,8 @@
int offset,
int length) throws SqlException
{
- if (blobGetPositionFromBytesCall == null) {
+ if (blobGetPositionFromBytesCall == null ||
+ !blobGetPositionFromBytesCall.openOnClient_) {
blobGetPositionFromBytesCall = connection.prepareCallX
("? = CALL SYSIBM.BLOBGETPOSITIONFROMBYTES(?, ?, ?)",
java.sql.ResultSet.TYPE_FORWARD_ONLY,
@@ -371,7 +375,7 @@
*/
long blobGetLength(int sourceLocator) throws SqlException
{
- if (blobGetLengthCall == null) {
+ if (blobGetLengthCall == null || !blobGetLengthCall.openOnClient_) {
blobGetLengthCall = connection.prepareCallX
("? = CALL SYSIBM.BLOBGETLENGTH(?)",
java.sql.ResultSet.TYPE_FORWARD_ONLY,
@@ -421,7 +425,7 @@
{
if (forLength == 0) return new byte[0];
- if (blobGetBytesCall == null) {
+ if (blobGetBytesCall == null || !blobGetBytesCall.openOnClient_) {
blobGetBytesCall = connection.prepareCallX
("? = CALL SYSIBM.BLOBGETBYTES(?, ?, ?)",
java.sql.ResultSet.TYPE_FORWARD_ONLY,
@@ -495,7 +499,7 @@
int forLength,
byte[] bytes) throws SqlException
{
- if (blobSetBytesCall == null) {
+ if (blobSetBytesCall == null || !blobSetBytesCall.openOnClient_) {
blobSetBytesCall = connection.prepareCallX
("CALL SYSIBM.BLOBSETBYTES(?, ?, ?, ?)",
java.sql.ResultSet.TYPE_FORWARD_ONLY,
@@ -551,7 +555,7 @@
*/
void blobTruncate(int sourceLocator, long length) throws SqlException
{
- if (blobTruncateCall == null) {
+ if (blobTruncateCall == null || !blobTruncateCall.openOnClient_) {
blobTruncateCall = connection.prepareCallX
("CALL SYSIBM.BLOBTRUNCATE(?, ?)",
java.sql.ResultSet.TYPE_FORWARD_ONLY,
@@ -590,7 +594,8 @@
}
try {
- if (clobCreateLocatorCall == null) {
+ if (clobCreateLocatorCall == null ||
+ !clobCreateLocatorCall.openOnClient_) {
clobCreateLocatorCall = connection.prepareCallX
("? = CALL SYSIBM.CLOBCREATELOCATOR()",
java.sql.ResultSet.TYPE_FORWARD_ONLY,
@@ -641,7 +646,8 @@
*/
void clobReleaseLocator(int locator) throws SqlException
{
- if (clobReleaseLocatorCall == null) {
+ if (clobReleaseLocatorCall == null ||
+ !clobReleaseLocatorCall.openOnClient_) {
clobReleaseLocatorCall = connection.prepareCallX
("CALL SYSIBM.CLOBRELEASELOCATOR(?)",
java.sql.ResultSet.TYPE_FORWARD_ONLY,
@@ -760,7 +766,8 @@
int offset,
int length) throws SqlException
{
- if (clobGetPositionFromStringCall == null) {
+ if (clobGetPositionFromStringCall == null ||
+ !clobGetPositionFromStringCall.openOnClient_) {
clobGetPositionFromStringCall = connection.prepareCallX
("? = CALL SYSIBM.CLOBGETPOSITIONFROMSTRING(?, ?, ?)",
java.sql.ResultSet.TYPE_FORWARD_ONLY,
@@ -809,7 +816,8 @@
int searchLocator,
long fromPosition) throws SqlException
{
- if (clobGetPositionFromLocatorCall == null) {
+ if (clobGetPositionFromLocatorCall == null ||
+ !clobGetPositionFromLocatorCall.openOnClient_) {
clobGetPositionFromLocatorCall = connection.prepareCallX
("? = CALL SYSIBM.CLOBGETPOSITIONFROMLOCATOR(?, ?, ?)",
java.sql.ResultSet.TYPE_FORWARD_ONLY,
@@ -843,7 +851,7 @@
*/
long clobGetLength(int sourceLocator) throws SqlException
{
- if (clobGetLengthCall == null) {
+ if (clobGetLengthCall == null || !clobGetLengthCall.openOnClient_) {
clobGetLengthCall = connection.prepareCallX
("? = CALL SYSIBM.CLOBGETLENGTH(?)",
java.sql.ResultSet.TYPE_FORWARD_ONLY,
@@ -893,7 +901,8 @@
{
if (forLength == 0) return "";
- if (clobGetSubStringCall == null) {
+ if (clobGetSubStringCall == null ||
+ !clobGetSubStringCall.openOnClient_) {
clobGetSubStringCall = connection.prepareCallX
("? = CALL SYSIBM.CLOBGETSUBSTRING(?, ?, ?)",
java.sql.ResultSet.TYPE_FORWARD_ONLY,
@@ -969,7 +978,7 @@
int forLength,
String string) throws SqlException
{
- if (clobSetStringCall == null) {
+ if (clobSetStringCall == null || !clobSetStringCall.openOnClient_) {
clobSetStringCall = connection.prepareCallX
("CALL SYSIBM.CLOBSETSTRING(?, ?, ?, ?)",
java.sql.ResultSet.TYPE_FORWARD_ONLY,
@@ -1021,7 +1030,7 @@
*/
void clobTruncate(int sourceLocator, long length) throws SqlException
{
- if (clobTruncateCall == null) {
+ if (clobTruncateCall == null || !clobTruncateCall.openOnClient_) {
clobTruncateCall = connection.prepareCallX
("CALL SYSIBM.CLOBTRUNCATE(?, ?)",
java.sql.ResultSet.TYPE_FORWARD_ONLY,
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/J2EEDataSourceTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/J2EEDataSourceTest.java?rev=681694&r1=681693&r2=681694&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/J2EEDataSourceTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/J2EEDataSourceTest.java Fri Aug 1 06:54:25 2008
@@ -155,6 +155,7 @@
suite.addTest(new J2EEDataSourceTest("testPooledReuseOnClose"));
suite.addTest(new J2EEDataSourceTest("testSchemaIsReset"));
suite.addTest(new J2EEDataSourceTest("testSchemaIsResetWhenDeleted"));
+ suite.addTest(new J2EEDataSourceTest("testDerby3799"));
return suite;
}
@@ -243,6 +244,9 @@
"'org.apache.derbyTesting.functionTests.tests.jdbcapi.J2EEDataSourceTest." +
getNestedMethodName() +
"'");
+ s.execute("create table derby3799 (dClob clob)");
+ s.executeUpdate("insert into derby3799 values (" +
+ "'myLittleTestClob')");
}
};
}
@@ -3049,6 +3053,34 @@
}
/**
+ * Regression test for a NullPointerException when trying to use the LOB
+ * stored procedures after closing and then getting a new logical
+ * connection. The problem was that the LOB stored procedure objects on the
+ * server side were closed and not reprepared.
+ * See Jira issue DERBY-3799.
+ */
+ public void testDerby3799() throws SQLException {
+ ConnectionPoolDataSource cpDs =
+ J2EEDataSource.getConnectionPoolDataSource();
+ PooledConnection pc = cpDs.getPooledConnection();
+ // Get first logical connection.
+ Connection con1 = pc.getConnection();
+ Statement stmt = con1.createStatement();
+ ResultSet rs = stmt.executeQuery("select dClob from derby3799");
+ assertTrue(rs.next());
+ rs.getString(1);
+ rs.close();
+ con1.close();
+ // Get second logical connection.
+ Connection con2 = pc.getConnection();
+ stmt = con2.createStatement();
+ rs = stmt.executeQuery("select dClob from derby3799");
+ assertTrue(rs.next());
+ rs.getString(1); // NPE happened here.
+ con2.close();
+ }
+
+ /**
* Tests for DERBY-1144
*
* This test tests that holdability, autocomit, and transactionIsolation