@@ -60,14 +60,31 @@ protected enum StatementType {
6060 SELECT , INSERT , DELETE , UPDATE , CREATE , DROP , ALTER , TRUNCATE , USE , SHOW , DESCRIBE , EXPLAIN , SET , KILL , OTHER , INSERT_INTO_SELECT
6161 }
6262
63+ protected enum ShowStatementType {
64+ TABLES , USERS , PROCESSLIST
65+ }
66+
6367 protected static StatementType parseStatementType (String sql ) {
68+ return (StatementType ) parseStatement (sql )[0 ];
69+ }
70+
71+ private static final Object [] OTHER_STMT_TYPE_RESULT = new Object [] {StatementType .OTHER };
72+
73+ /**
74+ * Returns non-empty array with at list StatementType on position 0.
75+ * If Show statement - returns rest token from the statement.
76+ *
77+ * @param sql - raw SQL statement
78+ * @return Object[] - parse result
79+ */
80+ public static Object [] parseStatement (String sql ) {
6481 if (sql == null ) {
65- return StatementType . OTHER ;
82+ return OTHER_STMT_TYPE_RESULT ;
6683 }
6784
6885 String trimmedSql = sql .trim ();
6986 if (trimmedSql .isEmpty ()) {
70- return StatementType . OTHER ;
87+ return OTHER_STMT_TYPE_RESULT ;
7188 }
7289
7390 trimmedSql = trimmedSql .replaceAll ("/\\ *.*?\\ */" , "" ).trim (); // remove comments
@@ -81,34 +98,75 @@ protected static StatementType parseStatementType(String sql) {
8198 continue ;
8299 }
83100
101+ StatementType statementType = null ;
102+ Object [] parseResult = null ;
84103 switch (tokens [0 ].toUpperCase ()) {
85- case "SELECT" : return StatementType .SELECT ;
86- case "WITH" : return StatementType .SELECT ;
104+ case "SELECT" :
105+ statementType = StatementType .SELECT ;
106+ break ;
107+ case "WITH" :
108+ statementType = StatementType .SELECT ;
109+ break ;
87110 case "INSERT" :
111+ statementType = StatementType .INSERT ;
88112 for (String token : tokens ) {
89113 if (token .equalsIgnoreCase ("SELECT" )) {
90- return StatementType .INSERT_INTO_SELECT ;
114+ statementType = StatementType .INSERT_INTO_SELECT ;
115+ }
116+ }
117+ break ;
118+ case "DELETE" :
119+ statementType = StatementType .DELETE ;
120+ break ;
121+ case "UPDATE" :
122+ statementType = StatementType .UPDATE ;
123+ break ;
124+ case "CREATE" :
125+ statementType = StatementType .CREATE ;
126+ break ;
127+ case "DROP" :
128+ statementType = StatementType .DROP ;
129+ break ;
130+ case "ALTER" :
131+ statementType = StatementType .ALTER ;
132+ break ;
133+ case "TRUNCATE" :
134+ statementType = StatementType .TRUNCATE ;
135+ break ;
136+ case "USE" :
137+ statementType = StatementType .USE ;
138+ break ;
139+ case "SHOW" :
140+ statementType = StatementType .SHOW ;
141+ ShowStatementType showStatementType = null ;
142+ for (String token : tokens ) {
143+ if (!token .isEmpty ()) {
144+ showStatementType = ShowStatementType .valueOf (token .toUpperCase ());
145+ break ;
91146 }
92147 }
93- return StatementType .INSERT ;
94- case "DELETE" : return StatementType .DELETE ;
95- case "UPDATE" : return StatementType .UPDATE ;
96- case "CREATE" : return StatementType .CREATE ;
97- case "DROP" : return StatementType .DROP ;
98- case "ALTER" : return StatementType .ALTER ;
99- case "TRUNCATE" : return StatementType .TRUNCATE ;
100- case "USE" : return StatementType .USE ;
101- case "SHOW" : return StatementType .SHOW ;
102- case "DESCRIBE" : return StatementType .DESCRIBE ;
103- case "EXPLAIN" : return StatementType .EXPLAIN ;
104- case "SET" : return StatementType .SET ;
105- case "KILL" : return StatementType .KILL ;
106- default : return StatementType .OTHER ;
148+ parseResult = new Object [] {statementType , showStatementType };
149+ break ;
150+ case "DESCRIBE" :
151+ statementType = StatementType .DESCRIBE ;
152+ break ;
153+ case "EXPLAIN" :
154+ statementType = StatementType .EXPLAIN ;
155+ break ;
156+ case "SET" :
157+ statementType = StatementType .SET ;
158+ break ;
159+ case "KILL" :
160+ statementType = StatementType .KILL ;
161+ break ;
162+ default :
163+ parseResult = OTHER_STMT_TYPE_RESULT ;
107164 }
165+ return parseResult == null ? new Object [] {statementType } : parseResult ;
108166 }
109167 }
110168
111- return StatementType . OTHER ;
169+ return OTHER_STMT_TYPE_RESULT ;
112170 }
113171
114172 protected static String parseTableName (String sql ) {
0 commit comments