Add Teradata test case for Select

This commit is contained in:
Louis Xu
2016-03-29 18:57:37 +08:00
parent 30de161630
commit ce91facc67
3 changed files with 433 additions and 0 deletions
@@ -0,0 +1,294 @@
package com.alibaba.druid.bvt.sql.teradata;
import java.util.List;
import org.junit.Assert;
import com.alibaba.druid.sql.TeradataTest;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
import com.alibaba.druid.sql.ast.expr.SQLNotExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
import com.alibaba.druid.sql.dialect.teradata.ast.stmt.TeradataSelectQueryBlock;
import com.alibaba.druid.sql.dialect.teradata.parser.TeradataStatementParser;
import com.alibaba.druid.sql.dialect.teradata.visitor.TeradataSchemaStatVisitor;
import com.alibaba.druid.stat.TableStat;
import com.alibaba.druid.stat.TableStat.Column;
public class TeradataSelectTest_1 extends TeradataTest{
// case #1: general SELECT...FROM...WHERE
public void test_select() throws Exception {
String sql = "SELECT t1.name, t2.salary FROM employee t1, info t2 WHERE t1.name = t2.name;";
TeradataStatementParser parser = new TeradataStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
TeradataSchemaStatVisitor visitor = new TeradataSchemaStatVisitor();
statemen.accept(visitor);
System.out.println("Tables : " + visitor.getTables());
System.out.println("fields : " + visitor.getColumns());
System.out.println("coditions : " + visitor.getConditions());
System.out.println("orderBy : " + visitor.getOrderByColumns());
Assert.assertEquals(2, visitor.getTables().size());
Assert.assertEquals(3, visitor.getColumns().size());
Assert.assertEquals(2, visitor.getConditions().size());
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employee")));
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("info")));
Assert.assertTrue(visitor.getColumns().contains(new Column("employee", "name")));
Assert.assertTrue(visitor.getColumns().contains(new Column("info", "name")));
Assert.assertTrue(visitor.getColumns().contains(new Column("info", "salary")));
System.out.println("------ end of " + new Object(){}.getClass().getEnclosingMethod().getName() + " ------");
}
// case #2: test ORDER BY...ASC/DESC
public void test_orderBy() throws Exception {
String sql = "select * from tb order by id asc,name desc";
TeradataStatementParser parser = new TeradataStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement stmt = statementList.get(0);
SQLSelectStatement selectStmt = (SQLSelectStatement) stmt;
SQLSelect select = selectStmt.getSelect();
Assert.assertNotNull(select.getQuery());
TeradataSelectQueryBlock queryBlock = (TeradataSelectQueryBlock) select.getQuery();
Assert.assertNotNull(queryBlock.getOrderBy());
System.out.println("select order by: " + queryBlock.getOrderBy().getItems().get(0).getExpr());
print(statementList);
Assert.assertEquals(1, statementList.size());
TeradataSchemaStatVisitor visitor = new TeradataSchemaStatVisitor();
stmt.accept(visitor);
System.out.println("Tables : " + visitor.getTables());
System.out.println("fields : " + visitor.getColumns());
System.out.println("coditions : " + visitor.getConditions());
System.out.println("orderBy : " + visitor.getOrderByColumns());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(3, visitor.getColumns().size());
Assert.assertEquals(0, visitor.getConditions().size());
Assert.assertEquals(2, visitor.getOrderByColumns().size());
System.out.println("------ end of " + new Object(){}.getClass().getEnclosingMethod().getName() + " ------");
}
// case #3: test SELECT CONCAT...
public void test_concat() throws Exception {
String sql = "SELECT CONCAT(last_name,', ',first_name) AS full_name FROM mytable ORDER BY full_name;";
TeradataStatementParser parser = new TeradataStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
SQLSelectStatement selectStmt = (SQLSelectStatement) statemen;
SQLSelect select = selectStmt.getSelect();
Assert.assertNotNull(select.getQuery());
TeradataSelectQueryBlock queryBlock = (TeradataSelectQueryBlock) select.getQuery();
Assert.assertNotNull(queryBlock.getOrderBy());
System.out.println("select order by: " + queryBlock.getOrderBy().getItems().get(0).getExpr());
TeradataSchemaStatVisitor visitor = new TeradataSchemaStatVisitor();
statemen.accept(visitor);
System.out.println("Tables : " + visitor.getTables());
System.out.println("fields : " + visitor.getColumns());
System.out.println("coditions : " + visitor.getConditions());
System.out.println("orderBy : " + visitor.getOrderByColumns());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(2, visitor.getColumns().size());
Assert.assertEquals(0, visitor.getConditions().size());
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("mytable")));
Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "last_name")));
Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "first_name")));
System.out.println("------ end of " + new Object(){}.getClass().getEnclosingMethod().getName() + " ------");
}
// case #4: test constant
public void test_constant() throws Exception {
String sql = "select 1";
TeradataStatementParser parser = new TeradataStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement stmt = statementList.get(0);
SQLSelectStatement selectStmt = (SQLSelectStatement) stmt;
SQLSelect select = selectStmt.getSelect();
Assert.assertNotNull(select.getQuery());
TeradataSelectQueryBlock queryBlock = (TeradataSelectQueryBlock) select.getQuery();
Assert.assertNull(queryBlock.getOrderBy());
print(statementList);
Assert.assertEquals(1, statementList.size());
TeradataSchemaStatVisitor visitor = new TeradataSchemaStatVisitor();
stmt.accept(visitor);
Assert.assertEquals(0, visitor.getTables().size());
Assert.assertEquals(0, visitor.getColumns().size());
Assert.assertEquals(0, visitor.getConditions().size());
Assert.assertEquals(0, visitor.getOrderByColumns().size());
System.out.println("------ end of " + new Object(){}.getClass().getEnclosingMethod().getName() + " ------");
}
// case #5: test sub-query
public void test_subQuery() throws Exception {
String sql = "SELECT COUNT(*) a FROM (select nickname,mobile,comment,createdate from ub_userdiscuss order by discuss_id desc) b ";
TeradataStatementParser parser = new TeradataStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement stmt = statementList.get(0);
SQLSelectStatement selectStmt = (SQLSelectStatement) stmt;
SQLSelect select = selectStmt.getSelect();
Assert.assertNotNull(select.getQuery());
TeradataSelectQueryBlock queryBlock = (TeradataSelectQueryBlock) select.getQuery();
Assert.assertNull(queryBlock.getOrderBy());
// test for sub-query
{
Assert.assertTrue(queryBlock.getFrom() instanceof SQLSubqueryTableSource);
TeradataSelectQueryBlock subBlock = (TeradataSelectQueryBlock)((SQLSubqueryTableSource)queryBlock.getFrom()).getSelect().getQuery();
Assert.assertNotNull(subBlock.getOrderBy());
}
print(statementList);
Assert.assertEquals(1, statementList.size());
TeradataSchemaStatVisitor visitor = new TeradataSchemaStatVisitor();
stmt.accept(visitor);
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(5, visitor.getColumns().size());
Assert.assertEquals(0, visitor.getConditions().size());
Assert.assertEquals(1, visitor.getOrderByColumns().size());
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ub_userdiscuss")));
System.out.println("------ end of " + new Object(){}.getClass().getEnclosingMethod().getName() + " ------");
}
public void test_comment() throws Exception {
String sql = "select * from test /*!40101fff*/";
TeradataStatementParser parser = new TeradataStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement stmt = statementList.get(0);
SQLSelectStatement selectStmt = (SQLSelectStatement) stmt;
SQLSelect select = selectStmt.getSelect();
Assert.assertNotNull(select.getQuery());
TeradataSelectQueryBlock queryBlock = (TeradataSelectQueryBlock) select.getQuery();
Assert.assertNull(queryBlock.getOrderBy());
print(statementList);
Assert.assertEquals(1, statementList.size());
TeradataSchemaStatVisitor visitor = new TeradataSchemaStatVisitor();
stmt.accept(visitor);
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(1, visitor.getColumns().size());
Assert.assertEquals(0, visitor.getConditions().size());
Assert.assertEquals(0, visitor.getOrderByColumns().size());
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test")));
System.out.println("------ end of " + new Object(){}.getClass().getEnclosingMethod().getName() + " ------");
}
public void test_not() throws Exception {
String sql = "select a from t where not a<1 and not b>1";
TeradataStatementParser parser = new TeradataStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement stmt = statementList.get(0);
SQLSelectStatement selectStmt = (SQLSelectStatement) stmt;
SQLSelect select = selectStmt.getSelect();
Assert.assertNotNull(select.getQuery());
TeradataSelectQueryBlock queryBlock = (TeradataSelectQueryBlock) select.getQuery();
Assert.assertNull(queryBlock.getOrderBy());
{
SQLExpr where = queryBlock.getWhere();
Assert.assertTrue(where instanceof SQLBinaryOpExpr);
SQLBinaryOpExpr binaryWhere = (SQLBinaryOpExpr) where;
Assert.assertEquals(binaryWhere.getOperator(), SQLBinaryOperator.BooleanAnd);
Assert.assertTrue(binaryWhere.getLeft() instanceof SQLNotExpr);
Assert.assertTrue(binaryWhere.getRight() instanceof SQLNotExpr);
System.out.println("left expr: " + ((SQLNotExpr)binaryWhere.getLeft()).getExpr());
}
print(statementList);
Assert.assertEquals(1, statementList.size());
TeradataSchemaStatVisitor visitor = new TeradataSchemaStatVisitor();
stmt.accept(visitor);
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(2, visitor.getColumns().size());
Assert.assertEquals(2, visitor.getConditions().size());
Assert.assertEquals(0, visitor.getOrderByColumns().size());
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t")));
System.out.println("------ end of " + new Object(){}.getClass().getEnclosingMethod().getName() + " ------");
}
public void test_interval() throws Exception {
String sql = "select bsvariety, max(bsh) as bsh, min(bsl) as bsl "
+ " from exchange_market_info "
+ " where bsdate>(current_date - interval '1' DAY)"
+ " group by bsvariety;";
TeradataStatementParser parser = new TeradataStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement stmt = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
TeradataSchemaStatVisitor visitor = new TeradataSchemaStatVisitor();
stmt.accept(visitor);
Assert.assertTrue(visitor.getColumns().contains(new Column("exchange_market_info", "bsvariety")));
Assert.assertTrue(visitor.getColumns().contains(new Column("exchange_market_info", "bsh")));
Assert.assertTrue(visitor.getColumns().contains(new Column("exchange_market_info", "bsl")));
Assert.assertTrue(visitor.getColumns().contains(new Column("exchange_market_info", "bsdate")));
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(5, visitor.getColumns().size());
Assert.assertEquals(1, visitor.getConditions().size());
Assert.assertEquals(0, visitor.getOrderByColumns().size());
System.out.println("------ end of " + new Object(){}.getClass().getEnclosingMethod().getName() + " ------");
}
}
@@ -0,0 +1,109 @@
package com.alibaba.druid.bvt.sql.teradata;
import java.util.List;
import org.junit.Assert;
import com.alibaba.druid.sql.TeradataTest;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.dialect.teradata.ast.stmt.TeradataSelectQueryBlock;
import com.alibaba.druid.sql.dialect.teradata.parser.TeradataStatementParser;
import com.alibaba.druid.sql.dialect.teradata.visitor.TeradataSchemaStatVisitor;
import com.alibaba.druid.stat.TableStat.Column;
public class TeradataSelectTest_2 extends TeradataTest{
public void test_crossJoin() throws Exception {
String sql = "SELECT * FROM t1 CROSS JOIN t2 ON t1.id = t2.id;";
TeradataStatementParser parser = new TeradataStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statement = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
{
SQLSelectStatement selectStmt = (SQLSelectStatement) statement;
SQLSelect selectSQL = selectStmt.getSelect();
TeradataSelectQueryBlock queryBlock = (TeradataSelectQueryBlock) selectSQL.getQuery();
Assert.assertTrue(queryBlock.getFrom() instanceof SQLJoinTableSource);
SQLJoinTableSource joinSource = (SQLJoinTableSource) queryBlock.getFrom();
Assert.assertEquals(joinSource.getJoinType().toString(), "CROSS_JOIN");
Assert.assertEquals(joinSource.getLeft().toString(), "t1");
Assert.assertEquals(joinSource.getRight().toString(), "t2");
Assert.assertNotNull(joinSource.getCondition());
}
TeradataSchemaStatVisitor visitor = new TeradataSchemaStatVisitor();
statement.accept(visitor);
System.out.println("Tables : " + visitor.getTables());
System.out.println("fields : " + visitor.getColumns());
System.out.println("coditions : " + visitor.getConditions());
System.out.println("orderBy : " + visitor.getOrderByColumns());
Assert.assertEquals(2, visitor.getTables().size());
System.out.println("------ end of " + new Object(){}.getClass().getEnclosingMethod().getName() + " ------");
}
public void test_leftJoin() throws Exception {
String sql = "SELECT host.id as id" //
+ ", host.item_id as itemId" //
+ ", host.node_id as nodeId" //
+ ", host.node_type as nodeType" //
+ ", host.begin_time as beginTime" //
+ ", host.end_time as endTime" //
+ ", host.gmt_create as gmtCreate" //
+ ", host.gmt_modify as gmtModify" //
+ ", host.reason as reason" //
+ ", host.creator_id as creatorId" //
+ ", host.modifier_id as modifierId" //
+ ", user.name as creator" //
+ ", user.name as modifier" //
+ ", user.nick_name as nickName " //
+ " FROM notice_close_node host left join sys_user user on user.id = host.modifier_id";
TeradataStatementParser parser = new TeradataStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
{
SQLSelectStatement selectStmt = (SQLSelectStatement) statemen;
SQLSelect selectSQL = selectStmt.getSelect();
TeradataSelectQueryBlock queryBlock = (TeradataSelectQueryBlock) selectSQL.getQuery();
Assert.assertTrue(queryBlock.getFrom() instanceof SQLJoinTableSource);
SQLJoinTableSource joinSource = (SQLJoinTableSource) queryBlock.getFrom();
Assert.assertEquals(joinSource.getJoinType().toString(), "LEFT_OUTER_JOIN");
Assert.assertEquals(joinSource.getLeft().toString(), "notice_close_node");
Assert.assertEquals(joinSource.getRight().toString(), "sys_user");
Assert.assertNotNull(joinSource.getCondition());
}
TeradataSchemaStatVisitor visitor = new TeradataSchemaStatVisitor();
statemen.accept(visitor);
System.out.println("Tables : " + visitor.getTables());
System.out.println("fields : " + visitor.getColumns());
System.out.println("coditions : " + visitor.getConditions());
System.out.println("orderBy : " + visitor.getOrderByColumns());
Assert.assertEquals(2, visitor.getTables().size());
Assert.assertEquals(15, visitor.getColumns().size());
Assert.assertEquals(2, visitor.getConditions().size());
Assert.assertTrue(visitor.getColumns().contains(new Column("sys_user", "id")));
Assert.assertTrue(visitor.getColumns().contains(new Column("notice_close_node", "modifier_id")));
System.out.println("------ end of " + new Object(){}.getClass().getEnclosingMethod().getName() + " ------");
}
}
@@ -0,0 +1,30 @@
package com.alibaba.druid.sql;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.teradata.visitor.TeradataOutputVisitor;
import junit.framework.TestCase;
public class TeradataTest extends TestCase{
protected String output(List<SQLStatement> stmtList) {
StringBuilder out = new StringBuilder();
TeradataOutputVisitor visitor = new TeradataOutputVisitor(out);
for (SQLStatement stmt : stmtList) {
stmt.accept(visitor);
}
return out.toString();
}
protected void print(List<SQLStatement> stmtList) {
String text = output(stmtList);
String outputProperty = System.getProperty("druid.output");
if ("false".equals(outputProperty)) {
return;
}
System.out.println(text);
}
}