// Path: ddal-ddr/src/main/java/org/hellojavaer/ddal/ddr/datasource/exception/CrossDataSourceException.java
// public class CrossDataSourceException extends DDRDataSourceException {
// 
//     public CrossDataSourceException() {
//     }
// 
//     public CrossDataSourceException(String message) {
//         super(message);
//     }
// 
//     public CrossDataSourceException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public CrossDataSourceException(Throwable cause) {
//         super(cause);
//     }
// 
//     public CrossDataSourceException(String message, Throwable cause, boolean enableSuppression,
//                                     boolean writableStackTrace) {
//         super(message, cause, enableSuppression, writableStackTrace);
//     }
// }
// 
// Path: ddal-ddr/src/main/java/org/hellojavaer/ddal/ddr/datasource/exception/UninitializedStatusException.java
// public class UninitializedStatusException extends DDRDataSourceException {
// 
//     public UninitializedStatusException() {
//     }
// 
//     public UninitializedStatusException(String message) {
//         super(message);
//     }
// 
//     public UninitializedStatusException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public UninitializedStatusException(Throwable cause) {
//         super(cause);
//     }
// 
//     public UninitializedStatusException(String message, Throwable cause, boolean enableSuppression,
//                                         boolean writableStackTrace) {
//         super(message, cause, enableSuppression, writableStackTrace);
//     }
// }
// 
// Path: ddal-ddr/src/main/java/org/hellojavaer/ddal/ddr/datasource/jdbc/init/UninitializedStatementProcessor.java
// public class UninitializedStatementProcessor {
// 
//     private static Map<StatementProperty, InnerBean> map = new HashMap<StatementProperty, InnerBean>();
// 
//     public static void setDefaultValue(StatementProperty prop, Object val, boolean isSyncDefaultValue) {
//         map.put(prop, new InnerBean(val, isSyncDefaultValue));
//     }
// 
//     public static Object getDefaultValue(StatementProperty prop) {
//         InnerBean obj = map.get(prop);
//         if (obj != null) {
//             return obj.getVal();
//         } else {
//             return null;
//         }
//     }
// 
//     public static boolean isSetDefaultValue(StatementProperty prop) {
//         return map.containsKey(prop);
//     }
// 
//     public static boolean isSyncDefaultValue(StatementProperty prop) {
//         InnerBean obj = map.get(prop);
//         if (obj != null) {
//             return obj.isSyncDefaultValue();
//         } else {
//             return false;
//         }
//     }
// 
//     public static Object removeDefaultValue(StatementProperty prop) {
//         return map.remove(prop);
//     }
// }
// 
// Path: ddal-ddr/src/main/java/org/hellojavaer/ddal/ddr/datasource/jdbc/property/StatementProperty.java
// public enum StatementProperty {
// 
//     maxFieldSize,
// 
//     maxRows,
// 
//     fetchDirection,
// 
//     fetchSize,
// 
//     queryTimeout,
// 
//     closeOnCompletion,
// 
//     poolable;
// 
// }
// 
// Path: ddal-ddr/src/main/java/org/hellojavaer/ddal/ddr/datasource/manager/DataSourceParam.java
// public class DataSourceParam {
// 
//     private Set<String> scNames;
//     private boolean     readOnly;
// 
//     public Set<String> getScNames() {
//         return scNames;
//     }
// 
//     public void setScNames(Set<String> scNames) {
//         this.scNames = scNames;
//     }
// 
//     public boolean isReadOnly() {
//         return readOnly;
//     }
// 
//     public void setReadOnly(boolean readOnly) {
//         this.readOnly = readOnly;
//     }
// 
//     @Override
//     public String toString() {
//         return new DDRToStringBuilder().append("readOnly", readOnly).append("scNames", scNames).toString();
//     }
// }


