support MySql 5.5 token
 public virtual void TestCall()
 {
     var sql = "call p(?,?) ";
     var lexer = new MySqlLexer(sql);
     var parser = new MySqlDmlCallParser(lexer, new MySqlExprParser(lexer));
     var calls = parser.Call();
     parser.Match(MySqlToken.Eof);
     var output = Output2MySql(calls, sql);
     Assert.AreEqual("CALL p(?, ?)", output);
     sql = "call p(@var1,'@var2',var3)";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlCallParser(lexer, new MySqlExprParser(lexer));
     calls = parser.Call();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(calls, sql);
     Assert.AreEqual("CALL p(@var1, '@var2', var3)", output);
     sql = "call p()";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlCallParser(lexer, new MySqlExprParser(lexer));
     calls = parser.Call();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(calls, sql);
     Assert.AreEqual("CALL p()", output);
     sql = "call p(?)";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlCallParser(lexer, new MySqlExprParser(lexer));
     calls = parser.Call();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(calls, sql);
     Assert.AreEqual("CALL p(?)", output);
 }
 /// <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;
     }
 }
        //[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");
        }
 public virtual void TestUpdate()
 {
     var sql = "upDate LOw_PRIORITY IGNORE test.t1 sEt t1.col1=?, col2=DefaulT";
     var lexer = new MySqlLexer(sql);
     var parser = new MySqlDmlUpdateParser(lexer, new MySqlExprParser(lexer));
     var update = parser.Update();
     var output = Output2MySql(update, sql);
     Assert.IsNotNull(update);
     Assert.AreEqual("UPDATE LOW_PRIORITY IGNORE test.t1 SET t1.col1 = ?, col2 = DEFAULT", output);
     sql = "upDate  IGNORE (t1) set col2=DefaulT order bY t1.col2 ";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlUpdateParser(lexer, new MySqlExprParser(lexer));
     update = parser.Update();
     output = Output2MySql(update, sql);
     Assert.AreEqual("UPDATE IGNORE t1 SET col2 = DEFAULT ORDER BY t1.col2", output);
     sql = "upDate   (test.t1) SET col2=DefaulT order bY t1.col2 limit ? offset 1";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlUpdateParser(lexer, new MySqlExprParser(lexer));
     update = parser.Update();
     output = Output2MySql(update, sql);
     Assert.AreEqual("UPDATE test.t1 SET col2 = DEFAULT ORDER BY t1.col2 LIMIT 1, ?", output);
     sql = "upDate LOW_PRIORITY  t1, test.t2 SET col2=DefaulT , col2='123''4'";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlUpdateParser(lexer, new MySqlExprParser(lexer));
     update = parser.Update();
     output = Output2MySql(update, sql);
     Assert.AreEqual("UPDATE LOW_PRIORITY t1, test.t2 SET col2 = DEFAULT, col2 = '123\\'4'", output);
     sql = "upDate LOW_PRIORITY  t1, test.t2 SET col2:=DefaulT , col2='123''4' where id='a'";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlUpdateParser(lexer, new MySqlExprParser(lexer));
     update = parser.Update();
     output = Output2MySql(update, sql);
     Assert.AreEqual("UPDATE LOW_PRIORITY t1, test.t2 SET col2 = DEFAULT, col2 = '123\\'4' WHERE id = 'a'",
         output);
 }
 public virtual void TestGroupBy()
 {
     var sql = "group by c1 asc, c2 desc  , c3 with rollup";
     var lexer = new MySqlLexer(sql);
     var parser = GetDmlParser(lexer);
     var groupBy = parser.GroupBy();
     var output = Output2MySql(groupBy, sql);
     ListUtil.IsEquals(
         ListUtil.CreateList(new Pair<IExpression, SortOrder>(new Identifier(null, "c1"), SortOrder.Asc),
             new Pair<IExpression, SortOrder>(new Identifier(null, "c2"), SortOrder.Desc),
             new Pair<IExpression, SortOrder>(new Identifier(null, "c3"), SortOrder.Asc)), groupBy.OrderByList);
     Assert.AreEqual("GROUP BY c1, c2 DESC, c3 WITH ROLLUP", output);
     sql = "group by c1 asc, c2 desc  , c3 ";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     groupBy = parser.GroupBy();
     output = Output2MySql(groupBy, sql);
     ListUtil.IsEquals(
         ListUtil.CreateList(new Pair<IExpression, SortOrder>(new Identifier(null, "c1"), SortOrder.Asc),
             new Pair<IExpression, SortOrder>(new Identifier(null, "c2"), SortOrder.Desc),
             new Pair<IExpression, SortOrder>(new Identifier(null, "c3"), SortOrder.Asc)), groupBy.OrderByList);
     Assert.AreEqual("GROUP BY c1, c2 DESC, c3", output);
     sql = "group by c1   ";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     groupBy = parser.GroupBy();
     output = Output2MySql(groupBy, sql);
     ListUtil.IsEquals(
         ListUtil.CreateList(new Pair<IExpression, SortOrder>(new Identifier(null, "c1"), SortOrder.Asc)),
         groupBy.OrderByList);
     Assert.AreEqual("GROUP BY c1", output);
     sql = "group by c1 asc  ";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     groupBy = parser.GroupBy();
     output = Output2MySql(groupBy, sql);
     ListUtil.IsEquals(
         ListUtil.CreateList(new Pair<IExpression, SortOrder>(new Identifier(null, "c1"), SortOrder.Asc)),
         groupBy.OrderByList);
     Assert.AreEqual("GROUP BY c1", output);
     sql = "group by c1 desc  ";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     groupBy = parser.GroupBy();
     output = Output2MySql(groupBy, sql);
     ListUtil.IsEquals(
         ListUtil.CreateList(new Pair<IExpression, SortOrder>(new Identifier(null, "c1"), SortOrder.Desc)),
         groupBy.OrderByList);
     Assert.AreEqual("GROUP BY c1 DESC", output);
     sql = "group by c1 with rollup  ";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     groupBy = parser.GroupBy();
     output = Output2MySql(groupBy, sql);
     ListUtil.IsEquals(
         ListUtil.CreateList(new Pair<IExpression, SortOrder>(new Identifier(null, "c1"), SortOrder.Asc)),
         groupBy.OrderByList);
     Assert.AreEqual("GROUP BY c1 WITH ROLLUP", output);
 }
 private static string BuildErrorMsg(Exception e, MySqlLexer lexer, string sql)
 {
     var sb = new StringBuilder("You have an error in your Sql syntax; Error occurs around this fragment: ");
     var ch = lexer.CurrentIndex;
     var from = ch - 16;
     if (from < 0)
     {
         from = 0;
     }
     var to = ch + 9;
     if (to >= sql.Length)
     {
         to = sql.Length - 1;
     }
     var fragment = Runtime.Substring(sql, from, to + 1);
     sb.Append('{').Append(fragment).Append('}').Append(". Error cause: " + e.Message);
     return sb.ToString();
 }
 public virtual void Testdesc()
 {
     var sql = "desc tb1";
     var lexer = new MySqlLexer(sql);
     var parser = new MySqlDalParser(lexer, new MySqlExprParser(lexer));
     ISqlStatement desc = parser.Desc();
     parser.Match(MySqlToken.Eof);
     var output = Output2MySql(desc, sql);
     Assert.AreEqual("DESC tb1", output);
     sql = "desc db.tb1";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDalParser(lexer, new MySqlExprParser(lexer));
     desc = parser.Desc();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(desc, sql);
     Assert.AreEqual("DESC db.tb1", output);
     sql = "describe db.tb1";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDalParser(lexer, new MySqlExprParser(lexer));
     desc = parser.Desc();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(desc, sql);
     Assert.AreEqual("DESC db.tb1", output);
 }
示例#8
0
 protected MySqlParser(MySqlLexer lexer, bool cacheEvalRst)
 {
     this.lexer = lexer;
     this.cacheEvalRst = cacheEvalRst;
 }
 public MySqlDmlUpdateParser(MySqlLexer lexer, MySqlExprParser exprParser)
     : base(lexer, exprParser)
 {
 }
 public MySqlDmlSelectParser(MySqlLexer lexer, MySqlExprParser exprParser)
     : base(lexer, exprParser)
 {
     this.exprParser.SetSelectParser(this);
 }
示例#11
0
 protected MySqlParser(MySqlLexer lexer)
     : this(lexer, true)
 {
 }
