private DdlDatatype DataType()
{
var typeName = DataTypeName.None;
var unsigned = false;
var zerofill = false;
var binary = false;
IExpression length = null;
IExpression decimals = null;
Identifier charSet = null;
Identifier collation = null;
IList<IExpression> collectionVals = null;
switch (lexer.Token())
{
case MySqlToken.KwTinyint:
{
// | TINYINT[(length)] [UNSIGNED] [ZEROFILL]
typeName = DataTypeName.Tinyint;
if (lexer.NextToken() == MySqlToken.PuncLeftParen)
{
lexer.NextToken();
length = exprParser.Expression();
Match(MySqlToken.PuncRightParen);
}
if (lexer.Token() == MySqlToken.KwUnsigned)
{
unsigned = true;
lexer.NextToken();
}
if (lexer.Token() == MySqlToken.KwZerofill)
{
zerofill = true;
lexer.NextToken();
}
goto typeName_break;
}
case MySqlToken.KwSmallint:
{
// | SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
typeName = DataTypeName.Smallint;
if (lexer.NextToken() == MySqlToken.PuncLeftParen)
{
lexer.NextToken();
length = exprParser.Expression();
Match(MySqlToken.PuncRightParen);
}
if (lexer.Token() == MySqlToken.KwUnsigned)
{
unsigned = true;
lexer.NextToken();
}
if (lexer.Token() == MySqlToken.KwZerofill)
{
zerofill = true;
lexer.NextToken();
}
goto typeName_break;
}
case MySqlToken.KwMediumint:
{
// | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
typeName = DataTypeName.Mediumint;
if (lexer.NextToken() == MySqlToken.PuncLeftParen)
{
lexer.NextToken();
length = exprParser.Expression();
Match(MySqlToken.PuncRightParen);
}
if (lexer.Token() == MySqlToken.KwUnsigned)
{
unsigned = true;
lexer.NextToken();
}
if (lexer.Token() == MySqlToken.KwZerofill)
{
zerofill = true;
lexer.NextToken();
}
goto typeName_break;
}
case MySqlToken.KwInteger:
case MySqlToken.KwInt:
{
// | INT[(length)] [UNSIGNED] [ZEROFILL]
// | INTEGER[(length)] [UNSIGNED] [ZEROFILL]
typeName = DataTypeName.Int;
if (lexer.NextToken() == MySqlToken.PuncLeftParen)
{
lexer.NextToken();
length = exprParser.Expression();
Match(MySqlToken.PuncRightParen);
}
if (lexer.Token() == MySqlToken.KwUnsigned)
{
unsigned = true;
lexer.NextToken();
}
if (lexer.Token() == MySqlToken.KwZerofill)
{
zerofill = true;
lexer.NextToken();
}
goto typeName_break;
}
case MySqlToken.KwBigint:
{
// | BIGINT[(length)] [UNSIGNED] [ZEROFILL]
typeName = DataTypeName.Bigint;
if (lexer.NextToken() == MySqlToken.PuncLeftParen)
{
lexer.NextToken();
length = exprParser.Expression();
Match(MySqlToken.PuncRightParen);
}
if (lexer.Token() == MySqlToken.KwUnsigned)
{
unsigned = true;
lexer.NextToken();
}
if (lexer.Token() == MySqlToken.KwZerofill)
{
zerofill = true;
lexer.NextToken();
}
goto typeName_break;
}
case MySqlToken.KwReal:
{
// | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
typeName = DataTypeName.Real;
if (lexer.NextToken() == MySqlToken.PuncLeftParen)
{
lexer.NextToken();
length = exprParser.Expression();
Match(MySqlToken.PuncComma);
decimals = exprParser.Expression();
Match(MySqlToken.PuncRightParen);
}
if (lexer.Token() == MySqlToken.KwUnsigned)
{
unsigned = true;
lexer.NextToken();
}
if (lexer.Token() == MySqlToken.KwZerofill)
{
zerofill = true;
lexer.NextToken();
}
goto typeName_break;
}
case MySqlToken.KwDouble:
{
// | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
typeName = DataTypeName.Double;
if (lexer.NextToken() == MySqlToken.PuncLeftParen)
{
lexer.NextToken();
length = exprParser.Expression();
Match(MySqlToken.PuncComma);
decimals = exprParser.Expression();
Match(MySqlToken.PuncRightParen);
}
if (lexer.Token() == MySqlToken.KwUnsigned)
{
unsigned = true;
lexer.NextToken();
}
if (lexer.Token() == MySqlToken.KwZerofill)
{
zerofill = true;
lexer.NextToken();
}
goto typeName_break;
}
case MySqlToken.KwFloat:
{
// | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
typeName = DataTypeName.Float;
if (lexer.NextToken() == MySqlToken.PuncLeftParen)
{
lexer.NextToken();
length = exprParser.Expression();
Match(MySqlToken.PuncComma);
decimals = exprParser.Expression();
Match(MySqlToken.PuncRightParen);
}
if (lexer.Token() == MySqlToken.KwUnsigned)
{
unsigned = true;
lexer.NextToken();
}
if (lexer.Token() == MySqlToken.KwZerofill)
{
zerofill = true;
lexer.NextToken();
}
goto typeName_break;
}
case MySqlToken.KwNumeric:
case MySqlToken.KwDecimal:
case MySqlToken.KwDec:
{
// | DECIMAL[(length[,decimals])] [UNSIGNED] [ZEROFILL]
// | NUMERIC[(length[,decimals])] [UNSIGNED] [ZEROFILL]
typeName = DataTypeName.Decimal;
if (lexer.NextToken() == MySqlToken.PuncLeftParen)
{
lexer.NextToken();
length = exprParser.Expression();
if (lexer.Token() == MySqlToken.PuncComma)
{
Match(MySqlToken.PuncComma);
decimals = exprParser.Expression();
}
Match(MySqlToken.PuncRightParen);
}
if (lexer.Token() == MySqlToken.KwUnsigned)
{
unsigned = true;
lexer.NextToken();
}
if (lexer.Token() == MySqlToken.KwZerofill)
{
zerofill = true;
lexer.NextToken();
}
goto typeName_break;
}
case MySqlToken.KwChar:
{
// | CHAR[(length)] [CHARACTER SET charset_name] [COLLATE
// collation_name]
typeName = DataTypeName.Char;
if (lexer.NextToken() == MySqlToken.PuncLeftParen)
{
lexer.NextToken();
length = exprParser.Expression();
Match(MySqlToken.PuncRightParen);
}
if (lexer.Token() == MySqlToken.KwCharacter)
{
lexer.NextToken();
Match(MySqlToken.KwSet);
charSet = Identifier();
}
if (lexer.Token() == MySqlToken.KwCollate)
{
lexer.NextToken();
collation = Identifier();
}
goto typeName_break;
}
case MySqlToken.KwVarchar:
{
// | VARCHAR(length) [CHARACTER SET charset_name] [COLLATE
// collation_name]
typeName = DataTypeName.Varchar;
lexer.NextToken();
Match(MySqlToken.PuncLeftParen);
length = exprParser.Expression();
Match(MySqlToken.PuncRightParen);
if (lexer.Token() == MySqlToken.KwCharacter)
{
lexer.NextToken();
Match(MySqlToken.KwSet);
charSet = Identifier();
}
if (lexer.Token() == MySqlToken.KwCollate)
{
lexer.NextToken();
collation = Identifier();
}
goto typeName_break;
}
case MySqlToken.KwBinary:
{
// | BINARY[(length)]
typeName = DataTypeName.Binary;
if (lexer.NextToken() == MySqlToken.PuncLeftParen)
{
lexer.NextToken();
length = exprParser.Expression();
Match(MySqlToken.PuncRightParen);
}
goto typeName_break;
}
case MySqlToken.KwVarbinary:
{
// | VARBINARY(length)
typeName = DataTypeName.Varbinary;
lexer.NextToken();
Match(MySqlToken.PuncLeftParen);
length = exprParser.Expression();
Match(MySqlToken.PuncRightParen);
goto typeName_break;
}
case MySqlToken.KwTinyblob:
{
typeName = DataTypeName.Tinyblob;
lexer.NextToken();
goto typeName_break;
}
case MySqlToken.KwBlob:
{
typeName = DataTypeName.Blob;
lexer.NextToken();
goto typeName_break;
}
case MySqlToken.KwMediumblob:
{
typeName = DataTypeName.Mediumblob;
lexer.NextToken();
goto typeName_break;
}
case MySqlToken.KwLongblob:
{
typeName = DataTypeName.Longblob;
lexer.NextToken();
goto typeName_break;
}
case MySqlToken.KwTinytext:
{
// | TINYTEXT [BINARY] [CHARACTER SET charset_name] [COLLATE
// collation_name]
typeName = DataTypeName.Tinytext;
if (lexer.NextToken() == MySqlToken.KwBinary)
{
lexer.NextToken();
binary = true;
}
if (lexer.Token() == MySqlToken.KwCharacter)
{
lexer.NextToken();
Match(MySqlToken.KwSet);
charSet = Identifier();
}
if (lexer.Token() == MySqlToken.KwCollate)
{
lexer.NextToken();
collation = Identifier();
}
goto typeName_break;
}
case MySqlToken.KwMediumtext:
{
// | MEDIUMTEXT [BINARY] [CHARACTER SET charset_name] [COLLATE
// collation_name]
typeName = DataTypeName.Mediumtext;
if (lexer.NextToken() == MySqlToken.KwBinary)
{
lexer.NextToken();
binary = true;
}
if (lexer.Token() == MySqlToken.KwCharacter)
{
lexer.NextToken();
Match(MySqlToken.KwSet);
charSet = Identifier();
}
if (lexer.Token() == MySqlToken.KwCollate)
{
lexer.NextToken();
collation = Identifier();
}
goto typeName_break;
}
case MySqlToken.KwLongtext:
{
// | LONGTEXT [BINARY] [CHARACTER SET charset_name] [COLLATE
// collation_name]
typeName = DataTypeName.Longtext;
if (lexer.NextToken() == MySqlToken.KwBinary)
{
lexer.NextToken();
binary = true;
}
if (lexer.Token() == MySqlToken.KwCharacter)
{
lexer.NextToken();
Match(MySqlToken.KwSet);
charSet = Identifier();
}
if (lexer.Token() == MySqlToken.KwCollate)
{
lexer.NextToken();
collation = Identifier();
}
goto typeName_break;
}
case MySqlToken.KwSet:
{
// | SET(value1,value2,value3,...) [CHARACTER SET charset_name]
// [COLLATE collation_name]
typeName = DataTypeName.Set;
lexer.NextToken();
Match(MySqlToken.PuncLeftParen);
for (var i = 0; lexer.Token() != MySqlToken.PuncRightParen; ++i)
{
if (i > 0)
{
Match(MySqlToken.PuncComma);
}
else
{
collectionVals = new List<IExpression>(2);
}
collectionVals.Add(exprParser.Expression());
}
Match(MySqlToken.PuncRightParen);
if (lexer.Token() == MySqlToken.KwCharacter)
{
lexer.NextToken();
Match(MySqlToken.KwSet);
charSet = Identifier();
}
if (lexer.Token() == MySqlToken.KwCollate)
{
lexer.NextToken();
collation = Identifier();
}
goto typeName_break;
}
case MySqlToken.Identifier:
{
var si = specialIdentifiers.GetValue(lexer.GetStringValueUppercase());
if (si != SpecialIdentifier.None)
{
switch (si)
{
case SpecialIdentifier.Bit:
{
// BIT[(length)]
typeName = DataTypeName.Bit;
if (lexer.NextToken() == MySqlToken.PuncLeftParen)
{
lexer.NextToken();
length = exprParser.Expression();
Match(MySqlToken.PuncRightParen);
}
goto typeName_break;
}
case SpecialIdentifier.Date:
{
typeName = DataTypeName.Date;
lexer.NextToken();
goto typeName_break;
}
case SpecialIdentifier.Time:
{
typeName = DataTypeName.Time;
lexer.NextToken();
goto typeName_break;
}
case SpecialIdentifier.Timestamp:
{
typeName = DataTypeName.Timestamp;
lexer.NextToken();
goto typeName_break;
}
case SpecialIdentifier.Datetime:
{
typeName = DataTypeName.Datetime;
lexer.NextToken();
goto typeName_break;
}
case SpecialIdentifier.Year:
{
typeName = DataTypeName.Year;
lexer.NextToken();
goto typeName_break;
}
case SpecialIdentifier.Text:
{
// | TEXT [BINARY] [CHARACTER SET charset_name] [COLLATE
// collation_name]
typeName = DataTypeName.Text;
if (lexer.NextToken() == MySqlToken.KwBinary)
{
lexer.NextToken();
binary = true;
}
if (lexer.Token() == MySqlToken.KwCharacter)
{
lexer.NextToken();
Match(MySqlToken.KwSet);
charSet = Identifier();
}
if (lexer.Token() == MySqlToken.KwCollate)
{
lexer.NextToken();
collation = Identifier();
}
goto typeName_break;
}
case SpecialIdentifier.Enum:
{
// | ENUM(value1,value2,value3,...) [CHARACTER SET
// charset_name] [COLLATE collation_name]
typeName = DataTypeName.Enum;
lexer.NextToken();
Match(MySqlToken.PuncLeftParen);
for (var i_1 = 0; lexer.Token() != MySqlToken.PuncRightParen; ++i_1)
{
if (i_1 > 0)
{
Match(MySqlToken.PuncComma);
}
else
{
collectionVals = new List<IExpression>(2);
}
collectionVals.Add(exprParser.Expression());
}
Match(MySqlToken.PuncRightParen);
if (lexer.Token() == MySqlToken.KwCharacter)
{
lexer.NextToken();
Match(MySqlToken.KwSet);
charSet = Identifier();
}
if (lexer.Token() == MySqlToken.KwCollate)
{
lexer.NextToken();
collation = Identifier();
}
goto typeName_break;
}
}
}
goto default;
}
default:
{
return null;
}
}
typeName_break:
;
return new DdlDatatype(typeName, unsigned
, zerofill, binary, length, decimals, charSet, collation, collectionVals);
}