use of com.alibaba.cobar.parser.ast.expression.primary.Identifier in project cobar by alibaba.
the class MySQLDMLInsertParser method insert.
/**
* nothing has been pre-consumed <code><pre>
* 'INSERT' ('LOW_PRIORITY'|'DELAYED'|'HIGH_PRIORITY')? 'IGNORE'? 'INTO'? tbname
* ( 'SET' colName ('='|':=') (expr|'DEFAULT') (',' colName ('='|':=') (expr|'DEFAULT'))*
* | '(' ( colName (',' colName)* ')' ( ('VALUES'|'VALUE') value (',' value)*
* | '(' 'SELECT' ... ')'
* | 'SELECT' ...
* )
* | 'SELECT' ... ')'
* )
* |('VALUES'|'VALUE') value ( ',' value )*
* | 'SELECT' ...
* )
* ( 'ON' 'DUPLICATE' 'KEY' 'UPDATE' colName ('='|':=') expr ( ',' colName ('='|':=') expr)* )?
*
* value := '(' (expr|'DEFAULT') ( ',' (expr|'DEFAULT'))* ')'
* </pre></code>
*/
public DMLInsertStatement insert() throws SQLSyntaxErrorException {
match(KW_INSERT);
DMLInsertStatement.InsertMode mode = DMLInsertStatement.InsertMode.UNDEF;
boolean ignore = false;
switch(lexer.token()) {
case KW_LOW_PRIORITY:
lexer.nextToken();
mode = DMLInsertStatement.InsertMode.LOW;
break;
case KW_DELAYED:
lexer.nextToken();
mode = DMLInsertStatement.InsertMode.DELAY;
break;
case KW_HIGH_PRIORITY:
lexer.nextToken();
mode = DMLInsertStatement.InsertMode.HIGH;
break;
}
if (lexer.token() == KW_IGNORE) {
ignore = true;
lexer.nextToken();
}
if (lexer.token() == KW_INTO) {
lexer.nextToken();
}
Identifier table = identifier();
List<Pair<Identifier, Expression>> dupUpdate;
List<Identifier> columnNameList;
List<RowExpression> rowList;
QueryExpression select;
List<Expression> tempRowValue;
switch(lexer.token()) {
case KW_SET:
lexer.nextToken();
columnNameList = new LinkedList<Identifier>();
tempRowValue = new LinkedList<Expression>();
for (; ; lexer.nextToken()) {
Identifier id = identifier();
match(OP_EQUALS, OP_ASSIGN);
Expression expr = exprParser.expression();
columnNameList.add(id);
tempRowValue.add(expr);
if (lexer.token() != PUNC_COMMA) {
break;
}
}
rowList = new ArrayList<RowExpression>(1);
rowList.add(new RowExpression(tempRowValue));
dupUpdate = onDuplicateUpdate();
return new DMLInsertStatement(mode, ignore, table, columnNameList, rowList, dupUpdate);
case IDENTIFIER:
if (!"VALUE".equals(lexer.stringValueUppercase())) {
break;
}
case KW_VALUES:
lexer.nextToken();
columnNameList = null;
rowList = rowList();
dupUpdate = onDuplicateUpdate();
return new DMLInsertStatement(mode, ignore, table, columnNameList, rowList, dupUpdate);
case KW_SELECT:
columnNameList = null;
select = select();
dupUpdate = onDuplicateUpdate();
return new DMLInsertStatement(mode, ignore, table, columnNameList, select, dupUpdate);
case PUNC_LEFT_PAREN:
switch(lexer.nextToken()) {
case PUNC_LEFT_PAREN:
case KW_SELECT:
columnNameList = null;
select = selectPrimary();
match(PUNC_RIGHT_PAREN);
dupUpdate = onDuplicateUpdate();
return new DMLInsertStatement(mode, ignore, table, columnNameList, select, dupUpdate);
}
columnNameList = idList();
match(PUNC_RIGHT_PAREN);
switch(lexer.token()) {
case PUNC_LEFT_PAREN:
case KW_SELECT:
select = selectPrimary();
dupUpdate = onDuplicateUpdate();
return new DMLInsertStatement(mode, ignore, table, columnNameList, select, dupUpdate);
case KW_VALUES:
lexer.nextToken();
break;
default:
matchIdentifier("VALUE");
}
rowList = rowList();
dupUpdate = onDuplicateUpdate();
return new DMLInsertStatement(mode, ignore, table, columnNameList, rowList, dupUpdate);
}
throw err("unexpected token for insert: " + lexer.token());
}
use of com.alibaba.cobar.parser.ast.expression.primary.Identifier in project cobar by alibaba.
the class MySQLDALParser method showIndex.
private ShowIndex showIndex(ShowIndex.Type type) throws SQLSyntaxErrorException {
lexer.nextToken();
match(KW_FROM, KW_IN);
Identifier tempId = identifier();
if (lexer.token() == KW_FROM || lexer.token() == KW_IN) {
lexer.nextToken();
Identifier tempId2 = identifier();
return new ShowIndex(type, tempId, tempId2);
}
return new ShowIndex(type, tempId);
}
use of com.alibaba.cobar.parser.ast.expression.primary.Identifier in project cobar by alibaba.
the class MySQLDDLParser method createTable.
/**
* <code>TABLE</code> has been consumed
*/
private DDLCreateTableStatement createTable(boolean temp) throws SQLSyntaxErrorException {
boolean ifNotExists = false;
if (lexer.token() == KW_IF) {
lexer.nextToken();
match(KW_NOT);
match(KW_EXISTS);
ifNotExists = true;
}
Identifier table = identifier();
DDLCreateTableStatement stmt = new DDLCreateTableStatement(temp, ifNotExists, table);
createTableDefs(stmt);
TableOptions options = new TableOptions();
stmt.setTableOptions(options);
tableOptions(options);
DDLCreateTableStatement.SelectOption selectOpt = null;
switch(lexer.token()) {
case KW_IGNORE:
selectOpt = DDLCreateTableStatement.SelectOption.IGNORED;
if (lexer.nextToken() == KW_AS) {
lexer.nextToken();
}
break;
case KW_REPLACE:
selectOpt = DDLCreateTableStatement.SelectOption.REPLACE;
if (lexer.nextToken() == KW_AS) {
lexer.nextToken();
}
break;
case KW_AS:
lexer.nextToken();
case KW_SELECT:
break;
case EOF:
return stmt;
default:
throw new SQLSyntaxErrorException("DDL CREATE TABLE statement not end properly");
}
DMLSelectStatement select = new MySQLDMLSelectParser(lexer, exprParser).select();
stmt.setSelect(selectOpt, select);
match(EOF);
return stmt;
}
use of com.alibaba.cobar.parser.ast.expression.primary.Identifier in project cobar by alibaba.
the class MySQLDDLParser method alterTable.
/**
* token of table name has been consumed
*
* @throws SQLSyntaxErrorException
*/
private DDLAlterTableStatement alterTable(DDLAlterTableStatement stmt) throws SQLSyntaxErrorException {
TableOptions options = new TableOptions();
stmt.setTableOptions(options);
Identifier id = null;
Identifier id2 = null;
Identifier id3 = null;
ColumnDefinition colDef = null;
IndexDefinition indexDef = null;
Expression expr = null;
for (int i = 0; lexer.token() != EOF; ++i) {
if (i > 0) {
match(PUNC_COMMA);
}
if (tableOptions(options)) {
continue;
}
main_switch: switch(lexer.token()) {
case KW_CONVERT:
// | CONVERT TO CHARACTER SET charset_name [COLLATE
// collation_name]
lexer.nextToken();
match(KW_TO);
match(KW_CHARACTER);
match(KW_SET);
id = identifier();
id2 = null;
if (lexer.token() == KW_COLLATE) {
lexer.nextToken();
id2 = identifier();
}
stmt.setConvertCharset(new Pair<Identifier, Identifier>(id, id2));
break main_switch;
case KW_RENAME:
// | RENAME [TO] new_tbl_name
if (lexer.nextToken() == KW_TO) {
lexer.nextToken();
}
id = identifier();
stmt.setRenameTo(id);
break main_switch;
case KW_DROP:
drop_switch: switch(lexer.nextToken()) {
case KW_INDEX:
case KW_KEY:
// | DROP {INDEX|KEY} index_name
lexer.nextToken();
id = identifier();
stmt.addAlterSpecification(new DDLAlterTableStatement.DropIndex(id));
break drop_switch;
case KW_PRIMARY:
// | DROP PRIMARY KEY
lexer.nextToken();
match(KW_KEY);
stmt.addAlterSpecification(new DDLAlterTableStatement.DropPrimaryKey());
break drop_switch;
case IDENTIFIER:
// | DROP [COLUMN] col_name
id = identifier();
stmt.addAlterSpecification(new DDLAlterTableStatement.DropColumn(id));
break drop_switch;
case KW_COLUMN:
// | DROP [COLUMN] col_name
lexer.nextToken();
id = identifier();
stmt.addAlterSpecification(new DDLAlterTableStatement.DropColumn(id));
break drop_switch;
default:
throw new SQLSyntaxErrorException("ALTER TABLE error for DROP");
}
break main_switch;
case KW_CHANGE:
// [FIRST|AFTER col_name]
if (lexer.nextToken() == KW_COLUMN) {
lexer.nextToken();
}
id = identifier();
id2 = identifier();
colDef = columnDefinition();
if (lexer.token() == IDENTIFIER) {
if ("FIRST".equals(lexer.stringValueUppercase())) {
lexer.nextToken();
stmt.addAlterSpecification(new DDLAlterTableStatement.ChangeColumn(id, id2, colDef, null));
} else if ("AFTER".equals(lexer.stringValueUppercase())) {
lexer.nextToken();
id3 = identifier();
stmt.addAlterSpecification(new DDLAlterTableStatement.ChangeColumn(id, id2, colDef, id3));
} else {
stmt.addAlterSpecification(new DDLAlterTableStatement.ChangeColumn(id, id2, colDef));
}
} else {
stmt.addAlterSpecification(new DDLAlterTableStatement.ChangeColumn(id, id2, colDef));
}
break main_switch;
case KW_ALTER:
// DEFAULT}
if (lexer.nextToken() == KW_COLUMN) {
lexer.nextToken();
}
id = identifier();
switch(lexer.token()) {
case KW_SET:
lexer.nextToken();
match(KW_DEFAULT);
expr = exprParser.expression();
stmt.addAlterSpecification(new DDLAlterTableStatement.AlterColumnDefaultVal(id, expr));
break;
case KW_DROP:
lexer.nextToken();
match(KW_DEFAULT);
stmt.addAlterSpecification(new DDLAlterTableStatement.AlterColumnDefaultVal(id));
break;
default:
throw new SQLSyntaxErrorException("ALTER TABLE error for ALTER");
}
break main_switch;
case KW_ADD:
add_switch: switch(lexer.nextToken()) {
case IDENTIFIER:
// | ADD [COLUMN] col_name column_definition [FIRST | AFTER
// col_name ]
id = identifier();
colDef = columnDefinition();
if (lexer.token() == IDENTIFIER) {
if ("FIRST".equals(lexer.stringValueUppercase())) {
lexer.nextToken();
stmt.addAlterSpecification(new DDLAlterTableStatement.AddColumn(id, colDef, null));
} else if ("AFTER".equals(lexer.stringValueUppercase())) {
lexer.nextToken();
id2 = identifier();
stmt.addAlterSpecification(new DDLAlterTableStatement.AddColumn(id, colDef, id2));
} else {
stmt.addAlterSpecification(new DDLAlterTableStatement.AddColumn(id, colDef));
}
} else {
stmt.addAlterSpecification(new DDLAlterTableStatement.AddColumn(id, colDef));
}
break add_switch;
case PUNC_LEFT_PAREN:
// | ADD [COLUMN] (col_name column_definition,...)
lexer.nextToken();
for (int j = 0; lexer.token() != PUNC_RIGHT_PAREN; ++j) {
DDLAlterTableStatement.AddColumns addColumns = new DDLAlterTableStatement.AddColumns();
stmt.addAlterSpecification(addColumns);
if (j > 0) {
match(PUNC_COMMA);
}
id = identifier();
colDef = columnDefinition();
addColumns.addColumn(id, colDef);
}
match(PUNC_RIGHT_PAREN);
break add_switch;
case KW_COLUMN:
if (lexer.nextToken() == PUNC_LEFT_PAREN) {
// | ADD [COLUMN] (col_name column_definition,...)
lexer.nextToken();
for (int j = 0; lexer.token() != PUNC_RIGHT_PAREN; ++j) {
DDLAlterTableStatement.AddColumns addColumns = new DDLAlterTableStatement.AddColumns();
stmt.addAlterSpecification(addColumns);
if (j > 0) {
match(PUNC_COMMA);
}
id = identifier();
colDef = columnDefinition();
addColumns.addColumn(id, colDef);
}
match(PUNC_RIGHT_PAREN);
} else {
// | ADD [COLUMN] col_name column_definition [FIRST |
// AFTER col_name ]
id = identifier();
colDef = columnDefinition();
if (lexer.token() == IDENTIFIER) {
if ("FIRST".equals(lexer.stringValueUppercase())) {
lexer.nextToken();
stmt.addAlterSpecification(new DDLAlterTableStatement.AddColumn(id, colDef, null));
} else if ("AFTER".equals(lexer.stringValueUppercase())) {
lexer.nextToken();
id2 = identifier();
stmt.addAlterSpecification(new DDLAlterTableStatement.AddColumn(id, colDef, id2));
} else {
stmt.addAlterSpecification(new DDLAlterTableStatement.AddColumn(id, colDef));
}
} else {
stmt.addAlterSpecification(new DDLAlterTableStatement.AddColumn(id, colDef));
}
}
break add_switch;
case KW_INDEX:
case KW_KEY:
// | ADD {INDEX|KEY} [index_name] [index_type]
// (index_col_name,...) [index_option] ...
id = null;
if (lexer.nextToken() == IDENTIFIER) {
id = identifier();
}
indexDef = indexDefinition();
stmt.addAlterSpecification(new DDLAlterTableStatement.AddIndex(id, indexDef));
break add_switch;
case KW_PRIMARY:
// | ADD PRIMARY KEY [index_type] (index_col_name,...)
// [index_option] ...
lexer.nextToken();
match(KW_KEY);
indexDef = indexDefinition();
stmt.addAlterSpecification(new DDLAlterTableStatement.AddPrimaryKey(indexDef));
break add_switch;
case KW_UNIQUE:
// (index_col_name,...) [index_option] ...
switch(lexer.nextToken()) {
case KW_INDEX:
case KW_KEY:
lexer.nextToken();
}
id = null;
if (lexer.token() == IDENTIFIER) {
id = identifier();
}
indexDef = indexDefinition();
stmt.addAlterSpecification(new DDLAlterTableStatement.AddUniqueKey(id, indexDef));
break add_switch;
case KW_FULLTEXT:
// (index_col_name,...) [index_option] ...
switch(lexer.nextToken()) {
case KW_INDEX:
case KW_KEY:
lexer.nextToken();
}
id = null;
if (lexer.token() == IDENTIFIER) {
id = identifier();
}
indexDef = indexDefinition();
stmt.addAlterSpecification(new DDLAlterTableStatement.AddFullTextIndex(id, indexDef));
break add_switch;
case KW_SPATIAL:
// (index_col_name,...) [index_option] ...
switch(lexer.nextToken()) {
case KW_INDEX:
case KW_KEY:
lexer.nextToken();
}
id = null;
if (lexer.token() == IDENTIFIER) {
id = identifier();
}
indexDef = indexDefinition();
stmt.addAlterSpecification(new DDLAlterTableStatement.AddSpatialIndex(id, indexDef));
break add_switch;
default:
throw new SQLSyntaxErrorException("ALTER TABLE error for ADD");
}
break main_switch;
case IDENTIFIER:
SpecialIdentifier si = specialIdentifiers.get(lexer.stringValueUppercase());
if (si != null) {
switch(si) {
case IMPORT:
// | IMPORT TABLESPACE
lexer.nextToken();
matchIdentifier("TABLESPACE");
stmt.setImportTableSpace(true);
break main_switch;
case DISCARD:
// | DISCARD TABLESPACE
lexer.nextToken();
matchIdentifier("TABLESPACE");
stmt.setDiscardTableSpace(true);
break main_switch;
case ENABLE:
// | ENABLE KEYS
lexer.nextToken();
match(KW_KEYS);
stmt.setEnableKeys(true);
break main_switch;
case DISABLE:
// | DISABLE KEYS
lexer.nextToken();
match(KW_KEYS);
stmt.setDisableKeys(true);
break main_switch;
case MODIFY:
// AFTER col_name]
if (lexer.nextToken() == KW_COLUMN) {
lexer.nextToken();
}
id = identifier();
colDef = columnDefinition();
if (lexer.token() == IDENTIFIER) {
if ("FIRST".equals(lexer.stringValueUppercase())) {
lexer.nextToken();
stmt.addAlterSpecification(new DDLAlterTableStatement.ModifyColumn(id, colDef, null));
} else if ("AFTER".equals(lexer.stringValueUppercase())) {
lexer.nextToken();
id2 = identifier();
stmt.addAlterSpecification(new DDLAlterTableStatement.ModifyColumn(id, colDef, id2));
} else {
stmt.addAlterSpecification(new DDLAlterTableStatement.ModifyColumn(id, colDef));
}
} else {
stmt.addAlterSpecification(new DDLAlterTableStatement.ModifyColumn(id, colDef));
}
break main_switch;
}
}
default:
throw new SQLSyntaxErrorException("unknown ALTER specification");
}
}
return stmt;
}
use of com.alibaba.cobar.parser.ast.expression.primary.Identifier in project cobar by alibaba.
the class MySQLDDLParser method ddlStmt.
/**
* nothing has been pre-consumed
*/
public DDLStatement ddlStmt() throws SQLSyntaxErrorException {
Identifier idTemp1;
Identifier idTemp2;
SpecialIdentifier siTemp;
switch(lexer.token()) {
case KW_ALTER:
boolean ignore = false;
if (lexer.nextToken() == KW_IGNORE) {
ignore = true;
lexer.nextToken();
}
switch(lexer.token()) {
case KW_TABLE:
lexer.nextToken();
idTemp1 = identifier();
DDLAlterTableStatement alterTableStatement = new DDLAlterTableStatement(ignore, idTemp1);
return alterTable(alterTableStatement);
default:
throw err("Only ALTER TABLE is supported");
}
case KW_CREATE:
switch(lexer.nextToken()) {
case KW_UNIQUE:
case KW_FULLTEXT:
case KW_SPATIAL:
lexer.nextToken();
case KW_INDEX:
lexer.nextToken();
idTemp1 = identifier();
for (; lexer.token() != KW_ON; lexer.nextToken()) ;
lexer.nextToken();
idTemp2 = identifier();
return new DDLCreateIndexStatement(idTemp1, idTemp2);
case KW_TABLE:
lexer.nextToken();
return createTable(false);
case IDENTIFIER:
siTemp = specialIdentifiers.get(lexer.stringValueUppercase());
if (siTemp != null) {
switch(siTemp) {
case TEMPORARY:
lexer.nextToken();
match(KW_TABLE);
return createTable(true);
case POLICY:
lexer.nextToken();
Identifier policyName = identifier();
match(PUNC_LEFT_PAREN);
ExtDDLCreatePolicy policy = new ExtDDLCreatePolicy(policyName);
for (int j = 0; lexer.token() != PUNC_RIGHT_PAREN; ++j) {
if (j > 0) {
match(PUNC_COMMA);
}
Integer id = lexer.integerValue().intValue();
match(LITERAL_NUM_PURE_DIGIT);
Expression val = exprParser.expression();
policy.addProportion(id, val);
}
match(PUNC_RIGHT_PAREN);
return policy;
}
}
default:
throw err("unsupported DDL for CREATE");
}
case KW_DROP:
switch(lexer.nextToken()) {
case KW_INDEX:
lexer.nextToken();
idTemp1 = identifier();
match(KW_ON);
idTemp2 = identifier();
return new DDLDropIndexStatement(idTemp1, idTemp2);
case KW_TABLE:
lexer.nextToken();
return dropTable(false);
case IDENTIFIER:
siTemp = specialIdentifiers.get(lexer.stringValueUppercase());
if (siTemp != null) {
switch(siTemp) {
case TEMPORARY:
lexer.nextToken();
match(KW_TABLE);
return dropTable(true);
case POLICY:
lexer.nextToken();
Identifier policyName = identifier();
return new ExtDDLDropPolicy(policyName);
}
}
default:
throw err("unsupported DDL for DROP");
}
case KW_RENAME:
lexer.nextToken();
match(KW_TABLE);
idTemp1 = identifier();
match(KW_TO);
idTemp2 = identifier();
List<Pair<Identifier, Identifier>> list;
if (lexer.token() != PUNC_COMMA) {
list = new ArrayList<Pair<Identifier, Identifier>>(1);
list.add(new Pair<Identifier, Identifier>(idTemp1, idTemp2));
return new DDLRenameTableStatement(list);
}
list = new LinkedList<Pair<Identifier, Identifier>>();
list.add(new Pair<Identifier, Identifier>(idTemp1, idTemp2));
for (; lexer.token() == PUNC_COMMA; ) {
lexer.nextToken();
idTemp1 = identifier();
match(KW_TO);
idTemp2 = identifier();
list.add(new Pair<Identifier, Identifier>(idTemp1, idTemp2));
}
return new DDLRenameTableStatement(list);
case IDENTIFIER:
SpecialIdentifier si = specialIdentifiers.get(lexer.stringValueUppercase());
if (si != null) {
switch(si) {
case TRUNCATE:
return truncate();
}
}
default:
throw err("unsupported DDL");
}
}
Aggregations