private Pair<string, Pair<IExpression, IExpression>> Type4specialFunc()
{
IExpression exp1 = null;
IExpression exp2 = null;
// DATE
// DATETIME
// SIGNED [INTEGER]
// TIME
string typeName;
switch (lexer.Token())
{
case MySqlToken.KwBinary:
case MySqlToken.KwChar:
{
typeName = lexer.Token().KeyWordToString();
if (lexer.NextToken() == MySqlToken.PuncLeftParen)
{
lexer.NextToken();
exp1 = Expression();
Match(MySqlToken.PuncRightParen);
}
return ConstructTypePair(typeName, exp1, exp2);
}
case MySqlToken.KwDecimal:
{
typeName = lexer.Token().KeyWordToString();
if (lexer.NextToken() == MySqlToken.PuncLeftParen)
{
lexer.NextToken();
exp1 = Expression();
if (lexer.Token() == MySqlToken.PuncComma)
{
lexer.NextToken();
exp2 = Expression();
}
Match(MySqlToken.PuncRightParen);
}
return ConstructTypePair(typeName, exp1, exp2);
}
case MySqlToken.KwUnsigned:
{
typeName = lexer.Token().KeyWordToString();
if (lexer.NextToken() == MySqlToken.KwInteger)
{
lexer.NextToken();
}
return ConstructTypePair(typeName, null, null);
}
case MySqlToken.Identifier:
{
typeName = lexer.GetStringValueUppercase();
lexer.NextToken();
if ("SIGNED".Equals(typeName))
{
if (lexer.Token() == MySqlToken.KwInteger)
{
lexer.NextToken();
}
}
else
{
if (!"DATE".Equals(typeName) && !"DATETIME".Equals(typeName) && !"TIME".Equals(typeName))
{
throw Err("invalide type name: " + typeName);
}
}
return ConstructTypePair(typeName, null, null);
}
default:
{
throw Err("invalide type name: " + lexer.GetStringValueUppercase());
}
}
}