public void Optimize_PositiveNumber()
        {
            var ast = new SqlPrefixOperationNode
            {
                Operator = new SqlOperatorNode("+"),
                Right    = new SqlNumberNode(5)
            };

            var target = new ExpressionOptimizeVisitor();
            var result = target.Visit(ast);

            result.Should().MatchAst(new SqlNumberNode(5));
        }
        public void Optimize_ConstantStringConcat()
        {
            // "A" + "B" => "AB"
            var ast = new SqlInfixOperationNode
            {
                Left     = new SqlStringNode("A"),
                Operator = new SqlOperatorNode("+"),
                Right    = new SqlStringNode("B")
            };

            var target = new ExpressionOptimizeVisitor();
            var result = target.Visit(ast);

            result.Should().MatchAst(new SqlStringNode("AB"));
        }
        public void Optimize_CastStringToNumeric()
        {
            // CAST("123.45" as NUMERIC) => 123.45M
            var ast = new SqlCastNode
            {
                Expression = new SqlStringNode("123.45"),
                DataType   = new SqlDataTypeNode
                {
                    DataType = new SqlKeywordNode("NUMERIC")
                }
            };

            var target = new ExpressionOptimizeVisitor();
            var result = target.Visit(ast);

            result.Should().MatchAst(new SqlNumberNode(123.45M));
        }
        public void Optimize_CastStringToBigint()
        {
            // CAST("12345" as BIGINT) => 12345L
            var ast = new SqlCastNode
            {
                Expression = new SqlStringNode("12345"),
                DataType   = new SqlDataTypeNode
                {
                    DataType = new SqlKeywordNode("BIGINT")
                }
            };

            var target = new ExpressionOptimizeVisitor();
            var result = target.Visit(ast);

            result.Should().MatchAst(new SqlNumberNode(12345L));
        }
        public void Optimize_CastNumberToVarcharMax()
        {
            // CAST(5 as VARCHAR(MAX)) => "5"
            var ast = new SqlCastNode
            {
                Expression = new SqlNumberNode(5),
                DataType   = new SqlDataTypeNode
                {
                    DataType = new SqlKeywordNode("VARCHAR"),
                    Size     = new SqlKeywordNode("MAX")
                }
            };

            var target = new ExpressionOptimizeVisitor();
            var result = target.Visit(ast);

            result.Should().MatchAst(new SqlStringNode("5"));
        }
        public void Optimize_CastStringToVarcharNoPadRight()
        {
            // CAST("12345" as VARCHAR(3)) => "123"
            var ast = new SqlCastNode
            {
                Expression = new SqlStringNode("ab"),
                DataType   = new SqlDataTypeNode
                {
                    DataType = new SqlKeywordNode("VARCHAR"),
                    Size     = new SqlNumberNode(4)
                }
            };

            var target = new ExpressionOptimizeVisitor();
            var result = target.Visit(ast);

            result.Should().MatchAst(new SqlStringNode("ab"));
        }
        public void Optimize_AdditionMultiplicationConstants()
        {
            // 1 + 2 * 3 => 7
            var ast = new SqlInfixOperationNode
            {
                Left     = new SqlNumberNode(1),
                Operator = new SqlOperatorNode("+"),
                Right    = new SqlInfixOperationNode
                {
                    Left     = new SqlNumberNode(2),
                    Operator = new SqlOperatorNode("*"),
                    Right    = new SqlNumberNode(3)
                }
            };

            var target = new ExpressionOptimizeVisitor();
            var result = target.Visit(ast);

            result.Should().MatchAst(new SqlNumberNode(7));
        }