Type:
Bug
Priority:
Major
Resolution:
Fixed
Affects Version/s:
1.1.9
Sprint:
Sprint connector/j 1.3.0
When performing a batch insert with the rewriteBatchedStatements=true option, the insert can fail if the first value being inserted isn't a parameter. The following test case demonstrates the problem:
@Test
public void testInsertWithLeadingConstantValue() throws Exception {
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true", "root", "root");
Statement stmt = null;
PreparedStatement insertStmt = null;
try {
stmt = conn.createStatement();
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS test_table(col1 VARCHAR(32), col2 VARCHAR(32))");
insertStmt = conn.prepareStatement("INSERT INTO test_table (col1, col2) values('some value', ?)");
insertStmt.setString(1, "a");
insertStmt.addBatch();
insertStmt.setString(1, "b");
insertStmt.addBatch();
insertStmt.executeBatch();
conn.commit();
}
finally {
if (insertStmt != null) {
insertStmt.close();
}
if (stmt != null) {
stmt.close();
}
conn.close();
}
}
The insert attempt results in the following SQL being executed:
INSERT INTO test_table (col1, col2) values ( 'some value' , 'a' ),( 'b' )
The SQL fails with the following error:
java.sql.BatchUpdateException: Column count doesn't match value count at row 2
at org.mariadb.jdbc.MySQLStatement.executeBatch(MySQLStatement.java:1291)
at org.mariadb.jdbc.TestBatchInsert.testInsertWithLeadingConstantValue(TestBatchInsert.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:44)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.sql.SQLException: Column count doesn't match value count at row 2
at org.mariadb.jdbc.internal.SQLExceptionMapper.get(SQLExceptionMapper.java:149)
at org.mariadb.jdbc.internal.SQLExceptionMapper.throwException(SQLExceptionMapper.java:106)
at org.mariadb.jdbc.MySQLStatement.executeQueryEpilog(MySQLStatement.java:268)
at org.mariadb.jdbc.MySQLStatement.execute(MySQLStatement.java:335)
at org.mariadb.jdbc.MySQLStatement.executeBatch(MySQLStatement.java:1271)
... 25 more
Caused by: org.mariadb.jdbc.internal.common.QueryException: Column count doesn't match value count at row 2
at org.mariadb.jdbc.internal.mysql.MySQLProtocol.getResult(MySQLProtocol.java:995)
at org.mariadb.jdbc.internal.mysql.MySQLProtocol.executeQuery(MySQLProtocol.java:1050)
at org.mariadb.jdbc.MySQLStatement.execute(MySQLStatement.java:328)
... 26 more
This seems to be because the initial part of the values clause up to the first parameter isn't being included in the rewritten SQL. The following patch addresses this issue:
diff --git a/src/main/java/org/mariadb/jdbc/internal/common/query/MySQLParameterizedQuery.java b/src/main/java/org/mariadb/jdbc/internal/common/query/MySQLParameterizedQuery.java
index 364a185..8f7dd5a 100644
--- a/src/main/java/org/mariadb/jdbc/internal/common/query/MySQLParameterizedQuery.java
+++ b/src/main/java/org/mariadb/jdbc/internal/common/query/MySQLParameterizedQuery.java
@@ -139,6 +139,9 @@
throw new AssertionError("Invalid query, queryParts was empty");
}
os.write(",(".getBytes());
+ if (queryPartsArray[0].length > rewriteOffset) {
+ os.write(queryPartsArray[0], rewriteOffset + 1, queryPartsArray[0].length - rewriteOffset - 1);
+ }
for(int i = 1; i<queryPartsArray.length; i++) {
parameters[i-1].writeTo(os);
if(queryPartsArray[i].length != 0)
Transition
Time In Source Status
Execution Times
Open
In Progress
9h 1m
1
In Progress
Closed
1d 5h 24m
1
{"report":{"fcp":876.0999994277954,"ttfb":212,"pageVisibility":"visible","entityId":52318,"key":"jira.project.issue.view-issue","isInitial":true,"threshold":1000,"elementTimings":{},"userDeviceMemory":8,"userDeviceProcessors":64,"apdex":1,"journeyId":"1807fd74-363a-466b-90de-e6fa567192d9","navigationType":0,"readyForUser":971.0999994277954,"redirectCount":0,"resourceLoadedEnd":1009.8999996185303,"resourceLoadedStart":217.69999980926514,"resourceTiming":[{"duration":104.09999942779541,"initiatorType":"link","name":"https://jira.mariadb.org/s/2c21342762a6a02add1c328bed317ffd-CDN/lu2cib/820016/12ta74/0a8bac35585be7fc6c9cc5a0464cd4cf/_/download/contextbatch/css/_super/batch.css","startTime":217.69999980926514,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":217.69999980926514,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":321.79999923706055,"responseStart":0,"secureConnectionStart":0},{"duration":104.19999980926514,"initiatorType":"link","name":"https://jira.mariadb.org/s/7ebd35e77e471bc30ff0eba799ebc151-CDN/lu2cib/820016/12ta74/2bf333562ca6724060a9d5f1535471f6/_/download/contextbatch/css/jira.browse.project,project.issue.navigator,jira.view.issue,jira.general,jira.global,atl.general,-_super/batch.css?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&slack-enabled=true","startTime":218.0999994277954,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":218.0999994277954,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":322.29999923706055,"responseStart":0,"secureConnectionStart":0},{"duration":123.19999980926514,"initiatorType":"script","name":"https://jira.mariadb.org/s/0917945aaa57108d00c5076fea35e069-CDN/lu2cib/820016/12ta74/0a8bac35585be7fc6c9cc5a0464cd4cf/_/download/contextbatch/js/_super/batch.js?locale=en","startTime":218.19999980926514,"connectEnd":218.19999980926514,"connectStart":218.19999980926514,"domainLookupEnd":218.19999980926514,"domainLookupStart":218.19999980926514,"fetchStart":218.19999980926514,"redirectEnd":0,"redirectStart":0,"requestStart":218.19999980926514,"responseEnd":341.3999996185303,"responseStart":341.3999996185303,"secureConnectionStart":218.19999980926514},{"duration":178.5999994277954,"initiatorType":"script","name":"https://jira.mariadb.org/s/2d8175ec2fa4c816e8023260bd8c1786-CDN/lu2cib/820016/12ta74/2bf333562ca6724060a9d5f1535471f6/_/download/contextbatch/js/jira.browse.project,project.issue.navigator,jira.view.issue,jira.general,jira.global,atl.general,-_super/batch.js?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&locale=en&slack-enabled=true","startTime":218.5,"connectEnd":218.5,"connectStart":218.5,"domainLookupEnd":218.5,"domainLookupStart":218.5,"fetchStart":218.5,"redirectEnd":0,"redirectStart":0,"requestStart":218.5,"responseEnd":397.0999994277954,"responseStart":397.0999994277954,"secureConnectionStart":218.5},{"duration":182.70000076293945,"initiatorType":"script","name":"https://jira.mariadb.org/s/a9324d6758d385eb45c462685ad88f1d-CDN/lu2cib/820016/12ta74/c92c0caa9a024ae85b0ebdbed7fb4bd7/_/download/contextbatch/js/atl.global,-_super/batch.js?locale=en","startTime":218.79999923706055,"connectEnd":218.79999923706055,"connectStart":218.79999923706055,"domainLookupEnd":218.79999923706055,"domainLookupStart":218.79999923706055,"fetchStart":218.79999923706055,"redirectEnd":0,"redirectStart":0,"requestStart":218.79999923706055,"responseEnd":401.5,"responseStart":401.5,"secureConnectionStart":218.79999923706055},{"duration":183.19999980926514,"initiatorType":"script","name":"https://jira.mariadb.org/s/d41d8cd98f00b204e9800998ecf8427e-CDN/lu2cib/820016/12ta74/1.0/_/download/batch/jira.webresources:calendar-en/jira.webresources:calendar-en.js","startTime":218.89999961853027,"connectEnd":218.89999961853027,"connectStart":218.89999961853027,"domainLookupEnd":218.89999961853027,"domainLookupStart":218.89999961853027,"fetchStart":218.89999961853027,"redirectEnd":0,"redirectStart":0,"requestStart":218.89999961853027,"responseEnd":402.0999994277954,"responseStart":402.0999994277954,"secureConnectionStart":218.89999961853027},{"duration":183.39999961853027,"initiatorType":"script","name":"https://jira.mariadb.org/s/d41d8cd98f00b204e9800998ecf8427e-CDN/lu2cib/820016/12ta74/1.0/_/download/batch/jira.webresources:calendar-localisation-moment/jira.webresources:calendar-localisation-moment.js","startTime":219.19999980926514,"connectEnd":219.19999980926514,"connectStart":219.19999980926514,"domainLookupEnd":219.19999980926514,"domainLookupStart":219.19999980926514,"fetchStart":219.19999980926514,"redirectEnd":0,"redirectStart":0,"requestStart":219.19999980926514,"responseEnd":402.5999994277954,"responseStart":402.5999994277954,"secureConnectionStart":219.19999980926514},{"duration":269.0999994277954,"initiatorType":"link","name":"https://jira.mariadb.org/s/b04b06a02d1959df322d9cded3aeecc1-CDN/lu2cib/820016/12ta74/a2ff6aa845ffc9a1d22fe23d9ee791fc/_/download/contextbatch/css/jira.global.look-and-feel,-_super/batch.css","startTime":219.5,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":219.5,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":488.5999994277954,"responseStart":0,"secureConnectionStart":0},{"duration":183.39999961853027,"initiatorType":"script","name":"https://jira.mariadb.org/rest/api/1.0/shortcuts/820016/47140b6e0a9bc2e4913da06536125810/shortcuts.js?context=issuenavigation&context=issueaction","startTime":219.69999980926514,"connectEnd":219.69999980926514,"connectStart":219.69999980926514,"domainLookupEnd":219.69999980926514,"domainLookupStart":219.69999980926514,"fetchStart":219.69999980926514,"redirectEnd":0,"redirectStart":0,"requestStart":219.69999980926514,"responseEnd":403.0999994277954,"responseStart":403.0999994277954,"secureConnectionStart":219.69999980926514},{"duration":268.9000005722046,"initiatorType":"link","name":"https://jira.mariadb.org/s/3ac36323ba5e4eb0af2aa7ac7211b4bb-CDN/lu2cib/820016/12ta74/d176f0986478cc64f24226b3d20c140d/_/download/contextbatch/css/com.atlassian.jira.projects.sidebar.init,-_super,-project.issue.navigator,-jira.view.issue/batch.css?jira.create.linked.issue=true","startTime":219.79999923706055,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":219.79999923706055,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":488.69999980926514,"responseStart":0,"secureConnectionStart":0},{"duration":183.69999980926514,"initiatorType":"script","name":"https://jira.mariadb.org/s/5d5e8fe91fbc506585e83ea3b62ccc4b-CDN/lu2cib/820016/12ta74/d176f0986478cc64f24226b3d20c140d/_/download/contextbatch/js/com.atlassian.jira.projects.sidebar.init,-_super,-project.issue.navigator,-jira.view.issue/batch.js?jira.create.linked.issue=true&locale=en","startTime":220,"connectEnd":220,"connectStart":220,"domainLookupEnd":220,"domainLookupStart":220,"fetchStart":220,"redirectEnd":0,"redirectStart":0,"requestStart":220,"responseEnd":403.69999980926514,"responseStart":403.69999980926514,"secureConnectionStart":220},{"duration":331.5999994277954,"initiatorType":"script","name":"https://jira.mariadb.org/s/d41d8cd98f00b204e9800998ecf8427e-CDN/lu2cib/820016/12ta74/1.0/_/download/batch/jira.webresources:bigpipe-js/jira.webresources:bigpipe-js.js","startTime":225.69999980926514,"connectEnd":225.69999980926514,"connectStart":225.69999980926514,"domainLookupEnd":225.69999980926514,"domainLookupStart":225.69999980926514,"fetchStart":225.69999980926514,"redirectEnd":0,"redirectStart":0,"requestStart":225.69999980926514,"responseEnd":557.2999992370605,"responseStart":557.2999992370605,"secureConnectionStart":225.69999980926514},{"duration":350.30000019073486,"initiatorType":"script","name":"https://jira.mariadb.org/s/d41d8cd98f00b204e9800998ecf8427e-CDN/lu2cib/820016/12ta74/1.0/_/download/batch/jira.webresources:bigpipe-init/jira.webresources:bigpipe-init.js","startTime":225.79999923706055,"connectEnd":225.79999923706055,"connectStart":225.79999923706055,"domainLookupEnd":225.79999923706055,"domainLookupStart":225.79999923706055,"fetchStart":225.79999923706055,"redirectEnd":0,"redirectStart":0,"requestStart":225.79999923706055,"responseEnd":576.0999994277954,"responseStart":576.0999994277954,"secureConnectionStart":225.79999923706055},{"duration":59.30000019073486,"initiatorType":"xmlhttprequest","name":"https://jira.mariadb.org/rest/webResources/1.0/resources","startTime":500.69999980926514,"connectEnd":500.69999980926514,"connectStart":500.69999980926514,"domainLookupEnd":500.69999980926514,"domainLookupStart":500.69999980926514,"fetchStart":500.69999980926514,"redirectEnd":0,"redirectStart":0,"requestStart":500.69999980926514,"responseEnd":560,"responseStart":560,"secureConnectionStart":500.69999980926514},{"duration":240.80000019073486,"initiatorType":"link","name":"https://jira.mariadb.org/s/d5715adaadd168a9002b108b2b039b50-CDN/lu2cib/820016/12ta74/be4b45e9cec53099498fa61c8b7acba4/_/download/contextbatch/css/jira.project.sidebar,-_super,-project.issue.navigator,-jira.general,-jira.browse.project,-jira.view.issue,-jira.global,-atl.general,-com.atlassian.jira.projects.sidebar.init/batch.css?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&slack-enabled=true","startTime":769.0999994277954,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":769.0999994277954,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":1009.8999996185303,"responseStart":0,"secureConnectionStart":0},{"duration":278.19999980926514,"initiatorType":"script","name":"https://jira.mariadb.org/s/d41d8cd98f00b204e9800998ecf8427e-CDN/lu2cib/820016/12ta74/e65b778d185daf5aee24936755b43da6/_/download/contextbatch/js/browser-metrics-plugin.contrib,-_super,-project.issue.navigator,-jira.view.issue,-atl.general/batch.js?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&slack-enabled=true","startTime":770.1999998092651,"connectEnd":770.1999998092651,"connectStart":770.1999998092651,"domainLookupEnd":770.1999998092651,"domainLookupStart":770.1999998092651,"fetchStart":770.1999998092651,"redirectEnd":0,"redirectStart":0,"requestStart":770.1999998092651,"responseEnd":1048.3999996185303,"responseStart":1048.3999996185303,"secureConnectionStart":770.1999998092651},{"duration":282.8999996185303,"initiatorType":"script","name":"https://jira.mariadb.org/s/097ae97cb8fbec7d6ea4bbb1f26955b9-CDN/lu2cib/820016/12ta74/be4b45e9cec53099498fa61c8b7acba4/_/download/contextbatch/js/jira.project.sidebar,-_super,-project.issue.navigator,-jira.general,-jira.browse.project,-jira.view.issue,-jira.global,-atl.general,-com.atlassian.jira.projects.sidebar.init/batch.js?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&locale=en&slack-enabled=true","startTime":770.5,"connectEnd":770.5,"connectStart":770.5,"domainLookupEnd":770.5,"domainLookupStart":770.5,"fetchStart":770.5,"redirectEnd":0,"redirectStart":0,"requestStart":770.5,"responseEnd":1053.3999996185303,"responseStart":1053.3999996185303,"secureConnectionStart":770.5},{"duration":239.4000005722046,"initiatorType":"script","name":"https://www.google-analytics.com/analytics.js","startTime":869.2999992370605,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":869.2999992370605,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":1108.6999998092651,"responseStart":0,"secureConnectionStart":0}],"fetchStart":0,"domainLookupStart":0,"domainLookupEnd":0,"connectStart":0,"connectEnd":0,"requestStart":40,"responseStart":212,"responseEnd":220,"domLoading":215,"domInteractive":1040,"domContentLoadedEventStart":1041,"domContentLoadedEventEnd":1101,"domComplete":1343,"loadEventStart":1343,"loadEventEnd":1343,"userAgent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","marks":[{"name":"bigPipe.sidebar-id.start","time":1018.0999994277954},{"name":"bigPipe.sidebar-id.end","time":1019},{"name":"bigPipe.activity-panel-pipe-id.start","time":1019.0999994277954},{"name":"bigPipe.activity-panel-pipe-id.end","time":1020.1999998092651},{"name":"activityTabFullyLoaded","time":1119.0999994277954}],"measures":[],"correlationId":"b2d44dff1ee6c0","effectiveType":"4g","downlink":10,"rtt":0,"serverDuration":99,"dbReadsTimeInMs":13,"dbConnsTimeInMs":22,"applicationHash":"9d11dbea5f4be3d4cc21f03a88dd11d8c8687422","experiments":[]}}