Inheritance: MySqlParser
 public virtual void TestAnyAll()
 {
     var sql = "1 >= any (select id from t1 limit 1)";
     var parser = new MySqlExprParser(new MySqlLexer(sql));
     var expr = parser.Expression();
     var output = Output2MySql(expr, sql);
     Assert.AreEqual("1 >= ANY (SELECT id FROM t1 LIMIT 0, 1)", output);
     Assert.AreEqual(typeof (ComparisionGreaterThanOrEqualsExpression),
         expr.GetType());
     sql =
         "1 >= any (select id from t1 limit 1) > aLl(select tb1.id from tb1 t1,tb2 as t2 where t1.id=t2.id limit 1)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual(
         "1 >= ANY (SELECT id FROM t1 LIMIT 0, 1) > ALL (SELECT tb1.id FROM tb1 AS T1, tb2 AS T2 WHERE t1.id = t2.id LIMIT 0, 1)",
         output);
     var gt = (ComparisionGreaterThanExpression)expr;
     var ge = (ComparisionGreaterThanOrEqualsExpression)gt.LeftOprand;
     Assert.AreEqual(typeof (LiteralNumber), ge.LeftOprand.GetType());
     sql = "1 >= any + any";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("1 >= any + any", output);
 }
        //[Test]
        //public virtual void TestMain()
        //{
        //    Main(null);
        //    Assert.IsTrue(true);
        //}
        /// <exception cref="System.Exception" />
        public static void Main(string[] ars)
        {
            var sql = Performance.SqlBenchmarkSelect;
            for (var i = 0; i < 3; ++i)
            {
                var lexer = new MySqlLexer(sql);
                var exprParser = new MySqlExprParser(lexer);
                var parser = new MySqlDmlSelectParser(lexer, exprParser);
                IQueryExpression stmt = parser.Select();
            }

            // System.out.println(stmt);
            Thread.Sleep(1000);
            long loop = 300*10000;
            var t1 = Runtime.CurrentTimeMillis();
            t1 = Runtime.CurrentTimeMillis();
            for (long i_1 = 0; i_1 < loop; ++i_1)
            {
                var lexer = new MySqlLexer(sql);
                var exprParser = new MySqlExprParser(lexer);
                var parser = new MySqlDmlSelectParser(lexer, exprParser);
                IQueryExpression stmt = parser.Select();
            }
            var t2 = Runtime.CurrentTimeMillis();
            Console.Out.WriteLine((t2 - t1)*1000.0d/loop + " us");
        }
 /// <exception cref="System.SqlSyntaxErrorException" />
 public static void InitRouteRule(ISchemaLoader loader)
 {
     var functions = loader.Functions;
     var functionManager = new MySqlFunctionManager(true);
     BuildFuncManager(functionManager, functions);
     foreach (var conf in loader.RuleConfigList)
     {
         var algorithmString = conf.Algorithm;
         var lexer = new MySqlLexer(algorithmString);
         var parser = new MySqlExprParser(lexer, functionManager, false, MySqlParser.DefaultCharset);
         var expression = parser.Expression();
         if (lexer.Token() != MySqlToken.Eof)
         {
             throw new ConfigException("route algorithm not end with EOF: " + algorithmString);
         }
         IRuleAlgorithm algorithm;
         if (expression is IRuleAlgorithm)
         {
             algorithm = (IRuleAlgorithm)expression;
         }
         else
         {
             algorithm = new ExpressionAdapter(expression);
         }
         conf.RuleAlgorithm = algorithm;
     }
 }
 public virtual void TestArithmetic()
 {
     var sql = "? + @usrVar1 * c/@@version- e % -f diV g";
     var parser = new MySqlExprParser(new MySqlLexer(sql));
     var expr = parser.Expression();
     var output = Output2MySql(expr, sql);
     Assert.AreEqual("? + @usrVar1 * c / @@version - e % - f DIV g", output);
     var sub = (ArithmeticSubtractExpression)expr;
     var add = (ArithmeticAddExpression)sub.LeftOprand;
     var idiv = (ArithmeticIntegerDivideExpression)sub.RightOprand;
     var mod = (ArithmeticModExpression)idiv.LeftOprand;
     var div = (ArithmeticDivideExpression)add.RightOprand;
     var mt = (ArithmeticMultiplyExpression)div.LeftOprand;
     var mi = (MinusExpression)mod.RightOprand;
     Assert.AreEqual("c", ((Identifier)mt.RightOprand).IdText);
     Assert.AreEqual("f", ((Identifier)mi.Operand).IdText);
     sql = "a+-b";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a + - b", output);
     sql = "a+--b";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a + - - b", output);
     sql = "a++b";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a + b", output);
     sql = "a+++b";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a + b", output);
     sql = "a++-b";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a + - b", output);
     sql = "a + b mod (-((select id from t1 limit 1)- e) ) ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a + b % - ((SELECT id FROM t1 LIMIT 0, 1) - e)",
         output);
     add = (ArithmeticAddExpression)expr;
     mod = (ArithmeticModExpression)add.RightOprand;
     mi = (MinusExpression)mod.RightOprand;
     sub = (ArithmeticSubtractExpression)mi.Operand;
     Assert.IsTrue(typeof (IQueryExpression).IsAssignableFrom(sub.LeftOprand.GetType()));
     Assert.AreEqual("e", ((Identifier)sub.RightOprand).IdText);
 }
 public MySqlDmlInsertParser(MySqlLexer lexer, MySqlExprParser exprParser)
     : base(lexer, exprParser)
 {
 }
 public virtual void TestExpr1()
 {
     var sql = "\"abc\" /* */  '\\'s' + id2/ id3, 123-456*(ii moD d)";
     var lexer = new MySqlLexer(sql);
     var parser = new MySqlExprParser(lexer);
     var expr = parser.Expression();
     var output = Output2MySql(expr, sql);
     Assert.AreEqual("'abc\\'s' + id2 / id3", output);
     Assert.AreEqual(typeof (ArithmeticAddExpression), expr.GetType());
     var bex = (BinaryOperatorExpression)((ArithmeticAddExpression)expr).RightOprand;
     Assert.AreEqual(typeof (ArithmeticDivideExpression), bex.GetType());
     Assert.AreEqual(typeof (Identifier), bex.RightOprand.GetType());
     lexer.NextToken();
     parser = new MySqlExprParser(lexer);
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("123 - 456 * (ii % d)", output);
     Assert.AreEqual(typeof (ArithmeticSubtractExpression), expr.GetType());
     sql = "(n'\"abc\"' \"abc\" /* */  '\\'s' + 1.123e1/ id3)*(.1e3-a||b)mod x'abc'&&(select 0b1001^b'0000')";
     lexer = new MySqlLexer(sql);
     parser = new MySqlExprParser(lexer);
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual(
         "(N'\"abc\"abc\\'s' + 11.23 / id3) * (1E+2 - a OR b) % x'abc' AND (SELECT b'1001' ^ b'0000')", output);
     Assert.AreEqual(typeof (LogicalAndExpression), expr.GetType());
     bex = (BinaryOperatorExpression)((LogicalAndExpression)expr).GetOperand(0);
     Assert.AreEqual(typeof (ArithmeticModExpression), bex.GetType());
     bex = (BinaryOperatorExpression)((ArithmeticModExpression)bex).LeftOprand;
     Assert.AreEqual(typeof (ArithmeticMultiplyExpression), bex.GetType());
     bex = (BinaryOperatorExpression)((ArithmeticMultiplyExpression)bex).LeftOprand;
     Assert.AreEqual(typeof (ArithmeticAddExpression), bex.GetType());
     Assert.AreEqual(typeof (LiteralString), ((ArithmeticAddExpression)bex).LeftOprand.GetType());
     bex = (BinaryOperatorExpression)((ArithmeticAddExpression)bex).RightOprand;
     Assert.AreEqual(typeof (ArithmeticDivideExpression), bex.GetType());
     Assert.AreEqual(typeof (DmlSelectStatement), ((LogicalAndExpression)expr).GetOperand(1).GetType());
     sql = "not! ~`select` in (1,current_date,`current_date`)like `all` div a between (c&&d) and (d|e)";
     lexer = new MySqlLexer(sql);
     parser = new MySqlExprParser(lexer);
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual(
         "NOT ! ~ `select` IN (1, CURDATE(), `current_date`) LIKE `all` DIV a BETWEEN (c AND d) AND d | e",
         output);
     Assert.AreEqual(typeof (LogicalNotExpression), expr.GetType());
     var tex = (TernaryOperatorExpression)((LogicalNotExpression)expr).Operand;
     Assert.AreEqual(typeof (BetweenAndExpression), tex.GetType());
     Assert.AreEqual(typeof (LikeExpression), tex.First.GetType());
     Assert.AreEqual(typeof (LogicalAndExpression), tex.Second.GetType());
     Assert.AreEqual(typeof (BitOrExpression), tex.Third.GetType());
     tex = (TernaryOperatorExpression)((BetweenAndExpression)tex).First;
     Assert.AreEqual(typeof (InExpression), tex.First.GetType());
     Assert.AreEqual(typeof (ArithmeticIntegerDivideExpression), tex.Second.GetType());
     bex = (InExpression)tex.First;
     Assert.AreEqual(typeof (NegativeValueExpression), bex.LeftOprand.GetType());
     Assert.AreEqual(typeof (InExpressionList), bex.RightOprand.GetType());
     UnaryOperatorExpression uex = (NegativeValueExpression)bex.LeftOprand;
     Assert.AreEqual(typeof (BitInvertExpression), uex.Operand.GetType());
     sql = " binary case ~a||b&&c^d xor e when 2>any(select a ) then 3 else 4 end is not null =a";
     lexer = new MySqlLexer(sql);
     parser = new MySqlExprParser(lexer);
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual(
         "BINARY CASE ~ a OR b AND c ^ d XOR e WHEN 2 > ANY (SELECT a) THEN 3 ELSE 4 END IS NOT NULL = a", output);
     Assert.AreEqual(typeof (ComparisionEqualsExpression), expr.GetType());
     bex = (ComparisionEqualsExpression)expr;
     Assert.AreEqual(typeof (ComparisionIsExpression), bex.LeftOprand.GetType());
     Assert.AreEqual(typeof (Identifier), bex.RightOprand.GetType());
     var cex = (ComparisionIsExpression)bex.LeftOprand;
     Assert.AreEqual(typeof (CastBinaryExpression), cex.Operand.GetType());
     uex = (UnaryOperatorExpression)cex.Operand;
     Assert.AreEqual(typeof (CaseWhenOperatorExpression), uex.Operand.GetType());
     var cwex = (CaseWhenOperatorExpression)uex.Operand;
     Assert.AreEqual(typeof (LogicalOrExpression), cwex.Comparee.GetType());
     PolyadicOperatorExpression pex = (LogicalOrExpression)cwex.Comparee;
     Assert.AreEqual(typeof (BitInvertExpression), pex.GetOperand(0).GetType());
     Assert.AreEqual(typeof (LogicalXORExpression), pex.GetOperand(1).GetType());
     bex = (LogicalXORExpression)pex.GetOperand(1);
     Assert.AreEqual(typeof (LogicalAndExpression), bex.LeftOprand
                                                       .GetType());
     Assert.AreEqual(typeof (Identifier), bex.RightOprand.GetType());
     pex = (LogicalAndExpression)bex.LeftOprand;
     Assert.AreEqual(typeof (Identifier), pex.GetOperand(0).GetType());
     Assert.AreEqual(typeof (BitXORExpression), pex.GetOperand(1).GetType());
     sql = " !interval(a,b)<=>a>>b collate x /?+a!=@@1 or @var sounds like -(a-b) mod -(d or e)";
     lexer = new MySqlLexer(sql);
     parser = new MySqlExprParser(lexer);
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual(
         "! INTERVAL(a, b) <=> a >> b COLLATE x / ? + a != @@1 OR @var SOUNDS LIKE - (a - b) % - (d OR e)",
         output);
     Assert.AreEqual(typeof (LogicalOrExpression), expr.GetType());
     pex = (LogicalOrExpression)expr;
     Assert.AreEqual(typeof (ComparisionNotEqualsExpression), pex.GetOperand(0).GetType());
     Assert.AreEqual(typeof (SoundsLikeExpression), pex.GetOperand(1).GetType());
     bex = (BinaryOperatorExpression)pex.GetOperand(0);
     Assert.AreEqual(typeof (ComparisionNullSafeEqualsExpression), bex.LeftOprand.GetType());
     Assert.AreEqual(typeof (SysVarPrimary), bex.RightOprand.GetType());
     bex = (BinaryOperatorExpression)bex.LeftOprand;
     Assert.AreEqual(typeof (NegativeValueExpression), bex.LeftOprand.GetType());
     Assert.AreEqual(typeof (BitShiftExpression), bex.RightOprand.
                                                      GetType());
     bex = (BinaryOperatorExpression)bex.RightOprand;
     Assert.AreEqual(typeof (Identifier), bex.LeftOprand.GetType());
     Assert.AreEqual(typeof (ArithmeticAddExpression), bex.RightOprand.GetType());
     bex = (BinaryOperatorExpression)bex.RightOprand;
     Assert.AreEqual(typeof (ArithmeticDivideExpression), bex.LeftOprand.GetType());
     Assert.AreEqual(typeof (Identifier), bex.RightOprand.GetType());
     bex = (BinaryOperatorExpression)bex.LeftOprand;
     Assert.AreEqual(typeof (CollateExpression), bex.LeftOprand.GetType());
     Assert.AreEqual(typeof (ParamMarker), bex.RightOprand.GetType());
     bex = (BinaryOperatorExpression)((LogicalOrExpression)expr).GetOperand(1);
     Assert.AreEqual(typeof (UsrDefVarPrimary), bex.LeftOprand.GetType());
     Assert.AreEqual(typeof (ArithmeticModExpression), bex.RightOprand.GetType());
     bex = (BinaryOperatorExpression)bex.RightOprand;
     Assert.AreEqual(typeof (MinusExpression), bex.LeftOprand.GetType());
     Assert.AreEqual(typeof (MinusExpression), bex.RightOprand.GetType());
     uex = (UnaryOperatorExpression)bex.LeftOprand;
     Assert.AreEqual(typeof (ArithmeticSubtractExpression), uex.Operand.GetType());
     uex = (UnaryOperatorExpression)bex.RightOprand;
     Assert.AreEqual(typeof (LogicalOrExpression), uex.Operand.GetType());
 }
 public virtual void TestPrimarySystemVar()
 {
     var sql = "@@gloBal . /*dd*/ `all`";
     var lexer = new MySqlLexer(sql);
     var parser = new MySqlExprParser(lexer);
     var expr = parser.Expression();
     var output = Output2MySql(expr, sql);
     Assert.AreEqual("@@global.`all`", output);
     Assert.AreEqual(typeof (SysVarPrimary), expr.GetType());
     var sysvar = (SysVarPrimary)expr;
     Assert.AreEqual(VariableScope.Global, sysvar.Scope);
     Assert.AreEqual("`all`", sysvar.VarText);
     sql = "@@Session . /*dd*/ any";
     lexer = new MySqlLexer(sql);
     parser = new MySqlExprParser(lexer);
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("@@any", output);
     Assert.AreEqual(typeof (SysVarPrimary), expr.GetType());
     sysvar = (SysVarPrimary)expr;
     Assert.AreEqual(VariableScope.Session, sysvar.Scope);
     Assert.AreEqual("any", sysvar.VarText);
     sql = "@@LOCAl . /*dd*/ `usage`";
     lexer = new MySqlLexer(sql);
     parser = new MySqlExprParser(lexer);
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("@@`usage`", output);
     Assert.AreEqual(typeof (SysVarPrimary), expr.GetType());
     sysvar = (SysVarPrimary)expr;
     Assert.AreEqual(VariableScope.Session, sysvar.Scope);
     Assert.AreEqual("`usage`", sysvar.VarText);
     sql = "@@LOCAl . /*dd*/ `var1`";
     lexer = new MySqlLexer(sql);
     parser = new MySqlExprParser(lexer);
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("@@`var1`", output);
     Assert.AreEqual(typeof (SysVarPrimary), expr.GetType());
     sysvar = (SysVarPrimary)expr;
     Assert.AreEqual(VariableScope.Session, sysvar.Scope);
     Assert.AreEqual("`var1`", sysvar.VarText);
     sql = "@@var1   ,";
     lexer = new MySqlLexer(sql);
     parser = new MySqlExprParser(lexer);
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("@@var1", output);
     Assert.AreEqual(typeof (SysVarPrimary), expr.GetType());
     sysvar = (SysVarPrimary)expr;
     Assert.AreEqual(VariableScope.Session, sysvar.Scope);
     Assert.AreEqual("var1", sysvar.VarText);
     sql = "@@`case``1`   ,@@_";
     lexer = new MySqlLexer(sql);
     parser = new MySqlExprParser(lexer);
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("@@`case``1`", output);
     Assert.AreEqual(typeof (SysVarPrimary), expr.GetType());
     sysvar = (SysVarPrimary)expr;
     Assert.AreEqual(VariableScope.Session, sysvar.Scope);
     Assert.AreEqual("`case``1`", sysvar.VarText);
     lexer.NextToken();
     parser = new MySqlExprParser(lexer);
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("@@_", output);
     Assert.AreEqual(typeof (SysVarPrimary), expr.GetType());
     sysvar = (SysVarPrimary)expr;
     Assert.AreEqual(VariableScope.Session, sysvar.Scope);
     Assert.AreEqual("_", sysvar.VarText);
 }
        /// <exception cref="System.SqlSyntaxErrorException" />
        public static ISqlStatement Parse(string sql, MySqlLexer lexer, string charset)
        {
            try
            {
                ISqlStatement stmt = null;
                var isEof = true;
                var exprParser = new MySqlExprParser(lexer, charset);
                switch (lexer.Token())
                {
                    case MySqlToken.KwDesc:
                    case MySqlToken.KwDescribe:
                    {
                        stmt = new MySqlDalParser(lexer, exprParser).Desc();
                        goto stmtSwitch_break;
                    }

                    case MySqlToken.KwSelect:
                    case MySqlToken.PuncLeftParen:
                    {
                        stmt = new MySqlDmlSelectParser(lexer, exprParser).SelectUnion();
                        goto stmtSwitch_break;
                    }

                    case MySqlToken.KwDelete:
                    {
                        stmt = new MySqlDmlDeleteParser(lexer, exprParser).Delete();
                        goto stmtSwitch_break;
                    }

                    case MySqlToken.KwInsert:
                    {
                        stmt = new MySqlDmlInsertParser(lexer, exprParser).Insert();
                        goto stmtSwitch_break;
                    }

                    case MySqlToken.KwReplace:
                    {
                        stmt = new MySqlDmlReplaceParser(lexer, exprParser).Replace();
                        goto stmtSwitch_break;
                    }

                    case MySqlToken.KwUpdate:
                    {
                        stmt = new MySqlDmlUpdateParser(lexer, exprParser).Update();
                        goto stmtSwitch_break;
                    }

                    case MySqlToken.KwCall:
                    {
                        stmt = new MySqlDmlCallParser(lexer, exprParser).Call();
                        goto stmtSwitch_break;
                    }

                    case MySqlToken.KwSet:
                    {
                        stmt = new MySqlDalParser(lexer, exprParser).Set();
                        goto stmtSwitch_break;
                    }

                    case MySqlToken.KwShow:
                    {
                        stmt = new MySqlDalParser(lexer, exprParser).Show();
                        goto stmtSwitch_break;
                    }

                    case MySqlToken.KwAlter:
                    case MySqlToken.KwCreate:
                    case MySqlToken.KwDrop:
                    case MySqlToken.KwRename:
                    {
                        stmt = new MySqlDdlParser(lexer, exprParser).DdlStmt();
                        isEof = IsEOFedDdl(stmt);
                        goto stmtSwitch_break;
                    }

                    case MySqlToken.KwRelease:
                    {
                        stmt = new MySqlMtsParser(lexer).Release();
                        goto stmtSwitch_break;
                    }

                    case MySqlToken.Identifier:
                    {
                        var si = SpecialIdentifier.None;
                        if ((si = SpecialIdentifiers[lexer.GetStringValueUppercase()]) != SpecialIdentifier.None)
                        {
                            switch (si)
                            {
                                case SpecialIdentifier.Truncate:
                                {
                                    stmt = new MySqlDdlParser(lexer, exprParser).Truncate();
                                    goto stmtSwitch_break;
                                }

                                case SpecialIdentifier.Savepoint:
                                {
                                    stmt = new MySqlMtsParser(lexer).Savepoint();
                                    goto stmtSwitch_break;
                                }

                                case SpecialIdentifier.Rollback:
                                {
                                    stmt = new MySqlMtsParser(lexer).Rollback();
                                    goto stmtSwitch_break;
                                }
                            }
                        }
                        goto default;
                    }

                    default:
                    {
                        throw new SqlSyntaxErrorException("sql is not a supported statement");
                    }
                }
                stmtSwitch_break:
                ;
                if (isEof)
                {
                    while (lexer.Token() == MySqlToken.PuncSemicolon)
                    {
                        lexer.NextToken();
                    }
                    if (lexer.Token() != MySqlToken.Eof)
                    {
                        throw new SqlSyntaxErrorException("Sql syntax error!");
                    }
                }
                return stmt;
            }
            catch (Exception e)
            {
                throw new SqlSyntaxErrorException(BuildErrorMsg(e, lexer, sql), e);
            }
        }
 public virtual void TestMatchExpression()
 {
     // QS_TODO
     var sql = "MATCH (title,body) AGAINST ('database' WITH QUERY EXPANSION)";
     var parser = new MySqlExprParser(new MySqlLexer(sql));
     var expr = parser.Expression();
     var output = Output2MySql(expr, sql);
     Assert.AreEqual("MATCH (title, body) AGAINST ('database' WITH QUERY EXPANSION)", output);
     Assert.AreEqual("MATCH (title, body) AGAINST ('database' WITH QUERY EXPANSION)", output);
     sql = "MATCH (title,body) AGAINST ( (abc in (d)) IN boolean MODE)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("MATCH (title, body) AGAINST ((abc IN (d)) IN BOOLEAN MODE)", output);
     sql = "MATCH (title,body) AGAINST ('database')";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("MATCH (title, body) AGAINST ('database')", output);
     sql = "MATCH (col1,col2,col3) AGAINST ((a:=b:=c) IN boolean MODE)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("MATCH (col1, col2, col3) AGAINST (a := b := c IN BOOLEAN MODE)", output);
     sql = "MATCH (title,body) AGAINST ((a and (b ||c)) IN boolean MODE)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("MATCH (title, body) AGAINST (a AND (b OR c) IN BOOLEAN MODE)", output);
     sql = "MATCH (title,body) AGAINST ((a between b and c) IN boolean MODE)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("MATCH (title, body) AGAINST (a BETWEEN b AND c IN BOOLEAN MODE)", output);
     sql = "MATCH (title,body) AGAINST ((a between b and (abc in (d))) IN boolean MODE)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("MATCH (title, body) AGAINST ((a BETWEEN b AND abc IN (d)) IN BOOLEAN MODE)", output);
     sql = "MATCH (title,body) AGAINST ((not not a) IN boolean MODE)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("MATCH (title, body) AGAINST (NOT NOT a IN BOOLEAN MODE)", output);
     sql = "MATCH (title,body) AGAINST ((a is true) IN boolean MODE)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("MATCH (title, body) AGAINST (a IS TRUE IN BOOLEAN MODE)", output);
     sql = "MATCH (title,body) AGAINST ((select a) IN boolean MODE)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("MATCH (title, body) AGAINST (SELECT a IN BOOLEAN MODE)", output);
     sql = "MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("MATCH (title, body) AGAINST ('database' IN NATURAL LANGUAGE MODE)", output);
     sql = "MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("MATCH (title, body) AGAINST ('database' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION)",
         output);
 }
 public virtual void TestPrimary()
 {
     var sql = "(1,2,existS (select id.* from t1))";
     var parser = new MySqlExprParser(new MySqlLexer(sql));
     var expr = parser.Expression();
     var output = Output2MySql(expr, sql);
     Assert.AreEqual("ROW(1, 2, EXISTS (SELECT id.* FROM t1))", output);
     var row = (RowExpression)expr;
     Assert.AreEqual(3, row.RowExprList.Count);
     sql = "*";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("*", output);
     Assert.IsTrue(typeof (Wildcard).IsAssignableFrom(expr.GetType()));
     sql = "case v1 when `index` then a when 2 then b else c end";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CASE v1 WHEN `index` THEN a WHEN 2 THEN b ELSE c END", output);
     var cw = (CaseWhenOperatorExpression)expr;
     Assert.AreEqual("v1", ((Identifier)cw.Comparee).IdText);
     Assert.AreEqual(2, cw.WhenList.Count);
     Assert.AreEqual("c", ((Identifier)cw.ElseResult).IdText);
     sql = "case  when 1=value then a  end";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CASE WHEN 1 = value THEN a END", output);
     cw = (CaseWhenOperatorExpression)expr;
     Assert.IsNull(cw.Comparee);
     Assert.AreEqual(1, cw.WhenList.Count);
     Assert.IsNull(cw.ElseResult);
     sql = "case  when 1=`in` then a  end";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CASE WHEN 1 = `in` THEN a END", output);
     sql = " ${INSENSITIVE}. ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("${INSENSITIVE}", output);
     sql = "current_date, ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CURDATE()", output);
     sql = "CurRent_Date  (  ) ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CURDATE()", output);
     sql = "CurRent_TiMe   ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CURTIME()", output);
     sql = "CurRent_TiMe  () ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CURTIME()", output);
     sql = "CurRent_TimesTamp ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("NOW()", output);
     sql = "CurRent_TimesTamp  ()";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("NOW()", output);
     sql = "localTimE";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("NOW()", output);
     sql = "localTimE  () ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("NOW()", output);
     sql = "localTimesTamP  ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("NOW()", output);
     sql = "localTimesTamP  () ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("NOW()", output);
     sql = "CurRent_user ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CURRENT_USER()", output);
     sql = "CurRent_user  () ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CURRENT_USER()", output);
     sql = "default  () ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("DEFAULT()", output);
     sql = "vaLueS(1,col1*2)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("VALUES(1, col1 * 2)", output);
     sql = "(1,2,mod(m,n))";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("ROW(1, 2, m % n)", output);
     sql = "chaR (77,121,'77.3')";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CHAR(77, 121, '77.3')", output);
     sql = "CHARSET(CHAR(0x65 USING utf8))";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CHARSET(CHAR(x'65' USING utf8))", output);
     sql = "CONVERT(_latin1'Müller' USING utf8)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CONVERT(_latin1'Müller' USING utf8)", output);
 }
 protected internal virtual MySqlDmlParser GetDmlParser(MySqlLexer lexer)
 {
     var exp = new MySqlExprParser(lexer);
     MySqlDmlParser parser = new MySqlDmlSelectParser(lexer, exp);
     return parser;
 }
 public virtual void TestAssignment()
 {
     var sql = "a /*dd*/:=b:=c";
     var parser = new MySqlExprParser(new MySqlLexer(sql));
     var expr = parser.Expression();
     var output = Output2MySql(expr, sql);
     Assert.AreEqual("a := b := c", output);
     Assert.AreEqual(typeof (AssignmentExpression), expr.GetType());
     var ass = (AssignmentExpression)expr;
     Assert.AreEqual(typeof (AssignmentExpression), ass.RightOprand.GetType());
     ass = (AssignmentExpression)ass.RightOprand;
     Assert.AreEqual("b", ((Identifier)ass.LeftOprand).IdText);
     sql = "c=@var:=1";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("c = (@var := 1)", output);
     Assert.AreEqual(typeof (ComparisionEqualsExpression), expr.GetType());
     ass = (AssignmentExpression)((BinaryOperatorExpression)expr).RightOprand;
     var usr = (UsrDefVarPrimary)ass.LeftOprand;
     Assert.AreEqual("@var", usr.VarText);
     sql = "a:=b or c &&d :=0b1101 or b'01'&0xabc";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a := b OR c AND d := b'1101' OR b'01' & x'abc'",
         output);
     Assert.AreEqual(typeof (AssignmentExpression), expr.GetType());
     ass = (AssignmentExpression)expr;
     Assert.AreEqual(typeof (AssignmentExpression), ass.RightOprand.GetType());
     ass = (AssignmentExpression)ass.RightOprand;
     Assert.AreEqual(typeof (LogicalOrExpression), ass.LeftOprand.
                                                       GetType());
     Assert.AreEqual(typeof (LogicalOrExpression), ass.RightOprand
                                                      .GetType());
     var lor = (LogicalOrExpression)ass.LeftOprand;
     Assert.AreEqual(typeof (LogicalAndExpression), lor.GetOperand(1).GetType());
     lor = (LogicalOrExpression)ass.RightOprand;
     Assert.AreEqual(typeof (LiteralBitField), lor.GetOperand(0).GetType());
     Assert.AreEqual(typeof (BitAndExpression), lor.GetOperand(1).GetType());
     sql = "a:=((b or (c &&d)) :=((0b1101 or (b'01'&0xabc))))";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a := b OR c AND d := b'1101' OR b'01' & x'abc'",
         output);
     Assert.AreEqual(typeof (AssignmentExpression), expr.GetType());
     ass = (AssignmentExpression)expr;
     Assert.AreEqual(typeof (AssignmentExpression), ass.RightOprand.GetType());
     ass = (AssignmentExpression)ass.RightOprand;
     Assert.AreEqual(typeof (LogicalOrExpression), ass.LeftOprand.
                                                       GetType());
     Assert.AreEqual(typeof (LogicalOrExpression), ass.RightOprand
                                                      .GetType());
     lor = (LogicalOrExpression)ass.LeftOprand;
     Assert.AreEqual(typeof (LogicalAndExpression), lor.GetOperand(1).GetType());
     lor = (LogicalOrExpression)ass.RightOprand;
     Assert.AreEqual(typeof (LiteralBitField), lor.GetOperand(0).GetType());
     Assert.AreEqual(typeof (BitAndExpression), lor.GetOperand(1).GetType());
     sql = "(a:=b) or c &&(d :=0b1101 or b'01')&0xabc ^null";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("(a := b) OR c AND (d := b'1101' OR b'01') & x'abc' ^ NULL", output);
     Assert.AreEqual(typeof (LogicalOrExpression), expr.GetType());
     lor = (LogicalOrExpression)expr;
     Assert.AreEqual(typeof (AssignmentExpression), lor.GetOperand(0).GetType());
     Assert.AreEqual(typeof (LogicalAndExpression), lor.GetOperand(1).GetType());
     var land = (LogicalAndExpression)lor.GetOperand(1);
     Assert.AreEqual(typeof (Identifier), land.GetOperand(0).GetType());
     Assert.AreEqual(typeof (BitAndExpression), land.GetOperand(1).GetType());
     var band = (BitAndExpression)land.GetOperand(1);
     Assert.AreEqual(typeof (AssignmentExpression), band.LeftOprand.GetType());
     Assert.AreEqual(typeof (BitXORExpression), band.RightOprand.GetType());
     ass = (AssignmentExpression)band.LeftOprand;
     Assert.AreEqual(typeof (LogicalOrExpression), ass.RightOprand
                                                      .GetType());
     var bxor = (BitXORExpression)band.RightOprand;
     Assert.AreEqual(typeof (LiteralHexadecimal), bxor.LeftOprand.
                                                       GetType());
     Assert.AreEqual(typeof (LiteralNull), bxor.RightOprand.GetType());
 }
 public virtual void TestString()
 {
     var sql = "_latin1'abc\\'d' 'ef\"'";
     var lexer = new MySqlLexer(sql);
     var parser = new MySqlExprParser(lexer);
     var expr = parser.Expression();
     var output = Output2MySql(expr, sql);
     Assert.AreEqual("_latin1'abc\\'def\"'", output);
     sql = "n'abc\\'d' \"ef'\"\"\"";
     lexer = new MySqlLexer(sql);
     parser = new MySqlExprParser(lexer);
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("N'abc\\'def\\'\"'", output);
     sql = "`char`'an'";
     lexer = new MySqlLexer(sql);
     parser = new MySqlExprParser(lexer);
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("`char`", output);
     sql = "_latin1 n'abc' ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("_latin1", output);
 }
 public MySqlDmlUpdateParser(MySqlLexer lexer, MySqlExprParser exprParser)
     : base(lexer, exprParser)
 {
 }
 public virtual void TestUnary()
 {
     var sql = "!-~ binary a collate latin1_danish_ci";
     var parser = new MySqlExprParser(new MySqlLexer(sql));
     var expr = parser.Expression();
     var output = Output2MySql(expr, sql);
     Assert.AreEqual("! - ~ BINARY a COLLATE latin1_danish_ci", output);
     var neg = (NegativeValueExpression)expr;
     var mi = (MinusExpression)neg.Operand;
     var bi = (BitInvertExpression)mi.Operand;
     var bin = (CastBinaryExpression)bi.Operand;
     var col = (CollateExpression)bin.Operand;
     Assert.AreEqual("a", ((Identifier)col.StringValue).IdText);
 }
 public virtual void TestComparision()
 {
     var sql = "a  betwEen b and c Not between d and e";
     var parser = new MySqlExprParser(new MySqlLexer(sql));
     var expr = parser.Expression();
     var output = Output2MySql(expr, sql);
     Assert.AreEqual("a BETWEEN b AND c NOT BETWEEN d AND e", output);
     var ba = (BetweenAndExpression)expr;
     Assert.AreEqual("a", ((Identifier)ba.First).IdText);
     Assert.AreEqual("b", ((Identifier)ba.Second).IdText);
     Assert.AreEqual(false, ba.IsNot);
     ba = (BetweenAndExpression)ba.Third;
     Assert.AreEqual("c", ((Identifier)ba.First).IdText);
     Assert.AreEqual("d", ((Identifier)ba.Second).IdText);
     Assert.AreEqual("e", ((Identifier)ba.Third).IdText);
     Assert.AreEqual(true, ba.IsNot);
     sql = "a between b between c and d and e between f and g";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a BETWEEN b BETWEEN c AND d AND e BETWEEN f AND g", output);
     ba = (BetweenAndExpression)expr;
     var ba2 = (BetweenAndExpression)ba.Second;
     var ba3 = (BetweenAndExpression)ba.Third;
     Assert.AreEqual("a", ((Identifier)ba.First).IdText);
     Assert.AreEqual("b", ((Identifier)ba2.First).IdText);
     Assert.AreEqual("c", ((Identifier)ba2.Second).IdText);
     Assert.AreEqual("d", ((Identifier)ba2.Third).IdText);
     Assert.AreEqual("e", ((Identifier)ba3.First).IdText);
     Assert.AreEqual("f", ((Identifier)ba3.Second).IdText);
     Assert.AreEqual("g", ((Identifier)ba3.Third).IdText);
     sql = "((select a)) between (select b)   and (select d) ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("(SELECT a) BETWEEN (SELECT b) AND (SELECT d)", output);
     sql = "a  rliKe b not REGEXP c";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a REGEXP b NOT REGEXP c", output);
     var re = (RegexpExpression)expr;
     var re2 = (RegexpExpression)re.LeftOprand;
     Assert.AreEqual("a", ((Identifier)re2.LeftOprand).IdText);
     Assert.AreEqual("b", ((Identifier)re2.RightOprand).IdText);
     Assert.AreEqual("c", ((Identifier)re.RightOprand).IdText);
     Assert.AreEqual(true, re.IsNot);
     Assert.AreEqual(false, re2.IsNot);
     sql = "((a)) like (((b)))escape (((d)))";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a LIKE b ESCAPE d", output);
     sql = "((select a)) like (((select b)))escape (((select d)))";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("(SELECT a) LIKE (SELECT b) ESCAPE (SELECT d)", output);
     sql = "a  like b NOT LIKE c escape d";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a LIKE b NOT LIKE c ESCAPE d", output);
     var le = (LikeExpression)expr;
     var le2 = (LikeExpression)le.First;
     Assert.AreEqual("a", ((Identifier)le2.First).IdText);
     Assert.AreEqual("b", ((Identifier)le2.Second).IdText);
     Assert.AreEqual("c", ((Identifier)le.Second).IdText);
     Assert.AreEqual("d", ((Identifier)le.Third).IdText);
     Assert.AreEqual(true, le.IsNot);
     Assert.AreEqual(false, le2.IsNot);
     sql = "b NOT LIKE c ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("b NOT LIKE c", output);
     sql = "a in (b) not in (select id from t1)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a IN (b) NOT IN (SELECT id FROM t1)", output);
     var @in = (InExpression)expr;
     var in2 = (InExpression)@in.LeftOprand;
     Assert.AreEqual("a", ((Identifier)in2.LeftOprand).IdText);
     Assert.IsTrue(typeof (IQueryExpression).IsAssignableFrom(@in.RightOprand.GetType()));
     Assert.AreEqual(true, @in.IsNot);
     Assert.AreEqual(false, in2.IsNot);
     sql = "(select a)is not null";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("(SELECT a) IS NOT NULL", output);
     sql = "a is not null is not false is not true is not UNKNOWn is null is false is true is unknown";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual(
         "a IS NOT NULL IS NOT FALSE IS NOT TRUE IS NOT UNKNOWN IS NULL IS FALSE IS TRUE IS UNKNOWN", output);
     var @is = (ComparisionIsExpression)expr;
     var is2 = (ComparisionIsExpression)@is.Operand;
     var is3 = (ComparisionIsExpression)is2.Operand;
     var is4 = (ComparisionIsExpression)is3.Operand;
     var is5 = (ComparisionIsExpression)is4.Operand;
     var is6 = (ComparisionIsExpression)is5.Operand;
     var is7 = (ComparisionIsExpression)is6.Operand;
     var is8 = (ComparisionIsExpression)is7.Operand;
     Assert.AreEqual(ComparisionIsExpression.IsUnknown, @is.Mode);
     Assert.AreEqual(ComparisionIsExpression.IsTrue, is2.Mode);
     Assert.AreEqual(ComparisionIsExpression.IsFalse, is3.Mode);
     Assert.AreEqual(ComparisionIsExpression.IsNull, is4.Mode);
     Assert.AreEqual(ComparisionIsExpression.IsNotUnknown, is5.Mode);
     Assert.AreEqual(ComparisionIsExpression.IsNotTrue, is6.Mode);
     Assert.AreEqual(ComparisionIsExpression.IsNotFalse, is7.Mode);
     Assert.AreEqual(ComparisionIsExpression.IsNotNull, is8.Mode);
     Assert.AreEqual("a", ((Identifier)is8.Operand).IdText);
     sql = "a = b <=> c >= d > e <= f < g <> h != i";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a = b <=> c >= d > e <= f < g <> h != i", output);
     var neq = (ComparisionNotEqualsExpression)expr;
     var lg = (ComparisionLessOrGreaterThanExpression)neq.LeftOprand;
     var l = (ComparisionLessThanExpression)lg.LeftOprand;
     var leq = (ComparisionLessThanOrEqualsExpression)l.LeftOprand;
     var g = (ComparisionGreaterThanExpression)leq.LeftOprand;
     var geq = (ComparisionGreaterThanOrEqualsExpression)g.LeftOprand;
     var nseq = (ComparisionNullSafeEqualsExpression)geq.LeftOprand;
     var eq = (ComparisionEqualsExpression)nseq.LeftOprand;
     Assert.AreEqual("i", ((Identifier)neq.RightOprand).IdText);
     Assert.AreEqual("h", ((Identifier)lg.RightOprand).IdText);
     Assert.AreEqual("g", ((Identifier)l.RightOprand).IdText);
     Assert.AreEqual("f", ((Identifier)leq.RightOprand).IdText);
     Assert.AreEqual("e", ((Identifier)g.RightOprand).IdText);
     Assert.AreEqual("d", ((Identifier)geq.RightOprand).IdText);
     Assert.AreEqual("c", ((Identifier)nseq.RightOprand).IdText);
     Assert.AreEqual("b", ((Identifier)eq.RightOprand).IdText);
     Assert.AreEqual("a", ((Identifier)eq.LeftOprand).IdText);
     sql = "a sounds like b sounds like c";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a SOUNDS LIKE b SOUNDS LIKE c", output);
     var sl = (SoundsLikeExpression)expr;
     var sl2 = (SoundsLikeExpression)sl.LeftOprand;
     Assert.AreEqual("a", ((Identifier)sl2.LeftOprand).IdText);
     Assert.AreEqual("b", ((Identifier)sl2.RightOprand).IdText);
     Assert.AreEqual("c", ((Identifier)sl.RightOprand).IdText);
     sql = "a like b escape c";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a LIKE b ESCAPE c", output);
     sql = "(select a) collate z";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("(SELECT a) COLLATE z", output);
     sql = "val1 IN (1,2,'a')";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("val1 IN (1, 2, 'a')", output);
 }
 public virtual void TestBitHex()
 {
     var sql = "x'89af' ";
     var parser = new MySqlExprParser(new MySqlLexer(sql));
     var expr = parser.Expression();
     var output = Output2MySql(expr, sql);
     Assert.AreEqual("x'89af'", output);
     Assert.AreEqual("89af", ((LiteralHexadecimal)expr).Text);
     sql = "_latin1 b'1011' ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("_latin1 b'1011'", output);
     Assert.AreEqual("1011", ((LiteralBitField)expr).Text);
     Assert.AreEqual("_latin1", ((LiteralBitField)expr).Introducer);
     sql = "abc 0b1011 ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("abc", output);
     sql = "_latin1 0xabc ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("_latin1 x'abc'", output);
     sql = "jkl 0xabc ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("jkl", output);
 }
 public virtual void TestBit()
 {
     var sql = "0b01001001 | 3 & 1.2 <<d >> 0x0f";
     var parser = new MySqlExprParser(new MySqlLexer(sql));
     var expr = parser.Expression();
     var output = Output2MySql(expr, sql);
     Assert.AreEqual("b'01001001' | 3 & 1.2 << d >> x'0f'", output);
     var or = (BitOrExpression)expr;
     var and = (BitAndExpression)or.RightOprand;
     var rs = (BitShiftExpression)and.RightOprand;
     var ls = (BitShiftExpression)rs.LeftOprand;
     Assert.AreEqual("d", ((Identifier)ls.RightOprand).IdText);
     Assert.IsTrue(rs.IsRightShift());
     Assert.IsFalse(ls.IsRightShift());
     sql = "true + b & false ^ d - null ";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("TRUE + b & FALSE ^ d - NULL", output);
     and = (BitAndExpression)expr;
     var add = (ArithmeticAddExpression)and.LeftOprand;
     var sub = (ArithmeticSubtractExpression)and.RightOprand;
     var xor = (BitXORExpression)sub.LeftOprand;
     Assert.AreEqual("d", ((Identifier)xor.RightOprand).IdText);
     Assert.AreEqual("b", ((Identifier)add.RightOprand).IdText);
 }
 public virtual void TestUser()
 {
     var sql = "'root'@'localhost'";
     var parser = new MySqlExprParser(new MySqlLexer(sql));
     var expr = parser.Expression();
     var output = Output2MySql(expr, sql);
     Assert.AreEqual("'root'@'localhost'", output);
     var usr = (UserExpression)expr;
     Assert.AreEqual("'root'@'localhost'", usr.UserAtHost);
     sql = "root@localhost";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("root@localhost", output);
     usr = (UserExpression)expr;
     Assert.AreEqual("root@localhost", usr.UserAtHost);
     sql = "var@'localhost'";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("var@'localhost'", output);
     usr = (UserExpression)expr;
     Assert.AreEqual("var@'localhost'", usr.UserAtHost);
 }
 public MySqlDmlSelectParser(MySqlLexer lexer, MySqlExprParser exprParser)
     : base(lexer, exprParser)
 {
     this.exprParser.SetSelectParser(this);
 }
 public virtual void TestInterval()
 {
     // QS_TODO
     var sql = "DATE_ADD('2009-01-01', INTERVAL (6/4) HOUR_MINUTE)";
     var parser = new MySqlExprParser(new MySqlLexer(sql));
     var expr = parser.Expression();
     var output = Output2MySql(expr, sql);
     Assert.AreEqual("DATE_ADD('2009-01-01', INTERVAL (6 / 4) HOUR_MINUTE)", output);
     sql = "'2008-12-31 23:59:59' + INTERVAL 1 SECOND";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("'2008-12-31 23:59:59' + INTERVAL 1 SECOND", output);
     sql = " INTERVAL 1 DAY + '2008-12-31'";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("INTERVAL 1 DAY + '2008-12-31'", output);
     sql = "DATE_ADD('2100-12-31 23:59:59',INTERVAL '1:1' MINUTE_SECOND)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("DATE_ADD('2100-12-31 23:59:59', INTERVAL '1:1' MINUTE_SECOND)", output);
     sql = "DATE_SUB('2005-01-01 00:00:00',INTERVAL '1 1:1:1' DAY_SECOND)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("DATE_SUB('2005-01-01 00:00:00', INTERVAL '1 1:1:1' DAY_SECOND)", output);
     sql = "DATE_ADD('1900-01-01 00:00:00',INTERVAL '-1 10' DAY_HOUR)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("DATE_ADD('1900-01-01 00:00:00', INTERVAL '-1 10' DAY_HOUR)", output);
     sql = "DATE_SUB('1998-01-02', INTERVAL 31 DAY)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("DATE_SUB('1998-01-02', INTERVAL 31 DAY)", output);
     sql = "DATE_ADD('1992-12-31 23:59:59.000002',INTERVAL '1.999999' SECOND_MICROSECOND)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("DATE_ADD('1992-12-31 23:59:59.000002', INTERVAL '1.999999' SECOND_MICROSECOND)", output);
     sql = "DATE_ADD('2013-01-01', INTERVAL 1 HOUR)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("DATE_ADD('2013-01-01', INTERVAL 1 HOUR)", output);
     sql = "DATE_ADD('2009-01-30', INTERVAL 1 MONTH)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("DATE_ADD('2009-01-30', INTERVAL 1 MONTH)", output);
     sql = "DATE_ADD('1992-12-31 23:59:59.000002',INTERVAL '1:1.999999' minute_MICROSECOND)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("DATE_ADD('1992-12-31 23:59:59.000002', INTERVAL '1:1.999999' MINUTE_MICROSECOND)", output);
     sql = "DATE_ADD('1992-12-31 23:59:59.000002',INTERVAL '1:1:1.999999' hour_MICROSECOND)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("DATE_ADD('1992-12-31 23:59:59.000002', INTERVAL '1:1:1.999999' HOUR_MICROSECOND)", output);
     sql = "DATE_ADD('2100-12-31 23:59:59',INTERVAL '1:1:1' hour_SECOND)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("DATE_ADD('2100-12-31 23:59:59', INTERVAL '1:1:1' HOUR_SECOND)", output);
     sql = "DATE_ADD('1992-12-31 23:59:59.000002',INTERVAL '1 1:1:1.999999' day_MICROSECOND)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("DATE_ADD('1992-12-31 23:59:59.000002', INTERVAL '1 1:1:1.999999' DAY_MICROSECOND)", output);
     sql = "DATE_ADD('2100-12-31 23:59:59',INTERVAL '1 1:1' day_minute)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("DATE_ADD('2100-12-31 23:59:59', INTERVAL '1 1:1' DAY_MINUTE)", output);
     sql = "DATE_ADD('2100-12-31',INTERVAL '1-1' year_month)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("DATE_ADD('2100-12-31', INTERVAL '1-1' YEAR_MONTH)", output);
     sql = "INTERVAL(n1,n2,n3)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("INTERVAL(n1, n2, n3)", output);
     sql = "INTERVAL a+b day";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("INTERVAL (a + b) DAY", output);
     sql = "INTERVAL(select id from t1) day";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("INTERVAL (SELECT id FROM t1) DAY", output);
     sql = "INTERVAL(('jklj'+a))day";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("INTERVAL ('jklj' + a) DAY", output);
 }
 public MySqlDmlReplaceParser(MySqlLexer lexer, MySqlExprParser exprParser)
     : base(lexer, exprParser)
 {
 }
 public virtual void TestLogical()
 {
     var sql = "a || b Or c";
     var parser = new MySqlExprParser(new MySqlLexer(sql));
     var expr = parser.Expression();
     var output = Output2MySql(expr, sql);
     Assert.AreEqual("a OR b OR c", output);
     Assert.AreEqual(typeof (LogicalOrExpression), expr.GetType());
     var or = (LogicalOrExpression)expr;
     Assert.AreEqual(3, or.Arity);
     Assert.AreEqual("b", ((Identifier)or.GetOperand(1)).IdText);
     sql = "a XOR b xOr c";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a XOR b XOR c", output);
     Assert.AreEqual(typeof (LogicalXORExpression), expr.GetType());
     var xor = (LogicalXORExpression)expr;
     Assert.AreEqual(typeof (LogicalXORExpression), xor.LeftOprand
                                                       .GetType());
     xor = (LogicalXORExpression)xor.LeftOprand;
     Assert.AreEqual("b", ((Identifier)xor.RightOprand).IdText);
     sql = "a XOR( b xOr c)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a XOR (b XOR c)", output);
     xor = (LogicalXORExpression)expr;
     var xor2 = (LogicalXORExpression)xor.RightOprand;
     Assert.AreEqual("a", ((Identifier)xor.LeftOprand).IdText);
     Assert.AreEqual("b", ((Identifier)xor2.LeftOprand).IdText);
     Assert.AreEqual("c", ((Identifier)xor2.RightOprand).IdText);
     sql = "a and     b && c";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("a AND b AND c", output);
     Assert.AreEqual(typeof (LogicalAndExpression), expr.GetType());
     var and = (LogicalAndExpression)expr;
     Assert.AreEqual(3, or.Arity);
     Assert.AreEqual("b", ((Identifier)and.GetOperand(1)).IdText);
     sql = "not NOT Not a";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("NOT NOT NOT a", output);
     Assert.AreEqual(typeof (LogicalNotExpression), expr.GetType());
     var not = (LogicalNotExpression)((LogicalNotExpression)expr).Operand;
     Assert.AreEqual(typeof (LogicalNotExpression), not.GetType());
     not = (LogicalNotExpression)not.Operand;
     Assert.AreEqual(typeof (LogicalNotExpression), not.GetType());
     Assert.AreEqual("a", ((Identifier)not.Operand).IdText);
 }
