Merge pull request #1149 from usakey/master

Add implementation for Teradata SQL parser SELECT
This commit is contained in:
wenshao
2016-04-01 08:50:27 +08:00
30 changed files with 2177 additions and 4 deletions
@@ -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);
}
}