Thread: 8.0.3 parse errors where 7.x was ok
I'm getting a new exception when upgrading to Postgres 8.0.3 with the JDBC drivers it builds: java.sql.SQLException: ERROR: parse error at or near "$1" This is happening with the following bit of code: 105 try { 106 s = c.prepareStatement("select now() - interval ?"); 107 s.setString(1, "7 days"); 108 ResultSet r = s.executeQuery(); The driver was built from postgresql-jdbc-8.0-311.src using the FreeBSD port on FreeBSD 5.4 with Java 1.4.2-p7. Using the older jar built for postgresql-7.3.4 works fine. Is this syntax no longer supported? Nick -- "The aptly-named morons.org is an obscenity-laced screed..." -- Robert P. Lockwood, Catholic League director of research Nick Johnson, version 2.1 http://web.morons.org/
On Tue, 9 Aug 2005, Nick Johnson wrote: > I'm getting a new exception when upgrading to Postgres 8.0.3 with the JDBC > drivers it builds: > > java.sql.SQLException: ERROR: parse error at or near "$1" > > 105 try { > 106 s = c.prepareStatement("select now() - interval ?"); > 107 s.setString(1, "7 days"); > 108 ResultSet r = s.executeQuery(); > > Is this syntax no longer supported? > Yes. The 8.0 driver always uses server side prepared statements when in the past the statements were usually put together on the driver side. The using a type prefix (like "interval") is not supported in server prepared statements, so this is a server limitation that is now exposed with the new driver. I believe "?::interval" or "cast(? as interval)" should work. Kris Jurka
Nick Johnson wrote: > I'm getting a new exception when upgrading to Postgres 8.0.3 with the > JDBC drivers it builds: > > java.sql.SQLException: ERROR: parse error at or near "$1" > > This is happening with the following bit of code: > > 105 try { > 106 s = c.prepareStatement("select now() - interval ?"); > 107 s.setString(1, "7 days"); > 108 ResultSet r = s.executeQuery(); Because the driver now pushes parameter handling to the backend, you can only put ? placeholders where there is a PARAM terminal in the backend's SQL grammar. Previously the driver just substituted parameter values directly into the query, so you could get away with all sorts of things. Perhaps this will work instead: s = c.prepareStatement("select now() - ?"); s.setObject(new org.postgresql.util.PGInterval("7 days")); -O