private StatementExecutor generateExecutor(final String sql) throws SQLException {
   StatementExecutor result =
       new StatementExecutor(shardingConnection.getShardingContext().getExecutorEngine());
   SQLRouteResult sqlRouteResult =
       shardingConnection
           .getShardingContext()
           .getSqlRouteEngine()
           .route(sql, Collections.emptyList());
   mergeContext = sqlRouteResult.getMergeContext();
   mergeContext.setExecutorEngine(shardingConnection.getShardingContext().getExecutorEngine());
   for (SQLExecutionUnit each : sqlRouteResult.getExecutionUnits()) {
     result.addStatement(
         new StatementExecutorWrapper(
             generateStatement(each.getSql(), each.getDataSource()), each));
   }
   return result;
 }