internal override ExpressionNode Optimize()
{
_left = _left.Optimize();
if (_op == Operators.Is)
{
// only 'Is Null' or 'Is Not Null' are valid
if (_right is UnaryNode)
{
UnaryNode un = (UnaryNode)_right;
if (un._op != Operators.Not)
{
throw ExprException.InvalidIsSyntax();
}
_op = Operators.IsNot;
_right = un._right;
}
if (_right is ZeroOpNode)
{
if (((ZeroOpNode)_right)._op != Operators.Null)
{
throw ExprException.InvalidIsSyntax();
}
}
else
{
throw ExprException.InvalidIsSyntax();
}
}
else
{
_right = _right.Optimize();
}
if (IsConstant())
{
object val = Eval();
if (val == DBNull.Value)
{
return new ZeroOpNode(Operators.Null);
}
if (val is bool)
{
if ((bool)val)
return new ZeroOpNode(Operators.True);
else
return new ZeroOpNode(Operators.False);
}
return new ConstNode(table, ValueType.Object, val, false);
}
else
return this;
}