From 3b71fd017127d9084a8da4e4add74b6d8b0a5368 Mon Sep 17 00:00:00 2001 From: shenfeng Date: Mon, 21 Jul 2025 17:32:15 +0800 Subject: [PATCH 1/2] fix Bug #118688 com.mysql.cj.protocol.a.StringValueEncoder#getString does not handle string escaping --- .../java/com/mysql/cj/protocol/a/StringValueEncoder.java | 6 ++---- .../testsuite/regression/StatementRegressionTest.java | 8 ++++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/protocol-impl/java/com/mysql/cj/protocol/a/StringValueEncoder.java b/src/main/protocol-impl/java/com/mysql/cj/protocol/a/StringValueEncoder.java index c2ca3e28a..16f2d87dd 100644 --- a/src/main/protocol-impl/java/com/mysql/cj/protocol/a/StringValueEncoder.java +++ b/src/main/protocol-impl/java/com/mysql/cj/protocol/a/StringValueEncoder.java @@ -171,11 +171,9 @@ public String getString(BindValue binding) { case BLOB: case MEDIUMBLOB: case LONGBLOB: - StringBuilder sb = new StringBuilder("'"); - sb.append(x); - sb.append("'"); - return sb.toString(); + return StringUtils.toString(getBytes(binding), this.charEncoding.getValue()); case DATE: + StringBuilder sb; Object dt = TimeUtil.parseToDateTimeObject(x, binding.getMysqlType()); if (dt instanceof LocalDate) { sb = new StringBuilder("'"); diff --git a/src/test/java/testsuite/regression/StatementRegressionTest.java b/src/test/java/testsuite/regression/StatementRegressionTest.java index 12d70ff3b..ada71d4f9 100644 --- a/src/test/java/testsuite/regression/StatementRegressionTest.java +++ b/src/test/java/testsuite/regression/StatementRegressionTest.java @@ -14052,4 +14052,12 @@ public void testBug96786() throws Exception { assertTrue(this.stmt.isClosed()); } + @Test + public void testBug118688() throws Exception { + ClientPreparedStatement preparedStatement = (ClientPreparedStatement) this.conn.prepareStatement("SELECT * FROM test wehre id = ?"); + preparedStatement.setString(1, "'a'"); + String sql = ((ClientPreparedQuery) preparedStatement.getQuery()).asSql(); + assertEquals("SELECT * FROM test wehre id = '''a'''",sql); + } + } From caf3a9c3311abd22d94370efe882b8373f4a90eb Mon Sep 17 00:00:00 2001 From: shenfeng Date: Mon, 21 Jul 2025 18:24:40 +0800 Subject: [PATCH 2/2] polish --- .../java/testsuite/regression/StatementRegressionTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test/java/testsuite/regression/StatementRegressionTest.java b/src/test/java/testsuite/regression/StatementRegressionTest.java index ada71d4f9..a15873211 100644 --- a/src/test/java/testsuite/regression/StatementRegressionTest.java +++ b/src/test/java/testsuite/regression/StatementRegressionTest.java @@ -14053,11 +14053,13 @@ public void testBug96786() throws Exception { } @Test - public void testBug118688() throws Exception { + public void testBug118688() throws Exception { ClientPreparedStatement preparedStatement = (ClientPreparedStatement) this.conn.prepareStatement("SELECT * FROM test wehre id = ?"); preparedStatement.setString(1, "'a'"); String sql = ((ClientPreparedQuery) preparedStatement.getQuery()).asSql(); - assertEquals("SELECT * FROM test wehre id = '''a'''",sql); + assertEquals("SELECT * FROM test wehre id = '''a'''", sql); + preparedStatement.close(); + assertTrue(preparedStatement.isClosed()); } }