Re: "This ResultSet is closed" exception on a PreparedStatement getMetaData() - Mailing list pgsql-jdbc

From Dave Cramer
Subject Re: "This ResultSet is closed" exception on a PreparedStatement getMetaData()
Date
Msg-id CADK3HHLyc+qzTXHxv4EGOJvNgX8Jf+J26=NdEhb6yN+BO3zFKw@mail.gmail.com
Whole thread Raw
In response to "This ResultSet is closed" exception on a PreparedStatement getMetaData()  (Emmanuel GUITON <Emmanuel.GUITON@intrinsec.com>)
Responses Re: "This ResultSet is closed" exception on a PreparedStatement getMetaData()  (Emmanuel GUITON <Emmanuel.GUITON@intrinsec.com>)
List pgsql-jdbc
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.GUITON@intrinsec.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 l Standard+33141917777

215, avenue Georges Clemenceau l 92024 Nanterre


 


Attachment

pgsql-jdbc by date:

Previous
From: Emmanuel GUITON
Date:
Subject: "This ResultSet is closed" exception on a PreparedStatement getMetaData()
Next
From: Kevin Grittner
Date:
Subject: Re: "This ResultSet is closed" exception on a PreparedStatement getMetaData()