mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
Add Teradata test case for Select
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user