示例#12
0
 protected internal virtual MySqlDmlParser GetDmlParser(MySqlLexer lexer)
 {
     var exp = new MySqlExprParser(lexer);
     MySqlDmlParser parser = new MySqlDmlSelectParser(lexer, exp);
     return parser;
 }
示例#13
0
 public MySqlMtsParser(MySqlLexer lexer)
     : base(lexer)
 {
 }
示例#14
0
 public MySqlDalParser(MySqlLexer lexer, MySqlExprParser exprParser)
     : base(lexer)
 {
     this.exprParser = exprParser;
 }
示例#15
0
 public virtual void TestOrderBy()
 {
     var sql = "order by c1 asc, c2 desc  , c3 ";
     var lexer = new MySqlLexer(sql);
     var parser = GetDmlParser(lexer);
     var orderBy = parser.OrderBy();
     var output = Output2MySql(orderBy, sql);
     ListUtil.IsEquals(ListUtil.CreateList(
         new Pair<IExpression, SortOrder>(new Identifier(null, "c1"), SortOrder.Asc),
         new Pair<IExpression, SortOrder>(new Identifier(null, "c2"), SortOrder.Desc),
         new Pair<IExpression, SortOrder>(new Identifier(null, "c3"), SortOrder.Asc)),
         orderBy.OrderByList);
     Assert.AreEqual("ORDER BY c1, c2 DESC, c3", output);
     sql = "order by c1   ";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     orderBy = parser.OrderBy();
     output = Output2MySql(orderBy, sql);
     ListUtil.IsEquals(
         ListUtil.CreateList(new Pair<IExpression, SortOrder>(new Identifier(null, "c1"), SortOrder.Asc)),
         orderBy.OrderByList);
     Assert.AreEqual("ORDER BY c1", output);
     sql = "order by c1 asc  ";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     orderBy = parser.OrderBy();
     output = Output2MySql(orderBy, sql);
     ListUtil.IsEquals(
         ListUtil.CreateList(new Pair<IExpression, SortOrder>(new Identifier(null, "c1"), SortOrder.Asc)),
         orderBy.OrderByList);
     Assert.AreEqual("ORDER BY c1", output);
     sql = "order by c1 desc  ";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     orderBy = parser.OrderBy();
     output = Output2MySql(orderBy, sql);
     ListUtil.IsEquals(
         ListUtil.CreateList(new Pair<IExpression, SortOrder>(new Identifier(null, "c1"), SortOrder.Desc)),
         orderBy.OrderByList);
     Assert.AreEqual("ORDER BY c1 DESC", output);
 }
 /// <exception cref="System.Exception" />
 public override string GetSql()
 {
     var sql = new InsertLong().GetSql();
     var lexer = new MySqlLexer(sql);
     insert = new MySqlDmlInsertParser(lexer, new MySqlExprParser(lexer)).Insert();
     return sql;
 }
 /// <exception cref="System.Exception" />
 public override void Route(SchemaConfig schema, int loop, string sql)
 {
     for (var i = 0; i < loop; ++i)
     {
         var lexer = new MySqlLexer(sql);
         var insert = new MySqlDmlInsertParser(lexer, new MySqlExprParser(lexer)).Insert();
     }
 }
 public virtual void TestInsert()
 {
     var sql = "insErt HIGH_PRIORITY intO test.t1 seT t1.id1=?, id2 := '123'";
     var lexer = new MySqlLexer(sql);
     var parser = new MySqlDmlInsertParser(lexer, new MySqlExprParser(lexer));
     var insert = parser.Insert();
     parser.Match(MySqlToken.Eof);
     var output = Output2MySql(insert, sql);
     Assert.IsNotNull(insert);
     Assert.AreEqual("INSERT HIGH_PRIORITY INTO test.t1 (t1.id1, id2) VALUES (?, '123')", output);
     sql = "insErt  IGNORE test.t1 seT t1.id1:=? oN dupLicatE key UPDATE ex.col1=?, col2=12";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlInsertParser(lexer, new MySqlExprParser(lexer));
     insert = parser.Insert();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(insert, sql);
     Assert.AreEqual(
         "INSERT IGNORE INTO test.t1 (t1.id1) VALUES (?) ON DUPLICATE KEY UPDATE ex.col1 = ?, col2 = 12", output);
     sql = "insErt t1 value (123,?) oN dupLicatE key UPDATE ex.col1=?";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlInsertParser(lexer, new MySqlExprParser(lexer));
     insert = parser.Insert();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(insert, sql);
     Assert.AreEqual("INSERT INTO t1 VALUES (123, ?) ON DUPLICATE KEY UPDATE ex.col1 = ?", output);
     sql = "insErt LOW_PRIORITY t1 valueS (12e-2,1,2), (?),(default)";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlInsertParser(lexer, new MySqlExprParser(lexer));
     insert = parser.Insert();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(insert, sql);
     Assert.AreEqual("INSERT LOW_PRIORITY INTO t1 VALUES (0.12, 1, 2), (?), (DEFAULT)", output);
     sql = "insErt LOW_PRIORITY t1 select id from t1";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlInsertParser(lexer, new MySqlExprParser(lexer));
     insert = parser.Insert();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(insert, sql);
     Assert.AreEqual("INSERT LOW_PRIORITY INTO t1 SELECT id FROM t1",
         output);
     sql = "insErt delayed t1 select id from t1";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlInsertParser(lexer, new MySqlExprParser(lexer));
     insert = parser.Insert();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(insert, sql);
     Assert.AreEqual("INSERT DELAYED INTO t1 SELECT id FROM t1", output);
     sql = "insErt LOW_PRIORITY t1 (select id from t1) oN dupLicatE key UPDATE ex.col1=?, col2=12";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlInsertParser(lexer, new MySqlExprParser(lexer));
     insert = parser.Insert();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(insert, sql);
     Assert.AreEqual(
         "INSERT LOW_PRIORITY INTO t1 SELECT id FROM t1 ON DUPLICATE KEY UPDATE ex.col1 = ?, col2 = 12", output);
     sql = "insErt LOW_PRIORITY t1 (t1.col1) valueS (123),('12''34')";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlInsertParser(lexer, new MySqlExprParser(lexer));
     insert = parser.Insert();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(insert, sql);
     Assert.AreEqual("INSERT LOW_PRIORITY INTO t1 (t1.col1) VALUES (123), ('12\\'34')", output);
     sql = "insErt LOW_PRIORITY t1 (col1, t1.col2) VALUE (123,'123\\'4') oN dupLicatE key UPDATE ex.col1=?";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlInsertParser(lexer, new MySqlExprParser(lexer));
     insert = parser.Insert();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(insert, sql);
     Assert.AreEqual(
         "INSERT LOW_PRIORITY INTO t1 (col1, t1.col2) VALUES (123, '123\\'4') ON DUPLICATE KEY UPDATE ex.col1 = ?",
         output);
     sql = "insErt LOW_PRIORITY t1 (col1, t1.col2) select id from t3 oN dupLicatE key UPDATE ex.col1=?";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlInsertParser(lexer, new MySqlExprParser(lexer));
     insert = parser.Insert();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(insert, sql);
     Assert.AreEqual(
         "INSERT LOW_PRIORITY INTO t1 (col1, t1.col2) SELECT id FROM t3 ON DUPLICATE KEY UPDATE ex.col1 = ?",
         output);
     sql = "insErt LOW_PRIORITY IGNORE intO t1 (col1) ( select id from t3) ";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlInsertParser(lexer, new MySqlExprParser(lexer));
     insert = parser.Insert();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(insert, sql);
     Assert.AreEqual("INSERT LOW_PRIORITY IGNORE INTO t1 (col1) SELECT id FROM t3", output);
 }
 public virtual void TestReplace()
 {
     var sql = "ReplaCe LOW_PRIORITY intO test.t1 seT t1.id1:=?, id2='123'";
     var lexer = new MySqlLexer(sql);
     var parser = new MySqlDmlReplaceParser(lexer, new MySqlExprParser(lexer));
     var replace = parser.Replace();
     parser.Match(MySqlToken.Eof);
     Assert.IsNotNull(replace);
     var output = Output2MySql(replace, sql);
     Assert.AreEqual("REPLACE LOW_PRIORITY INTO test.t1 (t1.id1, id2) VALUES (?, '123')", output);
     sql = "ReplaCe   test.t1 seT t1.id1:=? ";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlReplaceParser(lexer, new MySqlExprParser(lexer));
     replace = parser.Replace();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(replace, sql);
     Assert.AreEqual("REPLACE INTO test.t1 (t1.id1) VALUES (?)", output);
     sql = "ReplaCe t1 value (123,?) ";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlReplaceParser(lexer, new MySqlExprParser(lexer));
     replace = parser.Replace();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(replace, sql);
     Assert.AreEqual("REPLACE INTO t1 VALUES (123, ?)", output);
     sql = "ReplaCe LOW_PRIORITY t1 valueS (12e-2), (?)";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlReplaceParser(lexer, new MySqlExprParser(lexer));
     replace = parser.Replace();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(replace, sql);
     Assert.AreEqual("REPLACE LOW_PRIORITY INTO t1 VALUES (0.12), (?)", output);
     sql = "ReplaCe LOW_PRIORITY t1 select id from t1";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlReplaceParser(lexer, new MySqlExprParser(lexer));
     replace = parser.Replace();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(replace, sql);
     Assert.AreEqual("REPLACE LOW_PRIORITY INTO t1 SELECT id FROM t1",
         output);
     sql = "ReplaCe delayed t1 select id from t1";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlReplaceParser(lexer, new MySqlExprParser(lexer));
     replace = parser.Replace();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(replace, sql);
     Assert.AreEqual("REPLACE DELAYED INTO t1 SELECT id FROM t1", output);
     sql = "ReplaCe LOW_PRIORITY t1 (select id from t1) ";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlReplaceParser(lexer, new MySqlExprParser(lexer));
     replace = parser.Replace();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(replace, sql);
     Assert.AreEqual("REPLACE LOW_PRIORITY INTO t1 SELECT id FROM t1",
         output);
     sql = "ReplaCe LOW_PRIORITY t1 (t1.col1) valueS (123),('12''34')";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlReplaceParser(lexer, new MySqlExprParser(lexer));
     replace = parser.Replace();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(replace, sql);
     Assert.AreEqual("REPLACE LOW_PRIORITY INTO t1 (t1.col1) VALUES (123), ('12\\'34')", output);
     sql = "ReplaCe LOW_PRIORITY t1 (col1, t1.col2) VALUE (123,'123\\'4') ";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlReplaceParser(lexer, new MySqlExprParser(lexer));
     replace = parser.Replace();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(replace, sql);
     Assert.AreEqual("REPLACE LOW_PRIORITY INTO t1 (col1, t1.col2) VALUES (123, '123\\'4')", output);
     sql = "REPLACE LOW_PRIORITY t1 (col1, t1.col2) select id from t3 ";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlReplaceParser(lexer, new MySqlExprParser(lexer));
     replace = parser.Replace();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(replace, sql);
     Assert.AreEqual("REPLACE LOW_PRIORITY INTO t1 (col1, t1.col2) SELECT id FROM t3", output);
     sql = "replace LOW_PRIORITY  intO t1 (col1) ( select id from t3) ";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlReplaceParser(lexer, new MySqlExprParser(lexer));
     replace = parser.Replace();
     parser.Match(MySqlToken.Eof);
     output = Output2MySql(replace, sql);
     Assert.AreEqual("REPLACE LOW_PRIORITY INTO t1 (col1) SELECT id FROM t3", output);
 }
 /// <exception cref="System.Exception" />
 public override string GetSql()
 {
     var sb = new StringBuilder("insert into offer_detail (offer_id, gmt) values ");
     for (var i = 0; i < 8; ++i)
     {
         if (i > 0)
         {
             sb.Append(", ");
         }
         sb.Append("(" + (i + 100) + ", now())");
     }
     var sql = sb.ToString();
     var lexer = new MySqlLexer(sql);
     insert = new MySqlDmlInsertParser(lexer, new MySqlExprParser(lexer)).Insert();
     sqlSize = new InsertLong().GetSql().Length;
     return sql;
 }
 public MySqlDmlReplaceParser(MySqlLexer lexer, MySqlExprParser exprParser)
     : base(lexer, exprParser)
 {
 }
 /// <exception cref="System.Exception" />
 public override void Route(SchemaConfig schema, int loop, string sql)
 {
     for (var i = 0; i < loop; ++i)
     {
         var lexer = new MySqlLexer(sql);
         var select = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer)).Select();
         var visitor = new PartitionKeyVisitor(schema.Tables);
         select.Accept(visitor);
     }
 }