Beispiel #24
0
 public MySqlDalParser(MySqlLexer lexer, MySqlExprParser exprParser)
     : base(lexer)
 {
     this.exprParser = exprParser;
 }
 public virtual void TestStartedFromIdentifier()
 {
     // QS_TODO
     var sql = "cast(CAST(1-2 AS UNSIGNED) AS SIGNED)";
     var parser = new MySqlExprParser(new MySqlLexer(sql));
     var expr = parser.Expression();
     var output = Output2MySql(expr, sql);
     Assert.AreEqual("CAST(CAST(1 - 2 AS UNSIGNED) AS SIGNED)", output);
     sql = "position('a' in \"abc\")";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("LOCATE('a', 'abc')", output);
     sql = "cast(CAST(1-2 AS UNSIGNED integer) AS SIGNED integer)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CAST(CAST(1 - 2 AS UNSIGNED) AS SIGNED)", output);
     sql = "CAST(expr as char)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CAST(expr AS CHAR)", output);
     sql = "CAST(6/4 AS DECIMAL(3,1))";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CAST(6 / 4 AS DECIMAL(3, 1))", output);
     sql = "CAST(6/4 AS DECIMAL(3))";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CAST(6 / 4 AS DECIMAL(3))", output);
     sql = "CAST(6/4 AS DECIMAL)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CAST(6 / 4 AS DECIMAL)", output);
     sql = "CAST(now() as date)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CAST(NOW() AS DATE)", output);
     sql = "CAST(expr as char(5))";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("CAST(expr AS CHAR(5))", output);
     sql = "SUBSTRING('abc',pos,len)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("SUBSTRING('abc', pos, len)", output);
     sql = "SUBSTRING('abc' FROM pos FOR len)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("SUBSTRING('abc', pos, len)", output);
     sql = "SUBSTRING(str,pos)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("SUBSTRING(str, pos)", output);
     sql = "SUBSTRING('abc',1,2)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("SUBSTRING('abc', 1, 2)", output);
     sql = "row(1,2,str)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("ROW(1, 2, str)", output);
     sql = "position(\"abc\" in '/*abc*/')";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("LOCATE('abc', '/*abc*/')", output);
     sql = "locate(localtime,b)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("LOCATE(NOW(), b)", output);
     sql = "locate(locate(a,b),`match`)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("LOCATE(LOCATE(a, b), `match`)", output);
     sql = "TRIM(LEADING 'x' FROM 'xxxbarxxx')";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("TRIM(LEADING 'x' FROM 'xxxbarxxx')", output);
     sql = "TRIM(BOTH 'x' FROM 'xxxbarxxx')";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("TRIM(BOTH 'x' FROM 'xxxbarxxx')", output);
     sql = "TRIM(TRAILING 'xyz' FROM 'barxxyz')";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("TRIM(TRAILING 'xyz' FROM 'barxxyz')", output);
     sql = "TRIM('  if   ')";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("TRIM('  if   ')", output);
     sql = "TRIM( 'x' FROM 'xxxbarxxx')";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("TRIM('x' FROM 'xxxbarxxx')", output);
     sql = "TRIM(both  FROM 'barxxyz')";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("TRIM(BOTH  FROM 'barxxyz')", output);
     sql = "TRIM(leading  FROM 'barxxyz')";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("TRIM(LEADING  FROM 'barxxyz')", output);
     sql = "TRIM(TRAILING  FROM 'barxxyz')";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("TRIM(TRAILING  FROM 'barxxyz')", output);
     sql = "avg(DISTINCT results)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("AVG(DISTINCT results)", output);
     sql = "avg(results)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("AVG(results)", output);
     sql = "max(DISTINCT results)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("MAX(DISTINCT results)", output);
     sql = "max(results)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("MAX(results)", output);
     sql = "min(DISTINCT results)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("MIN(DISTINCT results)", output);
     sql = "min(results)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("MIN(results)", output);
     sql = "sum(DISTINCT results)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("SUM(DISTINCT results)", output);
     sql = "sum(results)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("SUM(results)", output);
     sql = "Count(DISTINCT expr1,expr2,expr3)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("COUNT(DISTINCT expr1, expr2, expr3)", output);
     sql = "Count(*)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("COUNT(*)", output);
     sql = "GROUP_CONCAT(DISTINCT expr1,expr2,expr3 ORDER BY col_name1 DESC,col_name2 SEPARATOR ' ')";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual(
         "GROUP_CONCAT(DISTINCT expr1, expr2, expr3 ORDER BY col_name1 DESC, col_name2 SEPARATOR  )", output);
     sql = "GROUP_CONCAT(a||b,expr2,expr3 ORDER BY col_name1 asc,col_name2 SEPARATOR '@ ')";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("GROUP_CONCAT(a OR b, expr2, expr3 ORDER BY col_name1 ASC, col_name2 SEPARATOR @ )", output);
     sql = "GROUP_CONCAT(expr1 ORDER BY col_name1 asc,col_name2 SEPARATOR 'str_val ')";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("GROUP_CONCAT(expr1 ORDER BY col_name1 ASC, col_name2 SEPARATOR str_val )", output);
     sql = "GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC )";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ,)", output);
     sql = "GROUP_CONCAT(DISTINCT test_score ORDER BY test_score asc )";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("GROUP_CONCAT(DISTINCT test_score ORDER BY test_score ASC SEPARATOR ,)", output);
     sql = "GROUP_CONCAT(c1)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("GROUP_CONCAT(c1 SEPARATOR ,)", output);
     sql = "GROUP_CONCAT(c1 separator '')";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("GROUP_CONCAT(c1 SEPARATOR )", output);
     sql = "default";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("DEFAULT", output);
     sql = "default(col)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("DEFAULT(col)", output);
     sql = "database()";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("DATABASE()", output);
     sql = "if(1>2,a+b,a:=1)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("IF(1 > 2, a + b, a := 1)", output);
     sql = "insert('abc',1,2,'')";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("INSERT('abc', 1, 2, '')", output);
     sql = "left(\"hjkafag\",4)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("LEFT('hjkafag', 4)", output);
     sql = "repeat('ag',2.1e1)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("REPEAT('ag', 21)", output);
     sql = "replace('anjd',\"df\",'af')";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("REPLACE('anjd', 'df', 'af')", output);
     sql = "right(\"hjkafag\",4)";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("RIGHT('hjkafag', 4)", output);
     sql = "schema()";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("DATABASE()", output);
     sql = "utc_date()";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("UTC_DATE()", output);
     sql = "Utc_time()";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("UTC_TIME()", output);
     sql = "Utc_timestamp()";
     parser = new MySqlExprParser(new MySqlLexer(sql));
     expr = parser.Expression();
     output = Output2MySql(expr, sql);
     Assert.AreEqual("UTC_TIMESTAMP()", output);
 }