mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
补充测试
git-svn-id: http://code.alibabatech.com/svn/druid/trunk@444 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
@@ -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
Reference in New Issue
Block a user