"This ResultSet is closed" exception on a PreparedStatement getMetaData()

From: Emmanuel GUITON <Emmanuel(dot)GUITON(at)intrinsec(dot)com>
To: "pgsql-jdbc(at)postgresql(dot)org" <pgsql-jdbc(at)postgresql(dot)org>
Subject: "This ResultSet is closed" exception on a PreparedStatement getMetaData()
Date: 2013-12-19 09:33:44
Message-ID: 624816662dca463f90adcce3a43c7c06@ISC-SRV-EXC05.Intrinsec.neurones.sa
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

Hello,

I ran into troubles fetching metadata on a PreparedStatement. After some time, I isolated a simple test case that shows the issue (see the code snippet below). On a brand new PreparedStatement, I call the getMetaData() method without any problem. However, if I execute the query (executeQuery()) on this same statement, close the ResultSet and then calls again
getMetaData() (still on the same PreparedStatement), getMetaData() throws a RuntimeException saying "This ResultSet is closed".
I would expect to be able to get the metadata. Is that a bug in the JDBC driver ?

I tested this behavior on several flavours of the 9.3 driver version, including 9.3-1100-jdbc4 .

Regards,
- Emmanuel

package test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import junit.framework.Assert;
import org.testng.annotations.Test;

/**
* Test on the PostgreSql JDBC driver.
*/
public class JdbcTest
{
/**
* This test shows a driver issue on the PreparedStatement management.
*
* @throws ClassNotFoundException On driver initialization failure.
* @throws SQLException On datbase operation failure.
*/
@Test
public void test2()
throws SQLException, ClassNotFoundException
{
Class.forName("org.postgresql.Driver");
final Connection connection = DriverManager.getConnection("jdbc:postgresql://server/db_name", "username", "password");

final String query = "SELECT 1 AS toto, 2 AS titi";

final PreparedStatement pstmt = connection.prepareStatement(query);
final ResultSetMetaData rsMetadata = pstmt.getMetaData();
Assert.assertNotNull(rsMetadata);

final ResultSetMetaData rsMetadata2 = pstmt.getMetaData();
Assert.assertNotNull(rsMetadata2);

final ResultSet rs = pstmt.executeQuery();
Assert.assertNotNull(rs);
rs.close();

Assert.assertFalse(pstmt.isClosed());
try
{
// Guess what ? The next line throws an exception !
final ResultSetMetaData rsMetadata3 = pstmt.getMetaData();
Assert.assertNotNull(rsMetadata3);
}
catch (final RuntimeException exception)
{
Assert.fail(exception.getMessage());
}
pstmt.close();

connection.close();
}
}

Emmanuel GUITON

Ingénieur Développement
Fixe : +33170928416 • Standard : +33141917777

215, avenue Georges Clemenceau • 92024 Nanterre

[cid:imagea09388(dot)JPG(at)42c04539(dot)4396f69c]<http://http://www.forum-fic.com/2014/fr/inscription-fic/>

[cid:imagea9e219(dot)JPG(at)8ae5650e(dot)41802064]<http://www.intrinsec.com/>

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Dave Cramer 2013-12-19 13:35:55 Re: "This ResultSet is closed" exception on a PreparedStatement getMetaData()
Previous Message Dave Cramer 2013-12-17 12:25:27 Re: revisiting unix domain sockets