// Path: src/main/java/com/elong/pb/newdda/client/constants/DatabaseType.java
// public enum DatabaseType {
// 
//     H2, MySQL, Oracle, SQLServer, DB2;
// 
//     public static DatabaseType valueFrom(final String databaseName) {
//         try {
//             return DatabaseType.valueOf(databaseName);
//         } catch (final IllegalArgumentException ex) {
//             throw new DatabaseTypeUnsupportedException(databaseName);
//         }
//     }
// 
// }
// 
// Path: src/main/java/com/elong/pb/newdda/client/router/parser/visitor/basic/mysql/MySqlEvalVisitor.java
// public class MySqlEvalVisitor extends MySqlEvalVisitorImpl {
// 
//     public static final String EVAL_VAR_INDEX = "EVAL_VAR_INDEX";
// 
//     @Override
//     public boolean visit(final SQLVariantRefExpr x) {
//         if (!"?".equals(x.getName())) {
//             return false;
//         }
// 
//         Map<String, Object> attributes = x.getAttributes();
// 
//         int varIndex = x.getIndex();
// 
//         if (varIndex == -1 || getParameters().size() <= varIndex) {
//             return false;
//         }
//         if (attributes.containsKey(EVAL_VALUE)) {
//             return false;
//         }
//         Object value = getParameters().get(varIndex);
//         if (value == null) {
//             value = EVAL_VALUE_NULL;
//         }
//         attributes.put(EVAL_VALUE, value);
//         attributes.put(EVAL_VAR_INDEX, varIndex);
//         return false;
//     }
// 
// }
// 
// Path: src/main/java/com/elong/pb/newdda/client/util/SqlUtil.java
// public class SqlUtil {
// 
//     /**
//      * 去掉SQL表达式的特殊字符.
//      *
//      * @param value SQL表达式
//      * @return 去掉SQL特殊字符的表达式
//      */
//     public static String getExactlyValue(final String value) {
//         return null == value ? null : CharMatcher.anyOf("[]`'\"").removeFrom(value);
//     }
// 
// }


import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.visitor.SQLEvalVisitor;
import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils;
import com.alibaba.druid.util.JdbcUtils;
import com.elong.pb.newdda.client.constants.DatabaseType;
import com.elong.pb.newdda.client.router.parser.visitor.basic.mysql.MySqlEvalVisitor;
import com.elong.pb.newdda.client.router.result.router.*;
import com.elong.pb.newdda.client.util.SqlUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
        return (null != currentRouterTable) ? createColumn(expr.getName(), currentRouterTable.getName()) : null;
    }

    private RouterTable findTableFromName(final String name) {
        for (RouterTable each : sqlParserResult.getRouteContext().getRouterTables()) {
            if (each.getName().equalsIgnoreCase(SqlUtil.getExactlyValue(name))) {
                return each;
            }
        }
        return null;
    }

    private RouterTable findTableFromAlias(final String alias) {
        for (RouterTable each : sqlParserResult.getRouteContext().getRouterTables()) {
            if (each.getAlias() != null && each.getAlias().equalsIgnoreCase(SqlUtil.getExactlyValue(alias))) {
                return each;
            }
        }
        return null;
    }

    private RouterTable findTable(final String tableNameOrAlias) {
        RouterTable routerTable = findTableFromName(tableNameOrAlias);
        return routerTable == null ?
                findTableFromAlias(tableNameOrAlias) :
                routerTable;
    }

    private RouterColumn createColumn(final String columnName, final String tableName) {
        return new RouterColumn(
// Path: src/main/java/com/elong/pb/newdda/client/constants/DatabaseType.java
// public enum DatabaseType {
// 
//     H2, MySQL, Oracle, SQLServer, DB2;
// 
//     public static DatabaseType valueFrom(final String databaseName) {
//         try {
//             return DatabaseType.valueOf(databaseName);
//         } catch (final IllegalArgumentException ex) {
//             throw new DatabaseTypeUnsupportedException(databaseName);
//         }
//     }
// 
// }
// 
// Path: src/main/java/com/elong/pb/newdda/client/router/parser/visitor/basic/mysql/MySqlEvalVisitor.java
// public class MySqlEvalVisitor extends MySqlEvalVisitorImpl {
// 
//     public static final String EVAL_VAR_INDEX = "EVAL_VAR_INDEX";
// 
//     @Override
//     public boolean visit(final SQLVariantRefExpr x) {
//         if (!"?".equals(x.getName())) {
//             return false;
//         }
// 
//         Map<String, Object> attributes = x.getAttributes();
// 
//         int varIndex = x.getIndex();
// 
//         if (varIndex == -1 || getParameters().size() <= varIndex) {
//             return false;
//         }
//         if (attributes.containsKey(EVAL_VALUE)) {
//             return false;
//         }
//         Object value = getParameters().get(varIndex);
//         if (value == null) {
//             value = EVAL_VALUE_NULL;
//         }
//         attributes.put(EVAL_VALUE, value);
//         attributes.put(EVAL_VAR_INDEX, varIndex);
//         return false;
//     }
// 
// }
// 
// Path: src/main/java/com/elong/pb/newdda/client/util/SqlUtil.java
// public class SqlUtil {
// 
//     /**
//      * 去掉SQL表达式的特殊字符.
//      *
//      * @param value SQL表达式
//      * @return 去掉SQL特殊字符的表达式
//      */
//     public static String getExactlyValue(final String value) {
//         return null == value ? null : CharMatcher.anyOf("[]`'\"").removeFrom(value);
//     }
// 
// }


// Path: src/main/java/com/elong/pb/newdda/client/router/parser/SqlParserContext.java
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.visitor.SQLEvalVisitor;
import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils;
import com.alibaba.druid.util.JdbcUtils;
import com.elong.pb.newdda.client.constants.DatabaseType;
import com.elong.pb.newdda.client.router.parser.visitor.basic.mysql.MySqlEvalVisitor;
import com.elong.pb.newdda.client.router.result.router.*;
import com.elong.pb.newdda.client.util.SqlUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

        return (null != currentRouterTable) ? createColumn(expr.getName(), currentRouterTable.getName()) : null;
    }

    private RouterTable findTableFromName(final String name) {
        for (RouterTable each : sqlParserResult.getRouteContext().getRouterTables()) {
            if (each.getName().equalsIgnoreCase(SqlUtil.getExactlyValue(name))) {
                return each;
            }
        }
        return null;
    }

    private RouterTable findTableFromAlias(final String alias) {
        for (RouterTable each : sqlParserResult.getRouteContext().getRouterTables()) {
            if (each.getAlias() != null && each.getAlias().equalsIgnoreCase(SqlUtil.getExactlyValue(alias))) {
                return each;
            }
        }
        return null;
    }

    private RouterTable findTable(final String tableNameOrAlias) {
        RouterTable routerTable = findTableFromName(tableNameOrAlias);
        return routerTable == null ?
                findTableFromAlias(tableNameOrAlias) :
                routerTable;
    }

    private RouterColumn createColumn(final String columnName, final String tableName) {
        return new RouterColumn(
                SqlUtil.getExactlyValue(columnName),