/* * Copyright 1999-2012 Alibaba Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * (created at 2011-5-17) */ package com.alibaba.cobar.parser.recognizer.mysql.syntax; import java.sql.SQLSyntaxErrorException; import org.junit.Assert; import com.alibaba.cobar.parser.Performance; import com.alibaba.cobar.parser.ast.expression.misc.QueryExpression; import com.alibaba.cobar.parser.ast.stmt.dml.DMLSelectStatement; import com.alibaba.cobar.parser.ast.stmt.dml.DMLSelectUnionStatement; import com.alibaba.cobar.parser.recognizer.mysql.lexer.MySQLLexer; /** * @author <a href="mailto:shuo.qius@alibaba-inc.com">QIU Shuo</a> */ public class MySQLDMLSelectParserTest extends AbstractSyntaxTest { @SuppressWarnings("unused") public static void main(String[] ars) throws Exception { String sql = Performance.SQL_BENCHMARK_SELECT; for (int i = 0; i < 3; ++i) { MySQLLexer lexer = new MySQLLexer(sql); MySQLExprParser exprParser = new MySQLExprParser(lexer); MySQLDMLSelectParser parser = new MySQLDMLSelectParser(lexer, exprParser); QueryExpression stmt = parser.select(); // System.out.println(stmt); } Thread.sleep(1000); long loop = 300 * 10000; long t1 = System.currentTimeMillis(); t1 = System.currentTimeMillis(); for (long i = 0; i < loop; ++i) { MySQLLexer lexer = new MySQLLexer(sql); MySQLExprParser exprParser = new MySQLExprParser(lexer); MySQLDMLSelectParser parser = new MySQLDMLSelectParser(lexer, exprParser); QueryExpression stmt = parser.select(); } long t2 = System.currentTimeMillis(); System.out.println((t2 - t1) * 1000.0d / loop + " us"); } public void testSelectUnion() throws SQLSyntaxErrorException { String sql = "(select id from t1) union all (select id from t2) union all (select id from t3) ordeR By d desC limit 1 offset ?"; MySQLLexer lexer = new MySQLLexer(sql); MySQLDMLSelectParser parser = new MySQLDMLSelectParser(lexer, new MySQLExprParser(lexer)); DMLSelectUnionStatement select = (DMLSelectUnionStatement) parser.selectUnion(); Assert.assertEquals(0, select.getFirstDistinctIndex()); Assert.assertEquals(3, select.getSelectStmtList().size()); String output = output2MySQL(select, sql); Assert.assertEquals( "(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.assertEquals(1, select.getFirstDistinctIndex()); Assert.assertEquals(3, select.getSelectStmtList().size()); output = output2MySQL(select, sql); Assert.assertEquals( "(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.assertEquals(2, select.getFirstDistinctIndex()); Assert.assertEquals(3, select.getSelectStmtList().size()); output = output2MySQL(select, sql); Assert.assertEquals("(SELECT id FROM t1) UNION (SELECT id FROM t2) UNION (SELECT id FROM t3)", output); } public void testSelect() throws SQLSyntaxErrorException { String sql = "SELect t1.id , t2.* from t1, test.t2 where test.t1.id=1 and t1.id=test.t2.id"; MySQLLexer lexer = new MySQLLexer(sql); MySQLDMLSelectParser parser = new MySQLDMLSelectParser(lexer, new MySQLExprParser(lexer)); DMLSelectStatement select = parser.select(); Assert.assertNotNull(select); String output = output2MySQL(select, sql); Assert.assertEquals("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.assertNotNull(select); output = output2MySQL(select, sql); Assert.assertEquals( "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.assertNotNull(select); output = output2MySQL(select, sql); Assert.assertEquals("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.assertNotNull(select); output = output2MySQL(select, sql); Assert.assertEquals( "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.assertNotNull(select); output = output2MySQL(select, sql); Assert.assertEquals( "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.assertNotNull(select); output = output2MySQL(select, sql); Assert.assertEquals("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.assertNotNull(select); output = output2MySQL(select, sql); Assert.assertEquals( "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.assertNotNull(select); output = output2MySQL(select, sql); Assert.assertEquals("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.assertNotNull(select); output = output2MySQL(select, sql); Assert.assertEquals("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.assertNotNull(select); output = output2MySQL(select, sql); Assert.assertEquals("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.assertNotNull(select); output = output2MySQL(select, sql); Assert.assertEquals("SELECT 1 + 1", output); sql = "SELect t1.* from tb "; lexer = new MySQLLexer(sql); parser = new MySQLDMLSelectParser(lexer, new MySQLExprParser(lexer)); select = parser.select(); Assert.assertNotNull(select); output = output2MySQL(select, sql); Assert.assertEquals("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.assertNotNull(select); output = output2MySQL(select, sql); Assert.assertEquals("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.assertNotNull(select); output = output2MySQL(select, sql); Assert.assertEquals("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.assertNotNull(select); output = output2MySQL(select, sql); Assert.assertEquals("SELECT DISTINCT id1, id2 FROM tb1, tb2 WHERE tb1.id1 = tb2.id2 LOCK IN SHARE MODE", output); } public void testSelectChinese() throws SQLSyntaxErrorException { String sql = "SELect t1.id , t2.* from t1, test.t2 where test.t1.id='中''‘文' and t1.id=test.t2.id"; MySQLLexer lexer = new MySQLLexer(sql); MySQLDMLSelectParser parser = new MySQLDMLSelectParser(lexer, new MySQLExprParser(lexer)); DMLSelectStatement select = parser.select(); Assert.assertNotNull(select); String output = output2MySQL(select, sql); Assert.assertEquals( "SELECT t1.id, t2.* FROM t1, test.t2 WHERE test.t1.id = '中\\'‘文' AND t1.id = test.t2.id", output); } }