diff --git a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index 84f743f59b..5cea6a1498 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -778,6 +778,8 @@ public class Lexer { return SQLType.ANALYZE; } else if (hashCode == FnvHash.Constants.EXPLAIN) { return SQLType.EXPLAIN; + } else if (hashCode == FnvHash.Constants.READ) { + return SQLType.READ; } else if (hashCode == FnvHash.Constants.WITH) { if (dbType == DbType.mysql || dbType == DbType.hive @@ -815,15 +817,57 @@ public class Lexer { if (token == Token.USER || identifierEquals(FnvHash.Constants.USER)) { return SQLType.CREATE_USER; } + + _for: + for (int i = 0; i < 1000;++i) { + switch (token) { + case EOF: + case ERROR: + break _for; + case TABLE: + sqlType = SQLType.CREATE_TABLE; + break; + case VIEW: + sqlType = SQLType.CREATE_VIEW; + break _for; + case FUNCTION: + sqlType = SQLType.CREATE_FUNCTION; + break; + case SELECT: + if (sqlType == SQLType.CREATE_TABLE) { + sqlType = SQLType.CREATE_TABLE_AS_SELECT; + break _for; + } + break; + default: + if (identifierEquals(FnvHash.Constants.ROLE)) { + sqlType = SQLType.CREATE_ROLE; + break _for; + } + break; + } + + nextToken(); + } } else if (sqlType == SQLType.DROP) { nextToken(); if (token == Token.USER || identifierEquals(FnvHash.Constants.USER)) { return SQLType.DROP_USER; + } else if (token == TABLE) { + return SQLType.DROP_TABLE; + } else if (token == VIEW) { + return SQLType.DROP_VIEW; + } else if (token == FUNCTION) { + return SQLType.DROP_FUNCTION; + } else if (identifierEquals(FnvHash.Constants.RESOURCE)) { + return SQLType.DROP_RESOURCE; } } else if (sqlType == SQLType.ALTER) { nextToken(); if (token == Token.USER || identifierEquals(FnvHash.Constants.USER)) { return SQLType.ALTER_USER; + } else if (token == TABLE) { + return SQLType.ALTER_TABLE; } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLType.java b/src/main/java/com/alibaba/druid/sql/parser/SQLType.java index d222cbba2b..54a3ff65b4 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLType.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLType.java @@ -36,8 +36,19 @@ public enum SQLType { REMOVE_USER, CREATE_USER, + CREATE_TABLE, + CREATE_TABLE_AS_SELECT, + CREATE_VIEW, + CREATE_FUNCTION, + CREATE_ROLE, DROP_USER, + DROP_TABLE, + DROP_VIEW, + DROP_FUNCTION, + DROP_RESOURCE, ALTER_USER, + ALTER_TABLE, + READ, UNKNOWN }