diff --git a/src/test/java/com/alibaba/druid/sql/oracle/demo/Demo2.java b/src/test/java/com/alibaba/druid/sql/oracle/demo/Demo2.java new file mode 100644 index 0000000000..069d1e125d --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/oracle/demo/Demo2.java @@ -0,0 +1,118 @@ +package com.alibaba.druid.sql.oracle.demo; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.TestCase; + +import com.alibaba.druid.sql.SQLUtils; +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.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; +import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitorAdapter; +import com.alibaba.druid.sql.parser.SQLStatementParser; + +public class Demo2 extends TestCase { + + public void test_0() throws Exception { + String sql = "select * from user where uid = ? and uname = ?"; + List parameters = new ArrayList(); + parameters.add(1); + parameters.add("wenshao"); + + SQLStatementParser parser = new MySqlStatementParser(sql); + List stmtList = parser.parseStatementList(); // + + SQLStatement first = (SQLStatement) stmtList.get(0); + + MyVisitor visitor = new MyVisitor(); + first.accept(visitor); + + SQLVariantRefExpr firstVar = visitor.getVariantList().get(0); + + int varIndex = (Integer) firstVar.getAttribute("varIndex"); + Integer param = (Integer) parameters.get(varIndex); + + final String tableName; + if (param.intValue() == 1) { + tableName = "user_1"; + } else { + tableName = "user_x"; + } + + for (SQLExprTableSource tableSource : visitor.getTableSourceList()) { + SQLExpr expr = tableSource.getExpr(); + if (expr instanceof SQLIdentifierExpr) { + SQLIdentifierExpr identExpr = (SQLIdentifierExpr) expr; + String ident = identExpr.getName(); + + if (ident.equals("user")) { + identExpr.setName(tableName); + } + } else if (expr instanceof SQLPropertyExpr) { + SQLPropertyExpr proExpr = (SQLPropertyExpr) expr; + String ident = proExpr.getName(); + + if (ident.equals("user")) { + proExpr.setName(tableName); + } + } + } + + String realSql = SQLUtils.toOracleString(first); + System.out.println(realSql); + } + + private static class MyVisitor extends MySqlASTVisitorAdapter { + + private int varIndex = 0; + private List variantList = new ArrayList(); + private List tableSourceList = new ArrayList(); + + public boolean visit(SQLVariantRefExpr x) { + x.getAttributes().put("varIndex", varIndex++); + return true; + } + + public boolean visit(SQLBinaryOpExpr x) { + if (x.getLeft() instanceof SQLIdentifierExpr && x.getRight() instanceof SQLVariantRefExpr) { + SQLIdentifierExpr identExpr = (SQLIdentifierExpr) x.getLeft(); + String ident = identExpr.getName(); + if (ident.equals("uid")) { + variantList.add((SQLVariantRefExpr) x.getRight()); + } + } + + return true; + } + + public boolean visit(SQLExprTableSource x) { + tableSourceList.add(x); + return true; + } + + public int getVarIndex() { + return varIndex; + } + + public void setVarIndex(int varIndex) { + this.varIndex = varIndex; + } + + public List getVariantList() { + return variantList; + } + + public List getTableSourceList() { + return tableSourceList; + } + + } + + +}