private ExpressionNode ParseAggregateArgument(FunctionId aggregate)
{
Debug.Assert(_token == Tokens.LeftParen, "ParseAggregateArgument(): Invalid argument, token <> '('");
bool child;
string relname;
string colname;
Scan();
try
{
if (_token != Tokens.Child)
{
if (_token != Tokens.Name)
throw ExprException.AggregateArgument();
colname = NameNode.ParseName(_text, _start, _pos);
ScanToken(Tokens.RightParen);
return new AggregateNode(_table, aggregate, colname);
}
child = (_token == Tokens.Child);
_prevOperand = Scalar;
// expecting an '(' or '.'
Scan();
if (_token == Tokens.LeftParen)
{
//read the relation name
ScanToken(Tokens.Name);
relname = NameNode.ParseName(_text, _start, _pos);
ScanToken(Tokens.RightParen);
ScanToken(Tokens.Dot);
}
else
{
relname = null;
CheckToken(Tokens.Dot);
}
ScanToken(Tokens.Name);
colname = NameNode.ParseName(_text, _start, _pos);
ScanToken(Tokens.RightParen);
}
catch (Exception e) when (Common.ADP.IsCatchableExceptionType(e))
{
throw ExprException.AggregateArgument();
}
return new AggregateNode(_table, aggregate, colname, !child, relname);
}