From 81868c09d3d5be569a5da7e9e115d8594a3d40a1 Mon Sep 17 00:00:00 2001 From: wang_hong <1337151114@qq.com> Date: Wed, 2 Jun 2021 18:02:07 +0800 Subject: [PATCH] Fix for Bug#103878 Connector/J 8 : query with 'show xxx' will get exception when use cursor --- .../java/com/mysql/cj/util/StringUtils.java | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/src/main/core-api/java/com/mysql/cj/util/StringUtils.java b/src/main/core-api/java/com/mysql/cj/util/StringUtils.java index be187068b..5be44da36 100644 --- a/src/main/core-api/java/com/mysql/cj/util/StringUtils.java +++ b/src/main/core-api/java/com/mysql/cj/util/StringUtils.java @@ -1871,6 +1871,9 @@ public static void appendAsHex(StringBuilder builder, int value) { return asBytes; } + private static final Pattern SERVER_PREPARE_STATEMENT_PATTERN = + Pattern.compile("^(\\s*\\/\\*([^\\*]|\\*[^\\/])*\\*\\/)*\\s*(SELECT|UPDATE|INSERT|DELETE|REPLACE|CALL|WITH)", Pattern.CASE_INSENSITIVE); + public static boolean canHandleAsServerPreparedStatementNoCache(String sql, ServerVersion serverVersion, boolean allowMultiQueries, boolean noBackslashEscapes, boolean useAnsiQuotes) { @@ -1879,27 +1882,19 @@ public static boolean canHandleAsServerPreparedStatementNoCache(String sql, Serv return false; } - boolean canHandleAsStatement = true; + boolean canHandleAsStatement = false; + + if (SERVER_PREPARE_STATEMENT_PATTERN.matcher(sql).find()) { + canHandleAsStatement = true; + } + if (canHandleAsStatement && sql.startsWith("/* ping */")) { + canHandleAsStatement = false; + } boolean allowBackslashEscapes = !noBackslashEscapes; String quoteChar = useAnsiQuotes ? "\"" : "'"; - - if (allowMultiQueries) { - if (StringUtils.indexOfIgnoreCase(0, sql, ";", quoteChar, quoteChar, - allowBackslashEscapes ? StringUtils.SEARCH_MODE__ALL : StringUtils.SEARCH_MODE__MRK_COM_WS) != -1) { - canHandleAsStatement = false; - } - } else if (startsWithIgnoreCaseAndWs(sql, "XA ")) { - canHandleAsStatement = false; - } else if (startsWithIgnoreCaseAndWs(sql, "CREATE TABLE")) { - canHandleAsStatement = false; - } else if (startsWithIgnoreCaseAndWs(sql, "DO")) { - canHandleAsStatement = false; - } else if (startsWithIgnoreCaseAndWs(sql, "SET")) { - canHandleAsStatement = false; - } else if (StringUtils.startsWithIgnoreCaseAndWs(sql, "SHOW WARNINGS") && serverVersion.meetsMinimum(ServerVersion.parseVersion("5.7.2"))) { - canHandleAsStatement = false; - } else if (sql.startsWith("/* ping */")) { + if (canHandleAsStatement && (allowMultiQueries && (StringUtils.indexOfIgnoreCase(0, sql, ";", quoteChar, quoteChar, + allowBackslashEscapes ? StringUtils.SEARCH_MODE__ALL : StringUtils.SEARCH_MODE__MRK_COM_WS) != -1))) { canHandleAsStatement = false; }