import org.hellojavaer.ddal.ddr.datasource.exception.CrossDataSourceException;
import org.hellojavaer.ddal.ddr.datasource.exception.StatementInitializationException;
import org.hellojavaer.ddal.ddr.datasource.exception.UninitializedStatusException;
import org.hellojavaer.ddal.ddr.datasource.jdbc.init.UninitializedStatementProcessor;
import org.hellojavaer.ddal.ddr.datasource.jdbc.property.StatementProperty;
import org.hellojavaer.ddal.ddr.datasource.manager.DataSourceParam;
import org.hellojavaer.ddal.ddr.sqlparse.SQLParsedResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.*;
import java.util.Set;
                    prop.setCloseOnCompletion(true);
                    tag.setCloseOnCompletion(true);
                }
                return val;
            } else {
                throw new UninitializedStatusException(
                                                       "Can't invoke 'isCloseOnCompletion()' before 'closeOnCompletion()' is invoked or statement is initialized");
            }
        }
    }

    @Override
    public void setPoolable(boolean poolable) throws SQLException {
        if (statement != null) {
            statement.setPoolable(poolable);
        } else {
            tag.setPoolable(true);
            prop.setPoolable(poolable);
        }
    }

    @Override
    public boolean isPoolable() throws SQLException {
        if (statement != null) {
            return statement.isPoolable();
        } else if (tag.isPoolable()) {
            return prop.isPoolable();
        } else {
            if (UninitializedStatementProcessor.isSetDefaultValue(StatementProperty.poolable)) {
                boolean val = ((boolean) UninitializedStatementProcessor.getDefaultValue(StatementProperty.poolable));
// Path: ddal-ddr/src/main/java/org/hellojavaer/ddal/ddr/datasource/exception/CrossDataSourceException.java
// public class CrossDataSourceException extends DDRDataSourceException {
// 
//     public CrossDataSourceException() {
//     }
// 
//     public CrossDataSourceException(String message) {
//         super(message);
//     }
// 
//     public CrossDataSourceException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public CrossDataSourceException(Throwable cause) {
//         super(cause);
//     }
// 
//     public CrossDataSourceException(String message, Throwable cause, boolean enableSuppression,
//                                     boolean writableStackTrace) {
//         super(message, cause, enableSuppression, writableStackTrace);
//     }
// }
// 
// Path: ddal-ddr/src/main/java/org/hellojavaer/ddal/ddr/datasource/exception/UninitializedStatusException.java
// public class UninitializedStatusException extends DDRDataSourceException {
// 
//     public UninitializedStatusException() {
//     }
// 
//     public UninitializedStatusException(String message) {
//         super(message);
//     }
// 
//     public UninitializedStatusException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public UninitializedStatusException(Throwable cause) {
//         super(cause);
//     }
// 
//     public UninitializedStatusException(String message, Throwable cause, boolean enableSuppression,
//                                         boolean writableStackTrace) {
//         super(message, cause, enableSuppression, writableStackTrace);
//     }
// }
// 
// Path: ddal-ddr/src/main/java/org/hellojavaer/ddal/ddr/datasource/jdbc/init/UninitializedStatementProcessor.java
// public class UninitializedStatementProcessor {
// 
//     private static Map<StatementProperty, InnerBean> map = new HashMap<StatementProperty, InnerBean>();
// 
//     public static void setDefaultValue(StatementProperty prop, Object val, boolean isSyncDefaultValue) {
//         map.put(prop, new InnerBean(val, isSyncDefaultValue));
//     }
// 
//     public static Object getDefaultValue(StatementProperty prop) {
//         InnerBean obj = map.get(prop);
//         if (obj != null) {
//             return obj.getVal();
//         } else {
//             return null;
//         }
//     }
// 
//     public static boolean isSetDefaultValue(StatementProperty prop) {
//         return map.containsKey(prop);
//     }
// 
//     public static boolean isSyncDefaultValue(StatementProperty prop) {
//         InnerBean obj = map.get(prop);
//         if (obj != null) {
//             return obj.isSyncDefaultValue();
//         } else {
//             return false;
//         }
//     }
// 
//     public static Object removeDefaultValue(StatementProperty prop) {
//         return map.remove(prop);
//     }
// }
// 
// Path: ddal-ddr/src/main/java/org/hellojavaer/ddal/ddr/datasource/jdbc/property/StatementProperty.java
// public enum StatementProperty {
// 
//     maxFieldSize,
// 
//     maxRows,
// 
//     fetchDirection,
// 
//     fetchSize,
// 
//     queryTimeout,
// 
//     closeOnCompletion,
// 
//     poolable;
// 
// }
// 
// Path: ddal-ddr/src/main/java/org/hellojavaer/ddal/ddr/datasource/manager/DataSourceParam.java
// public class DataSourceParam {
// 
//     private Set<String> scNames;
//     private boolean     readOnly;
// 
//     public Set<String> getScNames() {
//         return scNames;
//     }
// 
//     public void setScNames(Set<String> scNames) {
//         this.scNames = scNames;
//     }
// 
//     public boolean isReadOnly() {
//         return readOnly;
//     }
// 
//     public void setReadOnly(boolean readOnly) {
//         this.readOnly = readOnly;
//     }
// 
//     @Override
//     public String toString() {
//         return new DDRToStringBuilder().append("readOnly", readOnly).append("scNames", scNames).toString();
//     }
// }


// Path: ddal-ddr/src/main/java/org/hellojavaer/ddal/ddr/datasource/jdbc/DDRStatementImpl.java
import org.hellojavaer.ddal.ddr.datasource.exception.CrossDataSourceException;
import org.hellojavaer.ddal.ddr.datasource.exception.StatementInitializationException;
import org.hellojavaer.ddal.ddr.datasource.exception.UninitializedStatusException;
import org.hellojavaer.ddal.ddr.datasource.jdbc.init.UninitializedStatementProcessor;
import org.hellojavaer.ddal.ddr.datasource.jdbc.property.StatementProperty;
import org.hellojavaer.ddal.ddr.datasource.manager.DataSourceParam;
import org.hellojavaer.ddal.ddr.sqlparse.SQLParsedResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.*;
import java.util.Set;

                    prop.setCloseOnCompletion(true);
                    tag.setCloseOnCompletion(true);
                }
                return val;
            } else {
                throw new UninitializedStatusException(
                                                       "Can't invoke 'isCloseOnCompletion()' before 'closeOnCompletion()' is invoked or statement is initialized");
            }
        }
    }

    @Override
    public void setPoolable(boolean poolable) throws SQLException {
        if (statement != null) {
            statement.setPoolable(poolable);
        } else {
            tag.setPoolable(true);
            prop.setPoolable(poolable);
        }
    }

    @Override
    public boolean isPoolable() throws SQLException {
        if (statement != null) {
            return statement.isPoolable();
        } else if (tag.isPoolable()) {
            return prop.isPoolable();
        } else {
            if (UninitializedStatementProcessor.isSetDefaultValue(StatementProperty.poolable)) {
                boolean val = ((boolean) UninitializedStatementProcessor.getDefaultValue(StatementProperty.poolable));
                if (UninitializedStatementProcessor.isSyncDefaultValue(StatementProperty.poolable)) {