补充测试

git-svn-id: http://code.alibabatech.com/svn/druid/trunk@444 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
wenshao
2011-07-15 05:36:19 +00:00
parent e906c9b4e2
commit 34685651aa
5 changed files with 135 additions and 92 deletions
@@ -21,7 +21,9 @@ import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLOrderingSpecification;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.alibaba.druid.sql.ast.expr.SQLNumberExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr;
@@ -45,26 +47,13 @@ import com.alibaba.druid.sql.parser.Token;
public class OracleExprParser extends SQLExprParser {
public boolean allowStringAdditive = false;
/**
* @formatter:off
*/
private static final String[] _aggregateFunctions = {
"AVG", "CORR", "COVAR_POP", "COVAR_SAMP", "COUNT"
, "CUME_DIST", "DENSE_RANK", "FIRST", "FIRST_VALUE"
, "LAG", "LAST", "LAST_VALUE", "LEAD", "MAX"
, "MIN", "NTILE", "PERCENT_RANK", "PERCENTILE_CONT", "PERCENTILE_DISC"
, "RANK", "RATIO_TO_REPORT", "REGR_SLOPE", "REGR_INTERCEPT", "REGR_COUNT"
, "REGR_R2", "REGR_AVGX", "REGR_AVGY", "REGR_SXX", "REGR_SYY"
, "REGR_SXY", "ROW_NUMBER", "STDDEV", "STDDEV_POP", "STDDEV_SAMP"
, "SUM", "VAR_POP", "VAR_SAMP", "VARIANCE"
};
private static final String[] _aggregateFunctions = { "AVG", "CORR", "COVAR_POP", "COVAR_SAMP", "COUNT", "CUME_DIST", "DENSE_RANK", "FIRST", "FIRST_VALUE", "LAG", "LAST", "LAST_VALUE", "LEAD", "MAX", "MIN", "NTILE", "PERCENT_RANK", "PERCENTILE_CONT", "PERCENTILE_DISC", "RANK", "RATIO_TO_REPORT", "REGR_SLOPE", "REGR_INTERCEPT", "REGR_COUNT", "REGR_R2", "REGR_AVGX",
"REGR_AVGY", "REGR_SXX", "REGR_SYY", "REGR_SXY", "ROW_NUMBER", "STDDEV", "STDDEV_POP", "STDDEV_SAMP", "SUM", "VAR_POP", "VAR_SAMP", "VARIANCE" };
public OracleExprParser(Lexer lexer){
super(lexer);
@@ -115,18 +104,18 @@ public class OracleExprParser extends SQLExprParser {
case EXTRACT:
lexer.nextToken();
OracleExtractExpr extract = new OracleExtractExpr();
accept(Token.LPAREN);
extract.setUnit(OracleDateTimeUnit.valueOf(lexer.stringVal()));
lexer.nextToken();
accept(Token.FROM);
extract.setFrom(expr());
accept(Token.RPAREN);
return primaryRest(extract);
case TIMESTAMP:
return primaryRest(parseTimestamp());
@@ -140,7 +129,7 @@ public class OracleExprParser extends SQLExprParser {
case BINARY_DOUBLE:
OracleBinaryDoubleExpr doubleExpr = new OracleBinaryDoubleExpr();
doubleExpr.setValue(Double.parseDouble(lexer.numberString()));
lexer.nextToken();
return primaryRest(doubleExpr);
case TABLE:
@@ -214,57 +203,68 @@ public class OracleExprParser extends SQLExprParser {
return super.primary();
}
}
public SQLExpr primaryRest(SQLExpr expr) throws ParserException {
if (lexer.token() == Token.MONKEYS_AT) {
lexer.nextToken();
OracleDbLinkExpr dblink = new OracleDbLinkExpr();
dblink.setExpr(expr);
String link = lexer.stringVal();
accept(Token.IDENTIFIER);
dblink.setDbLink(link);
expr = dblink;
}
return super.primaryRest(expr);
}
protected SQLExpr dotRest(SQLExpr expr) {
if (lexer.token() == Token.LITERAL_ALIAS) {
String name = '"' + lexer.stringVal() + '"';
lexer.nextToken();
expr = new SQLPropertyExpr(expr, name);
expr = primaryRest(expr);
return expr;
}
return super.dotRest(expr);
}
public OracleDateExpr parseDate() {
accept(Token.DATE);
OracleDateExpr timestamp = new OracleDateExpr();
String literal = lexer.stringVal();
timestamp.setLiteral(literal);
accept(Token.LITERAL_CHARS);
return timestamp;
}
public OracleTimestampExpr parseTimestamp() {
accept(Token.TIMESTAMP);
OracleTimestampExpr timestamp = new OracleTimestampExpr();
String literal = lexer.stringVal();
timestamp.setLiteral(literal);
accept(Token.LITERAL_CHARS);
if (identifierEquals("AT")) {
lexer.nextToken();
acceptIdentifier("TIME");
acceptIdentifier("ZONE");
String timezone = lexer.stringVal();
timestamp.setTimeZone(timezone);
accept(Token.LITERAL_CHARS);
}
return timestamp;
}
@@ -428,24 +428,24 @@ public class OracleExprParser extends SQLExprParser {
return item;
}
protected SQLExpr parseInterval() {
accept(Token.INTERVAL);
OracleIntervalExpr interval = new OracleIntervalExpr();
if (lexer.token() != Token.LITERAL_CHARS) {
throw new ParserException("syntax error : " + lexer.token());
}
interval.setValue(lexer.stringVal());
lexer.nextToken();
if (lexer.token() != Token.IDENTIFIER) {
throw new ParserException("syntax error : " + lexer.token());
}
OracleIntervalType type = OracleIntervalType.valueOf(lexer.stringVal());
interval.setType(type);
lexer.nextToken();
return interval;
}
}
@@ -155,7 +155,7 @@ public class SQLExprParser extends SQLParser {
lexer.nextToken();
listExpr.getItems().add(expr());
} while (lexer.token() == Token.COMMA);
sqlExpr = listExpr;
}
accept(Token.RPAREN);
@@ -425,45 +425,7 @@ public class SQLExprParser extends SQLParser {
if (lexer.token() == Token.DOT) {
lexer.nextToken();
if (lexer.token() == Token.STAR) {
lexer.nextToken();
expr = new SQLPropertyExpr(expr, "*");
} else {
String name;
if (lexer.token() == Token.KEY) {
name = "KEY";
lexer.nextToken();
} else if (lexer.token() != Token.IDENTIFIER) {
throw new ParserException("error : " + lexer.stringVal());
} else {
name = lexer.stringVal();
lexer.nextToken();
}
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
SQLMethodInvokeExpr methodInvokeExpr = new SQLMethodInvokeExpr(name);
if (lexer.token() == Token.RPAREN) {
lexer.nextToken();
} else {
if (lexer.token() == Token.PLUS) {
methodInvokeExpr.getParameters().add(new SQLIdentifierExpr("+"));
lexer.nextToken();
} else {
exprList(methodInvokeExpr.getParameters());
}
accept(Token.RPAREN);
}
expr = methodInvokeExpr;
} else {
expr = new SQLPropertyExpr(expr, name);
}
}
expr = primaryRest(expr);
expr = dotRest(expr);
} else if (lexer.token() == Token.COLONEQ) {
lexer.nextToken();
SQLExpr rightExp = primary();
@@ -498,6 +460,48 @@ public class SQLExprParser extends SQLParser {
return expr;
}
protected SQLExpr dotRest(SQLExpr expr) {
if (lexer.token() == Token.STAR) {
lexer.nextToken();
expr = new SQLPropertyExpr(expr, "*");
} else {
String name;
if (lexer.token() == Token.KEY) {
name = "KEY";
lexer.nextToken();
} else if (lexer.token() != Token.IDENTIFIER) {
throw new ParserException("error : " + lexer.stringVal());
} else {
name = lexer.stringVal();
lexer.nextToken();
}
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
SQLMethodInvokeExpr methodInvokeExpr = new SQLMethodInvokeExpr(name);
if (lexer.token() == Token.RPAREN) {
lexer.nextToken();
} else {
if (lexer.token() == Token.PLUS) {
methodInvokeExpr.getParameters().add(new SQLIdentifierExpr("+"));
lexer.nextToken();
} else {
exprList(methodInvokeExpr.getParameters());
}
accept(Token.RPAREN);
}
expr = methodInvokeExpr;
} else {
expr = new SQLPropertyExpr(expr, name);
}
}
expr = primaryRest(expr);
return expr;
}
public final SQLExpr groupComparisionRest(SQLExpr expr) throws ParserException {
return expr;
}
@@ -802,14 +806,14 @@ public class SQLExprParser extends SQLParser {
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.BooleanOr, rightExp);
expr = orRest(expr);
} else if (lexer.token() == Token.XOR) {
} else if (lexer.token() == Token.XOR) {
lexer.nextToken();
SQLExpr rightExp = and();
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.BooleanXor, rightExp);
expr = orRest(expr);
}
return expr;
}
@@ -821,7 +825,7 @@ public class SQLExprParser extends SQLParser {
public SQLExpr relationalRest(SQLExpr expr) throws ParserException {
SQLExpr rightExp;
if (lexer.token() == Token.LT) {
lexer.nextToken();
rightExp = equality();
@@ -33,7 +33,7 @@ public class Case3 extends TestCase {
private String validationQuery = "SELECT 1"; // "SELECT 1";
private int threadCount = 10;
private int TEST_COUNT = 3;
final int LOOP_COUNT = 1000 * 1000;
final int LOOP_COUNT = 1000 * 100;
private boolean testOnBorrow = false;
private String connectionProperties = ""; // "bigStringTryClob=true;clientEncoding=GBK;defaultRowPrefetch=50;serverEncoding=ISO-8859-1";
private String sql = "SELECT 1";
@@ -16,11 +16,11 @@ import com.alibaba.druid.util.JdbcUtils;
public class OracleSQLParserResourceTest extends TestCase {
public void test_0() throws Exception {
for (int i = 0; i <= 53; ++i) {
String resource = "bvt/parser/oracle-" + i + ".txt";
exec_test(resource);
}
// exec_test("bvt/parser/oracle-0.txt");
// for (int i = 0; i <= 53; ++i) {
// String resource = "bvt/parser/oracle-" + i + ".txt";
// exec_test(resource);
// }
exec_test("bvt/parser/oracle-54.txt");
}
public void exec_test(String resource) throws Exception {
File diff suppressed because one or more lines are too long