Search in sources :

Example 1 with SQLParserFeature

use of com.alibaba.druid.sql.parser.SQLParserFeature in project druid by alibaba.

the class ParameterizedOutputVisitorUtils method parameterizeHash.

public static long parameterizeHash(String sql, DbType dbType, SQLSelectListCache selectListCache, List<Object> outParameters, VisitorFeature... visitorFeatures) {
    final SQLParserFeature[] features = outParameters == null ? defaultFeatures2 : defaultFeatures;
    SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType, features);
    if (selectListCache != null) {
        parser.setSelectListCache(selectListCache);
    }
    List<SQLStatement> statementList = parser.parseStatementList();
    final int stmtSize = statementList.size();
    if (stmtSize == 0) {
        return 0L;
    }
    StringBuilder out = new StringBuilder(sql.length());
    ParameterizedVisitor visitor = createParameterizedOutputVisitor(out, dbType);
    if (outParameters != null) {
        visitor.setOutputParameters(outParameters);
    }
    configVisitorFeatures(visitor, visitorFeatures);
    if (stmtSize == 1) {
        SQLStatement stmt = statementList.get(0);
        if (stmt.getClass() == SQLSelectStatement.class) {
            SQLSelectStatement selectStmt = (SQLSelectStatement) stmt;
            if (selectListCache != null) {
                SQLSelectQueryBlock queryBlock = selectStmt.getSelect().getQueryBlock();
                if (queryBlock != null) {
                    String cachedSelectList = queryBlock.getCachedSelectList();
                    long cachedSelectListHash = queryBlock.getCachedSelectListHash();
                    if (cachedSelectList != null) {
                        visitor.config(VisitorFeature.OutputSkipSelectListCacheString, true);
                    }
                    visitor.visit(selectStmt);
                    return FnvHash.fnv1a_64_lower(cachedSelectListHash, out);
                }
            }
            visitor.visit(selectStmt);
        } else if (stmt.getClass() == MySqlInsertStatement.class) {
            MySqlInsertStatement insertStmt = (MySqlInsertStatement) stmt;
            String columnsString = insertStmt.getColumnsString();
            if (columnsString != null) {
                long columnsStringHash = insertStmt.getColumnsStringHash();
                visitor.config(VisitorFeature.OutputSkipInsertColumnsString, true);
                ((MySqlASTVisitor) visitor).visit(insertStmt);
                return FnvHash.fnv1a_64_lower(columnsStringHash, out);
            }
        } else {
            stmt.accept(visitor);
        }
        return FnvHash.fnv1a_64_lower(out);
    }
    for (int i = 0; i < statementList.size(); i++) {
        if (i > 0) {
            out.append(";\n");
        }
        SQLStatement stmt = statementList.get(i);
        if (stmt.hasBeforeComment()) {
            stmt.getBeforeCommentsDirect().clear();
        }
        Class<?> stmtClass = stmt.getClass();
        if (stmtClass == SQLSelectStatement.class) {
            // only for performance
            SQLSelectStatement selectStatement = (SQLSelectStatement) stmt;
            visitor.visit(selectStatement);
            visitor.postVisit(selectStatement);
        } else {
            stmt.accept(visitor);
        }
    }
    return FnvHash.fnv1a_64_lower(out);
}
Also used : SQLStatementParser(com.alibaba.druid.sql.parser.SQLStatementParser) OracleASTParameterizedVisitor(com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTParameterizedVisitor) MySqlParameterizedVisitor(com.alibaba.druid.sql.dialect.mysql.visitor.MySqlParameterizedVisitor) MySqlInsertStatement(com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement) SQLStatement(com.alibaba.druid.sql.ast.SQLStatement) SQLParserFeature(com.alibaba.druid.sql.parser.SQLParserFeature) SQLSelectStatement(com.alibaba.druid.sql.ast.statement.SQLSelectStatement) SQLSelectQueryBlock(com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock)

Aggregations

SQLStatement (com.alibaba.druid.sql.ast.SQLStatement)1 SQLSelectQueryBlock (com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock)1 SQLSelectStatement (com.alibaba.druid.sql.ast.statement.SQLSelectStatement)1 MySqlInsertStatement (com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement)1 MySqlParameterizedVisitor (com.alibaba.druid.sql.dialect.mysql.visitor.MySqlParameterizedVisitor)1 OracleASTParameterizedVisitor (com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTParameterizedVisitor)1 SQLParserFeature (com.alibaba.druid.sql.parser.SQLParserFeature)1 SQLStatementParser (com.alibaba.druid.sql.parser.SQLStatementParser)1