示例#23
0
 public virtual void TestLimit()
 {
     var sql = "limit 1,2";
     var lexer = new MySqlLexer(sql);
     var parser = GetDmlParser(lexer);
     var limit = parser.Limit();
     var output = Output2MySql(limit, sql);
     Assert.AreEqual(1, limit.Offset);
     Assert.AreEqual(2, limit.Size);
     Assert.AreEqual("LIMIT 1, 2", output);
     sql = "limit 1,?";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     limit = parser.Limit();
     output = Output2MySql(limit, sql);
     Assert.AreEqual(1, limit.Offset);
     Assert.AreEqual(new ParamMarker(1), limit.Size);
     Assert.AreEqual("LIMIT 1, ?", output);
     sql = "limit ?,9";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     limit = parser.Limit();
     output = Output2MySql(limit, sql);
     Assert.AreEqual(new ParamMarker(1), limit.Offset);
     Assert.AreEqual(9, limit.Size);
     Assert.AreEqual("LIMIT ?, 9", output);
     sql = "limit ?,?";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     limit = parser.Limit();
     output = Output2MySql(limit, sql);
     Assert.AreEqual(new ParamMarker(1), limit.Offset);
     Assert.AreEqual(new ParamMarker(2), limit.Size);
     Assert.AreEqual("LIMIT ?, ?", output);
     sql = "limit ? d";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     limit = parser.Limit();
     output = Output2MySql(limit, sql);
     Assert.AreEqual(0, limit.Offset);
     Assert.AreEqual(new ParamMarker(1), limit.Size);
     Assert.AreEqual("LIMIT 0, ?", output);
     sql = "limit 9 f";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     limit = parser.Limit();
     output = Output2MySql(limit, sql);
     Assert.AreEqual(0, limit.Offset);
     Assert.AreEqual(9, limit.Size);
     Assert.AreEqual("LIMIT 0, 9", output);
     sql = "limit 9 ofFset 0";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     limit = parser.Limit();
     output = Output2MySql(limit, sql);
     Assert.AreEqual(0, limit.Offset);
     Assert.AreEqual(9, limit.Size);
     Assert.AreEqual("LIMIT 0, 9", output);
     sql = "limit ? offset 0";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     limit = parser.Limit();
     output = Output2MySql(limit, sql);
     Assert.AreEqual(0, limit.Offset);
     Assert.AreEqual(new ParamMarker(1), limit.Size);
     Assert.AreEqual("LIMIT 0, ?", output);
     sql = "limit ? offset ?";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     limit = parser.Limit();
     output = Output2MySql(limit, sql);
     Assert.AreEqual(new ParamMarker(2), limit.Offset);
     Assert.AreEqual(new ParamMarker(1), limit.Size);
     Assert.AreEqual("LIMIT ?, ?", output);
     sql = "limit 9 offset ?";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     limit = parser.Limit();
     output = Output2MySql(limit, sql);
     Assert.AreEqual(new ParamMarker(1), limit.Offset);
     Assert.AreEqual(9, limit.Size);
     Assert.AreEqual("LIMIT ?, 9", output);
 }
示例#24
0
 public MySqlExprParser(MySqlLexer lexer, MySqlFunctionManager functionManager, bool cacheEvalRst, string charset)
     : base(lexer, cacheEvalRst)
 {
     this.functionManager = functionManager;
     this.charset = charset ?? DefaultCharset;
 }
