private bool TableOption(DdlTableOptions options)
{
Identifier id = null;
IExpression expr = null;
switch (lexer.Token())
{
case MySqlToken.KwCharacter:
{
lexer.NextToken();
Match(MySqlToken.KwSet);
if (lexer.Token() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
id = Identifier();
options.CharSet = id;
break;
}
case MySqlToken.KwCollate:
{
lexer.NextToken();
if (lexer.Token() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
id = Identifier();
options.Collation = id;
break;
}
case MySqlToken.KwDefault:
{
switch (lexer.NextToken())
{
case MySqlToken.KwCharacter:
{
// | [DEFAULT] CHARSET [=] charset_name { MySql 5.1 legacy}
// | [DEFAULT] CHARACTER SET [=] charset_name
// | [DEFAULT] COLLATE [=] collation_name
lexer.NextToken();
Match(MySqlToken.KwSet);
if (lexer.Token() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
id = Identifier();
options.CharSet = id;
goto os_break;
}
case MySqlToken.KwCollate:
{
lexer.NextToken();
if (lexer.Token() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
id = Identifier();
options.Collation = id;
goto os_break;
}
case MySqlToken.Identifier:
{
var si = specialIdentifiers.GetValue(lexer.GetStringValueUppercase());
if (si != SpecialIdentifier.None)
{
switch (si)
{
case SpecialIdentifier.Charset:
{
lexer.NextToken();
if (lexer.Token() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
id = Identifier();
options.CharSet = id;
goto os_break;
}
}
}
goto default;
}
default:
{
lexer.AddCacheToke(MySqlToken.KwDefault);
return false;
}
}
//goto case MySqlToken.KwIndex;
}
case MySqlToken.KwIndex:
{
// | INDEX DIRECTORY [=] 'absolute path to directory'
lexer.NextToken();
if (lexer.Token() == MySqlToken.Identifier && "DIRECTORY".Equals(lexer.GetStringValueUppercase()))
{
if (lexer.NextToken() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
options.IndexDir = (LiteralString)exprParser.Expression();
break;
}
lexer.AddCacheToke(MySqlToken.KwIndex);
return true;
}
case MySqlToken.KwUnion:
{
// | UNION [=] (tbl_name[,tbl_name]...)
if (lexer.NextToken() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
Match(MySqlToken.PuncLeftParen);
IList<Identifier> union = new List<Identifier>(2);
for (var j = 0; lexer.Token() != MySqlToken.PuncRightParen; ++j)
{
if (j > 0)
{
Match(MySqlToken.PuncComma);
}
id = Identifier();
union.Add(id);
}
Match(MySqlToken.PuncRightParen);
options.Union = union;
goto os_break;
}
case MySqlToken.Identifier:
{
var si_1 = specialIdentifiers.GetValue(lexer.GetStringValueUppercase());
if (si_1 != SpecialIdentifier.None)
{
switch (si_1)
{
case SpecialIdentifier.Charset:
{
// CHARSET [=] charset_name
lexer.NextToken();
if (lexer.Token() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
id = Identifier();
options.CharSet = id;
goto os_break;
}
case SpecialIdentifier.Engine:
{
// ENGINE [=] engine_name
if (lexer.NextToken() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
id = Identifier();
options.Engine = id;
goto os_break;
}
case SpecialIdentifier.AutoIncrement:
{
// | AUTO_INCREMENT [=] value
if (lexer.NextToken() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
expr = exprParser.Expression();
options.AutoIncrement = expr;
goto os_break;
}
case SpecialIdentifier.AvgRowLength:
{
// | AVG_ROW_LENGTH [=] value
if (lexer.NextToken() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
expr = exprParser.Expression();
options.AvgRowLength = expr;
goto os_break;
}
case SpecialIdentifier.Checksum:
{
// | CHECKSUM [=] {0 | 1}
if (lexer.NextToken() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
switch (lexer.Token())
{
case MySqlToken.LiteralBoolFalse:
{
lexer.NextToken();
options.CheckSum = false;
goto case MySqlToken.LiteralBoolTrue;
}
case MySqlToken.LiteralBoolTrue:
{
lexer.NextToken();
options.CheckSum = true;
break;
}
case MySqlToken.LiteralNumPureDigit:
{
var intVal = (int)lexer.GetIntegerValue();
lexer.NextToken();
if (intVal == 0)
{
options.CheckSum = false;
}
else
{
options.CheckSum = true;
}
break;
}
default:
{
throw new SqlSyntaxErrorException("table option of CHECKSUM error");
}
}
goto os_break;
}
case SpecialIdentifier.DelayKeyWrite:
{
// | DELAY_KEY_WRITE [=] {0 | 1}
if (lexer.NextToken() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
switch (lexer.Token())
{
case MySqlToken.LiteralBoolFalse:
{
lexer.NextToken();
options.DelayKeyWrite = false;
goto case MySqlToken.LiteralBoolTrue;
}
case MySqlToken.LiteralBoolTrue:
{
lexer.NextToken();
options.DelayKeyWrite = true;
break;
}
case MySqlToken.LiteralNumPureDigit:
{
var intVal_1 = (int)lexer.GetIntegerValue();
lexer.NextToken();
if (intVal_1 == 0)
{
options.DelayKeyWrite = false;
}
else
{
options.DelayKeyWrite = true;
}
break;
}
default:
{
throw new SqlSyntaxErrorException("table option of DELAY_KEY_WRITE error");
}
}
goto os_break;
}
case SpecialIdentifier.Comment:
{
// | COMMENT [=] 'string'
if (lexer.NextToken() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
options.Comment = (LiteralString)exprParser.Expression();
goto os_break;
}
case SpecialIdentifier.Connection:
{
// | CONNECTION [=] 'connect_string'
if (lexer.NextToken() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
options.Connection = (LiteralString)exprParser.Expression();
goto os_break;
}
case SpecialIdentifier.Data:
{
// | DATA DIRECTORY [=] 'absolute path to directory'
lexer.NextToken();
MatchIdentifier("DIRECTORY");
if (lexer.Token() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
options.DataDir = (LiteralString)exprParser.Expression();
goto os_break;
}
case SpecialIdentifier.InsertMethod:
{
// | INSERT_METHOD [=] { NO | FIRST | LAST }
if (lexer.NextToken() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
switch (MatchIdentifier("NO", "FIRST", "LAST"))
{
case 0:
{
options.InsertMethod = InsertMethod.No;
break;
}
case 1:
{
options.InsertMethod = InsertMethod.First;
break;
}
case 2:
{
options.InsertMethod = InsertMethod.Last;
break;
}
}
goto os_break;
}
case SpecialIdentifier.KeyBlockSize:
{
// | KEY_BLOCK_SIZE [=] value
if (lexer.NextToken() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
options.KeyBlockSize = exprParser.Expression();
goto os_break;
}
case SpecialIdentifier.MaxRows:
{
// | MAX_ROWS [=] value
if (lexer.NextToken() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
options.MaxRows = exprParser.Expression();
goto os_break;
}
case SpecialIdentifier.MinRows:
{
// | MIN_ROWS [=] value
if (lexer.NextToken() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
options.MinRows = exprParser.Expression();
goto os_break;
}
case SpecialIdentifier.PackKeys:
{
// | PACK_KEYS [=] {0 | 1 | DEFAULT}
if (lexer.NextToken() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
switch (lexer.Token())
{
case MySqlToken.LiteralBoolFalse:
{
lexer.NextToken();
options.PackKeys = PackKeys.False;
break;
}
case MySqlToken.LiteralBoolTrue:
{
lexer.NextToken();
options.PackKeys = PackKeys.True;
break;
}
case MySqlToken.LiteralNumPureDigit:
{
var intVal_2 = (int)lexer.GetIntegerValue();
lexer.NextToken();
if (intVal_2 == 0)
{
options.PackKeys = PackKeys.False;
}
else
{
options.PackKeys = PackKeys.True;
}
break;
}
case MySqlToken.KwDefault:
{
lexer.NextToken();
options.PackKeys = PackKeys.Default;
break;
}
default:
{
throw new SqlSyntaxErrorException("table option of PACK_KEYS error");
}
}
goto os_break;
}
case SpecialIdentifier.Password:
{
// | PASSWORD [=] 'string'
if (lexer.NextToken() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
options.Password = (LiteralString)exprParser.Expression();
goto os_break;
}
case SpecialIdentifier.RowFormat:
{
// | ROW_FORMAT [=]
// {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
if (lexer.NextToken() == MySqlToken.OpEquals)
{
lexer.NextToken();
}
switch (lexer.Token())
{
case MySqlToken.KwDefault:
{
lexer.NextToken();
options.RowFormat = RowFormat.Default;
goto os_break;
}
case MySqlToken.Identifier:
{
var sid = specialIdentifiers.GetValue(lexer.GetStringValueUppercase());
if (sid != SpecialIdentifier.None)
{
switch (sid)
{
case SpecialIdentifier.Dynamic:
{
lexer.NextToken();
options.RowFormat = RowFormat.Dynamic;
goto os_break;
}
case SpecialIdentifier.Fixed:
{
lexer.NextToken();
options.RowFormat = RowFormat.Fixed;
goto os_break;
}
case SpecialIdentifier.Compressed:
{
lexer.NextToken();
options.RowFormat = RowFormat.Compressed;
goto os_break;
}
case SpecialIdentifier.Redundant:
{
lexer.NextToken();
options.RowFormat = RowFormat.Redundant;
goto os_break;
}
case SpecialIdentifier.Compact:
{
lexer.NextToken();
options.RowFormat = RowFormat.Compact;
goto os_break;
}
}
}
goto default;
}
default:
{
throw new SqlSyntaxErrorException("table option of ROW_FORMAT error");
}
}
//break;
}
}
}
goto default;
}
default:
{
return false;
}
}
os_break:
;
return true;
}