Details
-
Bug
-
Status: Closed (View Workflow)
-
Minor
-
Resolution: Fixed
-
1.3.7
-
None
Description
A complete background can be found here:
https://github.com/jdbi/jdbi/issues/309
But to sum up, if I issue a query with an "on duplicate key" clause, and a parameter I need to bind, and one of the columns has a typo in it, say for a schema like so:
CREATE TABLE `test_bug` (
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
`data` varchar(45) NOT NULL,
|
`counter` int(11) NOT NULL DEFAULT '0',
|
PRIMARY KEY (`id`)
|
);
|
I issue a query like so:
try ( PreparedStatement st =
|
connection.prepareStatement("insert into test_bug (id, data, counters) values (?,?,?) on duplicate key update counter = counter + ?") ) {
|
st.setInt(1, 1);
|
st.setString(2, "test");
|
st.setInt(3, 1);
|
st.setInt(4, 5);
|
st.execute();
|
}
|
(note counters instead of counter)
I get an error like so:
Exception in thread "main" java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '5 on duplicate key update counter = counter +' at line 1
|
Query is : insert into test_jdbi_bug (id, data, counters) values (1,'test',1)5 on duplicate key update counter = counter +
|
at org.mariadb.jdbc.internal.util.ExceptionMapper.get(ExceptionMapper.java:125)
|
at org.mariadb.jdbc.internal.util.ExceptionMapper.throwException(ExceptionMapper.java:69)
|
at org.mariadb.jdbc.MariaDbStatement.executeQueryEpilog(MariaDbStatement.java:213)
|
at org.mariadb.jdbc.MariaDbClientPreparedStatement.executeInternal(MariaDbClientPreparedStatement.java:185)
|
at org.mariadb.jdbc.MariaDbClientPreparedStatement.execute(MariaDbClientPreparedStatement.java:129)
|
at com.shareplaylearn.App.jdbcTest(App.java:23)
|
at com.shareplaylearn.App.main(App.java:29)
|
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
|
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
|
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
|
at java.lang.reflect.Method.invoke(Method.java:498)
|
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
|
Caused by: org.mariadb.jdbc.internal.util.dao.QueryException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '5 on duplicate key update counter = counter +' at line 1
|
Query is : insert into test_jdbi_bug (id, data, counters) values (1,'test',1)5 on duplicate key update counter = counter +
|
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:870)
|
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQueries(AbstractQueryProtocol.java:789)
|
at org.mariadb.jdbc.MariaDbClientPreparedStatement.executeInternal(MariaDbClientPreparedStatement.java:177)
|
... 8 more
|
Note the '5' character that was bizarrely inserted into the query.
Instead of the expected error (you can see the expected error by trimming off the On Duplicate clause:
try ( PreparedStatement st =
|
connection.prepareStatement("insert into test_jdbi_bug (id, data, counters) values (?,?,?)") ) { //+
|
//" on duplicate key update counter = counter + ?") ) {
|
st.setInt(1, 1);
|
st.setString(2, "test");
|
st.setInt(3, 1);
|
///st.setInt(4, 5);
|
st.execute();
|
}
|
...(yields the below, as expected)
|
Exception in thread "main" java.sql.SQLSyntaxErrorException: Unknown column 'counters' in 'field list'
|
Query is : insert into test_jdbi_bug (id, data, counters) values (1,'test',1)
|
There are two things wrong with the error you get with the on duplicate clause:
- it's incredibly misleading and makes a simple, common mistake very hard to track down
- it seems to indicate the sql parser has gone a bit off the reservation.