Re: JDBC driver error: "syntax error at end of input" when no primary key

From: Dave Cramer <davecramer(at)postgres(dot)rocks>
To: Tomas Janco <tomas(dot)janco(at)myinphinity(dot)com>
Cc: "pgsql-jdbc(at)postgresql(dot)org" <pgsql-jdbc(at)postgresql(dot)org>
Subject: Re: JDBC driver error: "syntax error at end of input" when no primary key
Date: 2020-12-02 23:55:37
Message-ID: CADK3HHJZbD7gHgx7a0na2h=VApY9f0egCcuMsNXSPruaCnyrqQ@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

On Fri, 27 Nov 2020 at 09:11, Tomas Janco <tomas(dot)janco(at)myinphinity(dot)com>
wrote:

> Hello,
>
> I have found following problem with JDBC driver:
> When an updatable result set is created for a table without primary key,
> any update fails with error: "syntax error at end of input"
> The driver generates invalid SQL query to update the table.
>
> JDBC driver version: 42.2.18 (jre8)
> Server version: PostgreSQL 9.6.6, compiled by Visual C++ build 1800, 64-bit
>
> Sample code:
>
> import java.sql.Connection;
>
> import java.sql.DriverManager;
>
> import java.sql.PreparedStatement;
>
> import java.sql.ResultSet;
>
>
> public class TestPgSql {
>
> /* test table schema:
>
> CREATE TABLE public.sample
>
> (
>
> id integer,
>
> value character varying(255) COLLATE pg_catalog."default"
>
> )
>
> WITH (
>
> OIDS = FALSE
>
> )
>
> TABLESPACE pg_default;
>
> INSERT INTO public.sample(id, value)
>
> VALUES (1, 'abcd');
>
> */
>
> public static void main(String args[]) throws Exception {
>
> Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost/...?user=....&password=....");
>
> String sql = "SELECT * FROM sample WHERE id = 1;";
>
> PreparedStatement stmt = conn.prepareStatement(sql, ResultSet.CONCUR_UPDATABLE, ResultSet.TYPE_FORWARD_ONLY);
>
> ResultSet rs = stmt.executeQuery();
>
> rs.next();
>
> rs.updateString("value", "something");
>
> rs.updateRow();
>
> rs.close();
>
> }
>
> }
>
>
> Expected behavior:
> The code successfully updates the table OR throws an error explaining
> primary key is not present in result set and is required for updatable
> result set.
>
> Actual behavior:
> Incorrect SQL command is generated internally: "UPDATE sample SET "value"
> = $1 WHERE "
> The query is missing the WHERE condition expression.
> This results in following exception being thrown:
>
> Exception in thread "main" org.postgresql.util.PSQLException: ERROR:
> syntax error at end of input
> Position: 39
> at
> org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2553)
> at
> org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2285)
> at
> org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:323)
> at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:473)
> at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:393)
> at
> org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:164)
> at
> org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:130)
> at org.postgresql.jdbc.PgResultSet.updateRow(PgResultSet.java:1445)
> at TestPgSql.main(TestPgSql.java:35)
>
>
> I think this is a bug in JDBC driver.
>

Certainly an undesirable feature.

There is no way to update a row without a primary key. The driver is
looking for the primary key. You are correct the error thrown is not
desirable

I've created an issue https://github.com/pgjdbc/pgjdbc/issues/1975

Thanks,

Dave

>

In response to

Browse pgsql-jdbc by date

  From Date Subject
Next Message Daniel Migowski 2020-12-03 10:36:43 AW: Metadata performance
Previous Message Dave Cramer 2020-12-02 23:41:09 Re: Metadata performance