/*
* 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.fragment.tableref.Dual;
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 testSelectDual() throws SQLSyntaxErrorException {
String sql = "select 1+1 from dual ";
MySQLLexer lexer = new MySQLLexer(sql);
MySQLDMLSelectParser parser = new MySQLDMLSelectParser(lexer, new MySQLExprParser(lexer));
DMLSelectStatement select = parser.select();
Assert.assertEquals(1, select.getTables().getTableReferenceList().size());
Assert.assertTrue(select.getTables().getTableReferenceList().get(0) instanceof Dual);
String output = output2MySQL(select, sql);
Assert.assertEquals("SELECT 1 + 1 FROM DUAL", output);
}
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);
}
}