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

From: Emmanuel GUITON <Emmanuel(dot)GUITON(at)intrinsec(dot)com>
To: Dave Cramer <pg(at)fastcrypt(dot)com>
Cc: "pgsql-jdbc(at)postgresql(dot)org" <pgsql-jdbc(at)postgresql(dot)org>
Subject: Re: "This ResultSet is closed" exception on a PreparedStatement getMetaData()
Date: 2013-12-19 14:06:52
Message-ID: bb4163ec1fc0467eb1f04c18dc964159@ISC-SRV-EXC05.Intrinsec.neurones.sa
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

Hi Dave,

I am a bit surprised with what you say since in the test case I provided, I call getMetaData() on the PreparedStatement without having ever executed the PreparedStatement itself to get the ResultSet. And it works.
Do you mean that under the hook the PreparedStatement executes a query to be able to fetch the metadata ? (Then what would it be since a ResultSet could not be fetched without parameter values when the query has parameters.)

Unfortunately, I do not know if this behavior is consistent with previous versions of the JDBC driver.

Regards,
- Emmanuel

Emmanuel GUITON

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

215, avenue Georges Clemenceau • 92024 Nanterre

[cid:imagece5cb1(dot)JPG(at)77aaa8f3(dot)42bf0e2a]<http://www.forum-fic.com/2014/fr/inscription-fic/>

[cid:image125bfa(dot)JPG(at)8bfdc9d8(dot)438d38ce]<http://www.intrinsec.com/>

________________________________
From: davecramer(at)gmail(dot)com <davecramer(at)gmail(dot)com> on behalf of Dave Cramer <pg(at)fastcrypt(dot)com>
Sent: Thursday, December 19, 2013 2:35 PM
To: Emmanuel GUITON
Cc: pgsql-jdbc(at)postgresql(dot)org
Subject: Re: [JDBC] "This ResultSet is closed" exception on a PreparedStatement getMetaData()

Emmanuel,

The assumption that the spec makes about the prepared statement being compiled are not valid for PostgreSQL. The metadata comes from the result set, not from the statement. You could in fact not call getMetaData on a statement which was not executed.

That being said, do you know if this behaviour is consistent with previous versions of the JDBC driver ?

Dave Cramer

dave.cramer(at)credativ(dot)ca
http://www.credativ.ca

________________________________

On Thu, Dec 19, 2013 at 4:33 AM, Emmanuel GUITON <Emmanuel(dot)GUITON(at)intrinsec(dot)com<mailto:Emmanuel(dot)GUITON(at)intrinsec(dot)com>> wrote:

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<tel:%2B33170928416> • Standard : +33141917777<tel:%2B33141917777>

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/>

In response to

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Dave Cramer 2013-12-19 14:20:02 Re: "This ResultSet is closed" exception on a PreparedStatement getMetaData()
Previous Message Kevin Grittner 2013-12-19 13:59:24 Re: "This ResultSet is closed" exception on a PreparedStatement getMetaData()