sandynz commented on PR #28837: URL: https://github.com/apache/shardingsphere/pull/28837#issuecomment-1774689039
mysql-connection-j 8.0.33 QueryInfo.java https://github.com/mysql/mysql-connector-j/blob/8.0.33/src/main/core-api/java/com/mysql/cj/QueryInfo.java#L668 ``` /** * Returns the type of return that can be expected from executing the given query. This operation does not take into consideration the multiplicity * of queries in the specified SQL. * * @param sql * the query to check * @param noBackslashEscapes * whether backslash escapes are disabled or not * @return the return type that can be expected from the given query, one of the elements of {@link QueryReturnType}. */ public static QueryReturnType getQueryReturnType(String sql, boolean noBackslashEscapes) { /* * Statements that return results: * - ANALYZE; CHECK/CHECKSUM; DESC/DESCRIBE; EXPLAIN; HELP; OPTIMIZE; REPAIR; SELECT; SHOW; TABLE; VALUES; WITH ... SELECT|TABLE|VALUES ...; XA RECOVER; * * Statements that may return results: * - CALL; EXECUTE; * * Statements that do not return results: * - ALTER; BINLOG; CACHE; CHANGE; CLONE; COMMIT; CREATE; DEALLOCATE; DELETE; DO; DROP; FLUSH; GET; GRANT; HANDLER; IMPORT; INSERT; INSTALL; KILL; LOAD; * - LOCK; PREPARE; PURGE; RELEASE; RENAME; REPLACE; RESET; RESIGNAL; RESTART; REVOKE; ROLLBACK; SAVEPOINT; SET; SHUTDOWN; SIGNAL; START; STOP; * - TRUNCATE; UNINSTALL; UNLOCK; UPDATE; USE; WITH ... DELETE|UPDATE ...; XA [!RECOVER]; */ int statementKeywordPos = indexOfStatementKeyword(sql, noBackslashEscapes); if (statementKeywordPos == -1) { return QueryReturnType.NONE; } char firstStatementChar = Character.toUpperCase(sql.charAt(statementKeywordPos)); if (firstStatementChar == 'A' && StringUtils.startsWithIgnoreCaseAndWs(sql, "ANALYZE", statementKeywordPos)) { return QueryReturnType.PRODUCES_RESULT_SET; } else if (firstStatementChar == 'C' && StringUtils.startsWithIgnoreCaseAndWs(sql, "CALL", statementKeywordPos)) { return QueryReturnType.MAY_PRODUCE_RESULT_SET; } else if (firstStatementChar == 'C' && StringUtils.startsWithIgnoreCaseAndWs(sql, "CHECK", statementKeywordPos)) { // Also matches "CHECKSUM". return QueryReturnType.PRODUCES_RESULT_SET; } else if (firstStatementChar == 'D' && StringUtils.startsWithIgnoreCaseAndWs(sql, "DESC", statementKeywordPos)) { // Also matches "DESCRIBE". return QueryReturnType.PRODUCES_RESULT_SET; } else if (firstStatementChar == 'E' && StringUtils.startsWithIgnoreCaseAndWs(sql, "EXPLAIN", statementKeywordPos)) { return QueryReturnType.PRODUCES_RESULT_SET; } else if (firstStatementChar == 'E' && StringUtils.startsWithIgnoreCaseAndWs(sql, "EXECUTE", statementKeywordPos)) { return QueryReturnType.MAY_PRODUCE_RESULT_SET; } else if (firstStatementChar == 'H' && StringUtils.startsWithIgnoreCaseAndWs(sql, "HELP", statementKeywordPos)) { return QueryReturnType.PRODUCES_RESULT_SET; } else if (firstStatementChar == 'O' && StringUtils.startsWithIgnoreCaseAndWs(sql, "OPTIMIZE", statementKeywordPos)) { return QueryReturnType.PRODUCES_RESULT_SET; } else if (firstStatementChar == 'R' && StringUtils.startsWithIgnoreCaseAndWs(sql, "REPAIR", statementKeywordPos)) { return QueryReturnType.PRODUCES_RESULT_SET; } else if (firstStatementChar == 'S' && (StringUtils.startsWithIgnoreCaseAndWs(sql, "SELECT", statementKeywordPos) || StringUtils.startsWithIgnoreCaseAndWs(sql, "SHOW", statementKeywordPos))) { return QueryReturnType.PRODUCES_RESULT_SET; } else if (firstStatementChar == 'T' && StringUtils.startsWithIgnoreCaseAndWs(sql, "TABLE", statementKeywordPos)) { return QueryReturnType.PRODUCES_RESULT_SET; } else if (firstStatementChar == 'V' && StringUtils.startsWithIgnoreCaseAndWs(sql, "VALUES", statementKeywordPos)) { return QueryReturnType.PRODUCES_RESULT_SET; } else if (firstStatementChar == 'W' && StringUtils.startsWithIgnoreCaseAndWs(sql, "WITH", statementKeywordPos)) { String context = getContextForWithStatement(sql, noBackslashEscapes); if ("SELECT".equalsIgnoreCase(context) || "TABLE".equalsIgnoreCase(context) || "VALUES".equalsIgnoreCase(context)) { return QueryReturnType.PRODUCES_RESULT_SET; } else if ("UPDATE".equalsIgnoreCase(context) || "DELETE".equalsIgnoreCase(context)) { return QueryReturnType.DOES_NOT_PRODUCE_RESULT_SET; } else { return QueryReturnType.MAY_PRODUCE_RESULT_SET; } } else if (firstStatementChar == 'X' && StringUtils.indexOfIgnoreCase(statementKeywordPos, sql, new String[] { "XA", "RECOVER" }, OPENING_MARKERS, CLOSING_MARKERS, noBackslashEscapes ? SearchMode.__MRK_COM_MYM_HNT_WS : SearchMode.__FULL) == statementKeywordPos) { return QueryReturnType.PRODUCES_RESULT_SET; } return QueryReturnType.DOES_NOT_PRODUCE_RESULT_SET; } ``` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
