postgres PreparedStatement commented ? problem PSQLException: No value specified for parameter ... - Mailing list pgsql-jdbc

From Ali Vatani
Subject postgres PreparedStatement commented ? problem PSQLException: No value specified for parameter ...
Date
Msg-id 20060225030913.23189.qmail@web31813.mail.mud.yahoo.com
Whole thread Raw
Responses Re: postgres PreparedStatement commented ? problem PSQLException:  (Kris Jurka <books@ejurka.com>)
List pgsql-jdbc
I came across a bug in the Postgres JDBC driver with
regards to PreparedStatements and comments that contain ?
tags.

I was using hibernate with the hibernate.use_sql_comments
property set to true in order to see the HQL embedded in
the SQL as comments.  All worked fine with MySQL, and then
I switched to Postgres, and started seeing errors like
this:

org.postgresql.util.PSQLException: No value specified for
parameter 2.
    at
org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:134)
    at
org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:179)
    at
org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:437)
    at
org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:353)
    at
org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:346)

I traced it down to PreparedStatements with ? in the
comments, which expect additional parameters.  /* */ is an
acceptable form for SQL comments, and other JDBC drivers
seem to handle this ok, and hibernate uses it embedded with
the query in order to show the HQL preconversion.  The
postgres drivers probably just need to ignore the commented
areas before searching for ? in the query string.

Here's some simple code to recreate the problem:

import java.sql.*;

public class PostgresCommentBug {

    public static void main(String[] args) {

        String url = "jdbc:postgresql://localhost:5432/somedb";
        //String url = "jdbc:mysql://localhost:3306/somedb";
        String user = "";
        String pass = "";

        try {
            Class.forName("org.postgresql.Driver");
            //Class.forName("com.mysql.jdbc.Driver");
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(url, user, pass);
        } catch (SQLException e) {
            e.printStackTrace();
            System.exit(1);
        }

        try {
            PreparedStatement ps =
                conn.prepareStatement("/* A comment with a ? in it */
select * from foo where bar = ?");
            ps.setString(1, "xyz");
            // Postgres JDBC drivers expect 2 sets, where as other
            // drivers ignore the commented area, and expect only
one.
            ps.execute();
            ps.close();
        } catch (SQLException e) {
            e.printStackTrace();
            System.exit(1);
        }
        System.out.println("Success");
    }
}

Currently, I'm using driver version
postgresql-8.1-405.jdbc3.jar, although I tried it with the
jdbc2 drivers, and older versions as well, including 8.0
drivers.

I'm using DB version "PostgreSQL 8.1.3 on i686-pc-mingw32,
compiled by GCC gcc.exe (GCC) 3.4.2 (mingw-special)"

There are several work arounds, such as not using the sql
comments or using hibernates string tags instead of ?.  But
this would be a good fix, probably very simple too.  Just
sharing the info in case others have had this problem.  I
found very little help on this issue, and others forums
that displayed a similar error did not have a resolution or
track it down to the details.

thanks.

pgsql-jdbc by date:

Previous
From: Hugo Sacramento
Date:
Subject: Retrieve Query
Next
From: Björn Bergenheim
Date:
Subject: How to get batch commands to work