in core/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java [2511:4019]
public SQLStatement parseShow() {
accept(Token.SHOW);
if (lexer.token() == Token.COMMENT) {
lexer.nextToken();
}
boolean isPhysical = false;
if (lexer.identifierEquals(FnvHash.Constants.PHYSICAL)) {
lexer.nextToken();
isPhysical = true;
}
boolean full = false;
if (lexer.token() == Token.FULL) {
lexer.nextToken();
full = true;
} else if (lexer.token() == Token.HINT) {
String hints = lexer.stringVal().toLowerCase();
if (hints.endsWith(" full")
&& hints.length() <= 11
&& hints.charAt(0) == '!'
&& hints.charAt(1) == '5') {
lexer.nextToken();
full = true;
}
}
if (lexer.identifierEquals(FnvHash.Constants.STATS)) {
lexer.nextToken();
SQLShowStatisticStmt showStats = new SQLShowStatisticStmt();
showStats.setDbType(DbType.mysql);
if (full) {
showStats.setFull(true);
}
return showStats;
}
if (lexer.identifierEquals(FnvHash.Constants.PROCESSLIST)) {
lexer.nextToken();
MySqlShowProcessListStatement stmt = new MySqlShowProcessListStatement();
stmt.setFull(full);
if (!full) {
if (lexer.identifierEquals(FnvHash.Constants.MPP)) {
lexer.nextToken();
stmt.setMpp(true);
}
}
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
stmt.setWhere(
this.exprParser.expr());
}
if (lexer.token() == Token.ORDER) {
stmt.setOrderBy(
this.exprParser.parseOrderBy());
}
if (lexer.token() == Token.LIMIT) {
stmt.setLimit(
this.exprParser.parseLimit());
}
return stmt;
}
if (lexer.identifierEquals("COLUMNS") || lexer.identifierEquals("FIELDS")) {
lexer.nextToken();
SQLShowColumnsStatement stmt = parseShowColumns();
stmt.setFull(full);
return stmt;
}
if (lexer.identifierEquals("COLUMNS")) {
lexer.nextToken();
SQLShowColumnsStatement stmt = parseShowColumns();
return stmt;
}
if (lexer.identifierEquals(TABLES)) {
lexer.nextToken();
SQLShowTablesStatement stmt = parseShowTables();
stmt.setFull(full);
return stmt;
}
if (lexer.identifierEquals("DATABASES")) {
lexer.nextToken();
SQLShowDatabasesStatement stmt = parseShowDatabases(isPhysical);
if (full) {
stmt.setFull(true);
}
return stmt;
}
if (lexer.identifierEquals("WARNINGS")) {
lexer.nextToken();
MySqlShowWarningsStatement stmt = parseShowWarnings();
return stmt;
}
if (lexer.identifierEquals("COUNT")) {
lexer.nextToken();
accept(Token.LPAREN);
accept(Token.STAR);
accept(Token.RPAREN);
if (lexer.identifierEquals(FnvHash.Constants.ERRORS)) {
lexer.nextToken();
MySqlShowErrorsStatement stmt = new MySqlShowErrorsStatement();
stmt.setCount(true);
return stmt;
} else {
acceptIdentifier("WARNINGS");
MySqlShowWarningsStatement stmt = new MySqlShowWarningsStatement();
stmt.setCount(true);
return stmt;
}
}
if (lexer.identifierEquals(FnvHash.Constants.ERRORS)) {
lexer.nextToken();
MySqlShowErrorsStatement stmt = new MySqlShowErrorsStatement();
stmt.setLimit(this.exprParser.parseLimit());
return stmt;
}
if (lexer.identifierEquals(STATUS)) {
lexer.nextToken();
MySqlShowStatusStatement stmt = parseShowStatus();
return stmt;
}
if (lexer.identifierEquals(DBLOCK)) {
lexer.nextToken();
return new MysqlShowDbLockStatement();
}
if (lexer.identifierEquals(VARIABLES)) {
lexer.nextToken();
SQLShowVariantsStatement stmt = parseShowVariants();
return stmt;
}
if (lexer.identifierEquals(GLOBAL)) {
lexer.nextToken();
if (lexer.identifierEquals(STATUS)) {
lexer.nextToken();
MySqlShowStatusStatement stmt = parseShowStatus();
stmt.setGlobal(true);
return stmt;
}
if (lexer.identifierEquals(VARIABLES)) {
lexer.nextToken();
SQLShowVariantsStatement stmt = parseShowVariants();
stmt.setGlobal(true);
return stmt;
}
// DRDS GSI syntax.
if (isEnabled(SQLParserFeature.DRDSAsyncDDL) && (INDEX == lexer.token() || lexer.identifierEquals("INDEXES"))) {
lexer.nextToken();
DrdsShowGlobalIndex stmt = new DrdsShowGlobalIndex();
if (Token.FROM == lexer.token()) {
lexer.nextToken();
stmt.setTableName(this.exprParser.name());
}
return stmt;
}
}
if (lexer.identifierEquals(FnvHash.Constants.SESSION)) {
lexer.nextToken();
if (lexer.identifierEquals(STATUS)) {
lexer.nextToken();
MySqlShowStatusStatement stmt = parseShowStatus();
stmt.setSession(true);
return stmt;
}
if (lexer.identifierEquals(VARIABLES)) {
lexer.nextToken();
SQLShowVariantsStatement stmt = parseShowVariants();
stmt.setSession(true);
return stmt;
}
SQLShowSessionStatement stmt = new SQLShowSessionStatement();
if (lexer.token() == Token.LIKE) {
lexer.nextToken();
SQLExpr like = this.exprParser.expr();
stmt.setLike(like);
}
return stmt;
}
if (lexer.identifierEquals("COBAR_STATUS")) {
lexer.nextToken();
return new CobarShowStatus();
}
if (lexer.identifierEquals("AUTHORS")) {
lexer.nextToken();
return new MySqlShowAuthorsStatement();
}
if (lexer.token() == Token.BINARY) {
lexer.nextToken();
acceptIdentifier("LOGS");
return new MySqlShowBinaryLogsStatement();
}
if (lexer.identifierEquals("MASTER")) {
lexer.nextToken();
if (lexer.identifierEquals("LOGS")) {
lexer.nextToken();
return new MySqlShowMasterLogsStatement();
}
acceptIdentifier(STATUS);
return new MySqlShowMasterStatusStatement();
}
if (lexer.identifierEquals("CLUSTER")) {
lexer.nextToken();
acceptIdentifier("NAME");
return new MySqlShowClusterNameStatement();
}
if (lexer.identifierEquals("SYNC_JOB")) {
lexer.nextToken();
acceptIdentifier(STATUS);
MySqlShowJobStatusStatement stmt = new MySqlShowJobStatusStatement();
stmt.setSync(true);
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
stmt.setWhere(this.exprParser.expr());
}
return stmt;
}
if (lexer.identifierEquals("JOB")) {
lexer.nextToken();
acceptIdentifier(STATUS);
MySqlShowJobStatusStatement stmt = new MySqlShowJobStatusStatement();
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
stmt.setWhere(this.exprParser.expr());
}
return stmt;
}
if (lexer.identifierEquals("MIGRATE")) {
lexer.nextToken();
acceptIdentifier("TASK");
acceptIdentifier(STATUS);
MySqlShowMigrateTaskStatusStatement stmt = new MySqlShowMigrateTaskStatusStatement();
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
stmt.setWhere(this.exprParser.expr());
}
return stmt;
}
if (lexer.identifierEquals(FnvHash.Constants.CHARSET)) {
lexer.nextToken();
MySqlShowCharacterSetStatement stmt = new MySqlShowCharacterSetStatement();
if (lexer.token() == Token.LIKE) {
lexer.nextTokenValue();
stmt.setPattern(this.exprParser.expr());
}
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
stmt.setWhere(this.exprParser.expr());
}
return stmt;
}
if (lexer.identifierEquals(FnvHash.Constants.CHARACTER)) {
lexer.nextToken();
accept(Token.SET);
MySqlShowCharacterSetStatement stmt = new MySqlShowCharacterSetStatement();
if (lexer.token() == Token.LIKE) {
lexer.nextTokenValue();
stmt.setPattern(this.exprParser.expr());
}
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
stmt.setWhere(this.exprParser.expr());
}
return stmt;
}
if (lexer.identifierEquals("COLLATION")) {
lexer.nextToken();
MySqlShowCollationStatement stmt = new MySqlShowCollationStatement();
if (lexer.token() == Token.LIKE) {
lexer.nextTokenValue();
stmt.setPattern(this.exprParser.expr());
}
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
stmt.setWhere(this.exprParser.expr());
}
return stmt;
}
if (lexer.identifierEquals(BINLOG)) {
lexer.nextToken();
acceptIdentifier(EVENTS);
MySqlShowBinLogEventsStatement stmt = new MySqlShowBinLogEventsStatement();
if (lexer.token() == Token.IN) {
lexer.nextToken();
stmt.setIn(this.exprParser.expr());
}
if (lexer.token() == Token.FROM) {
lexer.nextToken();
stmt.setFrom(this.exprParser.expr());
}
stmt.setLimit(this.exprParser.parseLimit());
return stmt;
}
if (lexer.identifierEquals("CONTRIBUTORS")) {
lexer.nextToken();
return new MySqlShowContributorsStatement();
}
if (lexer.token() == Token.ALL) {
lexer.nextToken();
accept(Token.CREATE);
accept(TABLE);
SQLShowCreateTableStatement stmt = new SQLShowCreateTableStatement();
stmt.setAll(true);
stmt.setName(this.exprParser.name());
return stmt;
}
if (lexer.token() == Token.CREATE) {
lexer.nextToken();
if (lexer.token() == Token.DATABASE || lexer.token() == Token.SCHEMA) {
lexer.nextToken();
MySqlShowCreateDatabaseStatement stmt = new MySqlShowCreateDatabaseStatement();
if (lexer.token() == Token.IF) {
lexer.nextToken();
accept(Token.NOT);
accept(Token.EXISTS);
stmt.setIfNotExists(true);
}
stmt.setDatabase(this.exprParser.name());
return stmt;
}
if (lexer.identifierEquals("EVENT")) {
lexer.nextToken();
MySqlShowCreateEventStatement stmt = new MySqlShowCreateEventStatement();
stmt.setEventName(this.exprParser.name());
return stmt;
}
if (lexer.token() == Token.FUNCTION) {
lexer.nextToken();
MySqlShowCreateFunctionStatement stmt = new MySqlShowCreateFunctionStatement();
stmt.setName(this.exprParser.name());
return stmt;
}
if (lexer.token() == Token.PROCEDURE) {
lexer.nextToken();
MySqlShowCreateProcedureStatement stmt = new MySqlShowCreateProcedureStatement();
stmt.setName(this.exprParser.name());
return stmt;
}
if (lexer.token() == TABLE) {
lexer.nextToken();
SQLShowCreateTableStatement stmt = new SQLShowCreateTableStatement();
if (lexer.token() != Token.LIKE) {
stmt.setName(this.exprParser.name());
}
if (lexer.token() == Token.LIKE) {
lexer.nextToken();
if (lexer.identifierEquals(FnvHash.Constants.MAPPING)) {
lexer.nextToken();
accept(Token.LPAREN);
SQLName name = this.exprParser.name();
stmt.setLikeMapping(name);
accept(Token.RPAREN);
}
}
return stmt;
}
if (lexer.token() == Token.VIEW) {
lexer.nextToken();
SQLShowCreateViewStatement stmt = new SQLShowCreateViewStatement();
stmt.setName(this.exprParser.name());
return stmt;
}
if (lexer.token() == Token.TRIGGER) {
lexer.nextToken();
MySqlShowCreateTriggerStatement stmt = new MySqlShowCreateTriggerStatement();
stmt.setName(this.exprParser.name());
return stmt;
}
if (lexer.token() == Token.FULLTEXT) {
lexer.nextToken();
MysqlShowCreateFullTextStatement stmt = new MysqlShowCreateFullTextStatement();
stmt.setType(parseFullTextType());
stmt.setName(this.exprParser.name());
return stmt;
}
if (lexer.identifierEquals("MATERIALIZED")) {
lexer.nextToken();
SQLShowCreateMaterializedViewStatement stmt = new SQLShowCreateMaterializedViewStatement();
accept(VIEW);
stmt.setName(this.exprParser.name());
return stmt;
}
throw new ParserException("TODO " + lexer.info());
}
if (lexer.identifierEquals(ENGINE)) {
lexer.nextToken();
MySqlShowEngineStatement stmt = new MySqlShowEngineStatement();
stmt.setName(this.exprParser.name());
stmt.setOption(MySqlShowEngineStatement.Option.valueOf(lexer.stringVal().toUpperCase()));
lexer.nextToken();
return stmt;
}
if (lexer.token() == Token.DATABASE || lexer.identifierEquals(FnvHash.Constants.DB)) {
lexer.nextToken();
MySqlShowDatabaseStatusStatement stmt = new MySqlShowDatabaseStatusStatement();
if (full) {
stmt.setFull(true);
}
if (lexer.identifierEquals("STATUS")) {
lexer.nextToken();
if (lexer.token() == Token.LIKE) {
lexer.nextTokenValue();
stmt.setName(this.exprParser.name());
} else {
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
SQLExpr where = exprParser.expr();
stmt.setWhere(where);
}
if (lexer.token() == Token.ORDER) {
SQLOrderBy orderBy = exprParser.parseOrderBy();
stmt.setOrderBy(orderBy);
}
if (lexer.token() == Token.LIMIT) {
SQLLimit limit = exprParser.parseLimit();
stmt.setLimit(limit);
}
}
}
return stmt;
}
if (lexer.identifierEquals("STORAGE")) {
lexer.nextToken();
acceptIdentifier(ENGINES);
MySqlShowEnginesStatement stmt = new MySqlShowEnginesStatement();
stmt.setStorage(true);
return stmt;
}
if (lexer.identifierEquals(ENGINES)) {
lexer.nextToken();
MySqlShowEnginesStatement stmt = new MySqlShowEnginesStatement();
return stmt;
}
if (lexer.identifierEquals(EVENTS)) {
lexer.nextToken();
MySqlShowEventsStatement stmt = new MySqlShowEventsStatement();
if (lexer.token() == Token.FROM || lexer.token() == Token.IN) {
lexer.nextToken();
stmt.setSchema(this.exprParser.name());
}
if (lexer.token() == Token.LIKE) {
lexer.nextTokenValue();
stmt.setLike(this.exprParser.expr());
}
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
stmt.setWhere(this.exprParser.expr());
}
return stmt;
}
if (lexer.token() == Token.FUNCTION) {
lexer.nextToken();
if (lexer.identifierEquals("CODE")) {
lexer.nextToken();
MySqlShowFunctionCodeStatement stmt = new MySqlShowFunctionCodeStatement();
stmt.setName(this.exprParser.name());
return stmt;
}
acceptIdentifier(STATUS);
MySqlShowFunctionStatusStatement stmt = new MySqlShowFunctionStatusStatement();
if (lexer.token() == Token.LIKE) {
lexer.nextTokenValue();
stmt.setLike(this.exprParser.expr());
}
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
stmt.setWhere(this.exprParser.expr());
}
return stmt;
}
// MySqlShowFunctionStatusStatement
if (lexer.identifierEquals(ENGINE)) {
lexer.nextToken();
MySqlShowEngineStatement stmt = new MySqlShowEngineStatement();
stmt.setName(this.exprParser.name());
stmt.setOption(MySqlShowEngineStatement.Option.valueOf(lexer.stringVal().toUpperCase()));
lexer.nextToken();
return stmt;
}
if (lexer.identifierEquals("STORAGE")) {
lexer.nextToken();
accept(Token.EQ);
accept(Token.DEFAULT);
MySqlShowEnginesStatement stmt = new MySqlShowEnginesStatement();
stmt.setStorage(true);
return stmt;
}
// if (lexer.identifierEquals("KEYS") || lexer.token() == Token.INDEX) {
// lexer.nextToken();
// accept(Token.FROM);
// MySqlShowKeysStatement stmt = new MySqlShowKeysStatement();
// stmt.setTable(exprParser.name());
// return stmt;
// }
if (lexer.identifierEquals("GRANTS")) {
lexer.nextToken();
MySqlShowGrantsStatement stmt = new MySqlShowGrantsStatement();
if (lexer.token() == Token.FOR) {
lexer.nextToken();
stmt.setUser(this.exprParser.expr());
}
if (lexer.token() == Token.ON) {
lexer.nextToken();
SQLExpr on = this.exprParser.expr();
stmt.setOn(on);
}
return stmt;
}
if (lexer.token() == INDEX || lexer.identifierEquals("INDEXES") || lexer.identifierEquals("KEYS")) {
SQLShowIndexesStatement stmt = new SQLShowIndexesStatement();
stmt.setType(lexer.stringVal());
lexer.nextToken();
if (lexer.token() == Token.FROM || lexer.token() == Token.IN) {
lexer.nextToken();
SQLName table = exprParser.name();
stmt.setTable(table);
if (lexer.token() == Token.FROM || lexer.token() == Token.IN) {
lexer.nextToken();
SQLName database = exprParser.name();
stmt.setDatabase(database.toString());
}
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
SQLExpr where = exprParser.expr();
stmt.setWhere(where);
}
}
if (lexer.token() == Token.HINT) {
stmt.setHints(this.exprParser.parseHints());
}
return stmt;
}
if (lexer.token() == Token.OPEN || lexer.identifierEquals("OPEN")) {
lexer.nextToken();
acceptIdentifier(TABLES);
MySqlShowOpenTablesStatement stmt = new MySqlShowOpenTablesStatement();
if (lexer.token() == Token.FROM || lexer.token() == Token.IN) {
lexer.nextToken();
stmt.setDatabase(this.exprParser.name());
}
if (lexer.token() == Token.LIKE) {
lexer.nextTokenValue();
stmt.setLike(this.exprParser.expr());
}
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
stmt.setWhere(this.exprParser.expr());
}
return stmt;
}
if (lexer.identifierEquals("PLUGINS")) {
lexer.nextToken();
MySqlShowPluginsStatement stmt = new MySqlShowPluginsStatement();
return stmt;
}
if (lexer.identifierEquals("HTC")) {
lexer.nextToken();
MysqlShowHtcStatement stmt = new MysqlShowHtcStatement();
stmt.setFull(false);
return stmt;
}
if (lexer.identifierEquals("HMSMETA")) {
lexer.nextToken();
SQLName name = this.exprParser.name();
MySqlShowHMSMetaStatement stmt = new MySqlShowHMSMetaStatement();
stmt.setName(name);
return stmt;
}
if (lexer.identifierEquals("STC")) {
lexer.nextToken();
MysqlShowStcStatement stmt = new MysqlShowStcStatement();
if (lexer.identifierEquals("HIS")) {
lexer.nextToken();
stmt.setHis(true);
} else {
stmt.setHis(false);
}
return stmt;
}
if (lexer.identifierEquals("PRIVILEGES")) {
lexer.nextToken();
MySqlShowPrivilegesStatement stmt = new MySqlShowPrivilegesStatement();
return stmt;
}
if (lexer.token() == Token.PROCEDURE) {
lexer.nextToken();
if (lexer.identifierEquals("CODE")) {
lexer.nextToken();
MySqlShowProcedureCodeStatement stmt = new MySqlShowProcedureCodeStatement();
stmt.setName(this.exprParser.name());
return stmt;
}
acceptIdentifier(STATUS);
MySqlShowProcedureStatusStatement stmt = new MySqlShowProcedureStatusStatement();
if (lexer.token() == Token.LIKE) {
lexer.nextTokenValue();
stmt.setLike(this.exprParser.expr());
}
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
stmt.setWhere(this.exprParser.expr());
}
return stmt;
}
if (lexer.identifierEquals("PROFILES")) {
lexer.nextToken();
MySqlShowProfilesStatement stmt = new MySqlShowProfilesStatement();
return stmt;
}
if (lexer.identifierEquals("PROFILE")) {
lexer.nextToken();
MySqlShowProfileStatement stmt = new MySqlShowProfileStatement();
for (; ; ) {
if (lexer.token() == Token.ALL) {
stmt.getTypes().add(MySqlShowProfileStatement.Type.ALL);
lexer.nextToken();
} else if (lexer.identifierEquals("BLOCK")) {
lexer.nextToken();
acceptIdentifier("IO");
stmt.getTypes().add(MySqlShowProfileStatement.Type.BLOCK_IO);
} else if (lexer.identifierEquals("CONTEXT")) {
lexer.nextToken();
acceptIdentifier("SWITCHES");
stmt.getTypes().add(MySqlShowProfileStatement.Type.CONTEXT_SWITCHES);
} else if (lexer.identifierEquals("CPU")) {
lexer.nextToken();
stmt.getTypes().add(MySqlShowProfileStatement.Type.CPU);
} else if (lexer.identifierEquals("IPC")) {
lexer.nextToken();
stmt.getTypes().add(MySqlShowProfileStatement.Type.IPC);
} else if (lexer.identifierEquals("MEMORY")) {
lexer.nextToken();
stmt.getTypes().add(MySqlShowProfileStatement.Type.MEMORY);
} else if (lexer.identifierEquals("PAGE")) {
lexer.nextToken();
acceptIdentifier("FAULTS");
stmt.getTypes().add(MySqlShowProfileStatement.Type.PAGE_FAULTS);
} else if (lexer.identifierEquals("SOURCE")) {
lexer.nextToken();
stmt.getTypes().add(MySqlShowProfileStatement.Type.SOURCE);
} else if (lexer.identifierEquals("SWAPS")) {
lexer.nextToken();
stmt.getTypes().add(MySqlShowProfileStatement.Type.SWAPS);
} else {
break;
}
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
}
break;
}
if (lexer.token() == Token.FOR) {
lexer.nextToken();
acceptIdentifier("QUERY");
stmt.setForQuery(this.exprParser.primary());
}
stmt.setLimit(this.exprParser.parseLimit());
return stmt;
}
if (lexer.identifierEquals("RELAYLOG")) {
lexer.nextToken();
acceptIdentifier(EVENTS);
MySqlShowRelayLogEventsStatement stmt = new MySqlShowRelayLogEventsStatement();
if (lexer.token() == Token.IN) {
lexer.nextToken();
stmt.setLogName(this.exprParser.primary());
}
if (lexer.token() == Token.FROM) {
lexer.nextToken();
stmt.setFrom(this.exprParser.primary());
}
stmt.setLimit(this.exprParser.parseLimit());
return stmt;
}
if (lexer.identifierEquals("RELAYLOG")) {
lexer.nextToken();
acceptIdentifier(EVENTS);
MySqlShowRelayLogEventsStatement stmt = new MySqlShowRelayLogEventsStatement();
if (lexer.token() == Token.IN) {
lexer.nextToken();
stmt.setLogName(this.exprParser.primary());
}
if (lexer.token() == Token.FROM) {
lexer.nextToken();
stmt.setFrom(this.exprParser.primary());
}
stmt.setLimit(this.exprParser.parseLimit());
return stmt;
}
if (lexer.identifierEquals("SLAVE")) {
lexer.nextToken();
if (lexer.identifierEquals(STATUS)) {
lexer.nextToken();
return new MySqlShowSlaveStatusStatement();
} else {
acceptIdentifier("HOSTS");
MySqlShowSlaveHostsStatement stmt = new MySqlShowSlaveHostsStatement();
return stmt;
}
}
if (lexer.token() == TABLE) {
lexer.nextToken();
acceptIdentifier(STATUS);
MySqlShowTableStatusStatement stmt = new MySqlShowTableStatusStatement();
if (lexer.token() == Token.FROM || lexer.token() == Token.IN) {
lexer.nextToken();
SQLName name = this.exprParser.name();
if (name instanceof SQLPropertyExpr) {
stmt.setDatabase((SQLIdentifierExpr) ((SQLPropertyExpr) name).getOwner());
stmt.setTableGroup(new SQLIdentifierExpr(((SQLPropertyExpr) name).getName()));
} else {
stmt.setDatabase(name);
}
}
if (lexer.token() == Token.LIKE) {
lexer.nextTokenValue();
stmt.setLike(this.exprParser.expr());
}
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
stmt.setWhere(this.exprParser.expr());
}
return stmt;
}
if (lexer.identifierEquals("TRIGGERS")) {
lexer.nextToken();
MySqlShowTriggersStatement stmt = new MySqlShowTriggersStatement();
if (lexer.token() == Token.FROM || lexer.token() == Token.IN) {
lexer.nextToken();
SQLName database = exprParser.name();
stmt.setDatabase(database);
}
if (lexer.token() == Token.LIKE) {
lexer.nextTokenValue();
SQLExpr like = exprParser.expr();
stmt.setLike(like);
}
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
SQLExpr where = exprParser.expr();
stmt.setWhere(where);
}
return stmt;
}
if (lexer.identifierEquals(FnvHash.Constants.BROADCASTS)) {
lexer.nextToken();
MySqlShowBroadcastsStatement stmt = new MySqlShowBroadcastsStatement();
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
SQLExpr where = exprParser.expr();
stmt.setWhere(where);
}
if (lexer.token() == Token.ORDER) {
SQLOrderBy orderBy = exprParser.parseOrderBy();
stmt.setOrderBy(orderBy);
}
if (lexer.token() == Token.LIMIT) {
SQLLimit limit = exprParser.parseLimit();
stmt.setLimit(limit);
}
return stmt;
}
if (lexer.identifierEquals(FnvHash.Constants.DATASOURCES)) {
lexer.nextToken();
MySqlShowDatasourcesStatement stmt = new MySqlShowDatasourcesStatement();
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
SQLExpr where = exprParser.expr();
stmt.setWhere(where);
}
if (lexer.token() == Token.ORDER) {
SQLOrderBy orderBy = exprParser.parseOrderBy();
stmt.setOrderBy(orderBy);
}
if (lexer.token() == Token.LIMIT) {
SQLLimit limit = exprParser.parseLimit();
stmt.setLimit(limit);
}
return stmt;
}
if (lexer.identifierEquals(FnvHash.Constants.NODE)) {
lexer.nextToken();
MySqlShowNodeStatement stmt = new MySqlShowNodeStatement();
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
SQLExpr where = exprParser.expr();
stmt.setWhere(where);
}
if (lexer.token() == Token.ORDER) {
SQLOrderBy orderBy = exprParser.parseOrderBy();
stmt.setOrderBy(orderBy);
}
if (lexer.token() == Token.LIMIT) {
SQLLimit limit = exprParser.parseLimit();
stmt.setLimit(limit);
}
return stmt;
}
if (lexer.identifierEquals(FnvHash.Constants.HELP)) {
lexer.nextToken();
MySqlShowHelpStatement stmt = new MySqlShowHelpStatement();
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
SQLExpr where = exprParser.expr();
stmt.setWhere(where);
}
if (lexer.token() == Token.ORDER) {
SQLOrderBy orderBy = exprParser.parseOrderBy();
stmt.setOrderBy(orderBy);
}
if (lexer.token() == Token.LIMIT) {
SQLLimit limit = exprParser.parseLimit();
stmt.setLimit(limit);
}
return stmt;
}
if (lexer.token() == Token.SEQUENCE || lexer.identifierEquals(FnvHash.Constants.SEQUENCES)) {
lexer.nextToken();
MySqlShowSequencesStatement stmt = new MySqlShowSequencesStatement();
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
SQLExpr where = exprParser.expr();
stmt.setWhere(where);
}
if (lexer.token() == Token.ORDER) {
SQLOrderBy orderBy = exprParser.parseOrderBy();
stmt.setOrderBy(orderBy);
}
if (lexer.token() == Token.LIMIT) {
SQLLimit limit = exprParser.parseLimit();
stmt.setLimit(limit);
}
return stmt;
}
if (lexer.identifierEquals("PARTITIONS")) {
lexer.nextToken();
SQLShowPartitionsStmt stmt = new SQLShowPartitionsStmt();
if (lexer.token() == Token.FROM) {
lexer.nextToken();
}
SQLName name = exprParser.name();
stmt.setTableSource(name);
if (lexer.token() == Token.PARTITION) {
lexer.nextToken();
accept(Token.LPAREN);
parseAssignItems(stmt.getPartition(), stmt, false);
accept(Token.RPAREN);
}
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
stmt.setWhere(
this.exprParser.expr()
);
}
return stmt;
}
if (lexer.identifierEquals("RULE")) {
lexer.nextToken();
boolean version = false;
if (lexer.identifierEquals(FnvHash.Constants.VERSION)) {
version = true;
lexer.nextToken();
} else if (lexer.identifierEquals(FnvHash.Constants.FULL) || lexer.token() == Token.FULL) {
full = true;
lexer.nextToken();
}
if (lexer.identifierEquals(FnvHash.Constants.STATUS)) {
lexer.nextToken();
MySqlShowRuleStatusStatement stmt = new MySqlShowRuleStatusStatement();
if (full) {
stmt.setFull(full);
}
if (version) {
stmt.setVersion(true);
}
if (lexer.token() == Token.FROM) {
lexer.nextToken();
}
if (full) {
stmt.setLite(false);
}
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
SQLExpr where = exprParser.expr();
stmt.setWhere(where);
}
if (lexer.token() == Token.ORDER) {
SQLOrderBy orderBy = exprParser.parseOrderBy();
stmt.setOrderBy(orderBy);
}
if (lexer.token() == Token.LIMIT) {
SQLLimit limit = exprParser.parseLimit();
stmt.setLimit(limit);
}
return stmt;
} else {
MySqlShowRuleStatement stmt = new MySqlShowRuleStatement();
if (full) {
stmt.setFull(full);
}
if (version) {
stmt.setVersion(true);
}
if (lexer.identifierEquals(FnvHash.Constants.VERSION)) {
lexer.nextToken();
stmt.setVersion(true);
}
if (lexer.token() == Token.EOF || lexer.token() == SEMI) {
return stmt;
}
if (lexer.token() == Token.FROM) {
lexer.nextToken();
stmt.setName(exprParser.name());
}
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
SQLExpr where = exprParser.expr();
stmt.setWhere(where);
}
if (lexer.token() == Token.ORDER) {
SQLOrderBy orderBy = exprParser.parseOrderBy();
stmt.setOrderBy(orderBy);
}
if (lexer.token() == Token.LIMIT) {
SQLLimit limit = exprParser.parseLimit();
stmt.setLimit(limit);
}
return stmt;
}
}
if (lexer.identifierEquals("DS")) {
lexer.nextToken();
MySqlShowDsStatement stmt = new MySqlShowDsStatement();
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
SQLExpr where = exprParser.expr();
stmt.setWhere(where);
}
if (lexer.token() == Token.ORDER) {
SQLOrderBy orderBy = exprParser.parseOrderBy();
stmt.setOrderBy(orderBy);
}
if (lexer.token() == Token.LIMIT) {
SQLLimit limit = exprParser.parseLimit();
stmt.setLimit(limit);
}
return stmt;
}
if (lexer.identifierEquals("DDL")) {
lexer.nextToken();
// DRDS async DDL.
if (isEnabled(SQLParserFeature.DRDSAsyncDDL) && !lexer.identifierEquals("STATUS")) {
// SHOW [FULL] DDL.
DrdsShowDDLJobs showDDLJobs = new DrdsShowDDLJobs();
showDDLJobs.setFull(full);
while (lexer.token() != Token.EOF && lexer.token() != SEMI) {
showDDLJobs.addJobId(lexer.integerValue().longValue());
accept(Token.LITERAL_INT);
if (Token.COMMA == lexer.token()) {
lexer.nextToken();
} else if (lexer.token() == Token.EOF || lexer.token() == SEMI) {
break;
} else {
throw new ParserException("syntax error, expect job id, actual " + lexer.token() + ", " + lexer.info());
}
}
return showDDLJobs;
}
acceptIdentifier("STATUS");
MySqlShowDdlStatusStatement stmt = new MySqlShowDdlStatusStatement();
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
SQLExpr where = exprParser.expr();
stmt.setWhere(where);
}
if (lexer.token() == Token.ORDER) {
SQLOrderBy orderBy = exprParser.parseOrderBy();
stmt.setOrderBy(orderBy);
}
if (lexer.token() == Token.LIMIT) {
SQLLimit limit = exprParser.parseLimit();
stmt.setLimit(limit);
}
return stmt;
}
if (lexer.identifierEquals("TRACE")) {
lexer.nextToken();
MySqlShowTraceStatement stmt = new MySqlShowTraceStatement();
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
SQLExpr where = exprParser.expr();
stmt.setWhere(where);
}
if (lexer.token() == Token.ORDER) {
SQLOrderBy orderBy = exprParser.parseOrderBy();
stmt.setOrderBy(orderBy);
}
if (lexer.token() == Token.LIMIT) {
SQLLimit limit = exprParser.parseLimit();
stmt.setLimit(limit);
}
return stmt;
}
if (lexer.identifierEquals("TOPOLOGY")) {
lexer.nextToken();
MySqlShowTopologyStatement stmt = new MySqlShowTopologyStatement();
if (lexer.token() == Token.FROM) {
lexer.nextToken();
}
stmt.setName(exprParser.name());
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
SQLExpr where = exprParser.expr();
stmt.setWhere(where);
}
if (lexer.token() == Token.ORDER) {
SQLOrderBy orderBy = exprParser.parseOrderBy();
stmt.setOrderBy(orderBy);
}
if (lexer.token() == Token.LIMIT) {
SQLLimit limit = exprParser.parseLimit();
stmt.setLimit(limit);
}
stmt.setFull(full);
return stmt;
}
if (lexer.identifierEquals(FnvHash.Constants.PLANCACHE)) {
lexer.nextToken();
if (lexer.identifierEquals(FnvHash.Constants.STATUS)) {
lexer.nextToken();
return new MySqlShowPlanCacheStatusStatement();
} else if (lexer.identifierEquals(FnvHash.Constants.PLAN)) {
lexer.nextToken();
SQLSelect select = this.createSQLSelectParser().select();
return new MySqlShowPlanCacheStatement(select);
} else {
throw new ParserException("TODO " + lexer.info());
}
}
if (lexer.identifierEquals(FnvHash.Constants.SLOW)) {
MySqlShowSlowStatement stmt = parserShowSlow();
stmt.setPhysical(false);
stmt.setFull(full);
return stmt;
}
if (lexer.identifierEquals("PHYSICAL_SLOW")) {
MySqlShowSlowStatement stmt = parserShowSlow();
stmt.setPhysical(true);
stmt.setFull(full);
return stmt;
}
if (lexer.identifierEquals(FnvHash.Constants.QUERY_TASK)) {
lexer.nextToken();
SQLShowQueryTaskStatement stmt = new SQLShowQueryTaskStatement();
stmt.setDbType(dbType);
if (lexer.token() == Token.FOR) {
lexer.nextToken();
stmt.setUser(
exprParser.expr()
);
}
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
SQLExpr where = this.exprParser.expr();
stmt.setWhere(where);
}
if (lexer.token() == Token.ORDER) {
SQLOrderBy orderBy = this.exprParser.parseOrderBy();
stmt.setOrderBy(orderBy);
}
if (lexer.token() == Token.LIMIT) {
SQLLimit limit = this.exprParser.parseLimit();
stmt.setLimit(limit);
}
if (full) {
stmt.setFull(true);
}
return stmt;
}
if (lexer.identifierEquals(FnvHash.Constants.OUTLINES)) {
lexer.nextToken();
SQLShowOutlinesStatement stmt = new SQLShowOutlinesStatement();
stmt.setDbType(dbType);
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
SQLExpr where = this.exprParser.expr();
stmt.setWhere(where);
}
if (lexer.token() == Token.ORDER) {
SQLOrderBy orderBy = this.exprParser.parseOrderBy();
stmt.setOrderBy(orderBy);
}
if (lexer.token() == Token.LIMIT) {
SQLLimit limit = this.exprParser.parseLimit();
stmt.setLimit(limit);
}
return stmt;
}
if (lexer.identifierEquals(FnvHash.Constants.RECYCLEBIN)) {
lexer.nextToken();
SQLShowRecylebinStatement stmt = new SQLShowRecylebinStatement();
stmt.setDbType(dbType);
return stmt;
}
if (lexer.identifierEquals(FnvHash.Constants.TABLEGROUPS)) {
lexer.nextToken();
SQLShowTableGroupsStatement stmt = parseShowTableGroups();
return stmt;
}
if (lexer.identifierEquals(FnvHash.Constants.CATALOGS)) {
lexer.nextToken();
SQLShowCatalogsStatement stmt = new SQLShowCatalogsStatement();
if (lexer.token() == Token.LIKE) {
lexer.nextToken();
SQLExpr like = this.exprParser.expr();
stmt.setLike(like);
}
return stmt;
}
if (lexer.identifierEquals(FnvHash.Constants.FUNCTIONS)) {
lexer.nextToken();
SQLShowFunctionsStatement stmt = new SQLShowFunctionsStatement();
if (lexer.token() == Token.LIKE) {
lexer.nextToken();
SQLExpr like = this.exprParser.expr();
stmt.setLike(like);
}
return stmt;
}
if (lexer.identifierEquals(FnvHash.Constants.SCHEMAS)) {
lexer.nextToken();
SQLShowDatabasesStatement stmt = new SQLShowDatabasesStatement();
stmt.setPhysical(isPhysical);
if (lexer.token() == Token.IN || lexer.token() == Token.FROM) {
lexer.nextToken();
SQLName db = this.exprParser.name();
stmt.setDatabase(db);
}
if (full) {
stmt.setFull(true);
}
if (lexer.token() == Token.LIKE) {
lexer.nextToken();
SQLExpr like = this.exprParser.expr();
stmt.setLike(like);
}
return stmt;
}
if (lexer.identifierEquals(FnvHash.Constants.CONFIG)) {
lexer.nextToken();
SQLName name = this.exprParser.name();
MySqlShowConfigStatement stmt = new MySqlShowConfigStatement();
stmt.setName(name);
return stmt;
}
if (lexer.identifierEquals(FnvHash.Constants.USERS)) {
lexer.nextToken();
SQLShowUsersStatement stmt = new SQLShowUsersStatement();
stmt.setDbType(dbType);
return stmt;
}
if (lexer.identifierEquals(FnvHash.Constants.PHYSICAL_PROCESSLIST)) {
lexer.nextToken();
MySqlShowPhysicalProcesslistStatement stmt = new MySqlShowPhysicalProcesslistStatement();
if (full) {
stmt.setFull(full);
}
return stmt;
}
if (lexer.identifierEquals("MATERIALIZED")) {
return parseShowMaterializedView();
}
if (lexer.token() == Token.FULLTEXT) {
lexer.nextToken();
MysqlShowFullTextStatement stmt = new MysqlShowFullTextStatement();
if (lexer.identifierEquals(FnvHash.Constants.CHARFILTERS)) {
stmt.setType(FullTextType.CHARFILTER);
} else if (lexer.identifierEquals(FnvHash.Constants.TOKENIZERS)) {
stmt.setType(FullTextType.TOKENIZER);
} else if (lexer.identifierEquals(FnvHash.Constants.TOKENFILTERS)) {
stmt.setType(FullTextType.TOKENFILTER);
} else if (lexer.identifierEquals(FnvHash.Constants.ANALYZERS)) {
stmt.setType(FullTextType.ANALYZER);
} else if (lexer.identifierEquals(FnvHash.Constants.DICTIONARIES)) {
stmt.setType(FullTextType.DICTIONARY);
} else {
throw new ParserException("type of full text must be [CHARFILTERS/TOKENIZERS/TOKENFILTERS/ANALYZERS/DICTIONARYS] .");
}
lexer.nextToken();
return stmt;
}
// DRDS GSI management syntax.
if (isEnabled(SQLParserFeature.DRDSAsyncDDL) && lexer.identifierEquals("METADATA")) {
lexer.nextToken();
if (Token.LOCK == lexer.token() || lexer.identifierEquals("LOCKS")) {
lexer.nextToken();
DrdsShowMetadataLock stmt = new DrdsShowMetadataLock();
if (SEMI == lexer.token() || Token.EOF == lexer.token()) {
return stmt;
} else {
stmt.setSchemaName(this.exprParser.name());
return stmt;
}
} else {
throw new ParserException("syntax error, expect LOCK/LOCKS, actual " + lexer.token() + ", " + lexer.info());
}
}
// MySqlShowSlaveHostsStatement
throw new ParserException("TODO " + lexer.info());
}