in proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java [109:150]
public static ProxyBackendHandler newInstance(final DatabaseType databaseType, final QueryContext queryContext,
final ConnectionSession connectionSession, final boolean preferPreparedStatement) throws SQLException {
SQLStatementContext sqlStatementContext = queryContext.getSqlStatementContext();
SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
allowExecutingWhenTransactionalError(databaseType, connectionSession, sqlStatement);
checkUnsupportedSQLStatement(sqlStatement);
checkClusterState(sqlStatement);
if (sqlStatement instanceof EmptyStatement) {
return new SkipBackendHandler(sqlStatement);
}
if (sqlStatement instanceof DistSQLStatement) {
checkUnsupportedDistSQLStatementInTransaction(sqlStatement, connectionSession);
return DistSQLBackendHandlerFactory.newInstance((DistSQLStatement) sqlStatement, connectionSession);
}
String sql = queryContext.getSql();
handleAutoCommit(sqlStatement, connectionSession);
if (sqlStatement instanceof TCLStatement) {
return TCLBackendHandlerFactory.newInstance(sqlStatementContext, sql, connectionSession);
}
Optional<ProxyBackendHandler> backendHandler = DatabaseAdminBackendHandlerFactory.newInstance(databaseType, sqlStatementContext, connectionSession, sql, queryContext.getParameters());
if (backendHandler.isPresent()) {
return backendHandler.get();
}
Optional<ProxyBackendHandler> databaseOperateHandler = findDatabaseOperateBackendHandler(sqlStatement, connectionSession);
if (databaseOperateHandler.isPresent()) {
return databaseOperateHandler.get();
}
String databaseName = sqlStatementContext instanceof TableAvailable && ((TableAvailable) sqlStatementContext).getTablesContext().getDatabaseName().isPresent()
? ((TableAvailable) sqlStatementContext).getTablesContext().getDatabaseName().get()
: connectionSession.getUsedDatabaseName();
if (null == databaseName) {
return DatabaseBackendHandlerFactory.newInstance(queryContext, connectionSession, preferPreparedStatement);
}
Grantee grantee = connectionSession.getConnectionContext().getGrantee();
ShardingSphereMetaData metaData = ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData();
ShardingSphereDatabase database = metaData.getDatabase(databaseName);
for (SQLExecutionChecker each : ShardingSphereServiceLoader.getServiceInstances(SQLExecutionChecker.class)) {
each.check(metaData, grantee, queryContext, database);
}
return DatabaseAdminBackendHandlerFactory.newInstance(databaseType, sqlStatementContext, connectionSession)
.orElseGet(() -> DatabaseBackendHandlerFactory.newInstance(queryContext, connectionSession, preferPreparedStatement));
}