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);
}
Aggregations