diff --git a/src/test/java/com/alibaba/druid/bvt/sql/teradata/TeradataSelectTest_1.java b/src/test/java/com/alibaba/druid/bvt/sql/teradata/TeradataSelectTest_1.java new file mode 100644 index 0000000000..7b252f227c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/teradata/TeradataSelectTest_1.java @@ -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 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 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 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 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 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 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 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 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() + " ------"); + + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/teradata/TeradataSelectTest_2.java b/src/test/java/com/alibaba/druid/bvt/sql/teradata/TeradataSelectTest_2.java new file mode 100644 index 0000000000..d7050e7c4d --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/teradata/TeradataSelectTest_2.java @@ -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 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 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() + " ------"); + } +} diff --git a/src/test/java/com/alibaba/druid/sql/TeradataTest.java b/src/test/java/com/alibaba/druid/sql/TeradataTest.java new file mode 100644 index 0000000000..38d869e66f --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/TeradataTest.java @@ -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 stmtList) { + StringBuilder out = new StringBuilder(); + TeradataOutputVisitor visitor = new TeradataOutputVisitor(out); + + for (SQLStatement stmt : stmtList) { + stmt.accept(visitor); + } + + return out.toString(); + } + + protected void print(List stmtList) { + String text = output(stmtList); + String outputProperty = System.getProperty("druid.output"); + if ("false".equals(outputProperty)) { + return; + } + System.out.println(text); + } +}