mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
支持OracleOuter表达式
git-svn-id: http://code.alibabatech.com/svn/druid/trunk@967 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
@@ -36,7 +36,6 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements Serializable {
|
||||
}
|
||||
|
||||
public SQLMethodInvokeExpr(String methodName){
|
||||
|
||||
this.methodName = methodName;
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
|
||||
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;
|
||||
@@ -41,6 +42,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalType;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OraclePriorExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem;
|
||||
@@ -275,7 +277,25 @@ public class OracleExprParser extends SQLExprParser {
|
||||
expr = interval;
|
||||
}
|
||||
|
||||
return super.primaryRest(expr);
|
||||
SQLExpr restExpr = super.primaryRest(expr);
|
||||
|
||||
if (restExpr != expr && restExpr instanceof SQLMethodInvokeExpr) {
|
||||
SQLMethodInvokeExpr methodInvoke = (SQLMethodInvokeExpr) restExpr;
|
||||
if (methodInvoke.getParameters().size() == 1) {
|
||||
SQLExpr paramExpr = methodInvoke.getParameters().get(0);
|
||||
if (paramExpr instanceof SQLIdentifierExpr && "+".equals(((SQLIdentifierExpr) paramExpr).getName())) {
|
||||
OracleOuterExpr outerExpr = new OracleOuterExpr();
|
||||
if (methodInvoke.getOwner() == null) {
|
||||
outerExpr.setExpr(new SQLIdentifierExpr(methodInvoke.getMethodName()));
|
||||
} else {
|
||||
outerExpr.setExpr(new SQLPropertyExpr(methodInvoke.getOwner(), methodInvoke.getMethodName()));
|
||||
}
|
||||
return outerExpr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return restExpr;
|
||||
}
|
||||
|
||||
protected SQLExpr dotRest(SQLExpr expr) {
|
||||
|
||||
@@ -484,6 +484,7 @@ public class SQLExprParser extends SQLParser {
|
||||
lexer.nextToken();
|
||||
|
||||
SQLMethodInvokeExpr methodInvokeExpr = new SQLMethodInvokeExpr(name);
|
||||
methodInvokeExpr.setOwner(expr);
|
||||
if (lexer.token() == Token.RPAREN) {
|
||||
lexer.nextToken();
|
||||
} else {
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.alibaba.druid.bvt.sql.oracle;
|
||||
|
||||
import junit.framework.Assert;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
|
||||
import com.alibaba.druid.sql.test.TestUtils;
|
||||
|
||||
public class OracleOuterTest extends TestCase {
|
||||
|
||||
public void test_oracle() throws Exception {
|
||||
String sql = "SELECT employee_id, manager_id\n" + "FROM employees\n"
|
||||
+ "WHERE employees.manager_id(+) = employees.employee_id;";
|
||||
|
||||
String expect = "SELECT employee_id, manager_id\n" + "FROM employees\n"
|
||||
+ "WHERE employees.manager_id(+) = employees.employee_id;\n";
|
||||
|
||||
OracleStatementParser parser = new OracleStatementParser(sql);
|
||||
SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0);
|
||||
|
||||
String text = TestUtils.outputOracle(stmt);
|
||||
|
||||
Assert.assertEquals(expect, text);
|
||||
|
||||
System.out.println(text);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user