in sqlparser/seata-sqlparser-druid/src/main/java/org/apache/seata/sqlparser/druid/DruidSQLRecognizerFactoryImpl.java [40:79]
public List<SQLRecognizer> create(String sql, String dbType) {
List<SQLStatement> asts = SQLUtils.parseStatements(sql, DruidDbTypeAdapter.getAdaptiveDbType(dbType));
if (CollectionUtils.isEmpty(asts)) {
throw new UnsupportedOperationException("Unsupported SQL: " + sql);
}
if (asts.size() > 1 && !(asts.stream().allMatch(statement -> statement instanceof SQLUpdateStatement)
|| asts.stream().allMatch(statement -> statement instanceof SQLDeleteStatement))) {
throw new UnsupportedOperationException("ONLY SUPPORT SAME TYPE (UPDATE OR DELETE) MULTI SQL -" + sql);
}
List<SQLRecognizer> recognizers = null;
SQLRecognizer recognizer = null;
for (SQLStatement ast : asts) {
SQLOperateRecognizerHolder recognizerHolder =
SQLOperateRecognizerHolderFactory.getSQLRecognizerHolder(dbType.toLowerCase());
if (ast instanceof SQLInsertStatement) {
recognizer = recognizerHolder.getInsertRecognizer(sql, ast);
} else if (ast instanceof SQLUpdateStatement) {
recognizer = recognizerHolder.getUpdateRecognizer(sql, ast);
} else if (ast instanceof SQLDeleteStatement) {
recognizer = recognizerHolder.getDeleteRecognizer(sql, ast);
} else if (ast instanceof SQLSelectStatement) {
recognizer = recognizerHolder.getSelectForUpdateRecognizer(sql, ast);
}
// When recognizer is null, it indicates that recognizerHolder cannot allocate unsupported syntax, like merge and replace
if (ast instanceof SQLReplaceStatement) {
//just like:replace into t (id,dr) values (1,'2'), (2,'3')
throw new NotSupportYetException("not support the sql syntax with ReplaceStatement:" + ast +
"\nplease see the doc about SQL restrictions https://seata.apache.org/zh-cn/docs/user/sqlreference/dml");
}
if (recognizer != null && recognizer.isSqlSyntaxSupports()) {
if (recognizers == null) {
recognizers = new ArrayList<>();
}
recognizers.add(recognizer);
}
}
return recognizers;
}