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]

Reply via email to