mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
Merge pull request #1149 from usakey/master
Add implementation for Teradata SQL parser SELECT
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
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.SQLInsertStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelect;
|
||||
import com.alibaba.druid.sql.dialect.teradata.ast.stmt.TeradataInsertStatement;
|
||||
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 TeradataInsertTest_1 extends TeradataTest {
|
||||
public void test_values() throws Exception {
|
||||
String ins_sql = "INSERT INTO t1(c1, c2) VALUES "
|
||||
+ "('a', 'b'),"
|
||||
+ "('c', 'd'),"
|
||||
+ "('e', 'f')";
|
||||
|
||||
TeradataStatementParser parser = new TeradataStatementParser(ins_sql);
|
||||
List<SQLStatement> statementList = parser.parseStatementList();
|
||||
SQLStatement stmt = statementList.get(0);
|
||||
|
||||
Assert.assertTrue(stmt instanceof SQLInsertStatement);
|
||||
|
||||
TeradataInsertStatement insertStmt = (TeradataInsertStatement) stmt;
|
||||
Assert.assertEquals("t1", insertStmt.getTableSource().toString());
|
||||
Assert.assertEquals("c1", insertStmt.getColumns().get(0).toString());
|
||||
Assert.assertEquals("c2", insertStmt.getColumns().get(1).toString());
|
||||
Assert.assertEquals(3, insertStmt.getValuesList().size());
|
||||
Assert.assertEquals(2, insertStmt.getValuesList().get(0).getValues().size());
|
||||
|
||||
SQLSelect insertQuery = insertStmt.getQuery();
|
||||
Assert.assertNull(insertQuery);
|
||||
|
||||
TeradataSchemaStatVisitor visitor = new TeradataSchemaStatVisitor();
|
||||
insertStmt.accept(visitor);
|
||||
System.out.println(visitor.getColumns());
|
||||
System.out.println(visitor.getTables());
|
||||
System.out.println("------ end of " + new Object(){}.getClass().getEnclosingMethod().getName() + " ------");
|
||||
}
|
||||
|
||||
public void test_select() throws Exception {
|
||||
String ins_sql = "INSERT INTO d1.t1(col1, col2) "
|
||||
+ "SELECT c1, c2 "
|
||||
+ "FROM d2.t2 "
|
||||
+ "WHERE c1=0;";
|
||||
TeradataStatementParser parser = new TeradataStatementParser(ins_sql);
|
||||
List<SQLStatement> statementList = parser.parseStatementList();
|
||||
SQLStatement stmt = statementList.get(0);
|
||||
|
||||
Assert.assertTrue(stmt instanceof SQLInsertStatement);
|
||||
|
||||
TeradataInsertStatement insertStmt = (TeradataInsertStatement) stmt;
|
||||
SQLSelect insertQuery = insertStmt.getQuery();
|
||||
Assert.assertNotNull(insertQuery);
|
||||
|
||||
// retrieve SELECT sub-clause from INSERT query
|
||||
TeradataSelectQueryBlock insertBlock = (TeradataSelectQueryBlock) insertQuery.getQuery();
|
||||
Assert.assertNotNull(insertBlock);
|
||||
|
||||
// target table
|
||||
Assert.assertEquals("d1.t1", insertStmt.getTableSource().toString());
|
||||
Assert.assertEquals(2, insertStmt.getColumns().size());
|
||||
Assert.assertEquals("col1", insertStmt.getColumns().get(0).toString());
|
||||
Assert.assertEquals("col2", insertStmt.getColumns().get(1).toString());
|
||||
// source table
|
||||
Assert.assertEquals("d2.t2", insertBlock.getFrom().toString());
|
||||
Assert.assertEquals(2, insertBlock.getSelectList().size());
|
||||
Assert.assertEquals("c1", insertBlock.getSelectList().get(0).toString());
|
||||
Assert.assertEquals("c2", insertBlock.getSelectList().get(1).toString());
|
||||
|
||||
System.out.println("***********below is useful info **********");
|
||||
System.out.println("target table: " + insertStmt.getTableSource());
|
||||
System.out.println("target columns: " + insertStmt.getColumns());
|
||||
System.out.println("source from: " + insertBlock.getFrom());
|
||||
System.out.println("source columns : " + insertBlock.getSelectList());
|
||||
System.out.println("source condition: " + insertBlock.getWhere());
|
||||
System.out.println("********");
|
||||
|
||||
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());
|
||||
|
||||
System.out.println("------ end of " + new Object(){}.getClass().getEnclosingMethod().getName() + " ------");
|
||||
}
|
||||
}
|
||||
@@ -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,45 @@
|
||||
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.SQLSelectStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
|
||||
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_3 extends TeradataTest {
|
||||
public void test_trim() throws Exception {
|
||||
String sql = "select trim(trailing from columnname) from dbc.columnsv;";
|
||||
|
||||
TeradataStatementParser parser = new TeradataStatementParser(sql);
|
||||
List<SQLStatement> statementList = parser.parseStatementList();
|
||||
SQLStatement stmt = statementList.get(0);
|
||||
|
||||
Assert.assertTrue(stmt instanceof SQLSelectStatement);
|
||||
print(statementList);
|
||||
|
||||
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(1, visitor.getColumns().size());
|
||||
Assert.assertEquals(0, visitor.getConditions().size());
|
||||
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("dbc.columnsv")));
|
||||
|
||||
Assert.assertTrue(visitor.getColumns().contains(new Column("dbc.columnsv", "columnname")));
|
||||
System.out.println("------ end of " + new Object(){}.getClass().getEnclosingMethod().getName() + " ------");
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
package com.alibaba.druid.bvt.sql.teradata.parser;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import com.alibaba.druid.sql.dialect.teradata.parser.TeradataLexer;
|
||||
import com.alibaba.druid.sql.parser.Token;
|
||||
|
||||
public class TeradataLexerTest extends TestCase{
|
||||
|
||||
public void test_0() throws Exception {
|
||||
String sql = "SELECT a.user_id , "
|
||||
+ "SUM(CASE WHEN comment_score=2 THEN 1 ELSE 0 END) AS posfb ,"
|
||||
+ "SUM(CASE WHEN comment_score=-1 THEN 1 ELSE 0 END) AS negfb ,"
|
||||
+ "SUM(CASE WHEN comment_score=0 THEN 1 ELSE 0 END) AS neutfb "
|
||||
+ "FROM dw_feedback_detail a "
|
||||
+ "WHERE a.creation_dt >= '2012-11-13' "
|
||||
+ "AND a.ID_TYPE = 'S' "
|
||||
+ "AND a.TRX_TYPE <> 1 "
|
||||
+ "AND a.user_id IN ( SELECT DISTINCT aa.user_id "
|
||||
+ "FROM DW_TNS_RCNT_SLR_ACTVTY_SL aa "
|
||||
+ "INNER JOIN DW_CATEGORY_GROUPINGS b "
|
||||
+ "ON aa.site_id=b.site_id AND aa.LEAF_CATEG_ID=b.LEAF_CATEG_ID "
|
||||
+ "WHERE aa.leaf_categ_id NOT IN (100843,100844,100845,100846,100847,100848,100849,100850) "
|
||||
+ "AND b.META_CATEG_ID NOT IN (2038,6000,9800,10542,60089) "
|
||||
+ "GROUP BY aa.user_id "
|
||||
+ "HAVING SUM(LIVE_GMV_USD) + SUM(END_GMV_USD) > 10000 "
|
||||
+ "AND SUM(END_GMV_USD) > 50 "
|
||||
+ "AND SUM(live_lstg_count) + SUM(SUCC_LSTG_COUNT) > 5 "
|
||||
+ "AND SUM(live_lstg_count) + SUM(SUCC_LSTG_COUNT) <> 99999 "
|
||||
+ "AND "
|
||||
+ "CASE WHEN (SUM(LIVE_GMV_USD)/(SUM(LIVE_LSTG_QTY) + 0.0001)>=SUM(END_GMV_USD)/(SUM(END_QTY_SOLD)+0.0001)) "
|
||||
+ "THEN (SUM(LIVE_GMV_USD)/(SUM(LIVE_LSTG_QTY) + 0.0001)) "
|
||||
+ "ELSE (SUM(END_GMV_USD)/(SUM(END_QTY_SOLD)+0.0001)) END > 50 "
|
||||
+ "AND "
|
||||
+ "CASE WHEN (SUM(LIVE_GMV_USD)/(SUM(LIVE_LSTG_QTY) + 0.0001)>=SUM(END_GMV_USD)/(SUM(END_QTY_SOLD)+0.0001)) "
|
||||
+ "THEN (SUM(LIVE_GMV_USD)/(SUM(LIVE_LSTG_QTY) + 0.0001)) "
|
||||
+ "ELSE (SUM(END_GMV_USD)/(SUM(END_QTY_SOLD)+0.0001)) END < 100000 ) "
|
||||
+ "GROUP BY a.user_id ORDER BY a.user_id;";
|
||||
TeradataLexer lexer = new TeradataLexer(sql);
|
||||
|
||||
for(;;) {
|
||||
lexer.nextToken();
|
||||
Token tok = lexer.token();
|
||||
switch (tok) {
|
||||
case IDENTIFIER:
|
||||
System.out.println(tok.name() + "\t\t" + lexer.stringVal());
|
||||
break;
|
||||
case HINT:
|
||||
System.out.println(tok.name() + "\t\t\t\t" + lexer.stringVal());
|
||||
break;
|
||||
case LITERAL_INT:
|
||||
System.out.println(tok.name() + "\t\t" + lexer.numberString());
|
||||
break;
|
||||
case LITERAL_CHARS:
|
||||
System.out.println(tok.name() + "\t\t" + lexer.stringVal());
|
||||
break;
|
||||
case LITERAL_FLOAT:
|
||||
System.out.println(tok.name() + "\t\t" + lexer.numberString());
|
||||
break;
|
||||
default:
|
||||
System.out.println(tok.name() + "\t\t\t" + tok.name);
|
||||
break;
|
||||
}
|
||||
|
||||
if (tok == Token.EOF) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package com.alibaba.druid.bvt.sql.teradata.parser;
|
||||
|
||||
import com.alibaba.druid.sql.dialect.teradata.parser.TeradataLexer;
|
||||
import com.alibaba.druid.sql.parser.Token;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
public class TeradataLexerTest1 extends TestCase{
|
||||
|
||||
public void test_0() throws Exception {
|
||||
String sql = "LOCKING TABLE TEST1 FOR ACCESS;"
|
||||
+ "CREATE MULTISET TABLE TEST("
|
||||
+ "ITEM_ID DECIMAL(18,0) NOT NULL,"
|
||||
+ "AUCT_START_DT DATE NOT NULL,"
|
||||
+ "AUCT_END_DT DATE NOT NULL,"
|
||||
+ "PRIMARY INDEX(ITEM_ID)"
|
||||
+ "PARTITION BY RANGE_N(AUCT_END_DT BETWEEN "
|
||||
+ "DATE '2010-01-01' AND DATE '2012-12-31'));";
|
||||
TeradataLexer lexer = new TeradataLexer(sql);
|
||||
|
||||
for(;;) {
|
||||
lexer.nextToken();
|
||||
Token tok = lexer.token();
|
||||
switch (tok) {
|
||||
case IDENTIFIER:
|
||||
System.out.println(tok.name() + "\t\t" + lexer.stringVal());
|
||||
break;
|
||||
case HINT:
|
||||
System.out.println(tok.name() + "\t\t\t\t" + lexer.stringVal());
|
||||
break;
|
||||
case LITERAL_INT:
|
||||
System.out.println(tok.name() + "\t\t" + lexer.numberString());
|
||||
break;
|
||||
case LITERAL_CHARS:
|
||||
System.out.println(tok.name() + "\t\t" + lexer.stringVal());
|
||||
break;
|
||||
case LITERAL_FLOAT:
|
||||
System.out.println(tok.name() + "\t\t" + lexer.numberString());
|
||||
break;
|
||||
default:
|
||||
System.out.println(tok.name() + "\t\t\t" + tok.name);
|
||||
break;
|
||||
}
|
||||
|
||||
if (tok == Token.EOF) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
package com.alibaba.druid.bvt.sql.teradata.parser;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.Reader;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import com.alibaba.druid.sql.dialect.teradata.parser.TeradataLexer;
|
||||
import com.alibaba.druid.sql.parser.Token;
|
||||
import com.alibaba.druid.util.Utils;
|
||||
|
||||
public class TeradataLexerTest2 extends TestCase{
|
||||
|
||||
public void test_0() throws Exception {
|
||||
InputStream is = null;
|
||||
// mainly test SEL keyword
|
||||
is = Thread.currentThread().getContextClassLoader().getResourceAsStream("bvt/parser/teradata-1.txt");
|
||||
Reader reader = new InputStreamReader(is, "UTF-8");
|
||||
String input = Utils.read(reader);
|
||||
String sql = input.trim();
|
||||
|
||||
TeradataLexer lexer = new TeradataLexer(sql);
|
||||
|
||||
for(;;) {
|
||||
lexer.nextToken();
|
||||
Token tok = lexer.token();
|
||||
switch (tok) {
|
||||
case IDENTIFIER:
|
||||
System.out.println(tok.name() + "\t\t" + lexer.stringVal());
|
||||
break;
|
||||
case HINT:
|
||||
System.out.println(tok.name() + "\t\t\t\t" + lexer.stringVal());
|
||||
break;
|
||||
case LITERAL_INT:
|
||||
System.out.println(tok.name() + "\t\t" + lexer.numberString());
|
||||
break;
|
||||
case LITERAL_CHARS:
|
||||
System.out.println(tok.name() + "\t\t" + lexer.stringVal());
|
||||
break;
|
||||
case LITERAL_FLOAT:
|
||||
System.out.println(tok.name() + "\t\t" + lexer.numberString());
|
||||
break;
|
||||
default:
|
||||
System.out.println(tok.name() + "\t\t\t" + tok.name);
|
||||
break;
|
||||
}
|
||||
|
||||
if (tok == Token.EOF) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.alibaba.druid.bvt.sql.teradata.parser;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import com.alibaba.druid.sql.dialect.teradata.parser.TeradataLexer;
|
||||
import com.alibaba.druid.sql.parser.Token;
|
||||
|
||||
public class TeradataLexerTest3 extends TestCase{
|
||||
// test COMMENT
|
||||
public void test_0() throws Exception {
|
||||
String sql = "/*SUM(CASE WHEN comment_score=2 THEN 1 ELSE 0 END) AS posfb ,"
|
||||
+ "SUM(CASE WHEN comment_score=-1 THEN 1 ELSE 0 END) AS negfb ,*/";
|
||||
TeradataLexer lexer = new TeradataLexer(sql);
|
||||
|
||||
lexer.scanComment();
|
||||
for(;;) {
|
||||
lexer.nextToken();
|
||||
Token tok = lexer.token();
|
||||
switch (tok) {
|
||||
case IDENTIFIER:
|
||||
System.out.println(tok.name() + "\t\t" + lexer.stringVal());
|
||||
break;
|
||||
case HINT:
|
||||
System.out.println(tok.name() + "\t\t\t\t" + lexer.stringVal());
|
||||
break;
|
||||
case LITERAL_INT:
|
||||
System.out.println(tok.name() + "\t\t" + lexer.numberString());
|
||||
break;
|
||||
case LITERAL_CHARS:
|
||||
System.out.println(tok.name() + "\t\t" + lexer.stringVal());
|
||||
break;
|
||||
case LITERAL_FLOAT:
|
||||
System.out.println(tok.name() + "\t\t" + lexer.numberString());
|
||||
break;
|
||||
default:
|
||||
System.out.println(tok.name() + "\t\t\t" + tok.name);
|
||||
break;
|
||||
}
|
||||
|
||||
if (tok == Token.EOF) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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