private DdlAlterTableStatement AlterTable(DdlAlterTableStatement stmt)
{
var options = new DdlTableOptions();
stmt.TableOptions = options;
Identifier id = null;
Identifier id2 = null;
Identifier id3 = null;
DdlColumnDefinition colDef = null;
IndexDefinition indexDef = null;
IExpression expr = null;
for (var i = 0; lexer.Token() != MySqlToken.Eof; ++i)
{
if (i > 0)
{
Match(MySqlToken.PuncComma);
}
if (TableOptions(options))
{
continue;
}
switch (lexer.Token())
{
case MySqlToken.KwConvert:
{
// | CONVERT TO CHARACTER SET charset_name [COLLATE
// collation_name]
lexer.NextToken();
Match(MySqlToken.KwTo);
Match(MySqlToken.KwCharacter);
Match(MySqlToken.KwSet);
id = Identifier();
id2 = null;
if (lexer.Token() == MySqlToken.KwCollate)
{
lexer.NextToken();
id2 = Identifier();
}
stmt.ConvertCharset = new Pair<Identifier, Identifier>(id, id2);
goto main_switch_break;
}
case MySqlToken.KwRename:
{
// | RENAME [TO] new_tbl_name
if (lexer.NextToken() == MySqlToken.KwTo)
{
lexer.NextToken();
}
id = Identifier();
stmt.RenameTo = id;
goto main_switch_break;
}
case MySqlToken.KwDrop:
{
switch (lexer.NextToken())
{
case MySqlToken.KwIndex:
case MySqlToken.KwKey:
{
// | DROP {INDEX|KEY} index_name
lexer.NextToken();
id = Identifier();
stmt.AddAlterSpecification(new DdlAlterTableStatement.DropIndex(id));
goto drop_switch_break;
}
case MySqlToken.KwPrimary:
{
// | DROP PRIMARY KEY
lexer.NextToken();
Match(MySqlToken.KwKey);
stmt.AddAlterSpecification(new DdlAlterTableStatement.DropPrimaryKey());
goto drop_switch_break;
}
case MySqlToken.Identifier:
{
// | DROP [COLUMN] col_name
id = Identifier();
stmt.AddAlterSpecification(new DdlAlterTableStatement.DropColumn(id));
goto drop_switch_break;
}
case MySqlToken.KwColumn:
{
// | DROP [COLUMN] col_name
lexer.NextToken();
id = Identifier();
stmt.AddAlterSpecification(new DdlAlterTableStatement.DropColumn(id));
goto drop_switch_break;
}
default:
{
throw new SqlSyntaxErrorException("ALTER TABLE error for DROP");
}
}
drop_switch_break:
;
goto main_switch_break;
}
case MySqlToken.KwChange:
{
// | CHANGE [COLUMN] old_col_name new_col_name column_definition
// [FIRST|AFTER col_name]
if (lexer.NextToken() == MySqlToken.KwColumn)
{
lexer.NextToken();
}
id = Identifier();
id2 = Identifier();
colDef = ColumnDefinition();
if (lexer.Token() == MySqlToken.Identifier)
{
if ("FIRST".Equals(lexer.GetStringValueUppercase()))
{
lexer.NextToken();
stmt.AddAlterSpecification(new DdlAlterTableStatement.ChangeColumn(id, id2, colDef
, null));
}
else
{
if ("AFTER".Equals(lexer.GetStringValueUppercase()))
{
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
));
}
goto main_switch_break;
}
case MySqlToken.KwAlter:
{
// | ALTER [COLUMN] col_name {SET DEFAULT literal | DROP
// DEFAULT}
if (lexer.NextToken() == MySqlToken.KwColumn)
{
lexer.NextToken();
}
id = Identifier();
switch (lexer.Token())
{
case MySqlToken.KwSet:
{
lexer.NextToken();
Match(MySqlToken.KwDefault);
expr = exprParser.Expression();
stmt.AddAlterSpecification(new DdlAlterTableStatement.AlterColumnDefaultVal(id, expr
));
break;
}
case MySqlToken.KwDrop:
{
lexer.NextToken();
Match(MySqlToken.KwDefault);
stmt.AddAlterSpecification(new DdlAlterTableStatement.AlterColumnDefaultVal(id));
break;
}
default:
{
throw new SqlSyntaxErrorException("ALTER TABLE error for ALTER");
}
}
goto main_switch_break;
}
case MySqlToken.KwAdd:
{
switch (lexer.NextToken())
{
case MySqlToken.Identifier:
{
// | ADD [COLUMN] col_name column_definition [FIRST | AFTER
// col_name ]
id = Identifier();
colDef = ColumnDefinition();
if (lexer.Token() == MySqlToken.Identifier)
{
if ("FIRST".Equals(lexer.GetStringValueUppercase()))
{
lexer.NextToken();
stmt.AddAlterSpecification(new DdlAlterTableStatement.AddColumn(id, colDef, null));
}
else
{
if ("AFTER".Equals(lexer.GetStringValueUppercase()))
{
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));
}
goto add_switch_break;
}
case MySqlToken.PuncLeftParen:
{
// | ADD [COLUMN] (col_name column_definition,...)
lexer.NextToken();
for (var j = 0; lexer.Token() != MySqlToken.PuncRightParen; ++j)
{
var addColumns = new DdlAlterTableStatement.AddColumns();
stmt.AddAlterSpecification(addColumns);
if (j > 0)
{
Match(MySqlToken.PuncComma);
}
id = Identifier();
colDef = ColumnDefinition();
addColumns.AddColumn(id, colDef);
}
Match(MySqlToken.PuncRightParen);
goto add_switch_break;
}
case MySqlToken.KwColumn:
{
if (lexer.NextToken() == MySqlToken.PuncLeftParen)
{
// | ADD [COLUMN] (col_name column_definition,...)
lexer.NextToken();
for (var j_1 = 0; lexer.Token() != MySqlToken.PuncRightParen; ++j_1)
{
var addColumns = new DdlAlterTableStatement.AddColumns();
stmt.AddAlterSpecification(addColumns);
if (j_1 > 0)
{
Match(MySqlToken.PuncComma);
}
id = Identifier();
colDef = ColumnDefinition();
addColumns.AddColumn(id, colDef);
}
Match(MySqlToken.PuncRightParen);
}
else
{
// | ADD [COLUMN] col_name column_definition [FIRST |
// AFTER col_name ]
id = Identifier();
colDef = ColumnDefinition();
if (lexer.Token() == MySqlToken.Identifier)
{
if ("FIRST".Equals(lexer.GetStringValueUppercase()))
{
lexer.NextToken();
stmt.AddAlterSpecification(new DdlAlterTableStatement.AddColumn(id, colDef,
null));
}
else
{
if ("AFTER".Equals(lexer.GetStringValueUppercase()))
{
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));
}
}
goto add_switch_break;
}
case MySqlToken.KwIndex:
case MySqlToken.KwKey:
{
// | ADD {INDEX|KEY} [index_name] [index_type]
// (index_col_name,...) [index_option] ...
id = null;
if (lexer.NextToken() == MySqlToken.Identifier)
{
id = Identifier();
}
indexDef = IndexDefinition();
stmt.AddAlterSpecification(new DdlAlterTableStatement.AddIndex(id, indexDef));
goto add_switch_break;
}
case MySqlToken.KwPrimary:
{
// | ADD PRIMARY KEY [index_type] (index_col_name,...)
// [index_option] ...
lexer.NextToken();
Match(MySqlToken.KwKey);
indexDef = IndexDefinition();
stmt.AddAlterSpecification(new DdlAlterTableStatement.AddPrimaryKey(indexDef));
goto add_switch_break;
}
case MySqlToken.KwUnique:
{
switch (lexer.NextToken())
{
case MySqlToken.KwIndex:
case MySqlToken.KwKey:
{
// | ADD UNIQUE [INDEX|KEY] [index_name] [index_type]
// (index_col_name,...) [index_option] ...
lexer.NextToken();
break;
}
}
id = null;
if (lexer.Token() == MySqlToken.Identifier)
{
id = Identifier();
}
indexDef = IndexDefinition();
stmt.AddAlterSpecification(new DdlAlterTableStatement.AddUniqueKey(id, indexDef));
goto add_switch_break;
}
case MySqlToken.KwFulltext:
{
switch (lexer.NextToken())
{
case MySqlToken.KwIndex:
case MySqlToken.KwKey:
{
// | ADD FULLTEXT [INDEX|KEY] [index_name]
// (index_col_name,...) [index_option] ...
lexer.NextToken();
break;
}
}
id = null;
if (lexer.Token() == MySqlToken.Identifier)
{
id = Identifier();
}
indexDef = IndexDefinition();
stmt.AddAlterSpecification(new DdlAlterTableStatement.AddFullTextIndex(id, indexDef
));
goto add_switch_break;
}
case MySqlToken.KwSpatial:
{
switch (lexer.NextToken())
{
case MySqlToken.KwIndex:
case MySqlToken.KwKey:
{
// | ADD SPATIAL [INDEX|KEY] [index_name]
// (index_col_name,...) [index_option] ...
lexer.NextToken();
break;
}
}
id = null;
if (lexer.Token() == MySqlToken.Identifier)
{
id = Identifier();
}
indexDef = IndexDefinition();
stmt.AddAlterSpecification(new DdlAlterTableStatement.AddSpatialIndex(id, indexDef
));
goto add_switch_break;
}
default:
{
throw new SqlSyntaxErrorException("ALTER TABLE error for ADD");
}
}
add_switch_break:
;
goto main_switch_break;
}
case MySqlToken.Identifier:
{
var si = specialIdentifiers.GetValue(lexer.GetStringValueUppercase());
if (si != SpecialIdentifier.None)
{
switch (si)
{
case SpecialIdentifier.Import:
{
// | IMPORT TABLESPACE
lexer.NextToken();
MatchIdentifier("TABLESPACE");
stmt.IsImportTableSpace = true;
goto main_switch_break;
}
case SpecialIdentifier.Discard:
{
// | DISCARD TABLESPACE
lexer.NextToken();
MatchIdentifier("TABLESPACE");
stmt.DiscardTableSpace = true;
goto main_switch_break;
}
case SpecialIdentifier.Enable:
{
// | ENABLE KEYS
lexer.NextToken();
Match(MySqlToken.KwKeys);
stmt.EnableKeys = true;
goto main_switch_break;
}
case SpecialIdentifier.Disable:
{
// | DISABLE KEYS
lexer.NextToken();
Match(MySqlToken.KwKeys);
stmt.DisableKeys = true;
goto main_switch_break;
}
case SpecialIdentifier.Modify:
{
// | MODIFY [COLUMN] col_name column_definition [FIRST |
// AFTER col_name]
if (lexer.NextToken() == MySqlToken.KwColumn)
{
lexer.NextToken();
}
id = Identifier();
colDef = ColumnDefinition();
if (lexer.Token() == MySqlToken.Identifier)
{
if ("FIRST".Equals(lexer.GetStringValueUppercase()))
{
lexer.NextToken();
stmt.AddAlterSpecification(new DdlAlterTableStatement.ModifyColumn(id,
colDef, null
));
}
else
{
if ("AFTER".Equals(lexer.GetStringValueUppercase()))
{
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));
}
goto main_switch_break;
}
}
}
goto default;
}
default:
{
throw new SqlSyntaxErrorException("unknown ALTER specification");
}
}
main_switch_break:
;
}
return stmt;
}