/** * Alipay.com Inc. * Copyright (c) 2004-2012 All Rights Reserved. */ package com.alipay.zdal.parser.sql.dialect.mysql.parser; import java.util.List; import com.alipay.zdal.parser.sql.ast.SQLCommentHint; import com.alipay.zdal.parser.sql.ast.SQLExpr; import com.alipay.zdal.parser.sql.ast.SQLName; import com.alipay.zdal.parser.sql.ast.SQLOrderBy; import com.alipay.zdal.parser.sql.ast.SQLStatement; import com.alipay.zdal.parser.sql.ast.expr.SQLCharExpr; import com.alipay.zdal.parser.sql.ast.expr.SQLLiteralExpr; import com.alipay.zdal.parser.sql.ast.expr.SQLQueryExpr; import com.alipay.zdal.parser.sql.ast.expr.SQLVariantRefExpr; import com.alipay.zdal.parser.sql.ast.statement.SQLAlterTableDropColumnItem; import com.alipay.zdal.parser.sql.ast.statement.SQLColumnDefinition; import com.alipay.zdal.parser.sql.ast.statement.SQLCreateDatabaseStatement; import com.alipay.zdal.parser.sql.ast.statement.SQLCreateTableStatement; import com.alipay.zdal.parser.sql.ast.statement.SQLDropTableStatement; import com.alipay.zdal.parser.sql.ast.statement.SQLDropViewStatement; import com.alipay.zdal.parser.sql.ast.statement.SQLInsertStatement; import com.alipay.zdal.parser.sql.ast.statement.SQLSelect; import com.alipay.zdal.parser.sql.ast.statement.SQLSelectOrderByItem; import com.alipay.zdal.parser.sql.ast.statement.SQLSelectStatement; import com.alipay.zdal.parser.sql.ast.statement.SQLSetStatement; import com.alipay.zdal.parser.sql.ast.statement.SQLTableSource; import com.alipay.zdal.parser.sql.ast.statement.SQLUpdateSetItem; import com.alipay.zdal.parser.sql.ast.statement.SQLUpdateStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.CobarShowStatus; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlAlterTableAddColumn; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlAlterTableAddIndex; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlAlterTableAddUnique; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlAlterTableStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlCommitStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlCreateIndexStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlDescribeStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlDropTableStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlDropUser; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlDropViewStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlExecuteStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlHelpStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlInsertStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlKillStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlLockTableStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlLockTableStatement.LockType; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlPrepareStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlReplicateStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlResetStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlRollbackStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlSetCharSetStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlSetNamesStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlSetTransactionIsolationLevelStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowAuthorsStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowBinLogEventsStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowBinaryLogsStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowCharacterSetStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowCollationStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowColumnsStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowContributorsStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowCreateDatabaseStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowCreateEventStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowCreateFunctionStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowCreateProcedureStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowCreateTableStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowCreateTriggerStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowCreateViewStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowDatabasesStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowEngineStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowEnginesStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowErrorsStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowEventsStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowFunctionCodeStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowFunctionStatusStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowGrantsStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowIndexesStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowKeysStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowMasterLogsStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowMasterStatusStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowOpenTablesStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowPluginsStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowPrivilegesStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowProcedureCodeStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowProcedureStatusStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowProcessListStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowProfileStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowProfilesStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowRelayLogEventsStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowSlaveHostsStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowSlaveStatusStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowStatusStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowTableStatusStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowTablesStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowTriggersStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlStartTransactionStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlUnlockTablesStatement; import com.alipay.zdal.parser.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; import com.alipay.zdal.parser.sql.parser.Lexer; import com.alipay.zdal.parser.sql.parser.ParserException; import com.alipay.zdal.parser.sql.parser.SQLSelectParser; import com.alipay.zdal.parser.sql.parser.SQLStatementParser; import com.alipay.zdal.parser.sql.parser.Token; /** * * @author ���� * @version $Id: MySqlStatementParser.java, v 0.1 2012-11-17 ����3:40:25 Exp $ */ public class MySqlStatementParser extends SQLStatementParser { public MySqlStatementParser(String sql) throws ParserException { super(new MySqlExprParser(sql)); } public MySqlStatementParser(Lexer lexer) { super(new MySqlExprParser(lexer)); } public SQLCreateTableStatement parseCreateTable() throws ParserException { MySqlCreateTableParser parser = new MySqlCreateTableParser(this.exprParser); return parser.parseCrateTable(); } public SQLSelectStatement parseSelect() throws ParserException { return new SQLSelectStatement(new MySqlSelectParser(this.exprParser).select()); } public SQLUpdateStatement parseUpdateStatement() throws ParserException { MySqlUpdateStatement stmt = createUpdateStatement(); if (lexer.token() == Token.UPDATE) { lexer.nextToken(); if (identifierEquals("LOW_PRIORITY")) { lexer.nextToken(); stmt.setLowPriority(true); } if (identifierEquals("IGNORE")) { lexer.nextToken(); stmt.setIgnore(true); } SQLTableSource tableSource = this.exprParser.createSelectParser().parseTableSource(); stmt.setTableSource(tableSource); } accept(Token.SET); for (;;) { SQLUpdateSetItem item = new SQLUpdateSetItem(); item.setColumn(this.exprParser.name()); if (lexer.token() == Token.EQ) { lexer.nextToken(); } else { accept(Token.COLONEQ); } item.setValue(this.exprParser.expr()); stmt.getItems().add(item); if (lexer.token() == (Token.COMMA)) { lexer.nextToken(); continue; } break; } if (lexer.token() == (Token.WHERE)) { lexer.nextToken(); stmt.setWhere(this.exprParser.expr()); } stmt.setOrderBy(this.exprParser.parseOrderBy()); stmt.setLimit(parseLimit()); return stmt; } protected MySqlUpdateStatement createUpdateStatement() { return new MySqlUpdateStatement(); } public MySqlDeleteStatement parseDeleteStatement() throws ParserException { MySqlDeleteStatement deleteStatement = new MySqlDeleteStatement(); if (lexer.token() == Token.DELETE) { lexer.nextToken(); if (identifierEquals("LOW_PRIORITY")) { deleteStatement.setLowPriority(true); lexer.nextToken(); } if (identifierEquals("QUICK")) { deleteStatement.setQuick(true); lexer.nextToken(); } if (identifierEquals("IGNORE")) { deleteStatement.setIgnore(true); lexer.nextToken(); } if (lexer.token() == Token.IDENTIFIER) { deleteStatement.setTableSource(createSQLSelectParser().parseTableSource()); if (lexer.token() == Token.FROM) { lexer.nextToken(); SQLTableSource tableSource = createSQLSelectParser().parseTableSource(); deleteStatement.setFrom(tableSource); } } else { if (lexer.token() == Token.FROM) { lexer.nextToken(); deleteStatement.setTableSource(createSQLSelectParser().parseTableSource()); } } if (identifierEquals("USING")) { lexer.nextToken(); SQLTableSource tableSource = createSQLSelectParser().parseTableSource(); deleteStatement.setUsing(tableSource); } } if (lexer.token() == (Token.WHERE)) { lexer.nextToken(); SQLExpr where = this.exprParser.expr(); deleteStatement.setWhere(where); } if (lexer.token() == (Token.ORDER)) { SQLOrderBy orderBy = exprParser.parseOrderBy(); deleteStatement.setOrderBy(orderBy); } deleteStatement.setLimit(parseLimit()); return deleteStatement; } public SQLStatement parseCreate() throws ParserException { accept(Token.CREATE); List<SQLCommentHint> hints = this.exprParser.parseHints(); if (lexer.token() == Token.TABLE || identifierEquals("TEMPORARY")) { MySqlCreateTableParser parser = new MySqlCreateTableParser(this.exprParser); MySqlCreateTableStatement stmt = parser.parseCrateTable(false); stmt.setHints(hints); return stmt; } if (lexer.token() == Token.DATABASE) { return parseCreateDatabase(); } if (lexer.token() == Token.UNIQUE || lexer.token() == Token.INDEX || identifierEquals("FULLTEXT") || identifierEquals("SPATIAL")) { return parseCreateIndex(); } if (identifierEquals("USER")) { return parseCreateUser(); } throw new ParserException("TODO " + lexer.token()); } public SQLStatement parseCreateIndex() throws ParserException { MySqlCreateIndexStatement stmt = new MySqlCreateIndexStatement(); if (lexer.token() == Token.UNIQUE) { stmt.setType("UNIQUE"); lexer.nextToken(); } else if (identifierEquals("FULLTEXT")) { stmt.setType("FULLTEXT"); lexer.nextToken(); } else if (identifierEquals("SPATIAL")) { stmt.setType("SPATIAL"); lexer.nextToken(); } accept(Token.INDEX); stmt.setName(this.exprParser.name()); parseCreateIndexUsing(stmt); accept(Token.ON); stmt.setTable(this.exprParser.name()); accept(Token.LPAREN); for (;;) { SQLSelectOrderByItem item = this.exprParser.parseSelectOrderByItem(); stmt.getItems().add(item); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; } break; } accept(Token.RPAREN); parseCreateIndexUsing(stmt); return stmt; } private void parseCreateIndexUsing(MySqlCreateIndexStatement stmt) { if (identifierEquals("USING")) { lexer.nextToken(); if (identifierEquals("BTREE")) { stmt.setUsing("BTREE"); lexer.nextToken(); } else if (identifierEquals("HASH")) { stmt.setUsing("HASH"); lexer.nextToken(); } else { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } } } public SQLStatement parseCreateUser() throws ParserException { if (lexer.token() == Token.CREATE) { lexer.nextToken(); } acceptIdentifier("USER"); MySqlCreateUserStatement stmt = new MySqlCreateUserStatement(); for (;;) { MySqlCreateUserStatement.UserSpecification userSpec = new MySqlCreateUserStatement.UserSpecification(); SQLExpr expr = exprParser.primary(); userSpec.setUser(expr); if (lexer.token() == Token.IDENTIFIED) { lexer.nextToken(); if (lexer.token() == Token.BY) { lexer.nextToken(); if (identifierEquals("PASSWORD")) { lexer.nextToken(); } SQLCharExpr password = (SQLCharExpr) this.exprParser.expr(); userSpec.setPassword(password); } else if (lexer.token() == Token.WITH) { lexer.nextToken(); SQLCharExpr text = (SQLCharExpr) this.exprParser.expr(); userSpec.setAuthPlugin(text); } } stmt.getUsers().add(userSpec); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; } break; } return stmt; } public SQLStatement parseKill() { accept(Token.KILL); MySqlKillStatement stmt = new MySqlKillStatement(); if (identifierEquals("CONNECTION")) { stmt.setType(MySqlKillStatement.Type.CONNECTION); lexer.nextToken(); } else if (identifierEquals("QUERY")) { stmt.setType(MySqlKillStatement.Type.QUERY); lexer.nextToken(); } else { throw new ParserException("not support kill type " + lexer.token()); } SQLExpr threadId = this.exprParser.expr(); stmt.setThreadId(threadId); return stmt; } public SQLStatement parseBinlog() { acceptIdentifier("binlog"); MySqlBinlogStatement stmt = new MySqlBinlogStatement(); SQLExpr expr = this.exprParser.expr(); stmt.setExpr(expr); return stmt; } public SQLStatement parseReset() { acceptIdentifier("RESET"); MySqlResetStatement stmt = new MySqlResetStatement(); for (;;) { if (lexer.token() == Token.IDENTIFIER) { if (identifierEquals("QUERY")) { lexer.nextToken(); acceptIdentifier("CACHE"); stmt.getOptions().add("QUERY CACHE"); } else { stmt.getOptions().add(lexer.stringVal()); lexer.nextToken(); } if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; } } break; } return stmt; } public boolean parseStatementListDialect(List<SQLStatement> statementList) { if (lexer.token() == Token.KILL) { SQLStatement stmt = parseKill(); statementList.add(stmt); return true; } if (identifierEquals("PREPARE")) { MySqlPrepareStatement stmt = parsePrepare(); statementList.add(stmt); return true; } if (identifierEquals("EXECUTE")) { MySqlExecuteStatement stmt = parseExecute(); statementList.add(stmt); return true; } if (identifierEquals("LOAD")) { SQLStatement stmt = parseLoad(); statementList.add(stmt); return true; } if (identifierEquals("REPLACE")) { MySqlReplicateStatement stmt = parseReplicate(); statementList.add(stmt); return true; } if (identifierEquals("START")) { MySqlStartTransactionStatement stmt = parseStart(); statementList.add(stmt); return true; } if (identifierEquals("SHOW")) { SQLStatement stmt = parseShow(); statementList.add(stmt); return true; } if (identifierEquals("BINLOG")) { SQLStatement stmt = parseBinlog(); statementList.add(stmt); return true; } if (identifierEquals("RESET")) { SQLStatement stmt = parseReset(); statementList.add(stmt); return true; } if (identifierEquals("HELP")) { lexer.nextToken(); MySqlHelpStatement stmt = new MySqlHelpStatement(); stmt.setContent(this.exprParser.primary()); statementList.add(stmt); return true; } if (identifierEquals("DESC") || identifierEquals("DESCRIBE")) { SQLStatement stmt = parseDescribe(); statementList.add(stmt); return true; } if (lexer.token() == Token.LOCK) { lexer.nextToken(); acceptIdentifier("TABLES"); MySqlLockTableStatement stmt = new MySqlLockTableStatement(); stmt.setTableSource(this.exprParser.name()); if (identifierEquals("READ")) { lexer.nextToken(); if (identifierEquals("LOCAL")) { lexer.nextToken(); stmt.setLockType(LockType.READ_LOCAL); } else { stmt.setLockType(LockType.READ); } } else if (identifierEquals("WRITE")) { stmt.setLockType(LockType.WRITE); } else if (identifierEquals("LOW_PRIORITY")) { lexer.nextToken(); acceptIdentifier("WRITE"); stmt.setLockType(LockType.LOW_PRIORITY_WRITE); } statementList.add(stmt); return true; } if (identifierEquals("UNLOCK")) { lexer.nextToken(); acceptIdentifier("TABLES"); statementList.add(new MySqlUnlockTablesStatement()); return true; } return false; } public MySqlDescribeStatement parseDescribe() throws ParserException { if (lexer.token() == Token.DESC || identifierEquals("DESCRIBE")) { lexer.nextToken(); } else { throw new ParserException("expect DESC, actual " + lexer.token()); } MySqlDescribeStatement stmt = new MySqlDescribeStatement(); stmt.setObject(this.exprParser.name()); return stmt; } public SQLStatement parseShow() throws ParserException { acceptIdentifier("SHOW"); if (lexer.token() == Token.FULL) { lexer.nextToken(); if (identifierEquals("PROCESSLIST")) { lexer.nextToken(); MySqlShowProcessListStatement stmt = new MySqlShowProcessListStatement(); stmt.setFull(true); return stmt; } acceptIdentifier("COLUMNS"); MySqlShowColumnsStatement stmt = parseShowColumns(); stmt.setFull(true); return stmt; } if (identifierEquals("COLUMNS")) { lexer.nextToken(); MySqlShowColumnsStatement stmt = parseShowColumns(); return stmt; } if (identifierEquals("TABLES")) { lexer.nextToken(); MySqlShowTablesStatement stmt = parseShowTabless(); return stmt; } if (identifierEquals("DATABASES")) { lexer.nextToken(); MySqlShowDatabasesStatement stmt = parseShowDatabases(); return stmt; } if (identifierEquals("WARNINGS")) { lexer.nextToken(); MySqlShowWarningsStatement stmt = parseShowWarnings(); return stmt; } if (identifierEquals("COUNT")) { lexer.nextToken(); accept(Token.LPAREN); accept(Token.STAR); accept(Token.RPAREN); if (identifierEquals("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 (identifierEquals("ERRORS")) { lexer.nextToken(); MySqlShowErrorsStatement stmt = new MySqlShowErrorsStatement(); stmt.setLimit(parseLimit()); return stmt; } if (identifierEquals("STATUS")) { lexer.nextToken(); MySqlShowStatusStatement stmt = parseShowStatus(); return stmt; } if (identifierEquals("VARIABLES")) { lexer.nextToken(); MySqlShowVariantsStatement stmt = parseShowVariants(); return stmt; } if (identifierEquals("GLOBAL")) { lexer.nextToken(); if (identifierEquals("STATUS")) { lexer.nextToken(); MySqlShowStatusStatement stmt = parseShowStatus(); stmt.setGlobal(true); return stmt; } if (identifierEquals("VARIABLES")) { lexer.nextToken(); MySqlShowVariantsStatement stmt = parseShowVariants(); stmt.setGlobal(true); return stmt; } } if (identifierEquals("SESSION")) { lexer.nextToken(); if (identifierEquals("STATUS")) { lexer.nextToken(); MySqlShowStatusStatement stmt = parseShowStatus(); stmt.setSession(true); return stmt; } if (identifierEquals("VARIABLES")) { lexer.nextToken(); MySqlShowVariantsStatement stmt = parseShowVariants(); stmt.setSession(true); return stmt; } } if (identifierEquals("COBAR_STATUS")) { lexer.nextToken(); return new CobarShowStatus(); } if (identifierEquals("AUTHORS")) { lexer.nextToken(); return new MySqlShowAuthorsStatement(); } if (identifierEquals("BINARY")) { lexer.nextToken(); acceptIdentifier("LOGS"); return new MySqlShowBinaryLogsStatement(); } if (identifierEquals("MASTER")) { lexer.nextToken(); if (identifierEquals("LOGS")) { lexer.nextToken(); return new MySqlShowMasterLogsStatement(); } acceptIdentifier("STATUS"); return new MySqlShowMasterStatusStatement(); } if (identifierEquals("CHARACTER")) { lexer.nextToken(); accept(Token.SET); MySqlShowCharacterSetStatement stmt = new MySqlShowCharacterSetStatement(); if (lexer.token() == Token.LIKE) { lexer.nextToken(); stmt.setPattern(this.exprParser.expr()); } if (lexer.token() == Token.WHERE) { lexer.nextToken(); stmt.setWhere(this.exprParser.expr()); } return stmt; } if (identifierEquals("COLLATION")) { lexer.nextToken(); MySqlShowCollationStatement stmt = new MySqlShowCollationStatement(); if (lexer.token() == Token.LIKE) { lexer.nextToken(); stmt.setPattern(this.exprParser.expr()); } if (lexer.token() == Token.WHERE) { lexer.nextToken(); stmt.setWhere(this.exprParser.expr()); } return stmt; } if (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(parseLimit()); return stmt; } if (identifierEquals("CONTRIBUTORS")) { lexer.nextToken(); return new MySqlShowContributorsStatement(); } if (lexer.token() == Token.CREATE) { lexer.nextToken(); if (lexer.token() == Token.DATABASE) { lexer.nextToken(); MySqlShowCreateDatabaseStatement stmt = new MySqlShowCreateDatabaseStatement(); stmt.setDatabase(this.exprParser.name()); return stmt; } if (identifierEquals("EVENT")) { lexer.nextToken(); MySqlShowCreateEventStatement stmt = new MySqlShowCreateEventStatement(); stmt.setEventName(this.exprParser.name()); return stmt; } if (identifierEquals("FUNCTION")) { lexer.nextToken(); MySqlShowCreateFunctionStatement stmt = new MySqlShowCreateFunctionStatement(); stmt.setName(this.exprParser.name()); return stmt; } if (identifierEquals("PROCEDURE")) { lexer.nextToken(); MySqlShowCreateProcedureStatement stmt = new MySqlShowCreateProcedureStatement(); stmt.setName(this.exprParser.name()); return stmt; } if (lexer.token() == Token.TABLE) { lexer.nextToken(); MySqlShowCreateTableStatement stmt = new MySqlShowCreateTableStatement(); stmt.setName(this.exprParser.name()); return stmt; } if (lexer.token() == Token.VIEW) { lexer.nextToken(); MySqlShowCreateViewStatement stmt = new MySqlShowCreateViewStatement(); stmt.setName(this.exprParser.name()); return stmt; } if (identifierEquals("TRIGGER")) { lexer.nextToken(); MySqlShowCreateTriggerStatement stmt = new MySqlShowCreateTriggerStatement(); stmt.setName(this.exprParser.name()); return stmt; } throw new ParserException("TODO " + lexer.stringVal()); } if (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 (identifierEquals("STORAGE")) { lexer.nextToken(); acceptIdentifier("ENGINES"); MySqlShowEnginesStatement stmt = new MySqlShowEnginesStatement(); stmt.setStorage(true); return stmt; } if (identifierEquals("ENGINES")) { lexer.nextToken(); MySqlShowEnginesStatement stmt = new MySqlShowEnginesStatement(); return stmt; } if (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.nextToken(); stmt.setLike(this.exprParser.expr()); } if (lexer.token() == Token.WHERE) { lexer.nextToken(); stmt.setWhere(this.exprParser.expr()); } return stmt; } if (identifierEquals("FUNCTION")) { lexer.nextToken(); if (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.nextToken(); stmt.setLike(this.exprParser.expr()); } if (lexer.token() == Token.WHERE) { lexer.nextToken(); stmt.setWhere(this.exprParser.expr()); } return stmt; } // MySqlShowFunctionStatusStatement if (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 (identifierEquals("STORAGE")) { lexer.nextToken(); acceptIdentifier("ENGINES"); MySqlShowEnginesStatement stmt = new MySqlShowEnginesStatement(); stmt.setStorage(true); return stmt; } if (identifierEquals("ENGINES")) { lexer.nextToken(); MySqlShowEnginesStatement stmt = new MySqlShowEnginesStatement(); return stmt; } if (identifierEquals("GRANTS")) { lexer.nextToken(); MySqlShowGrantsStatement stmt = new MySqlShowGrantsStatement(); if (lexer.token() == Token.FOR) { lexer.nextToken(); stmt.setUser(this.exprParser.expr()); } return stmt; } if (lexer.token() == Token.INDEX || identifierEquals("INDEXES")) { lexer.nextToken(); MySqlShowIndexesStatement stmt = new MySqlShowIndexesStatement(); 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); } } return stmt; } if (identifierEquals("KEYS")) { lexer.nextToken(); MySqlShowKeysStatement stmt = new MySqlShowKeysStatement(); 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); } } return stmt; } if (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.nextToken(); stmt.setLike(this.exprParser.expr()); } if (lexer.token() == Token.WHERE) { lexer.nextToken(); stmt.setWhere(this.exprParser.expr()); } return stmt; } if (identifierEquals("PLUGINS")) { lexer.nextToken(); MySqlShowPluginsStatement stmt = new MySqlShowPluginsStatement(); return stmt; } if (identifierEquals("PRIVILEGES")) { lexer.nextToken(); MySqlShowPrivilegesStatement stmt = new MySqlShowPrivilegesStatement(); return stmt; } if (identifierEquals("PROCEDURE")) { lexer.nextToken(); if (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.nextToken(); stmt.setLike(this.exprParser.expr()); } if (lexer.token() == Token.WHERE) { lexer.nextToken(); stmt.setWhere(this.exprParser.expr()); } return stmt; } if (identifierEquals("PROCESSLIST")) { lexer.nextToken(); MySqlShowProcessListStatement stmt = new MySqlShowProcessListStatement(); return stmt; } if (identifierEquals("PROFILES")) { lexer.nextToken(); MySqlShowProfilesStatement stmt = new MySqlShowProfilesStatement(); return stmt; } if (identifierEquals("PROFILE")) { lexer.nextToken(); MySqlShowProfileStatement stmt = new MySqlShowProfileStatement(); for (;;) { if (lexer.token() == Token.ALL) { stmt.getTypes().add(MySqlShowProfileStatement.Type.ALL); lexer.nextToken(); } else if (identifierEquals("BLOCK")) { lexer.nextToken(); acceptIdentifier("IO"); stmt.getTypes().add(MySqlShowProfileStatement.Type.BLOCK_IO); } else if (identifierEquals("CONTEXT")) { lexer.nextToken(); acceptIdentifier("SWITCHES"); stmt.getTypes().add(MySqlShowProfileStatement.Type.CONTEXT_SWITCHES); } else if (identifierEquals("CPU")) { lexer.nextToken(); stmt.getTypes().add(MySqlShowProfileStatement.Type.CPU); } else if (identifierEquals("IPC")) { lexer.nextToken(); stmt.getTypes().add(MySqlShowProfileStatement.Type.IPC); } else if (identifierEquals("MEMORY")) { lexer.nextToken(); stmt.getTypes().add(MySqlShowProfileStatement.Type.MEMORY); } else if (identifierEquals("PAGE")) { lexer.nextToken(); acceptIdentifier("FAULTS"); stmt.getTypes().add(MySqlShowProfileStatement.Type.PAGE_FAULTS); } else if (identifierEquals("SOURCE")) { lexer.nextToken(); stmt.getTypes().add(MySqlShowProfileStatement.Type.SOURCE); } else if (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.parseLimit()); return stmt; } if (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.parseLimit()); return stmt; } if (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.parseLimit()); return stmt; } if (identifierEquals("SLAVE")) { lexer.nextToken(); if (identifierEquals("STATUS")) { lexer.nextToken(); return new MySqlShowSlaveStatusStatement(); } else { acceptIdentifier("HOSTS"); MySqlShowSlaveHostsStatement stmt = new MySqlShowSlaveHostsStatement(); return stmt; } } if (lexer.token() == Token.TABLE) { lexer.nextToken(); acceptIdentifier("STATUS"); MySqlShowTableStatusStatement stmt = new MySqlShowTableStatusStatement(); if (lexer.token() == Token.FROM || lexer.token() == Token.IN) { lexer.nextToken(); stmt.setDatabase(this.exprParser.name()); } if (lexer.token() == Token.LIKE) { lexer.nextToken(); stmt.setLike(this.exprParser.expr()); } if (lexer.token() == Token.WHERE) { lexer.nextToken(); stmt.setWhere(this.exprParser.expr()); } return stmt; } if (identifierEquals("TRIGGERS")) { lexer.nextToken(); MySqlShowTriggersStatement stmt = new MySqlShowTriggersStatement(); if (lexer.token() == Token.FROM) { lexer.nextToken(); SQLName database = exprParser.name(); stmt.setDatabase(database); } if (lexer.token() == Token.LIKE) { lexer.nextToken(); SQLExpr like = exprParser.expr(); stmt.setLike(like); } if (lexer.token() == Token.WHERE) { lexer.nextToken(); SQLExpr where = exprParser.expr(); stmt.setWhere(where); } return stmt; } // MySqlShowSlaveHostsStatement throw new ParserException("TODO " + lexer.stringVal()); } private MySqlShowStatusStatement parseShowStatus() throws ParserException { MySqlShowStatusStatement stmt = new MySqlShowStatusStatement(); if (lexer.token() == Token.LIKE) { lexer.nextToken(); SQLExpr like = exprParser.expr(); stmt.setLike(like); } if (lexer.token() == Token.WHERE) { lexer.nextToken(); SQLExpr where = exprParser.expr(); stmt.setWhere(where); } return stmt; } private MySqlShowVariantsStatement parseShowVariants() throws ParserException { MySqlShowVariantsStatement stmt = new MySqlShowVariantsStatement(); if (lexer.token() == Token.LIKE) { lexer.nextToken(); SQLExpr like = exprParser.expr(); stmt.setLike(like); } if (lexer.token() == Token.WHERE) { lexer.nextToken(); SQLExpr where = exprParser.expr(); stmt.setWhere(where); } return stmt; } private MySqlShowWarningsStatement parseShowWarnings() throws ParserException { MySqlShowWarningsStatement stmt = new MySqlShowWarningsStatement(); stmt.setLimit(parseLimit()); return stmt; } private MySqlShowDatabasesStatement parseShowDatabases() throws ParserException { MySqlShowDatabasesStatement stmt = new MySqlShowDatabasesStatement(); if (lexer.token() == Token.LIKE) { lexer.nextToken(); SQLExpr like = exprParser.expr(); stmt.setLike(like); } if (lexer.token() == Token.WHERE) { lexer.nextToken(); SQLExpr where = exprParser.expr(); stmt.setWhere(where); } return stmt; } private MySqlShowTablesStatement parseShowTabless() throws ParserException { MySqlShowTablesStatement stmt = new MySqlShowTablesStatement(); if (lexer.token() == Token.FROM) { lexer.nextToken(); SQLName database = exprParser.name(); stmt.setDatabase(database); } if (lexer.token() == Token.LIKE) { lexer.nextToken(); SQLExpr like = exprParser.expr(); stmt.setLike(like); } if (lexer.token() == Token.WHERE) { lexer.nextToken(); SQLExpr where = exprParser.expr(); stmt.setWhere(where); } return stmt; } private MySqlShowColumnsStatement parseShowColumns() throws ParserException { MySqlShowColumnsStatement stmt = new MySqlShowColumnsStatement(); if (lexer.token() == Token.FROM) { lexer.nextToken(); SQLName table = exprParser.name(); stmt.setTable(table); if (lexer.token() == Token.FROM) { lexer.nextToken(); SQLName database = exprParser.name(); stmt.setDatabase(database); } } if (lexer.token() == Token.LIKE) { lexer.nextToken(); SQLExpr like = exprParser.expr(); stmt.setLike(like); } if (lexer.token() == Token.WHERE) { lexer.nextToken(); SQLExpr where = exprParser.expr(); stmt.setWhere(where); } return stmt; } public MySqlStartTransactionStatement parseStart() throws ParserException { acceptIdentifier("START"); acceptIdentifier("TRANSACTION"); MySqlStartTransactionStatement stmt = new MySqlStartTransactionStatement(); if (identifierEquals("WITH")) { lexer.nextToken(); acceptIdentifier("CONSISTENT"); acceptIdentifier("SNAPSHOT"); stmt.setConsistentSnapshot(true); } if (identifierEquals("BEGIN")) { lexer.nextToken(); stmt.setBegin(true); if (identifierEquals("WORK")) { lexer.nextToken(); stmt.setWork(true); } } return stmt; } @Override public MySqlRollbackStatement parseRollback() { acceptIdentifier("ROLLBACK"); MySqlRollbackStatement stmt = new MySqlRollbackStatement(); if (identifierEquals("WORK")) { lexer.nextToken(); } if (lexer.token() == Token.AND) { lexer.nextToken(); if (lexer.token() == Token.NOT) { lexer.nextToken(); acceptIdentifier("CHAIN"); stmt.setChain(Boolean.FALSE); } else { acceptIdentifier("CHAIN"); stmt.setChain(Boolean.TRUE); } } if (identifierEquals("TO")) { lexer.nextToken(); if (identifierEquals("SAVEPOINT")) { lexer.nextToken(); } stmt.setTo(this.exprParser.name()); } return stmt; } public MySqlCommitStatement parseCommit() throws ParserException { acceptIdentifier("COMMIT"); MySqlCommitStatement stmt = new MySqlCommitStatement(); if (identifierEquals("WORK")) { lexer.nextToken(); stmt.setWork(true); } if (lexer.token() == Token.AND) { lexer.nextToken(); if (lexer.token() == Token.NOT) { lexer.nextToken(); acceptIdentifier("CHAIN"); stmt.setChain(Boolean.FALSE); } else { acceptIdentifier("CHAIN"); stmt.setChain(Boolean.TRUE); } } return stmt; } public MySqlReplicateStatement parseReplicate() throws ParserException { MySqlReplicateStatement stmt = new MySqlReplicateStatement(); acceptIdentifier("REPLACE"); if (identifierEquals("LOW_PRIORITY")) { stmt.setLowPriority(true); lexer.nextToken(); } if (identifierEquals("DELAYED")) { stmt.setDelayed(true); lexer.nextToken(); } if (lexer.token() == Token.INTO) { lexer.nextToken(); } SQLName tableName = exprParser.name(); stmt.setTableName(tableName); if (lexer.token() == Token.LPAREN) { lexer.nextToken(); if (lexer.token() == Token.SELECT) { SQLQueryExpr queryExpr = (SQLQueryExpr) this.exprParser.expr(); stmt.setQuery(queryExpr); } else { this.exprParser.exprList(stmt.getColumns()); } accept(Token.RPAREN); } if (lexer.token() == Token.VALUES || identifierEquals("VALUE")) { lexer.nextToken(); for (;;) { accept(Token.LPAREN); SQLInsertStatement.ValuesClause values = new SQLInsertStatement.ValuesClause(); this.exprParser.exprList(values.getValues()); stmt.getValuesList().add(values); accept(Token.RPAREN); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; } else { break; } } } else if (lexer.token() == Token.SELECT) { SQLQueryExpr queryExpr = (SQLQueryExpr) this.exprParser.expr(); stmt.setQuery(queryExpr); } else if (lexer.token() == Token.SET) { lexer.nextToken(); SQLInsertStatement.ValuesClause values = new SQLInsertStatement.ValuesClause(); stmt.getValuesList().add(values); for (;;) { stmt.getColumns().add(this.exprParser.name()); if (lexer.token() == Token.COLONEQ) { lexer.nextToken(); } else { accept(Token.EQ); } values.getValues().add(this.exprParser.expr()); if (lexer.token() == (Token.COMMA)) { lexer.nextToken(); continue; } break; } } else if (lexer.token() == Token.LPAREN) { lexer.nextToken(); SQLQueryExpr queryExpr = (SQLQueryExpr) this.exprParser.expr(); stmt.setQuery(queryExpr); accept(Token.RPAREN); } return stmt; } protected SQLStatement parseLoad() throws ParserException { acceptIdentifier("LOAD"); if (identifierEquals("DATA")) { SQLStatement stmt = parseLoadDataInFile(); return stmt; } if (identifierEquals("XML")) { SQLStatement stmt = parseLoadXml(); return stmt; } throw new ParserException("TODO"); } protected MySqlLoadXmlStatement parseLoadXml() throws ParserException { acceptIdentifier("XML"); MySqlLoadXmlStatement stmt = new MySqlLoadXmlStatement(); if (identifierEquals("LOW_PRIORITY")) { stmt.setLowPriority(true); lexer.nextToken(); } if (identifierEquals("CONCURRENT")) { stmt.setConcurrent(true); lexer.nextToken(); } if (identifierEquals("LOCAL")) { stmt.setLocal(true); lexer.nextToken(); } acceptIdentifier("INFILE"); SQLLiteralExpr fileName = (SQLLiteralExpr) exprParser.expr(); stmt.setFileName(fileName); if (identifierEquals("REPLACE")) { stmt.setReplicate(true); lexer.nextToken(); } if (identifierEquals("IGNORE")) { stmt.setIgnore(true); lexer.nextToken(); } accept(Token.INTO); accept(Token.TABLE); SQLName tableName = exprParser.name(); stmt.setTableName(tableName); if (identifierEquals("CHARACTER")) { lexer.nextToken(); accept(Token.SET); if (lexer.token() != Token.LITERAL_CHARS) { throw new ParserException("syntax error, illegal charset"); } String charset = lexer.stringVal(); lexer.nextToken(); stmt.setCharset(charset); } if (identifierEquals("ROWS")) { lexer.nextToken(); accept(Token.IDENTIFIED); accept(Token.BY); SQLExpr rowsIdentifiedBy = exprParser.expr(); stmt.setRowsIdentifiedBy(rowsIdentifiedBy); } if (identifierEquals("IGNORE")) { throw new ParserException("TODO"); } if (lexer.token() == Token.SET) { throw new ParserException("TODO"); } return stmt; } protected MySqlLoadDataInFileStatement parseLoadDataInFile() throws ParserException { acceptIdentifier("DATA"); MySqlLoadDataInFileStatement stmt = new MySqlLoadDataInFileStatement(); if (identifierEquals("LOW_PRIORITY")) { stmt.setLowPriority(true); lexer.nextToken(); } if (identifierEquals("CONCURRENT")) { stmt.setConcurrent(true); lexer.nextToken(); } if (identifierEquals("LOCAL")) { stmt.setLocal(true); lexer.nextToken(); } acceptIdentifier("INFILE"); SQLLiteralExpr fileName = (SQLLiteralExpr) exprParser.expr(); stmt.setFileName(fileName); if (identifierEquals("REPLACE")) { stmt.setReplicate(true); lexer.nextToken(); } if (identifierEquals("IGNORE")) { stmt.setIgnore(true); lexer.nextToken(); } accept(Token.INTO); accept(Token.TABLE); SQLName tableName = exprParser.name(); stmt.setTableName(tableName); if (identifierEquals("CHARACTER")) { lexer.nextToken(); accept(Token.SET); if (lexer.token() != Token.LITERAL_CHARS) { throw new ParserException("syntax error, illegal charset"); } String charset = lexer.stringVal(); lexer.nextToken(); stmt.setCharset(charset); } if (identifierEquals("FIELDS") || identifierEquals("COLUMNS")) { throw new ParserException("TODO"); } if (identifierEquals("LINES")) { throw new ParserException("TODO"); } if (identifierEquals("IGNORE")) { throw new ParserException("TODO"); } if (lexer.token() == Token.SET) { throw new ParserException("TODO"); } return stmt; } public MySqlPrepareStatement parsePrepare() throws ParserException { acceptIdentifier("PREPARE"); SQLName name = exprParser.name(); accept(Token.FROM); SQLExpr from = exprParser.expr(); return new MySqlPrepareStatement(name, from); } public MySqlExecuteStatement parseExecute() throws ParserException { acceptIdentifier("EXECUTE"); MySqlExecuteStatement stmt = new MySqlExecuteStatement(); SQLName statementName = exprParser.name(); stmt.setStatementName(statementName); if (identifierEquals("USING")) { lexer.nextToken(); exprParser.exprList(stmt.getParameters()); } return stmt; } public SQLInsertStatement parseInsert() { MySqlInsertStatement insertStatement = new MySqlInsertStatement(); if (lexer.token() == Token.INSERT) { lexer.nextToken(); if (identifierEquals("LOW_PRIORITY")) { insertStatement.setLowPriority(true); lexer.nextToken(); } if (identifierEquals("DELAYED")) { insertStatement.setDelayed(true); lexer.nextToken(); } if (identifierEquals("HIGH_PRIORITY")) { insertStatement.setHighPriority(true); lexer.nextToken(); } if (identifierEquals("IGNORE")) { insertStatement.setIgnore(true); lexer.nextToken(); } if (lexer.token() == Token.INTO) { lexer.nextToken(); } SQLName tableName = this.exprParser.name(); insertStatement.setTableName(tableName); if (lexer.token() == Token.IDENTIFIER && !identifierEquals("VALUE")) { insertStatement.setAlias(lexer.stringVal()); lexer.nextToken(); } } if (lexer.token() == (Token.LPAREN)) { lexer.nextToken(); if (lexer.token() == (Token.SELECT)) { SQLSelect select = this.exprParser.createSelectParser().select(); select.setParent(insertStatement); insertStatement.setQuery(select); } else { this.exprParser.exprList(insertStatement.getColumns()); } accept(Token.RPAREN); } if (lexer.token() == Token.VALUES || identifierEquals("VALUE")) { lexer.nextToken(); for (;;) { accept(Token.LPAREN); SQLInsertStatement.ValuesClause values = new SQLInsertStatement.ValuesClause(); this.exprParser.exprList(values.getValues()); insertStatement.getValuesList().add(values); accept(Token.RPAREN); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; } else { break; } } } else if (lexer.token() == Token.SET) { lexer.nextToken(); SQLInsertStatement.ValuesClause values = new SQLInsertStatement.ValuesClause(); insertStatement.getValuesList().add(values); for (;;) { SQLName name = this.exprParser.name(); insertStatement.getColumns().add(name); if (lexer.token() == Token.EQ) { lexer.nextToken(); } else { accept(Token.COLONEQ); } values.getValues().add(this.exprParser.expr()); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; } break; } } else if (lexer.token() == (Token.SELECT)) { SQLSelect select = this.exprParser.createSelectParser().select(); select.setParent(insertStatement); insertStatement.setQuery(select); } else if (lexer.token() == (Token.LPAREN)) { lexer.nextToken(); SQLSelect select = this.exprParser.createSelectParser().select(); select.setParent(insertStatement); insertStatement.setQuery(select); accept(Token.RPAREN); } if (lexer.token() == Token.ON) { lexer.nextToken(); acceptIdentifier("DUPLICATE"); accept(Token.KEY); accept(Token.UPDATE); exprParser.exprList(insertStatement.getDuplicateKeyUpdate()); } return insertStatement; } public SQLStatement parseDropUser() throws ParserException { acceptIdentifier("USER"); MySqlDropUser stmt = new MySqlDropUser(); for (;;) { SQLExpr expr = this.exprParser.expr(); stmt.getUsers().add(expr); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; } break; } return stmt; } protected SQLDropTableStatement parseDropTable(boolean acceptDrop) { if (acceptDrop) { accept(Token.DROP); } MySqlDropTableStatement stmt = new MySqlDropTableStatement(); if (identifierEquals("TEMPORARY")) { lexer.nextToken(); stmt.setTemporary(true); } accept(Token.TABLE); if (lexer.token() == Token.IF) { lexer.nextToken(); accept(Token.EXISTS); stmt.setIfExists(true); } for (;;) { SQLName name = this.exprParser.name(); stmt.addTableSource(name); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; } break; } if (identifierEquals("RESTRICT")) { stmt.setOption("RESTRICT"); lexer.nextToken(); } else if (identifierEquals("CASCADE")) { stmt.setOption("CASCADE"); lexer.nextToken(); } return stmt; } protected SQLDropViewStatement parseDropView(boolean acceptDrop) { if (acceptDrop) { accept(Token.DROP); } MySqlDropViewStatement stmt = new MySqlDropViewStatement(); accept(Token.VIEW); if (lexer.token() == Token.IF) { lexer.nextToken(); accept(Token.EXISTS); stmt.setIfExists(true); } for (;;) { SQLName name = this.exprParser.name(); stmt.addTableSource(name); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; } break; } if (identifierEquals("RESTRICT")) { stmt.setOption("RESTRICT"); lexer.nextToken(); } else if (identifierEquals("CASCADE")) { stmt.setOption("CASCADE"); lexer.nextToken(); } return stmt; } public SQLSelectParser createSQLSelectParser() { return new MySqlSelectParser(this.exprParser); } public SQLStatement parseSet() throws ParserException { accept(Token.SET); Boolean global = null; if (identifierEquals("GLOBAL")) { global = Boolean.TRUE; lexer.nextToken(); } else if (identifierEquals("SESSION")) { global = Boolean.FALSE; lexer.nextToken(); } if (identifierEquals("TRANSACTION")) { lexer.nextToken(); acceptIdentifier("ISOLATION"); acceptIdentifier("LEVEL"); MySqlSetTransactionIsolationLevelStatement stmt = new MySqlSetTransactionIsolationLevelStatement(); stmt.setGlobal(global); if (identifierEquals("READ")) { lexer.nextToken(); if (identifierEquals("UNCOMMITTED")) { stmt.setLevel("READ UNCOMMITTED"); lexer.nextToken(); } else if (identifierEquals("WRITE")) { stmt.setLevel("READ WRITE"); lexer.nextToken(); } else if (identifierEquals("ONLY")) { stmt.setLevel("READ ONLY"); lexer.nextToken(); } else if (identifierEquals("COMMITTED")) { stmt.setLevel("READ COMMITTED"); lexer.nextToken(); } else { throw new ParserException("UNKOWN TRANSACTION LEVEL : " + lexer.stringVal()); } } else if (identifierEquals("SERIALIZABLE")) { stmt.setLevel("SERIALIZABLE"); lexer.nextToken(); } else if (identifierEquals("REPEATABLE")) { lexer.nextToken(); if (identifierEquals("READ")) { stmt.setLevel("REPEATABLE READ"); lexer.nextToken(); } else { throw new ParserException("UNKOWN TRANSACTION LEVEL : " + lexer.stringVal()); } } else { throw new ParserException("UNKOWN TRANSACTION LEVEL : " + lexer.stringVal()); } return stmt; } else if (identifierEquals("NAMES")) { lexer.nextToken(); MySqlSetNamesStatement stmt = new MySqlSetNamesStatement(); if (lexer.token() == Token.DEFAULT) { lexer.nextToken(); stmt.setDefault(true); } else { String charSet = lexer.stringVal(); stmt.setCharSet(charSet); lexer.nextToken(); if (identifierEquals("COLLATE")) { lexer.nextToken(); String collate = lexer.stringVal(); stmt.setCollate(collate); lexer.nextToken(); } } return stmt; } else if (identifierEquals("CHARACTER")) { lexer.nextToken(); accept(Token.SET); MySqlSetCharSetStatement stmt = new MySqlSetCharSetStatement(); if (lexer.token() == Token.DEFAULT) { lexer.nextToken(); stmt.setDefault(true); } else { String charSet = lexer.stringVal(); stmt.setCharSet(charSet); lexer.nextToken(); if (identifierEquals("COLLATE")) { lexer.nextToken(); String collate = lexer.stringVal(); stmt.setCollate(collate); lexer.nextToken(); } } return stmt; } else { SQLSetStatement stmt = new SQLSetStatement(); parseAssignItems(stmt.getItems()); if (global != null && global.booleanValue()) { SQLVariantRefExpr varRef = (SQLVariantRefExpr) stmt.getItems().get(0).getTarget(); varRef.setGlobal(true); } return stmt; } } public Limit parseLimit() { return ((MySqlExprParser) this.exprParser).parseLimit(); } public SQLStatement parseAlter() { accept(Token.ALTER); boolean ignore = false; if (identifierEquals("IGNORE")) { ignore = true; lexer.nextToken(); } if (lexer.token() == Token.TABLE) { lexer.nextToken(); MySqlAlterTableStatement stmt = new MySqlAlterTableStatement(); stmt.setIgnore(ignore); stmt.setName(this.exprParser.name()); for (;;) { if (identifierEquals("ADD")) { lexer.nextToken(); if (identifierEquals("COLUMN")) { lexer.nextToken(); MySqlAlterTableAddColumn item = new MySqlAlterTableAddColumn(); SQLColumnDefinition columnDef = this.exprParser.parseColumn(); item.getColumns().add(columnDef); if (identifierEquals("AFTER")) { lexer.nextToken(); item.setAfter(this.exprParser.name()); } stmt.getItems().add(item); } else if (lexer.token() == Token.INDEX) { lexer.nextToken(); MySqlAlterTableAddIndex item = new MySqlAlterTableAddIndex(); if (lexer.token() == Token.LPAREN) { lexer.nextToken(); } else { item.setName(this.exprParser.name()); accept(Token.LPAREN); } for (;;) { SQLSelectOrderByItem column = this.exprParser.parseSelectOrderByItem(); item.getItems().add(column); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; } break; } accept(Token.RPAREN); stmt.getItems().add(item); } else if (lexer.token() == Token.UNIQUE) { lexer.nextToken(); MySqlAlterTableAddUnique item = new MySqlAlterTableAddUnique(); if (lexer.token() == Token.LPAREN) { lexer.nextToken(); } else { item.setName(this.exprParser.name()); accept(Token.LPAREN); } for (;;) { SQLSelectOrderByItem column = this.exprParser.parseSelectOrderByItem(); item.getItems().add(column); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; } break; } accept(Token.RPAREN); stmt.getItems().add(item); } else if (lexer.token() == Token.KEY) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (lexer.token() == Token.CONSTRAINT) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("FULLTEXT")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("SPATIAL")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else { MySqlAlterTableAddColumn item = new MySqlAlterTableAddColumn(); SQLColumnDefinition columnDef = this.exprParser.parseColumn(); item.getColumns().add(columnDef); if (identifierEquals("AFTER")) { lexer.nextToken(); item.setAfter(this.exprParser.name()); } stmt.getItems().add(item); } } else if (identifierEquals("ALTER")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("CHANGE")) { lexer.nextToken(); if (identifierEquals("COLUMN")) { lexer.nextToken(); } MySqlAlterTableChangeColumn item = new MySqlAlterTableChangeColumn(); item.setColumnName(this.exprParser.name()); item.setNewColumnDefinition(this.exprParser.parseColumn()); if (identifierEquals("FIRST")) { lexer.nextToken(); item.setFirst(true); } else if (identifierEquals("AFTER")) { lexer.nextToken(); item.setFirst(false); } stmt.getItems().add(item); } else if (identifierEquals("MODIFY")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (lexer.token() == Token.DROP) { lexer.nextToken(); if (identifierEquals("COLUMN")) { lexer.nextToken(); } SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); item.setColumnName(this.exprParser.name()); stmt.getItems().add(item); } else if (identifierEquals("DISABLE")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("ENABLE")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("RENAME")) { lexer.nextToken(); MySqlRenameTableStatement renameStmt = new MySqlRenameTableStatement(); MySqlRenameTableStatement.Item item = new MySqlRenameTableStatement.Item(); item.setName(stmt.getTableSource().getExpr()); item.setTo(this.exprParser.name()); renameStmt.getItems().add(item); return renameStmt; } else if (lexer.token() == Token.ORDER) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("CONVERT")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (lexer.token() == Token.DEFAULT) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("DISCARD")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("IMPORT")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("FORCE")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("TRUNCATE")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("COALESCE")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("REORGANIZE")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("EXCHANGE")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("ANALYZE")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("CHECK")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("OPTIMIZE")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("REBUILD")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("REPAIR")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("REMOVE")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("ENGINE")) { lexer.nextToken(); accept(Token.EQ); stmt.getItems().add(new MySqlAlterTableOption("ENGINE", lexer.stringVal())); lexer.nextToken(); } else if (identifierEquals("COLLATE")) { lexer.nextToken(); accept(Token.EQ); stmt.getItems().add(new MySqlAlterTableOption("COLLATE", lexer.stringVal())); lexer.nextToken(); } else if (identifierEquals("PACK_KEYS")) { lexer.nextToken(); accept(Token.EQ); if (identifierEquals("PACK")) { lexer.nextToken(); accept(Token.ALL); stmt.getItems().add(new MySqlAlterTableOption("PACK_KEYS", "PACK ALL")); } else { stmt.getItems().add( new MySqlAlterTableOption("PACK_KEYS", lexer.stringVal())); lexer.nextToken(); } } else if (identifierEquals("CHARACTER")) { lexer.nextToken(); accept(Token.SET); accept(Token.EQ); MySqlAlterTableCharacter item = new MySqlAlterTableCharacter(); item.setCharacterSet(this.exprParser.primary()); if (lexer.token() == Token.COMMA) { lexer.nextToken(); acceptIdentifier("COLLATE"); accept(Token.EQ); item.setCollate(this.exprParser.primary()); } stmt.getItems().add(item); } else { break; } if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; } else { break; } } return stmt; } throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } public SQLStatement parseRename() { MySqlRenameTableStatement stmt = new MySqlRenameTableStatement(); acceptIdentifier("RENAME"); accept(Token.TABLE); for (;;) { MySqlRenameTableStatement.Item item = new MySqlRenameTableStatement.Item(); item.setName(this.exprParser.name()); acceptIdentifier("TO"); item.setTo(this.exprParser.name()); stmt.getItems().add(item); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; } break; } return stmt; } public SQLStatement parseCreateDatabase() { if (lexer.token() == Token.CREATE) { lexer.nextToken(); } accept(Token.DATABASE); SQLCreateDatabaseStatement stmt = new SQLCreateDatabaseStatement(); stmt.setName(this.exprParser.name()); if (lexer.token() == Token.DEFAULT) { lexer.nextToken(); } return stmt; } }