add testcase for TD Lexer

This commit is contained in:
Louis Xu
2016-03-28 19:26:40 +08:00
parent 53cff80649
commit 7fdfd4505a
4 changed files with 219 additions and 0 deletions
@@ -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;
}
}
}
}