示例#25
0
 public virtual void TestTR1()
 {
     var sql = "(select * from `select`) as `select`";
     var lexer = new MySqlLexer(sql);
     var parser = GetDmlParser(lexer);
     var trs = parser.TableRefs();
     var output = Output2MySql(trs, sql);
     var list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (SubqueryFactor), list[0].GetType());
     Assert.AreEqual("(SELECT * FROM `select`) AS `SELECT`", output);
     sql = "(((selecT * from any)union select `select` from `from` order by dd) as 'a1', (((t2)))), t3";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(2, list.Count);
     Assert.AreEqual(typeof (TableReferences), list[0].GetType());
     Assert.AreEqual(typeof (TableRefFactor), list[1].GetType());
     list = ((TableReferences)list[0]).TableReferenceList;
     Assert.AreEqual(2, list.Count);
     Assert.AreEqual(typeof (SubqueryFactor), list[0].GetType());
     Assert.AreEqual(typeof (TableReferences), list[1].GetType());
     Assert.AreEqual("((SELECT * FROM any) UNION (SELECT `select` FROM `from` ORDER BY dd)) AS 'a1', t2, t3",
         output);
     sql = "(t1)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     var tr = list[0];
     Assert.AreEqual(typeof (TableReferences), tr.GetType());
     list = ((TableReferences)tr).TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     Assert.AreEqual("t1", output);
     sql = "(t1,t2,(t3))";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (TableReferences), list[0].GetType());
     tr = (TableReferences)list[0];
     Assert.AreEqual(typeof (TableReferences), tr.GetType());
     list = ((TableReferences)tr).TableReferenceList;
     Assert.AreEqual(3, list.Count);
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     Assert.AreEqual(typeof (TableRefFactor), list[1].GetType());
     Assert.AreEqual(typeof (TableRefFactor), list[1].GetType());
     Assert.AreEqual("t1, t2, t3", output);
     sql = "(tb1 as t1)inner join (tb2 as t2) on t1.name=t2.name";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (InnerJoin), list[0].GetType());
     tr = ((InnerJoin)list[0]).LeftTableRef;
     Assert.AreEqual(typeof (TableReferences), tr.GetType());
     list = ((TableReferences)tr).TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     var ex = ((InnerJoin)trs.TableReferenceList[0]).OnCond;
     Assert.AreEqual(ex.GetType(), typeof (ComparisionEqualsExpression));
     Assert.AreEqual("(tb1 AS T1) INNER JOIN (tb2 AS T2) ON t1.name = t2.name", output);
     sql = "(tb1 as t1)inner join tb2 as t2 using (c1)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     var using_list = ((InnerJoin)trs.TableReferenceList[0]).Using;
     Assert.AreEqual(1, using_list.Count);
     Assert.AreEqual("(tb1 AS T1) INNER JOIN tb2 AS T2 USING (c1)", output);
     sql = "(tb1 as t1)inner join tb2 as t2 using (c1,c2)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     using_list = ((InnerJoin)trs.TableReferenceList[0]).Using;
     Assert.AreEqual(2, using_list.Count);
     Assert.AreEqual("(tb1 AS T1) INNER JOIN tb2 AS T2 USING (c1, c2)", output);
     sql = "tb1 as t1 use index (i1,i2,i3)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     var hintlist = ((TableRefFactor)trs.TableReferenceList[0]).HintList;
     Assert.AreEqual(1, hintlist.Count);
     var indexhint = hintlist[0];
     Assert.AreEqual(3, indexhint.IndexList.Count);
     Assert.AreEqual("USE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("INDEX", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("tb1 AS T1 USE INDEX (i1, i2, i3)", output);
     sql = "tb1 as t1 use index (i1,i2,i3),tb2 as t2 use index (i1,i2,i3)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(2, list.Count);
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     hintlist = ((TableRefFactor)trs.TableReferenceList[0]).HintList;
     Assert.AreEqual(1, hintlist.Count);
     indexhint = hintlist[0];
     Assert.AreEqual(3, indexhint.IndexList.Count);
     Assert.AreEqual("USE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("INDEX", indexhint.IndexType.GetEnumName());
     hintlist = ((TableRefFactor)trs.TableReferenceList[1]).HintList;
     Assert.AreEqual(1, hintlist.Count);
     indexhint = hintlist[0];
     Assert.AreEqual(3, indexhint.IndexList.Count);
     Assert.AreEqual("USE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("INDEX", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("tb1 AS T1 USE INDEX (i1, i2, i3), tb2 AS T2 USE INDEX (i1, i2, i3)", output);
     sql = "tb1 as t1";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     Assert.AreEqual("tb1", ((TableRefFactor)trs.TableReferenceList[0]).Table.IdText);
     Assert.AreEqual("T1", ((TableRefFactor)trs.TableReferenceList[0]).Alias);
     Assert.AreEqual("tb1 AS T1", output);
     sql = "tb1 t1";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     Assert.AreEqual("tb1", ((TableRefFactor)trs.TableReferenceList[0]).Table.IdText);
     Assert.AreEqual("T1", ((TableRefFactor)trs.TableReferenceList[0]).Alias);
     Assert.AreEqual("tb1 AS T1", output);
     sql = "tb1,tb2,tb3";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(3, list.Count);
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     Assert.AreEqual("tb1", ((TableRefFactor)trs.TableReferenceList[0]).Table.IdText);
     Assert.AreEqual(null, ((TableRefFactor)trs.TableReferenceList[0]).Alias);
     Assert.AreEqual("tb2", ((TableRefFactor)trs.TableReferenceList[1]).Table.IdText);
     Assert.AreEqual("tb3", ((TableRefFactor)trs.TableReferenceList[2]).Table.IdText);
     Assert.AreEqual("tb1, tb2, tb3", output);
     sql = "tb1 use key for join (i1,i2)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     hintlist = ((TableRefFactor)trs.TableReferenceList[0]).HintList;
     Assert.AreEqual(1, hintlist.Count);
     indexhint = hintlist[0];
     Assert.AreEqual(2, indexhint.IndexList.Count);
     Assert.AreEqual("USE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("KEY", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("JOIN", indexhint.HintScope.GetEnumName());
     Assert.AreEqual("tb1 USE KEY FOR JOIN (i1, i2)", output);
     sql = "tb1 use index for group by(i1,i2)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     hintlist = ((TableRefFactor)trs.TableReferenceList[0]).HintList;
     Assert.AreEqual(1, hintlist.Count);
     indexhint = hintlist[0];
     Assert.AreEqual(2, indexhint.IndexList.Count);
     Assert.AreEqual("USE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("INDEX", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("GROUP_BY", indexhint.HintScope.GetEnumName());
     Assert.AreEqual("tb1 USE INDEX FOR GROUP BY (i1, i2)", output);
     sql = "tb1 use key for order by (i1,i2) use key for group by () " + "ignore index for group by (i1,i2)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     Assert.AreEqual("tb1", ((TableRefFactor)trs.TableReferenceList[0]).Table.IdText);
     Assert.AreEqual(null, ((TableRefFactor)trs.TableReferenceList[0]).Alias);
     hintlist = ((TableRefFactor)trs.TableReferenceList[0]).HintList;
     Assert.AreEqual(3, hintlist.Count);
     indexhint = hintlist[0];
     Assert.AreEqual(2, indexhint.IndexList.Count);
     Assert.AreEqual("USE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("KEY", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("ORDER_BY", indexhint.HintScope.GetEnumName());
     indexhint = hintlist[1];
     Assert.AreEqual(0, indexhint.IndexList.Count);
     Assert.AreEqual("USE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("KEY", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("GROUP_BY", indexhint.HintScope.GetEnumName());
     indexhint = hintlist[2];
     Assert.AreEqual(2, indexhint.IndexList.Count);
     Assert.AreEqual("IGNORE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("INDEX", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("GROUP_BY", indexhint.HintScope.GetEnumName());
     Assert.AreEqual(
         "tb1 USE KEY FOR ORDER BY (i1, i2) " + "USE KEY FOR GROUP BY () IGNORE INDEX FOR GROUP BY (i1, i2)",
         output);
     sql = "tb1 use index for order by (i1,i2) force index for group by (i1)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     Assert.AreEqual("tb1", ((TableRefFactor)trs.TableReferenceList[0]).Table.IdText);
     Assert.AreEqual(null, ((TableRefFactor)trs.TableReferenceList[0]).Alias);
     hintlist = ((TableRefFactor)trs.TableReferenceList[0]).HintList;
     Assert.AreEqual(2, hintlist.Count);
     indexhint = hintlist[0];
     Assert.AreEqual(2, indexhint.IndexList.Count);
     Assert.AreEqual("i1", indexhint.IndexList[0]);
     Assert.AreEqual("i2", indexhint.IndexList[1]);
     Assert.AreEqual("USE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("INDEX", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("ORDER_BY", indexhint.HintScope.GetEnumName());
     indexhint = hintlist[1];
     Assert.AreEqual(1, indexhint.IndexList.Count);
     Assert.AreEqual("FORCE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("INDEX", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("GROUP_BY", indexhint.HintScope.GetEnumName());
     Assert.AreEqual("tb1 USE INDEX FOR ORDER BY (i1, i2) FORCE INDEX FOR GROUP BY (i1)", output);
     sql = "tb1 ignore key for join (i1,i2)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     Assert.AreEqual("tb1", ((TableRefFactor)trs.TableReferenceList[0]).Table.IdText);
     Assert.AreEqual(null, ((TableRefFactor)trs.TableReferenceList[0]).Alias);
     hintlist = ((TableRefFactor)trs.TableReferenceList[0]).HintList;
     Assert.AreEqual(1, hintlist.Count);
     indexhint = hintlist[0];
     Assert.AreEqual(2, indexhint.IndexList.Count);
     Assert.AreEqual("i1", indexhint.IndexList[0]);
     Assert.AreEqual("i2", indexhint.IndexList[1]);
     Assert.AreEqual("IGNORE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("KEY", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("JOIN", indexhint.HintScope.GetEnumName());
     Assert.AreEqual("tb1 IGNORE KEY FOR JOIN (i1, i2)", output);
     sql = "tb1 ignore index for group by (i1,i2)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     Assert.AreEqual("tb1", ((TableRefFactor)trs.TableReferenceList[0]).Table.IdText);
     Assert.AreEqual(null, ((TableRefFactor)trs.TableReferenceList[0]).Alias);
     hintlist = ((TableRefFactor)trs.TableReferenceList[0]).HintList;
     Assert.AreEqual(1, hintlist.Count);
     indexhint = hintlist[0];
     Assert.AreEqual(2, indexhint.IndexList.Count);
     Assert.AreEqual("i1", indexhint.IndexList[0]);
     Assert.AreEqual("i2", indexhint.IndexList[1]);
     Assert.AreEqual("IGNORE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("INDEX", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("GROUP_BY", indexhint.HintScope.GetEnumName());
     Assert.AreEqual("tb1 IGNORE INDEX FOR GROUP BY (i1, i2)", output);
     sql =
         "(offer  a  straight_join wp_image b use key for join(t1,t2) on a.member_id=b.member_id inner join product_visit c )";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     Assert.AreEqual(
         "offer AS A STRAIGHT_JOIN wp_image AS B USE KEY FOR JOIN (t1, t2) ON a.member_id = b.member_id INNER JOIN product_visit AS C",
         output);
     sql = "tb1 ignore index for order by(i1)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     Assert.AreEqual("tb1", ((TableRefFactor)trs.TableReferenceList[0]).Table.IdText);
     Assert.AreEqual(null, ((TableRefFactor)trs.TableReferenceList[0]).Alias);
     hintlist = ((TableRefFactor)trs.TableReferenceList[0]).HintList;
     Assert.AreEqual(1, hintlist.Count);
     indexhint = hintlist[0];
     Assert.AreEqual(1, indexhint.IndexList.Count);
     Assert.AreEqual("i1", indexhint.IndexList[0]);
     Assert.AreEqual("IGNORE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("INDEX", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("ORDER_BY", indexhint.HintScope.GetEnumName());
     Assert.AreEqual("tb1 IGNORE INDEX FOR ORDER BY (i1)", output);
     sql = "tb1 force key for group by (i1,i2)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     Assert.AreEqual("tb1", ((TableRefFactor)trs.TableReferenceList[0]).Table.IdText);
     Assert.AreEqual(null, ((TableRefFactor)trs.TableReferenceList[0]).Alias);
     hintlist = ((TableRefFactor)trs.TableReferenceList[0]).HintList;
     Assert.AreEqual(1, hintlist.Count);
     indexhint = hintlist[0];
     Assert.AreEqual(2, indexhint.IndexList.Count);
     Assert.AreEqual("i1", indexhint.IndexList[0]);
     Assert.AreEqual("i2", indexhint.IndexList[1]);
     Assert.AreEqual("FORCE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("KEY", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("GROUP_BY", indexhint.HintScope.GetEnumName());
     Assert.AreEqual("tb1 FORCE KEY FOR GROUP BY (i1, i2)", output);
     sql = "tb1 force index for group by (i1,i2)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     Assert.AreEqual("tb1", ((TableRefFactor)trs.TableReferenceList[0]).Table.IdText);
     Assert.AreEqual(null, ((TableRefFactor)trs.TableReferenceList[0]).Alias);
     hintlist = ((TableRefFactor)trs.TableReferenceList[0]).HintList;
     Assert.AreEqual(1, hintlist.Count);
     indexhint = hintlist[0];
     Assert.AreEqual(2, indexhint.IndexList.Count);
     Assert.AreEqual("i1", indexhint.IndexList[0]);
     Assert.AreEqual("i2", indexhint.IndexList[1]);
     Assert.AreEqual("FORCE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("INDEX", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("GROUP_BY", indexhint.HintScope.GetEnumName());
     Assert.AreEqual("tb1 FORCE INDEX FOR GROUP BY (i1, i2)", output);
     sql = "tb1 force index for join (i1,i2)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     Assert.AreEqual("tb1", ((TableRefFactor)trs.TableReferenceList[0]).Table.IdText);
     Assert.AreEqual(null, ((TableRefFactor)trs.TableReferenceList[0]).Alias);
     hintlist = ((TableRefFactor)trs.TableReferenceList[0]).HintList;
     Assert.AreEqual(1, hintlist.Count);
     indexhint = hintlist[0];
     Assert.AreEqual(2, indexhint.IndexList.Count);
     Assert.AreEqual("i1", indexhint.IndexList[0]);
     Assert.AreEqual("i2", indexhint.IndexList[1]);
     Assert.AreEqual("FORCE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("INDEX", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("JOIN", indexhint.HintScope.GetEnumName());
     Assert.AreEqual("tb1 FORCE INDEX FOR JOIN (i1, i2)", output);
     sql = "(tb1 force index for join (i1,i2) )left outer join tb2 as t2 " +
           "use index (i1,i2,i3) on t1.id1=t2.id1";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (OuterJoin), list[0].GetType());
     Assert.AreEqual(true, ((OuterJoin)list[0]).IsLeftJoin);
     var ltr = (TableReferences)((OuterJoin)list[0]).LeftTableRef;
     Assert.AreEqual(1, ltr.TableReferenceList.Count);
     Assert.AreEqual(typeof (TableRefFactor), ltr.TableReferenceList[0].GetType());
     Assert.AreEqual(null, ((TableRefFactor)ltr.TableReferenceList[0]).Alias);
     Assert.AreEqual("tb1", ((TableRefFactor)ltr.TableReferenceList[0]).Table.IdText);
     hintlist = ((TableRefFactor)ltr.TableReferenceList[0]).HintList;
     Assert.AreEqual(1, hintlist.Count);
     indexhint = hintlist[0];
     Assert.AreEqual(2, indexhint.IndexList.Count);
     Assert.AreEqual("i1", indexhint.IndexList[0]);
     Assert.AreEqual("i2", indexhint.IndexList[1]);
     Assert.AreEqual("FORCE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("INDEX", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("JOIN", indexhint.HintScope.GetEnumName());
     var rtf = (TableRefFactor)((OuterJoin)list[0]).RightTableRef;
     Assert.AreEqual("T2", rtf.Alias);
     Assert.AreEqual("tb2", rtf.Table.IdText);
     hintlist = rtf.HintList;
     Assert.AreEqual(1, hintlist.Count);
     indexhint = hintlist[0];
     Assert.AreEqual(3, indexhint.IndexList.Count);
     Assert.AreEqual("i1", indexhint.IndexList[0]);
     Assert.AreEqual("i2", indexhint.IndexList[1]);
     Assert.AreEqual("USE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("INDEX", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("ALL", indexhint.HintScope.GetEnumName());
     Assert.AreEqual(typeof (ComparisionEqualsExpression), ((OuterJoin)
         list[0]).OnCond.GetType());
     Assert.AreEqual(
         "(tb1 FORCE INDEX FOR JOIN (i1, i2)) " + "LEFT JOIN tb2 AS T2 USE INDEX (i1, i2, i3) ON t1.id1 = t2.id1",
         output);
     sql = " (((tb1 force index for join (i1,i2),tb3),tb4),tb5) " +
           "left outer join (tb2 as t2 use index (i1,i2,i3)) using(id1)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (OuterJoin), list[0].GetType());
     Assert.AreEqual(true, ((OuterJoin)list[0]).IsLeftJoin);
     ltr = (TableReferences)((OuterJoin)list[0]).LeftTableRef;
     Assert.AreEqual(2, ltr.TableReferenceList.Count);
     Assert.AreEqual(typeof (TableReferences), ltr.TableReferenceList[0].GetType());
     var ltr1 = (TableReferences)ltr.TableReferenceList[0];
     Assert.AreEqual(2, ltr1.TableReferenceList.Count);
     Assert.AreEqual(typeof (TableReferences), ltr1.TableReferenceList[0].GetType());
     var ltr2 = (TableReferences)ltr1.TableReferenceList[0];
     Assert.AreEqual(2, ltr2.TableReferenceList.Count);
     Assert.AreEqual(typeof (TableRefFactor), ltr2.TableReferenceList[0].GetType());
     Assert.AreEqual(null, ((TableRefFactor)ltr2.TableReferenceList[0]).Alias);
     Assert.AreEqual("tb1", ((TableRefFactor)ltr2.TableReferenceList[0]).Table.IdText);
     hintlist = ((TableRefFactor)ltr2.TableReferenceList[0]).HintList;
     Assert.AreEqual(1, hintlist.Count);
     indexhint = hintlist[0];
     Assert.AreEqual(2, indexhint.IndexList.Count);
     Assert.AreEqual("i1", indexhint.IndexList[0]);
     Assert.AreEqual("i2", indexhint.IndexList[1]);
     Assert.AreEqual("FORCE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("INDEX", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("JOIN", indexhint.HintScope.GetEnumName());
     Assert.AreEqual(typeof (TableRefFactor), ltr2.TableReferenceList[1].GetType());
     Assert.AreEqual("tb3", ((TableRefFactor)ltr2.TableReferenceList[1]).Table.IdText);
     Assert.AreEqual(typeof (TableRefFactor), ltr1.TableReferenceList[1].GetType());
     Assert.AreEqual("tb4", ((TableRefFactor)ltr1.TableReferenceList[1]).Table.IdText);
     Assert.AreEqual(typeof (TableRefFactor), ltr.TableReferenceList[1].GetType());
     Assert.AreEqual("tb5", ((TableRefFactor)ltr.TableReferenceList[1]).Table.IdText);
     var rtr = (TableReferences)((OuterJoin)list[0]).RightTableRef;
     Assert.AreEqual("T2", ((TableRefFactor)rtr.TableReferenceList[0]).Alias);
     Assert.AreEqual("tb2", ((TableRefFactor)rtr.TableReferenceList[0]).Table.IdText);
     hintlist = ((TableRefFactor)rtr.TableReferenceList[0]).HintList;
     Assert.AreEqual(1, hintlist.Count);
     indexhint = hintlist[0];
     Assert.AreEqual(3, indexhint.IndexList.Count);
     Assert.AreEqual("i1", indexhint.IndexList[0]);
     Assert.AreEqual("i2", indexhint.IndexList[1]);
     Assert.AreEqual("USE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("INDEX", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("ALL", indexhint.HintScope.GetEnumName());
     using_list = ((OuterJoin)trs.TableReferenceList[0]).Using;
     Assert.AreEqual(1, using_list.Count);
     Assert.AreEqual("(tb1 FORCE INDEX FOR JOIN (i1, i2), tb3, tb4, tb5) "
                     + "LEFT JOIN (tb2 AS T2 USE INDEX (i1, i2, i3)) USING (id1)", output);
     sql = "(tb1 force index for join (i1,i2),tb3) " +
           "left outer join tb2 as t2 use index (i1,i2,i3) using(id1,id2)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     Assert.AreEqual(
         "(tb1 FORCE INDEX FOR JOIN (i1, i2), tb3) " +
         "LEFT JOIN tb2 AS T2 USE INDEX (i1, i2, i3) USING (id1, id2)", output);
     sql =
         "(tb1 force index for join (i1,i2),tb3) left outer join (tb2 as t2 use index (i1,i2,i3)) using(id1,id2)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     Assert.AreEqual(
         "(tb1 FORCE INDEX FOR JOIN (i1, i2), tb3) " +
         "LEFT JOIN (tb2 AS T2 USE INDEX (i1, i2, i3)) USING (id1, id2)", output);
     sql = "tb1 as t1 cross join tb2 as t2 use index(i1)using(id1)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     Assert.AreEqual("tb1 AS T1 INNER JOIN tb2 AS T2 USE INDEX (i1) USING (id1)", output);
     sql = "(tb1 as t1) cross join tb2 as t2 use index(i1)using(id1)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     Assert.AreEqual("(tb1 AS T1) INNER JOIN tb2 AS T2 USE INDEX (i1) USING (id1)", output);
     sql = "tb1 as _latin't1' cross join tb2 as t2 use index(i1)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     Assert.AreEqual("tb1 AS _LATIN't1' INNER JOIN tb2 AS T2 USE INDEX (i1)", output);
     sql = "((select '  @  from' from `from`)) as t1 cross join tb2 as t2 use index()";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (InnerJoin), list[0].GetType());
     var lsf = (SubqueryFactor)((InnerJoin)list[0]).LeftTableRef;
     Assert.AreEqual("T1", lsf.Alias);
     Assert.AreEqual(typeof (DmlSelectStatement), lsf.Subquery.GetType());
     rtf = (TableRefFactor)((InnerJoin)list[0]).RightTableRef;
     Assert.AreEqual("T2", rtf.Alias);
     hintlist = rtf.HintList;
     Assert.AreEqual(1, hintlist.Count);
     indexhint = hintlist[0];
     Assert.AreEqual("USE", indexhint.HintAction.GetEnumName());
     Assert.AreEqual("INDEX", indexhint.IndexType.GetEnumName());
     Assert.AreEqual("ALL", indexhint.HintScope.GetEnumName());
     Assert.AreEqual("tb2", rtf.Table.IdText);
     Assert.AreEqual("(SELECT '  @  from' FROM `from`) AS T1 " + "INNER JOIN tb2 AS T2 USE INDEX ()", output);
     sql = "(tb1 as t1) straight_join (tb2 as t2)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     Assert.AreEqual("(tb1 AS T1) STRAIGHT_JOIN (tb2 AS T2)", output);
     sql = "tb1 straight_join tb2 as t2 on tb1.id=tb2.id";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     Assert.AreEqual("tb1 STRAIGHT_JOIN tb2 AS T2 ON tb1.id = tb2.id",
         output);
     sql = "tb1 left outer join tb2 on tb1.id=tb2.id";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     Assert.AreEqual("tb1 LEFT JOIN tb2 ON tb1.id = tb2.id", output);
     sql = "tb1 left outer join tb2 using(id)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     Assert.AreEqual("tb1 LEFT JOIN tb2 USING (id)", output);
     sql = "(tb1 right outer join tb2 using()) join tb3 on tb1.id=tb2.id and tb2.id=tb3.id";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (InnerJoin), list[0].GetType());
     ltr = (TableReferences)((InnerJoin)list[0]).LeftTableRef;
     Assert.AreEqual(1, ltr.TableReferenceList.Count);
     var lltrf = (TableRefFactor)((OuterJoin)ltr.TableReferenceList[0]).LeftTableRef;
     Assert.AreEqual(null, lltrf.Alias);
     Assert.AreEqual("tb1", lltrf.Table.IdText);
     using_list = ((OuterJoin)ltr.TableReferenceList[0]).Using;
     Assert.AreEqual(0, using_list.Count);
     rtf = (TableRefFactor)((InnerJoin)list[0]).RightTableRef;
     Assert.AreEqual(null, rtf.Alias);
     hintlist = rtf.HintList;
     Assert.AreEqual(0, hintlist.Count);
     Assert.AreEqual("tb3", rtf.Table.IdText);
     Assert.AreEqual(typeof (LogicalAndExpression), ((InnerJoin)list[0]).OnCond.GetType());
     Assert.AreEqual("(tb1 RIGHT JOIN tb2 USING ()) " + "INNER JOIN tb3 ON tb1.id = tb2.id AND tb2.id = tb3.id",
         output);
     sql = "tb1 right outer join tb2 using(id1,id2) " + "join (tb3,tb4) on tb1.id=tb2.id and tb2.id=tb3.id";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (InnerJoin), list[0].GetType());
     var loj = (OuterJoin)((InnerJoin)list[0]).LeftTableRef;
     lltrf = (TableRefFactor)loj.LeftTableRef;
     Assert.AreEqual(null, lltrf.Alias);
     Assert.AreEqual("tb1", lltrf.Table.IdText);
     using_list = loj.Using;
     Assert.AreEqual(2, using_list.Count);
     rtr = (TableReferences)((InnerJoin)list[0]).RightTableRef;
     Assert.AreEqual(2, rtr.TableReferenceList.Count);
     Assert.AreEqual("tb3", ((TableRefFactor)rtr.TableReferenceList[0]).Table.IdText);
     Assert.AreEqual("tb4", ((TableRefFactor)rtr.TableReferenceList[1]).Table.IdText);
     Assert.AreEqual(typeof (LogicalAndExpression), ((InnerJoin)list[0]).OnCond.GetType());
     Assert.AreEqual(
         "tb1 RIGHT JOIN tb2 USING (id1, id2) " + "INNER JOIN (tb3, tb4) ON tb1.id = tb2.id AND tb2.id = tb3.id",
         output);
     sql = "tb1 left outer join tb2 join tb3 using(id)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     Assert.AreEqual("tb1 LEFT JOIN (tb2 INNER JOIN tb3) USING (id)",
         output);
     sql = "tb1 right join tb2 on tb1.id=tb2.id";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     Assert.AreEqual("tb1 RIGHT JOIN tb2 ON tb1.id = tb2.id", output);
     sql = "tb1 natural right join tb2 ";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     Assert.AreEqual("tb1 NATURAL RIGHT JOIN tb2", output);
     sql = "tb1 natural right outer join tb2 natural left outer join tb3";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (NaturalJoin), list[0].GetType());
     var lnj = (NaturalJoin)((NaturalJoin)list[0]).LeftTableRef;
     lltrf = (TableRefFactor)lnj.LeftTableRef;
     Assert.AreEqual(null, lltrf.Alias);
     Assert.AreEqual("tb1", lltrf.Table.IdText);
     var rltrf = (TableRefFactor)lnj.RightTableRef;
     Assert.AreEqual(null, rltrf.Alias);
     Assert.AreEqual("tb2", rltrf.Table.IdText);
     rtf = (TableRefFactor)((NaturalJoin)list[0]).RightTableRef;
     Assert.AreEqual(null, rtf.Alias);
     Assert.AreEqual("tb3", rtf.Table.IdText);
     Assert.AreEqual("tb1 NATURAL RIGHT JOIN tb2 NATURAL LEFT JOIN tb3", output);
     sql = "tb1 natural left outer join tb2 ";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     Assert.AreEqual("tb1 NATURAL LEFT JOIN tb2", output);
     sql = "(tb1  t1) natural  join (tb2 as t2) ";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     Assert.AreEqual("(tb1 AS T1) NATURAL JOIN (tb2 AS T2)", output);
     sql = "(select (select * from tb1) from `select` " + "where `any`=any(select id2 from tb2))any  ";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(typeof (SubqueryFactor), list[0].GetType());
     Assert.AreEqual("ANY", ((SubqueryFactor)list[0]).Alias);
     Assert.AreEqual(
         "(SELECT SELECT * FROM tb1 FROM `select` " + "WHERE `any` = ANY (SELECT id2 FROM tb2)) AS ANY", output);
     sql = "((tb1),(tb3 as t3,`select`),tb2 use key for join (i1,i2))" + " left join tb4 join tb5 using ()";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (OuterJoin), list[0].GetType());
     Assert.AreEqual(typeof (TableReferences), ((OuterJoin)list[0]).LeftTableRef.GetType());
     Assert.AreEqual(typeof (InnerJoin), ((OuterJoin)list[0]).RightTableRef.GetType());
     list = ((TableReferences)((OuterJoin)list[0]).LeftTableRef).TableReferenceList;
     list = ((TableReferences)list[1]).TableReferenceList;
     Assert.AreEqual(2, list.Count);
     Assert.AreEqual("(tb1, tb3 AS T3, `select`, tb2 USE KEY FOR JOIN (i1, i2))"
                     + " LEFT JOIN (tb4 INNER JOIN tb5) USING ()", output);
     sql = "((select `select` from `from` ) tb1),(tb3 as t3,`select`),tb2 use key for join (i1,i2) "
           + "left join tb4 using (i1,i2)straight_join tb5";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(3, list.Count);
     Assert.AreEqual(typeof (TableReferences), list[0].GetType());
     Assert.AreEqual(typeof (TableReferences), list[1].GetType());
     Assert.AreEqual(typeof (StraightJoin), list[2].GetType());
     list = ((TableReferences)list[0]).TableReferenceList;
     Assert.AreEqual(typeof (SubqueryFactor), list[0].GetType());
     list = trs.TableReferenceList;
     list = ((TableReferences)list[1]).TableReferenceList;
     Assert.AreEqual(typeof (TableRefFactor), list[0].GetType());
     Assert.AreEqual(typeof (TableRefFactor), list[1].GetType());
     list = trs.TableReferenceList;
     var sj = (StraightJoin)list[2];
     Assert.AreEqual(typeof (OuterJoin), sj.LeftTableRef.GetType());
     Assert.AreEqual(typeof (TableRefFactor), sj.RightTableRef.GetType());
     var oj = (OuterJoin)sj.LeftTableRef;
     using_list = oj.Using;
     Assert.AreEqual(2, using_list.Count);
     Assert.AreEqual(
         "(SELECT `select` FROM `from`) AS TB1, tb3 AS T3, `select`, tb2 USE KEY FOR JOIN (i1, i2) LEFT JOIN tb4 USING (i1, i2) STRAIGHT_JOIN tb5",
         output);
     sql = "(`select`,(tb1 as t1 use index for join()ignore key for group by (i1)))" +
           "join tb2 on cd1=any " + "right join " + "tb3 straight_join " +
           "(tb4 use index() left outer join (tb6,tb7) on id3=all(select `all` from `all`)) "
           + " on id2=any(select * from any) using  (i1)";
     lexer = new MySqlLexer(sql);
     parser = GetDmlParser(lexer);
     trs = parser.TableRefs();
     output = Output2MySql(trs, sql);
     list = trs.TableReferenceList;
     Assert.AreEqual(1, list.Count);
     Assert.AreEqual(typeof (OuterJoin), list[0].GetType());
     using_list = ((OuterJoin)list[0]).Using;
     Assert.AreEqual(1, using_list.Count);
     Assert.AreEqual(typeof (InnerJoin), ((OuterJoin)list[0]).LeftTableRef.GetType());
     Assert.AreEqual(typeof (StraightJoin), ((OuterJoin)list[0]).RightTableRef.GetType());
     var rsj = (StraightJoin)((OuterJoin)list[0]).RightTableRef;
     Assert.AreEqual(typeof (TableRefFactor), rsj.LeftTableRef.GetType());
     Assert.AreEqual(typeof (TableReferences), rsj.RightTableRef.GetType());
     list = ((TableReferences)rsj.RightTableRef).TableReferenceList;
     Assert.AreEqual(typeof (OuterJoin), list[0].GetType());
     Assert.AreEqual("(`select`, tb1 AS T1 USE INDEX FOR JOIN () IGNORE KEY FOR GROUP BY (i1)) "
                     + "INNER JOIN tb2 ON cd1 = any RIGHT JOIN (tb3 STRAIGHT_JOIN (tb4 USE INDEX () "
                     +
                     "LEFT JOIN (tb6, tb7) ON id3 = ALL (SELECT `all` FROM `all`)) ON id2 = ANY (SELECT * FROM any))"
                     + " USING (i1)", output);
 }
 public virtual void TestSelect()
 {
     var sql = "SELect t1.id , t2.* from t1, test.t2 where test.t1.id=1 and t1.id=test.t2.id";
     var lexer = new MySqlLexer(sql);
     var parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     var select = parser.Select();
     Assert.IsNotNull(select);
     var output = Output2MySql(select, sql);
     Assert.AreEqual("SELECT t1.id, t2.* FROM t1, test.t2 WHERE test.t1.id = 1 AND t1.id = test.t2.id", output);
     sql =
         "select * from  offer  a  straight_join wp_image b use key for join(t1,t2) on a.member_id=b.member_id inner join product_visit c where a.member_id=c.member_id and c.member_id='abc' ";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     select = parser.Select();
     Assert.IsNotNull(select);
     output = Output2MySql(select, sql);
     Assert.AreEqual(
         "SELECT * FROM offer AS A STRAIGHT_JOIN wp_image AS B USE KEY FOR JOIN (t1, t2) ON a.member_id = b.member_id INNER JOIN product_visit AS C WHERE a.member_id = c.member_id AND c.member_id = 'abc'",
         output);
     sql = "SELect all tb1.id,tb2.id from tb1,tb2 where tb1.id2=tb2.id2";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     select = parser.Select();
     Assert.IsNotNull(select);
     output = Output2MySql(select, sql);
     Assert.AreEqual("SELECT tb1.id, tb2.id FROM tb1, tb2 WHERE tb1.id2 = tb2.id2", output);
     sql = "SELect distinct high_priority tb1.id,tb2.id from tb1,tb2 where tb1.id2=tb2.id2";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     select = parser.Select();
     Assert.IsNotNull(select);
     output = Output2MySql(select, sql);
     Assert.AreEqual("SELECT DISTINCT HIGH_PRIORITY tb1.id, tb2.id FROM tb1, tb2 WHERE tb1.id2 = tb2.id2", output);
     sql = "SELect distinctrow high_priority sql_small_result tb1.id,tb2.id " +
           "from tb1,tb2 where tb1.id2=tb2.id2";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     select = parser.Select();
     Assert.IsNotNull(select);
     output = Output2MySql(select, sql);
     Assert.AreEqual(
         "SELECT DISTINCTROW HIGH_PRIORITY SQL_SMALL_RESULT tb1.id, tb2.id FROM tb1, tb2 WHERE tb1.id2 = tb2.id2",
         output);
     sql = "SELect  sql_cache id1,id2 from tb1,tb2 where tb1.id1=tb2.id1 ";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     select = parser.Select();
     Assert.IsNotNull(select);
     output = Output2MySql(select, sql);
     Assert.AreEqual("SELECT SQL_CACHE id1, id2 FROM tb1, tb2 WHERE tb1.id1 = tb2.id1", output);
     sql = "SELect  sql_cache id1,max(id2) from tb1 group by id1 having id1>10 order by id3 desc";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     select = parser.Select();
     Assert.IsNotNull(select);
     output = Output2MySql(select, sql);
     Assert.AreEqual("SELECT SQL_CACHE id1, MAX(id2) FROM tb1 GROUP BY id1 HAVING id1 > 10 ORDER BY id3 DESC",
         output);
     sql = "SELect  SQL_BUFFER_RESULT tb1.id1,id2 from tb1";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     select = parser.Select();
     Assert.IsNotNull(select);
     output = Output2MySql(select, sql);
     Assert.AreEqual("SELECT SQL_BUFFER_RESULT tb1.id1, id2 FROM tb1", output);
     sql = "SELect  SQL_no_cache tb1.id1,id2 from tb1";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     select = parser.Select();
     Assert.IsNotNull(select);
     output = Output2MySql(select, sql);
     Assert.AreEqual("SELECT SQL_NO_CACHE tb1.id1, id2 FROM tb1", output);
     sql = "SELect  SQL_CALC_FOUND_ROWS tb1.id1,id2 from tb1";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     select = parser.Select();
     Assert.IsNotNull(select);
     output = Output2MySql(select, sql);
     Assert.AreEqual("SELECT SQL_CALC_FOUND_ROWS tb1.id1, id2 FROM tb1", output);
     sql = "SELect 1+1 ";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     select = parser.Select();
     Assert.IsNotNull(select);
     output = Output2MySql(select, sql);
     Assert.AreEqual("SELECT 1 + 1", output);
     sql = "SELect t1.* from tb ";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     select = parser.Select();
     Assert.IsNotNull(select);
     output = Output2MySql(select, sql);
     Assert.AreEqual("SELECT t1.* FROM tb", output);
     sql = "SELect distinct high_priority straight_join sql_big_result sql_cache tb1.id,tb2.id "
           + "from tb1,tb2 where tb1.id2=tb2.id2";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     select = parser.Select();
     Assert.IsNotNull(select);
     output = Output2MySql(select, sql);
     Assert.AreEqual("SELECT DISTINCT HIGH_PRIORITY STRAIGHT_JOIN SQL_BIG_RESULT"
                     + " SQL_CACHE tb1.id, tb2.id FROM tb1, tb2 WHERE tb1.id2 = tb2.id2", output);
     sql = "SELect distinct id1,id2 from tb1,tb2 where tb1.id1=tb2.id2 for update";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     select = parser.Select();
     Assert.IsNotNull(select);
     output = Output2MySql(select, sql);
     Assert.AreEqual("SELECT DISTINCT id1, id2 FROM tb1, tb2 WHERE tb1.id1 = tb2.id2 FOR UPDATE", output);
     sql = "SELect distinct id1,id2 from tb1,tb2 where tb1.id1=tb2.id2 lock in share mode";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     select = parser.Select();
     Assert.IsNotNull(select);
     output = Output2MySql(select, sql);
     Assert.AreEqual("SELECT DISTINCT id1, id2 FROM tb1, tb2 WHERE tb1.id1 = tb2.id2 LOCK IN SHARE MODE", output);
 }
 public virtual void TestSelectChinese()
 {
     var sql = "SELect t1.id , t2.* from t1, test.t2 where test.t1.id='中''‘文' and t1.id=test.t2.id";
     var lexer = new MySqlLexer(sql);
     var parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     var select = parser.Select();
     Assert.IsNotNull(select);
     var output = Output2MySql(select, sql);
     Assert.AreEqual("SELECT t1.id, t2.* FROM t1, test.t2 WHERE test.t1.id = '中\\'‘文' AND t1.id = test.t2.id",
         output);
 }
 public MySqlDmlInsertParser(MySqlLexer lexer, MySqlExprParser exprParser)
     : base(lexer, exprParser)
 {
 }
示例#29
0
        public static Number String2Number(string str)
        {
            if (str == null)
            {
                return 0;
            }

            //TODO --ExprEvalUtils-String2Number
            try
            {
                return Convert.ToInt32(str);
            }
            catch (Exception ex)
            {
                Console.WriteLine("String2Number-ToInt32-{0}-{1}", str, ex);
            }
            try
            {
                return Convert.ToInt64(str);
            }
            catch (Exception ex)
            {
                Console.WriteLine("String2Number-ToInt64-{0}-{1}", str, ex);
            }
            try
            {
                var lexer = new MySqlLexer(str);
                switch (lexer.Token())
                {
                    case MySqlToken.LiteralNumPureDigit:
                    {
                        return lexer.GetIntegerValue();
                    }

                    case MySqlToken.LiteralNumMixDigit:
                    {
                        return lexer.GetDecimalValue();
                    }

                    default:
                    {
                        throw new ArgumentException("unrecognized number: " + str);
                    }
                }
            }
            catch (SqlSyntaxErrorException e)
            {
                throw new ArgumentException("str", e);
            }
        }
 public virtual void TestSelectUnion()
 {
     var sql =
         "(select id from t1) union all (select id from t2) union all (select id from t3) ordeR By d desC limit 1 offset ?";
     var lexer = new MySqlLexer(sql);
     var parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     var select = (DmlSelectUnionStatement)parser.SelectUnion();
     Assert.AreEqual(0, @select.FirstDistinctIndex);
     Assert.AreEqual(3, @select.SelectStmtList.Count);
     var output = Output2MySql(select, sql);
     Assert.AreEqual(
         "(SELECT id FROM t1) UNION ALL (SELECT id FROM t2) UNION ALL (SELECT id FROM t3) ORDER BY d DESC LIMIT ?, 1",
         output);
     sql =
         "(select id from t1) union  select id from t2 order by id union aLl (select id from t3) ordeR By d asC";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     select = (DmlSelectUnionStatement)parser.SelectUnion();
     Assert.AreEqual(1, @select.FirstDistinctIndex);
     Assert.AreEqual(3, @select.SelectStmtList.Count);
     output = Output2MySql(select, sql);
     Assert.AreEqual(
         "(SELECT id FROM t1) UNION (SELECT id FROM t2 ORDER BY id) UNION ALL (SELECT id FROM t3) ORDER BY d",
         output);
     sql = "(select id from t1) union distInct (select id from t2) union  select id from t3";
     lexer = new MySqlLexer(sql);
     parser = new MySqlDmlSelectParser(lexer, new MySqlExprParser(lexer));
     select = (DmlSelectUnionStatement)parser.SelectUnion();
     Assert.AreEqual(2, @select.FirstDistinctIndex);
     Assert.AreEqual(3, @select.SelectStmtList.Count);
     output = Output2MySql(select, sql);
     Assert.AreEqual("(SELECT id FROM t1) UNION (SELECT id FROM t2) UNION (SELECT id FROM t3)", output);
 }