flowable适配达梦7 (1.1)

应业务需求,需要在若依基础版中集成flowable任务流,实现流程申请审批。

RuoYi-Vue 项目地址

RuoYi-flowable 项目地址

因为项目所用的数据库是达梦7,所以在数据表迁移,适配达梦数据库的过程中,参考了 :若依以及flowbale达梦国产化数据库改造_全网最细

但是上文链接中的达梦版本是8 ,还有些细节偏差,以及后续遇到的问题:

  1. 报错:org.flowable.common.engine.api.FlowableException: Error initialising eventregistry data model
    在这里插入图片描述
    解决方案:
    1.1 pom.xml中在org.flowable加入liquibase-core依赖
    在这里插入图片描述
    1.2 liquibase.database.core.DmDatabase修改在这里插入图片描述
    1.3 新增dm.jdbc.driver.DmdbDatabaseMetaData_bs
    在这里插入图片描述
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package dm.jdbc.driver;

import com.ruoyi.common.utils.StringUtils;
import dm.jdbc.util.DmJdbcUtil;
import dm.jdbc.util.StringUtil;

import java.sql.*;

public class DmdbDatabaseMetaData_bs implements DatabaseMetaData {
    private DmdbConnection_bs connection;
    private final String m_esp;
    private boolean m_priv = false;
    int procedureResultUnknown = 0;
    int procedureNoResult = 1;
    int procedureReturnsResult = 2;
    int procedureColumnUnknown = 0;
    int procedureColumnIn = 1;
    int procedureColumnInOut = 2;
    int procedureColumnOut = 4;
    int procedureColumnReturn = 5;
    int procedureColumnResult = 3;
    int procedureNoNulls = 0;
    int procedureNullable = 1;
    int procedureNullableUnknown = 2;
    int columnNoNulls = 0;
    int columnNullable = 1;
    int columnNullableUnknown = 2;
    int bestRowTemporary = 0;
    int bestRowTransaction = 1;
    int bestRowSession = 2;
    int bestRowUnknown = 0;
    int bestRowNotPseudo = 1;
    int bestRowPseudo = 2;
    int versionColumnUnknown = 0;
    int versionColumnNotPseudo = 1;
    int versionColumnPseudo = 2;
    int importedKeyCascade = 0;
    int importedKeyRestrict = 1;
    int importedKeySetNull = 2;
    int importedKeyNoAction = 3;
    int importedKeySetDefault = 4;
    int importedKeyInitiallyDeferred = 5;
    int importedKeyInitiallyImmediate = 6;
    int importedKeyNotDeferrable = 7;
    int typeNoNulls = 0;
    int typeNullable = 1;
    int typeNullableUnknown = 2;
    int typePredNone = 0;
    int typePredChar = 1;
    int typePredBasic = 2;
    int typeSearchable = 3;
    short tableIndexStatistic = 0;
    short tableIndexClustered = 1;
    short tableIndexHashed = 2;
    short tableIndexOther = 3;
    short attributeNoNulls = 0;
    short attributeNullable = 1;
    short attributeNullableUnknown = 2;
    int XOpen = 1;
    int sqlStateSQL99 = 2;

    public DmdbDatabaseMetaData_bs(DmdbConnection_bs conn) {
        this.connection = conn;
        this.m_esp = " ESCAPE '!' ";
        this.m_priv = this.connection.isDbmdChkPrv();
    }



    @Override
    public boolean allProceduresAreCallable() throws SQLException {
        return true;
    }

    @Override
    public boolean allTablesAreSelectable() throws SQLException {
        return true;
    }

    @Override
    public String getURL() throws SQLException {
        return this.connection.getUrl();
    }

    @Override
    public String getUserName() throws SQLException {
        return this.connection.getCurrentUserName();
    }

    @Override
    public boolean isReadOnly() throws SQLException {
        return this.connection.isReadOnly();
    }

    @Override
    public boolean nullsAreSortedHigh() throws SQLException {
        return false;
    }

    @Override
    public boolean nullsAreSortedLow() throws SQLException {
        return true;
    }

    @Override
    public boolean nullsAreSortedAtStart() throws SQLException {
        return false;
    }

    @Override
    public boolean nullsAreSortedAtEnd() throws SQLException {
        return false;
    }

    @Override
    public String getDatabaseProductName() throws SQLException {
        if (StringUtil.isNotEmpty(this.connection.getDatabaseProductName())) {
            return this.connection.getDatabaseProductName();
        } else {
            return this.connection.isCompatibleOracle() ? "Oracle" : "DM DBMS";
        }
    }

    @Override
    public String getDatabaseProductVersion() throws SQLException {
        ResultSet rs = DmJdbcUtil.executeQuery(this.connection, "select top 1 * from v$version where banner like 'DM Database Server%'");
        if (rs.next()) {
            String str = rs.getString(1);
            int endIndex = str.indexOf("-Build");
            str = endIndex != -1 ? str.substring(0, endIndex) : str;
            int startIndex = str.lastIndexOf("V");
            return startIndex != -1 ? str.substring(startIndex + 1) : str;
        } else {
            return this.connection.getDmServerVersion();
        }
    }

    @Override
    public String getDriverName() throws SQLException {
        return "dm.jdbc.driver.DmDriver";
    }

    @Override
    public String getDriverVersion() throws SQLException {
        String s = "3.0";
        if (DmdbType.JDBC_VERSION >= 4) {
            s = "4.0";
        }

        String version = "7.6.0.165";

        try {
            String[] versionStr = version.split("\\.");

            for(int i = versionStr.length - 1; i > 0 && Integer.parseInt(versionStr[i]) == 0; --i) {
                versionStr[i] = null;
            }

            version = "";

            for(int i = 0; i < versionStr.length && !StringUtil.isEmpty(versionStr[i]); ++i) {
                if (i != 0) {
                    version = version + ".";
                }

                version = version + versionStr[i];
            }
        } catch (Exception var5) {
            version = "7.6.0.165";
        }

        s = s + "." + version + " (Build " + "2019.06.04" + ")";
        return s;
    }

    @Override
    public int getDriverMajorVersion() {
        return DmdbType.JDBC_VERSION;
    }

    @Override
    public int getDriverMinorVersion() {
        return 0;
    }

    @Override
    public boolean usesLocalFiles() throws SQLException {
        return false;
    }

    @Override
    public boolean usesLocalFilePerTable() throws SQLException {
        return false;
    }

    @Override
    public boolean supportsMixedCaseIdentifiers() throws SQLException {
        return false;
    }

    @Override
    public boolean storesUpperCaseIdentifiers() throws SQLException {
        return true;
    }

    @Override
    public boolean storesLowerCaseIdentifiers() throws SQLException {
        return false;
    }

    @Override
    public boolean storesMixedCaseIdentifiers() throws SQLException {
        return false;
    }

    @Override
    public boolean supportsMixedCaseQuotedIdentifiers() throws SQLException {
        return true;
    }

    @Override
    public boolean storesUpperCaseQuotedIdentifiers() throws SQLException {
        return false;
    }

    @Override
    public boolean storesLowerCaseQuotedIdentifiers() throws SQLException {
        return false;
    }

    @Override
    public boolean storesMixedCaseQuotedIdentifiers() throws SQLException {
        return true;
    }

    @Override
    public String getIdentifierQuoteString() throws SQLException {
        return "\"";
    }

    @Override
    public String getSQLKeywords() throws SQLException {
        StringBuffer sql = new StringBuffer("");
        sql.append("BREAK,BROWSE,BULK,CHECKPOINT,CLUSTERED,COMMITTED,COMPUTE,");
        sql.append(" CONFIRM,CONTROLROW,DATABASE,DBCC,DISK,DISTRIBUTED,DUMMY,");
        sql.append(" DUMP,ERRLVL,ERROREXIT,EXIT,FILE,FILLFACTOR,FLOPPY,HOLDLOCK,");
        sql.append(" IDENTITY_INSERT,IDENTITYCOL,IF,KILL,LINENO,LOAD,MIRROREXIT,");
        sql.append("NONCLUSTERED,OFF,OFFSETS,ONCE,OVER,PERCENT,PERM,PERMANENT,PLAN, PRINT,");
        sql.append("AFTER,ASSIGN,AUDIT,BEFORE,BITMAP,CACHE,CALL,CHAIN,CLUSTER,CYCLE,");
        sql.append(" DATABASE, DATAFILE, DEBUG, #DECODE, #DELETING, DISABLE,");
        sql.append(" EACH,ELSEIF,END,EXCLUSIVE, EXIT,FILLFACTOR, FUNCTION,");
        sql.append(" HEXTORAW,IDENTIFIED,IF, IFNULL,INCREASE, INDEX, ");
        sql.append(" INITIAL,INTENTION,ISNULL,ISOPEN,MAXVALUE,");
        sql.append(" MINVALUE,MODIFY,NATURAL,NEW, NEXT, NOAUDIT, NOCACHE,NOCYCLE,");
        sql.append(" NOTFOUND,  NVL, OFF, OLD, OUT,PENDANT, PERCENT, PRINT, PRIOR,");
        sql.append("RAISE,RAWTOHEX,READ,RENAME,RETURN,REVERSE,ROLE,ROWCOUNT,ROWNUM,SAVEPOINT,SERIALIZABLE,");
        sql.append(" SEQUENCE, SHARE, STATEMENT,TIES, TIMESTAMPADD, TIMESTAMPDIFF,");
        sql.append("TOP,TRIGGER,TRIGGERS,TRUNCATE,TYPECAST,UNCOMMITED,UNTIL,VSIZE,WHILE,LOGIN,");
        sql.append("EXTERNALLY,SESSION_PER_USER,CONNECT_IDLE_TIME,FAILED_LOGIN_ATTEMPS,");
        sql.append("PASSWORD_LIFE_TIME,PASSWORD_REUSE_TIME,PASSWORD_REUSE_MAX,");
        sql.append("PASSWORD_LOCK_TIME,PASSWORD_GRACE_TIME,POLICY,CATEGORY,UNLIMITED");
        return sql.toString();
    }

    @Override
    public String getNumericFunctions() throws SQLException {
        return "ABS,ACOS,ASIN,ATAN,ATAN2,CEILING,COS,COT,DEGREES,EXP,FLOOR,LOG,LOG10,MOD,PI,POWER,RADIANS,RAND,ROUND,SIGN,SIN,SQRT,TAN,TRUNCATE,CEIL,COSH,LN,SINH,TANH";
    }

    @Override
    public String getStringFunctions() throws SQLException {
        return "ASCII,CHAR,CONCAT,DIFFERENCE,INSERT,LCASE,LEFT,LENGTH,LOCATE,LTRIM,REPEAT,REPLACE,RIGHT,RTRIM,SOUNDEX,SPACE,UCASE,BIT_LENGTH,CHAR_LENGTH,CHARACTER_LENGTH,CHR,INITCAP,INSSTR,INSTR,INSTRB,LEFTSTR,LENGTHB,OCTET_LENGTH,LOWER,LPAD,POSITION,REPEATSTR,REVERSE,RIGHTSTR,RPAD,SUBSTR,SUBSTRB,TO_CHAR,TRANSLATE,TRIM,UPPER";
    }

    @Override
    public String getSystemFunctions() throws SQLException {
        return "IFNULL,USER,CUR_DATABASE,DBID,EXTENT,PAGE,SESSID,UID,TABLEDEF,VSIZE,SET_TABLE_OPTION,SET_INDEX_OPTION,CFALGORITHMSENCRYPT,CFALGORITHMSDECRYPT,BFALGORITHMSENCRYPT,BFALGORITHMSDECRYPT,LABEL_TO_CHAR,LABEL_FROM_CHAR,LABEL_CMP,LABEL_STR_CMP";
    }

    @Override
    public String getTimeDateFunctions() throws SQLException {
        return "CURDATE,CURTIME,DAYNAME,DAYOFMONTH,DAYOFWEEK,DAYOFYEAR,HOUR,MINUTE,MONTH,MONTHNAME,NOW,QUARTER,SECOND,TIMESTAMPADD,TIMESTAMPDIFF,WEEK,YEAR,ADD_DAYS,ADD_MONTHS,ADD_WEEKS,CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,DATEADD,DATEDIFF,DATEPART,DAYS_BETWEEN,EXTRACT,GETDATE,LAST_DAY,MONTHS_BETWEEN,NEXT_DAY,ROUND,SYSDATE,TO_DATE,TRUNC,WEEKDAY,YEARS_BETWEEN";
    }

    @Override
    public String getSearchStringEscape() throws SQLException {
        return "!";
    }

    @Override
    public String getExtraNameCharacters() throws SQLException {
        return "";
    }

    @Override
    public boolean supportsAlterTableWithAddColumn() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsAlterTableWithDropColumn() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsColumnAliasing() throws SQLException {
        return true;
    }

    @Override
    public boolean nullPlusNonNullIsNull() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsConvert() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsConvert(int fromType, int toType) throws SQLException {
        boolean supportsconvert = false;
        if (toType == 91) {
            switch (fromType) {
                case -1:
                case 1:
                case 12:
                case 91:
                case 2005:
                    supportsconvert = true;
            }
        }

        if (toType != 3 && toType != 2 && toType != -6 && toType != 4 && toType != 6 && toType != 8 && toType != 7 && toType != 5 && toType != -5 && toType != 1 && toType != 12 && toType != -7 && toType != 16 && toType != -1) {
            if (toType == 91) {
                switch (fromType) {
                    case -1:
                    case 0:
                    case 1:
                    case 12:
                    case 91:
                    case 93:
                    case 2005:
                        supportsconvert = true;
                    default:
                        return supportsconvert;
                }
            } else if (toType == 92) {
                switch (fromType) {
                    case -1:
                    case 0:
                    case 1:
                    case 12:
                    case 92:
                    case 93:
                    case 2005:
                        supportsconvert = true;
                    default:
                        return supportsconvert;
                }
            } else if (toType == 93) {
                switch (fromType) {
                    case -1:
                    case 0:
                    case 1:
                    case 12:
                    case 91:
                    case 92:
                    case 93:
                    case 2005:
                        supportsconvert = true;
                    default:
                        return supportsconvert;
                }
            } else if (toType == 2004) {
                switch (fromType) {
                    case -4:
                    case 2004:
                        supportsconvert = true;
                    default:
                        return supportsconvert;
                }
            } else if (toType == 2005) {
                switch (fromType) {
                    case -1:
                    case 2005:
                        supportsconvert = true;
                    default:
                        return supportsconvert;
                }
            } else {
                return supportsconvert;
            }
        } else {
            switch (fromType) {
                case -7:
                case -6:
                case -5:
                case -1:
                case 0:
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 7:
                case 8:
                case 12:
                case 16:
                    supportsconvert = true;
                case -4:
                case -3:
                case -2:
                case 9:
                case 10:
                case 11:
                case 13:
                case 14:
                case 15:
                default:
                    return supportsconvert;
            }
        }
    }

    @Override
    public boolean supportsTableCorrelationNames() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsDifferentTableCorrelationNames() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsExpressionsInOrderBy() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsOrderByUnrelated() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsGroupBy() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsGroupByUnrelated() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsGroupByBeyondSelect() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsLikeEscapeClause() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsMultipleResultSets() throws SQLException {
        return false;
    }

    @Override
    public boolean supportsMultipleTransactions() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsNonNullableColumns() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsMinimumSQLGrammar() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsCoreSQLGrammar() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsExtendedSQLGrammar() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsANSI92EntryLevelSQL() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsANSI92IntermediateSQL() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsANSI92FullSQL() throws SQLException {
        return false;
    }

    @Override
    public boolean supportsIntegrityEnhancementFacility() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsOuterJoins() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsFullOuterJoins() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsLimitedOuterJoins() throws SQLException {
        return true;
    }

    @Override
    public String getSchemaTerm() throws SQLException {
        return "SCHEMA";
    }

    @Override
    public String getProcedureTerm() throws SQLException {
        return "PROCEDURE";
    }

    @Override
    public String getCatalogTerm() throws SQLException {
        return "CATALOG";
    }

    @Override
    public boolean isCatalogAtStart() throws SQLException {
        return false;
    }

    @Override
    public String getCatalogSeparator() throws SQLException {
        return "";
    }

    @Override
    public boolean supportsSchemasInDataManipulation() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsSchemasInProcedureCalls() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsSchemasInTableDefinitions() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsSchemasInIndexDefinitions() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsSchemasInPrivilegeDefinitions() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsCatalogsInDataManipulation() throws SQLException {
        return false;
    }

    @Override
    public boolean supportsCatalogsInProcedureCalls() throws SQLException {
        return false;
    }

    @Override
    public boolean supportsCatalogsInTableDefinitions() throws SQLException {
        return false;
    }

    @Override
    public boolean supportsCatalogsInIndexDefinitions() throws SQLException {
        return false;
    }

    @Override
    public boolean supportsCatalogsInPrivilegeDefinitions() throws SQLException {
        return false;
    }

    @Override
    public boolean supportsPositionedDelete() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsPositionedUpdate() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsSelectForUpdate() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsStoredProcedures() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsSubqueriesInComparisons() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsSubqueriesInExists() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsSubqueriesInIns() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsSubqueriesInQuantifieds() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsCorrelatedSubqueries() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsUnion() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsUnionAll() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsOpenCursorsAcrossCommit() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsOpenCursorsAcrossRollback() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsOpenStatementsAcrossCommit() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsOpenStatementsAcrossRollback() throws SQLException {
        return true;
    }

    @Override
    public int getMaxBinaryLiteralLength() throws SQLException {
        return Integer.MAX_VALUE;
    }

    @Override
    public int getMaxCharLiteralLength() throws SQLException {
        return this.connection.getMaxRowSize();
    }

    @Override
    public int getMaxColumnNameLength() throws SQLException {
        return 128;
    }

    @Override
    public int getMaxColumnsInGroupBy() throws SQLException {
        return 64;
    }

    @Override
    public int getMaxColumnsInIndex() throws SQLException {
        return 16;
    }

    @Override
    public int getMaxColumnsInOrderBy() throws SQLException {
        return 64;
    }

    @Override
    public int getMaxColumnsInSelect() throws SQLException {
        return 1024;
    }

    @Override
    public int getMaxColumnsInTable() throws SQLException {
        return 1024;
    }

    @Override
    public int getMaxConnections() throws SQLException {
        return 256;
    }

    @Override
    public int getMaxCursorNameLength() throws SQLException {
        return 128;
    }

    @Override
    public int getMaxIndexLength() throws SQLException {
        return 1020;
    }

    @Override
    public int getMaxSchemaNameLength() throws SQLException {
        return 128;
    }

    @Override
    public int getMaxProcedureNameLength() throws SQLException {
        return 128;
    }

    @Override
    public int getMaxCatalogNameLength() throws SQLException {
        return 0;
    }

    @Override
    public int getMaxRowSize() throws SQLException {
        return 0;
    }

    @Override
    public boolean doesMaxRowSizeIncludeBlobs() throws SQLException {
        return false;
    }

    @Override
    public int getMaxStatementLength() throws SQLException {
        return 8000;
    }

    @Override
    public int getMaxStatements() throws SQLException {
        return 128;
    }

    @Override
    public int getMaxTableNameLength() throws SQLException {
        return 128;
    }

    @Override
    public int getMaxTablesInSelect() throws SQLException {
        return 50;
    }

    @Override
    public int getMaxUserNameLength() throws SQLException {
        return 128;
    }

    @Override
    public int getDefaultTransactionIsolation() throws SQLException {
        return 2;
    }

    @Override
    public boolean supportsTransactions() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsTransactionIsolationLevel(int level) throws SQLException {
        return level == 2 || level == 1 || level == 4 || level == 8;
    }

    @Override
    public boolean supportsDataDefinitionAndDataManipulationTransactions() throws SQLException {
        return !this.connection.getDDL_Autocommit();
    }

    @Override
    public boolean supportsDataManipulationTransactionsOnly() throws SQLException {
        return this.connection.getDDL_Autocommit();
    }

    @Override
    public boolean dataDefinitionCausesTransactionCommit() throws SQLException {
        return this.connection.getDDL_Autocommit();
    }

    @Override
    public boolean dataDefinitionIgnoredInTransactions() throws SQLException {
        return !this.connection.getDDL_Autocommit();
    }

    @Override
    public ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern) throws SQLException {
        if (this.connection.isCompatibleOracle() && StringUtil.isNotEmpty(catalog)) {
            try {
                return this.getPkgProcedures(schemaPattern, catalog, procedureNamePattern, 0);
            } catch (SQLException var9) {
            }
        }

        String schemaname = schemaPattern == null ? "%" : StringUtil.getEscStringName(schemaPattern);
        String procname = procedureNamePattern == null ? "%" : StringUtil.getEscStringName(procedureNamePattern);
        StringBuffer sql = new StringBuffer("");
        sql.append("SELECT /*+ MAX_OPT_N_TABLES(5) */ DISTINCT NULL AS PROCEDURE_CAT, SCHEMAS.NAME AS PROCEDURE_SCHEM,");
        sql.append("PROCS.NAME AS PROCEDURE_NAME, 'RESERVED1' AS RESERVED1,'RESERVED2' AS RESERVED2,'RESERVED3' AS RESERVED3, NULL AS REMARKS, 1 AS PROCEDURE_TYPE");
        sql.append(" FROM ");
        String schemaClause = this.makeSchemaClause(schemaname);
        sql.append(schemaClause);
        sql.append(" SCHEMAS, ");
        sql.append(" (SELECT * FROM SYS.SYSOBJECTS WHERE SUBTYPE$='PROC' ");
        if (!this.connection.isCompatibleOracle()) {
            sql.append("AND INFO1&0x01=1 ");
        }

        String procClause = this.makeClause_objWithoutPrec(procname);
        if (procClause != null) {
            sql.append(" AND NAME ");
            sql.append(procClause);
        }

        sql.append(")PROCS");
        sql.append(" WHERE SCHEMAS.ID = PROCS.SCHID");
        sql.append(" ORDER BY PROCEDURE_SCHEM ASC,PROCEDURE_NAME ASC;");
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    private ResultSet getPkgProcedures(String schName, String pkgName, String procName, int procType) throws SQLException {
        StringBuffer sql = new StringBuffer("");
        sql.append("SELECT /*+ MAX_OPT_N_TABLES(5) */ DISTINCT PACAGES.NAME AS PROCEDURE_CAT, SCHEMAS.NAME AS PROCEDURE_SCHEM,");
        sql.append("PROCS.MTDNAME AS PROCEDURE_NAME, 'RESERVED1' AS RESERVED1,'RESERVED2' AS RESERVED2,'RESERVED3' AS RESERVED3, NULL AS REMARKS, CASE PROCS.IS_PROC WHEN 'Y' THEN 1 ELSE  2 END AS PROCEDURE_TYPE");
        sql.append(" FROM SYS.SYSOBJECTS SCHEMAS, SYS.SYSOBJECTS PACAGES, SYS.V$PKGPROCS PROCS");
        sql.append(" WHERE");
        sql.append(" PROCS.PKGID = PACAGES.ID");
        sql.append(" AND PACAGES.SCHID = SCHEMAS.ID");
        if (procType == 1) {
            sql.append(" AND PROCS.IS_PROC = 'Y'");
        } else if (procType == 2) {
            sql.append(" AND PROCS.IS_PROC = 'N'");
        }

        if (StringUtil.isNotEmpty(schName)) {
            schName = StringUtil.getEscStringName(schName);
            String schemaClause = this.makeClause_objWithoutPrec(schName);
            if (schemaClause != null) {
                sql.append(" AND SCHEMAS.NAME ");
                sql.append(schemaClause);
            }
        }

        if (StringUtil.isNotEmpty(pkgName)) {
            pkgName = StringUtil.getEscStringName(pkgName);
            String pkgClause = this.makeClause_objWithoutPrec(pkgName);
            if (pkgClause != null) {
                sql.append(" AND PROCS.PKGNAME ");
                sql.append(pkgClause);
            }
        }

        if (StringUtil.isNotEmpty(procName)) {
            procName = StringUtil.getEscStringName(procName);
            String procClause = this.makeClause_objWithoutPrec(procName);
            if (procClause != null) {
                sql.append(" AND PROCS.MTDNAME ");
                sql.append(procClause);
            }
        }

        sql.append("ORDER BY PROCEDURE_SCHEM ASC, PROCEDURE_CAT ASC, PROCEDURE_NAME ASC;");
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    private ResultSet getPkgProcedureColumns(String schName, String pkgName, String procName, String colName, int procType) throws SQLException {
        StringBuffer sql = new StringBuffer("");
        sql.append("SELECT /*+ MAX_OPT_N_TABLES(5) */ DISTINCT ");
        sql.append("PACAGES.NAME AS PROCEDURE_CAT, ");
        sql.append("SCHEMAS.NAME AS PROCEDURE_SCHEM, ");
        sql.append("PROCS.MTDNAME AS PROCEDURE_NAME, ");
        sql.append("CASE TRIM(ARG.IOFLAG) WHEN 'R' THEN NULL ELSE ARG.NAME END AS COLUMN_NAME, ");
        sql.append("CASE TRIM(ARG.IOFLAG)");
        sql.append(" WHEN 'I' THEN 1");
        sql.append(" WHEN 'O' THEN 4");
        sql.append(" WHEN 'IO' THEN 2");
        sql.append(" WHEN 'R' THEN 5");
        sql.append(" END AS COLUMN_TYPE, ");
        sql.append(this.makeDataTypeClause("ARG.TYPE$", "ARG.SCALE"));
        sql.append("AS DATA_TYPE, ");
        sql.append(this.makeDataTypeNameClause("ARG.TYPE$"));
        sql.append("AS TYPE_NAME, ");
        sql.append("CASE SF_GET_COLUMN_SIZE(ARG.TYPE$, CAST (ARG.LENGTH$ AS INT), CAST (ARG.SCALE AS INT)) ");
        sql.append("WHEN -2 THEN NULL ");
        sql.append("ELSE SF_GET_COLUMN_SIZE(ARG.TYPE$, CAST (ARG.LENGTH$ AS INT), CAST (ARG.SCALE AS INT)) END ");
        sql.append("AS \"PRECISION\", ");
        sql.append("CASE SF_GET_BUFFER_LEN(ARG.TYPE$, CAST (ARG.LENGTH$ AS INT), CAST (ARG.SCALE AS INT)) ");
        sql.append("WHEN -2 THEN NULL ");
        sql.append("ELSE SF_GET_BUFFER_LEN(ARG.TYPE$, CAST (ARG.LENGTH$ AS INT), CAST (ARG.SCALE AS INT)) END ");
        sql.append("AS LENGTH, ");
        sql.append("CASE SF_GET_DECIMAL_DIGITS(ARG.TYPE$, CAST (ARG.SCALE AS INT)) ");
        sql.append("WHEN -2 THEN NULL ");
        sql.append("ELSE SF_GET_DECIMAL_DIGITS(ARG.TYPE$, CAST (ARG.SCALE AS INT)) END ");
        sql.append("AS SCALE, ");
        sql.append("10 AS RADIX, ");
        sql.append("1 AS NULLABLE, ");
        sql.append("NULL AS REMARKS, ");
        sql.append("ARG.DEFVAL AS COLUMN_DEF, ");
        sql.append("NULL AS SQL_DATA_TYPE, ");
        sql.append("NULL AS SQL_DATETIME_SUB, ");
        sql.append("NULL AS CHAR_OCTET_LENGTH, ");
        sql.append("ARG.PARAMID AS ORDINAL_POSITION, ");
        sql.append("CASE ARG.NULLABLE WHEN 'Y' THEN 'YES' ELSE 'NO' END AS IS_NULLABLE, ");
        sql.append("NULL AS SPECIFIC_NAME ");
        sql.append("FROM SYS.SYSOBJECTS SCHEMAS, SYS.SYSOBJECTS PACAGES, SYS.V$PKGPROCS PROCS, SYS.V$PKGPROCPARAMS ARG");
        sql.append(" WHERE");
        sql.append(" PROCS.PKGID = PACAGES.ID");
        sql.append(" AND PACAGES.SCHID = SCHEMAS.ID");
        sql.append(" AND ARG.PKGID = PROCS.PKGID");
        sql.append(" AND ARG.MTDID = PROCS.MTDID");
        if (procType == 1) {
            sql.append(" AND PROCS.IS_PROC = 'Y'");
        } else if (procType == 2) {
            sql.append(" AND PROCS.IS_PROC = 'N'");
        }

        if (StringUtil.isNotEmpty(schName)) {
            schName = StringUtil.getEscStringName(schName);
            String schemaClause = this.makeClause_objWithoutPrec(schName);
            if (schemaClause != null) {
                sql.append(" AND SCHEMAS.NAME ");
                sql.append(schemaClause);
            }
        }

        if (StringUtil.isNotEmpty(pkgName)) {
            pkgName = StringUtil.getEscStringName(pkgName);
            String pkgClause = this.makeClause_objWithoutPrec(pkgName);
            if (pkgClause != null) {
                sql.append(" AND PROCS.PKGNAME ");
                sql.append(pkgClause);
            }
        }

        if (StringUtil.isNotEmpty(procName)) {
            procName = StringUtil.getEscStringName(procName);
            String procClause = this.makeClause_objWithoutPrec(procName);
            if (procClause != null) {
                sql.append(" AND PROCS.MTDNAME ");
                sql.append(procClause);
            }
        }

        if (StringUtil.isNotEmpty(colName)) {
            colName = StringUtil.getEscStringName(colName);
            String colClause = this.makeClause_objWithoutPrec(colName);
            if (colClause != null) {
                sql.append(" AND ARG.NAME ");
                sql.append(colClause);
            }
        }

        sql.append(" ORDER BY PROCEDURE_SCHEM ASC, PROCEDURE_CAT ASC, PROCEDURE_NAME ASC, ORDINAL_POSITION ASC;");
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    @Override
    public ResultSet getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) throws SQLException {
        if (this.connection.isCompatibleOracle() && StringUtil.isNotEmpty(catalog)) {
            try {
                return this.getPkgProcedureColumns(schemaPattern, catalog, procedureNamePattern, columnNamePattern, 0);
            } catch (SQLException var12) {
            }
        }

        String schemaname = schemaPattern == null ? "%" : StringUtil.getEscStringName(schemaPattern);
        String procname = procedureNamePattern == null ? "%" : StringUtil.getEscStringName(procedureNamePattern);
        String colname = columnNamePattern == null ? "%" : StringUtil.getEscStringName(columnNamePattern);
        StringBuffer sql = new StringBuffer();
        sql.append("SELECT /*+ MAX_OPT_N_TABLES(5) */ DISTINCT ");
        sql.append("NULL AS PROCEDURE_CAT, ");
        sql.append("USERS.NAME AS PROCEDURE_SCHEM, ");
        sql.append("PROCS.NAME AS PROCEDURE_NAME, ");
        if (this.connection.isCompatibleOracle()) {
            sql.append("CASE ARG.INFO1 WHEN 3 THEN NULL ELSE ARG.NAME END AS COLUMN_NAME, ");
        } else {
            sql.append("ARG.NAME AS COLUMN_NAME,");
        }

        sql.append("CASE ARG.INFO1 WHEN 0 THEN 1 WHEN 1 THEN 4 WHEN 2 THEN 2 WHEN 3 THEN 5 END AS COLUMN_TYPE, ");
        sql.append(this.makeDataTypeClause("ARG.TYPE$", "ARG.SCALE"));
        sql.append("AS DATA_TYPE, ");
        sql.append(this.makeDataTypeNameClause("ARG.TYPE$"));
        sql.append("AS TYPE_NAME, ");
        sql.append("CASE SF_GET_COLUMN_SIZE(ARG.TYPE$, CAST (ARG.LENGTH$ AS INT), CAST (ARG.SCALE AS INT)) ");
        sql.append("WHEN -2 THEN NULL ");
        sql.append("ELSE SF_GET_COLUMN_SIZE(ARG.TYPE$, CAST (ARG.LENGTH$ AS INT), CAST (ARG.SCALE AS INT)) END ");
        sql.append("AS \"PRECISION\", ");
        sql.append("CASE SF_GET_BUFFER_LEN(ARG.TYPE$, CAST (ARG.LENGTH$ AS INT), CAST (ARG.SCALE AS INT)) ");
        sql.append("WHEN -2 THEN NULL ");
        sql.append("ELSE SF_GET_BUFFER_LEN(ARG.TYPE$, CAST (ARG.LENGTH$ AS INT), CAST (ARG.SCALE AS INT)) END ");
        sql.append("AS LENGTH, ");
        sql.append("CASE SF_GET_DECIMAL_DIGITS(ARG.TYPE$, CAST (ARG.SCALE AS INT)) ");
        sql.append("WHEN -2 THEN NULL ");
        sql.append("ELSE SF_GET_DECIMAL_DIGITS(ARG.TYPE$, CAST (ARG.SCALE AS INT)) END ");
        sql.append("AS SCALE, ");
        sql.append("10 AS RADIX, ");
        sql.append("1 AS NULLABLE, ");
        sql.append("NULL AS REMARKS, ");
        sql.append("ARG.DEFVAL AS COLUMN_DEF, ");
        sql.append("NULL AS SQL_DATA_TYPE, ");
        sql.append("NULL AS SQL_DATETIME_SUB, ");
        sql.append("NULL AS CHAR_OCTET_LENGTH, ");
        sql.append("ARG.COLID AS ORDINAL_POSITION, ");
        sql.append("CASE ARG.NULLABLE$ WHEN 'Y' THEN 'YES' ELSE 'NO' END AS IS_NULLABLE, ");
        sql.append("NULL AS SPECIFIC_NAME ");
        sql.append("FROM ");
        String schemaClause = this.makeSchemaClause(schemaname);
        sql.append(schemaClause);
        sql.append(" USERS, ");
        String procClause = this.makeProcClause(procname);
        sql.append(procClause);
        sql.append(" PROCS, ");
        sql.append("SYS.SYSCOLUMNS ARG ");
        sql.append("WHERE USERS.ID = PROCS.SCHID AND PROCS.ID = ARG.ID ");
        String columnClause = this.makeClause_objWithoutPrec(colname);
        if (columnClause != null) {
            sql.append(" AND ARG.NAME ");
            sql.append(columnClause);
        }

        sql.append(" ORDER BY PROCEDURE_SCHEM ASC,PROCEDURE_NAME ASC, ORDINAL_POSITION ASC;");
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    @Override
    public ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException {
        String schemaname = schemaPattern == null ? "%" : StringUtil.getEscStringName(schemaPattern);
        String procname = tableNamePattern == null ? "%" : StringUtil.getEscStringName(tableNamePattern);
        String selectClause = "SELECT /*+ MAX_OPT_N_TABLES(5) */ NULL AS TABLE_CAT, SCHEMAS.NAME AS TABLE_SCHEM, TABS.NAME AS TABLE_NAME, CASE TABS.SUBTYPE$ WHEN 'UTAB' THEN 'TABLE' WHEN 'VIEW' THEN 'VIEW' WHEN 'STAB' THEN 'SYSTEM TABLE' WHEN 'SYNOM' THEN 'SYNONYM' END AS TABLE_TYPE, (SELECT COMMENT$ FROM SYSTABLECOMMENTS WHERE SCHNAME = SCHEMAS.NAME AND TVNAME = TABS.NAME) AS REMARKS, NULL AS TYPE_CAT, NULL AS TYPE_SCHEM, NULL AS TYPE_NAME, NULL AS SELF_REFERENCING_COL_NAME, NULL AS REF_GENERATION ";
        String schemaClause = this.makeSchemaClause(schemaname);
        String tableClause = this.makeClause_objWithoutPrec(procname);
        String fromClause = " FROM " + schemaClause + " SCHEMAS," + " (SELECT * FROM SYS.SYSOBJECTS ";
        String typeClause = this.makeTableTypeClause(types);
        if (typeClause != null || tableClause != null) {
            fromClause = fromClause + " WHERE ";
            if (typeClause != null) {
                fromClause = fromClause + typeClause;
                if (tableClause != null) {
                    fromClause = fromClause + " AND NAME " + tableClause;
                }
            } else if (tableClause != null) {
                fromClause = fromClause + " NAME " + tableClause;
            }
        }

        fromClause = fromClause + ") TABS";
        String whereClause = " WHERE TABS.SCHID = SCHEMAS.ID ";
        if (this.m_priv) {
            whereClause = whereClause + " AND (SCHEMAS.PID = UID() OR EXISTS (SELECT * FROM SYS.SYSGRANTS WHERE (URID = UID() OR URID = 67108866) AND (TABS.ID = OBJID AND (PRIVID = -1 OR PRIVID = 8192)))) ";
        }

        String orderClause = " ORDER BY TABLE_TYPE ASC,TABLE_SCHEM ASC,TABLE_NAME ASC;";
        String sql = selectClause + fromClause + whereClause + orderClause;
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    private String makeSchemaClause(String schemaname) {
        String schemaClause = null;
        if (this.getEscape(schemaname)) {
            if (schemaname.equalsIgnoreCase("%")) {
                schemaClause = "(SELECT ID, NAME, PID FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCH') ";
            } else {
                schemaClause = "(SELECT ID, NAME, PID FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCH' AND NAME LIKE '" + schemaname + "' " + this.m_esp + " ) ";
            }
        } else {
            schemaClause = "(SELECT ID, NAME, PID FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCH' AND NAME = '" + schemaname + "' ) ";
        }

        return schemaClause;
    }

    private String makeTableClause(String tabName) {
        String clause = null;
        if (this.getEscape(tabName)) {
            if (tabName.equalsIgnoreCase("%")) {
                clause = "(SELECT ID, SCHID, NAME FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ IN('UTAB', 'STAB', 'VIEW')) ";
            } else {
                clause = "(SELECT ID, SCHID, NAME FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ IN('UTAB', 'STAB', 'VIEW') AND NAME LIKE '" + tabName + "' " + this.m_esp + " ) ";
            }
        } else {
            clause = "(SELECT ID, SCHID, NAME FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ IN('UTAB', 'STAB', 'VIEW') AND NAME = '" + tabName + "' ) ";
        }

        return clause;
    }

    private String makeTableClause_utab(String tabName) {
        String clause = null;
        if (this.getEscape(tabName)) {
            if (tabName.equalsIgnoreCase("%")) {
                clause = "(SELECT ID, SCHID, NAME FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ = 'UTAB') ";
            } else {
                clause = "(SELECT ID, SCHID, NAME FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ = 'UTAB' AND NAME LIKE '" + tabName + "' " + this.m_esp + " ) ";
            }
        } else {
            clause = "(SELECT ID, SCHID, NAME FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ = 'UTAB' AND NAME = '" + tabName + "' ) ";
        }

        return clause;
    }

    private String makeProcClause(String procName) {
        String clause = null;
        if (this.getEscape(procName)) {
            if (procName.equalsIgnoreCase("%")) {
                clause = "(SELECT ID, SCHID, NAME FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ = 'PROC' ";
            } else {
                clause = "(SELECT ID, SCHID, NAME FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ = 'PROC' AND NAME LIKE '" + procName + "' " + this.m_esp;
            }
        } else {
            clause = "(SELECT ID, SCHID, NAME FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ = 'PROC' AND NAME = '" + procName + "' ";
        }

        if (clause != null) {
            if (!this.connection.isCompatibleOracle()) {
                clause = clause + " AND INFO1&0X01 = 1";
            }

            clause = clause + ")";
        }

        return clause;
    }

    private String makeFuncClause(String funcName) {
        String clause = null;
        if (this.getEscape(funcName)) {
            if (funcName.equalsIgnoreCase("%")) {
                clause = "(SELECT ID, SCHID, NAME FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ = 'PROC' AND INFO1&0X01 = 0) ";
            } else {
                clause = "(SELECT ID, SCHID, NAME FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ = 'PROC' AND INFO1&0X01 = 0 AND NAME LIKE '" + funcName + "' " + this.m_esp + " ) ";
            }
        } else {
            clause = "(SELECT ID, SCHID, NAME FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ = 'PROC' AND INFO1&0X01 = 0 AND NAME = '" + funcName + "' ) ";
        }

        return clause;
    }

    private String makeClause_objWithoutPrec(String tpname) {
        String tableClause = null;
        if (this.getEscape(tpname)) {
            if (!tpname.equalsIgnoreCase("%")) {
                tableClause = "LIKE '" + tpname + "' " + this.m_esp;
            }
        } else {
            tableClause = "= '" + tpname + "' ";
        }

        return tableClause;
    }

    private String makeTableTypeClause(String[] types) {
        String typeClause = "";
        String retTypeClause = "(";
        String subpartitionClause = "CAST((INFO3 & 0x00FF & 0x003F) AS INT) != 9 AND CAST((INFO3 & 0x00FF & 0x003F) AS INT) != 27 AND CAST((INFO3 & 0x00FF & 0x003F) AS INT) != 29 AND CAST((INFO3 & 0x00FF & 0x003F) AS INT) != 25 AND CAST((INFO3 & 0x00FF & 0x003F) AS INT) != 12 AND CAST((INFO3 & 0x00FF & 0x003F) AS INT) != 7 AND CAST((INFO3 & 0x00FF & 0x003F) AS INT) != 21 AND CAST((INFO3 & 0x00FF & 0x003F) AS INT) != 23 AND CAST((INFO3 & 0x00FF & 0x003F) AS INT) != 18 AND CAST((INFO3 & 0x00FF & 0x003F) AS INT) != 5";
        if (types != null) {
            for(int i = 0; i < types.length; ++i) {
                if (types[i].equalsIgnoreCase("TABLE")) {
                    typeClause = typeClause + "OR (SUBTYPE$='UTAB' AND " + subpartitionClause + ")";
                } else if (types[i].equalsIgnoreCase("VIEW")) {
                    typeClause = typeClause + "OR SUBTYPE$='VIEW' ";
                } else if (types[i].equalsIgnoreCase("SYSTEM TABLE")) {
                    typeClause = typeClause + "OR SUBTYPE$='STAB' ";
                } else if (types[i].equalsIgnoreCase("SYNONYM")) {
                    typeClause = typeClause + "OR SUBTYPE$='SYNOM' ";
                }
            }

            if (typeClause.length() > 3) {
                retTypeClause = retTypeClause + typeClause.substring(3);
                retTypeClause = retTypeClause + ")";
                return retTypeClause;
            }
        }

        return null;
    }

    @Override
    public ResultSet getSchemas() throws SQLException {
        String sql = new String("SELECT /*+ MAX_OPT_N_TABLES(5) */ DISTINCT NAME AS TABLE_SCHEM, NULL AS TABLE_CATALOG ");
        sql = sql + " FROM SYS.SYSOBJECTS USERS WHERE TYPE$='SCH'";
        sql = sql + " ORDER BY TABLE_SCHEM ASC;";
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    @Override
    public ResultSet getCatalogs() throws SQLException {
        String sql = "SELECT /*+ MAX_OPT_N_TABLES(5) */ NULL AS TABLE_CAT FROM SYS.SYSDUAL WHERE 1=2;";
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    @Override
    public ResultSet getTableTypes() throws SQLException {
        String sql = "(SELECT 'SYSTEM TABLE' AS TABLE_TYPE FROM SYS.SYSDUAL UNION SELECT 'TABLE' AS TABLE_TYPE FROM SYS.SYSDUAL) UNION SELECT 'VIEW' AS TABLE_TYPE FROM SYS.SYSDUAL ";
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    @Override
    public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException {
        String schemaname = schemaPattern == null ? "%" : StringUtil.getEscStringName(schemaPattern);
        String tablename = tableNamePattern == null ? "%" : StringUtil.getEscStringName(tableNamePattern);
        String columnname = columnNamePattern == null ? "%" : StringUtil.getEscStringName(columnNamePattern);
        StringBuffer sql = new StringBuffer();
        sql.append("SELECT /*+ MAX_OPT_N_TABLES(5) */ DISTINCT ");
        sql.append("NULL AS TABLE_CAT, ");
        sql.append("SCHS.NAME AS TABLE_SCHEM, ");
        sql.append("TABS.NAME AS TABLE_NAME, ");
        sql.append("COLS.NAME AS COLUMN_NAME, ");
        sql.append(this.makeDataTypeClause("COLS.TYPE$", "COLS.SCALE"));
        sql.append("AS DATA_TYPE,");
        sql.append(this.makeDataTypeNameClause("COLS.TYPE$"));
        sql.append("AS TYPE_NAME,");
        sql.append("CASE SF_GET_COLUMN_SIZE(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT), CAST (COLS.SCALE AS INT)) ");
        sql.append("WHEN -2 THEN NULL ");
        sql.append("ELSE SF_GET_COLUMN_SIZE(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT), CAST (COLS.SCALE AS INT)) END ");
        sql.append("AS COLUMN_SIZE,");
        sql.append("CASE SF_GET_BUFFER_LEN(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT), CAST (COLS.SCALE AS INT)) ");
        sql.append("WHEN -2 THEN NULL ");
        sql.append("ELSE SF_GET_BUFFER_LEN(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT), CAST (COLS.SCALE AS INT)) END ");
        sql.append("AS BUFFER_LENGTH,");
        sql.append("CASE SF_GET_DECIMAL_DIGITS(COLS.TYPE$, CAST (COLS.SCALE AS INT)) ");
        sql.append("WHEN -2 THEN NULL ");
        sql.append("ELSE SF_GET_DECIMAL_DIGITS(COLS.TYPE$, CAST (COLS.SCALE AS INT)) END ");
        sql.append("AS DECIMAL_DIGITS,");
        sql.append("10 AS NUM_PREC_RADIX,");
        sql.append("CASE COLS.NULLABLE$ WHEN 'Y' THEN 1 ELSE 0 END AS NULLABLE,");
        sql.append("(SELECT COMMENT$ FROM SYSCOLUMNCOMMENTS WHERE SCHNAME=SCHS.NAME AND TVNAME=TABS.NAME AND COLNAME=COLS.NAME) AS REMARKS,");
        sql.append("COLS.DEFVAL AS COLUMN_DEF,");
        sql.append("0 AS SQL_DATA_TYPE,");
        sql.append("0 AS SQL_DATETIME_SUB,");
        sql.append("CASE SF_GET_OCT_LENGTH(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT)) ");
        sql.append("WHEN -2 THEN NULL ");
        sql.append("ELSE SF_GET_OCT_LENGTH(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT)) END ");
        sql.append("AS CHAR_OCTET_LENGTH,");
        sql.append("COLS.COLID + 1 AS ORDINAL_POSITION,");
        sql.append("CASE COLS.NULLABLE$ WHEN 'Y' THEN 'YES' ELSE 'NO' END AS IS_NULLABLE,");
        sql.append("NULL AS SCOPE_CATLOG,");
        sql.append("NULL AS SCOPE_SCHEMA,");
        sql.append("NULL AS SCOPE_TABLE,");
        sql.append("0 AS SOURCE_DATA_TYPE ");
        sql.append("FROM ");
        String schemaClause = this.makeSchemaClause(schemaname);
        sql.append(schemaClause);
        sql.append(" AS SCHS, ");
        String tabClause = this.makeTableClause(tablename);
        sql.append(tabClause);
        sql.append(" AS TABS, ");
        sql.append("SYS.SYSCOLUMNS AS COLS");
        sql.append(" WHERE TABS.ID = COLS.ID AND SCHS.ID = TABS.SCHID ");
        String colClause = this.makeClause_objWithoutPrec(columnname);
        if (colClause != null) {
            sql.append("AND COLS.NAME ");
            sql.append(colClause);
        }

        sql.append(" ORDER BY TABLE_SCHEM ASC,TABLE_NAME ASC,ORDINAL_POSITION ASC;");
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    private String makeDataTypeNameClause(String typeColName) {
        return "CASE INSTR(" + typeColName + ",'CLASS',1,1) WHEN 0 THEN " + typeColName + " ELSE SF_GET_CLASS_NAME(" + typeColName + ") END ";
    }

    private String makeDataTypeClause(String typeColName, String scaleColName) {
        StringBuffer sBuffer = new StringBuffer();
        sBuffer.append("CASE " + typeColName);
        if (this.connection.isCompatibleOracle()) {
            sBuffer.append(" WHEN 'NUMBER' THEN 3");
            sBuffer.append(" WHEN 'NUMERIC' THEN 3");
        } else {
            sBuffer.append(" WHEN 'NUMBER' THEN 2");
            sBuffer.append(" WHEN 'NUMERIC' THEN 2");
        }

        sBuffer.append(" WHEN 'TIMESTAMP' THEN 93");
        sBuffer.append(" WHEN 'CHARACTER' THEN 1");
        sBuffer.append(" WHEN 'VARCHAR' THEN 12");
        sBuffer.append(" WHEN 'VARCHAR2' THEN 12");
        sBuffer.append(" WHEN 'DEC' THEN 3");
        sBuffer.append(" WHEN 'DECIMAL' THEN 3");
        sBuffer.append(" WHEN 'BIT' THEN -7");
        sBuffer.append(" WHEN 'INT' THEN 4");
        sBuffer.append(" WHEN 'INTEGER' THEN 4");
        sBuffer.append(" WHEN 'BIGINT' THEN -5");
        sBuffer.append(" WHEN 'BYTE' THEN -6");
        sBuffer.append(" WHEN 'TINYINT' THEN -6");
        sBuffer.append(" WHEN 'SMALLINT' THEN 5");
        sBuffer.append(" WHEN 'BINARY' THEN -2");
        sBuffer.append(" WHEN 'VARBINARY' THEN -3");
        sBuffer.append(" WHEN 'FLOAT' THEN 6");
        sBuffer.append(" WHEN 'DOUBLE' THEN 8");
        sBuffer.append(" WHEN 'REAL' THEN 7");
        sBuffer.append(" WHEN 'DOUBLE PRECISION' THEN 8");
        sBuffer.append(" WHEN 'DATE' THEN 91");
        sBuffer.append(" WHEN 'TIME' THEN 92");
        sBuffer.append(" WHEN 'DATETIME' THEN 93");
        sBuffer.append(" WHEN 'TEXT' THEN -1");
        sBuffer.append(" WHEN 'LONGVARCHAR' THEN -1");
        sBuffer.append(" WHEN 'IMAGE' THEN -4");
        sBuffer.append(" WHEN 'LONGVARBINARY' THEN -4");
        sBuffer.append(" WHEN 'BLOB' THEN 2004");
        sBuffer.append(" WHEN 'CLOB' THEN 2005");
        sBuffer.append(" WHEN 'CURSOR' THEN -10");
        sBuffer.append(" WHEN 'BOOL' THEN 16");
        sBuffer.append(" WHEN 'BOOLEAN' THEN 16");
        sBuffer.append(" ELSE SF_GET_DATA_TYPE(" + typeColName + ", CAST(" + scaleColName + " AS INT), 3)");
        sBuffer.append(" END ");
        return sBuffer.toString();
    }

    private boolean getEscape(String str) {
        boolean flag = false;
        int len = str.length();
        if (len == 1) {
            return str.charAt(0) == '%' || str.charAt(0) == '_';
        } else {
            for(int i = len - 1; i >= 0; --i) {
                if (str.charAt(i) == '%' || str.charAt(i) == '_') {
                    flag = true;
                }
            }

            return flag;
        }
    }

    @Override
    public ResultSet getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern) throws SQLException {
        String schemaname = schema == null ? this.connection.getCurrentUserName() : schema;
        String tablename = table == null ? "%" : table;
        String columnname = columnNamePattern == null ? "%" : columnNamePattern;
        schemaname = StringUtil.getEscStringName(schemaname);
        tablename = StringUtil.getEscStringName(tablename);
        columnname = StringUtil.getEscStringName(columnname);
        StringBuffer sql = new StringBuffer();
        sql.append("SELECT /*+ MAX_OPT_N_TABLES(5) */ DISTINCT NULL AS TABLE_CAT,'");
        sql.append(schemaname);
        sql.append("' AS TABLE_SCHEM, '");
        sql.append(tablename);
        sql.append("' AS TABLE_NAME, ");
        sql.append("COLS.NAME AS COLUMN_NAME, ");
        sql.append("GRANTORS.NAME AS GRANTOR,");
        sql.append("GRANTEES.NAME AS GRANTEE,");
        sql.append("SF_GET_SYS_PRIV(CAST (COLGRANTS.PRIVID AS INT)) AS PRIVILEGE, ");
        sql.append("CASE COLGRANTS.GRANTABLE WHEN 'Y' THEN 'YES' WHEN 'N' THEN 'NO' END AS IS_GRANTABLE ");
        sql.append("FROM SYS.SYSGRANTS COLGRANTS, ");
        sql.append("SYS.SYSCOLUMNS COLS, ");
        sql.append("SYS.SYSOBJECTS GRANTORS, ");
        sql.append("(SELECT ID, NAME FROM SYS.SYSOBJECTS WHERE SUBTYPE$='USER' OR SUBTYPE$='ROLE') GRANTEES,");
        sql.append("(SELECT ID, NAME, SCHID FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ = 'UTAB') TABS ");
        sql.append("WHERE TABS.SCHID = ");
        sql.append("(SELECT ID FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCH' AND NAME = '");
        sql.append(schemaname);
        sql.append("') AND TABS.NAME = '");
        sql.append(tablename);
        sql.append("' AND COLGRANTS.OBJID = TABS.ID ");
        String colClause = this.makeClause_objWithoutPrec(columnname);
        if (colClause != null) {
            sql.append("AND COLS.NAME ");
            sql.append(colClause);
        }

        sql.append(" AND COLGRANTS.GRANTOR = GRANTORS.ID AND COLGRANTS.URID = GRANTEES.ID AND ");
        sql.append("COLGRANTS.COLID = COLS.COLID AND COLGRANTS.OBJID = COLS.ID");
        sql.append(" ORDER BY COLUMN_NAME ASC,PRIVILEGE ASC;");
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    @Override
    public ResultSet getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern) throws SQLException {
        String schemaname = schemaPattern == null ? "%" : StringUtil.getEscStringName(schemaPattern);
        String tablename = tableNamePattern == null ? "%" : StringUtil.getEscStringName(tableNamePattern);
        StringBuffer sql = new StringBuffer();
        sql.append("SELECT /*+ MAX_OPT_N_TABLES(5) */ DISTINCT NULL AS TABLE_CAT,");
        sql.append("USERS.NAME AS TABLE_SCHEM, ");
        sql.append("TABS.NAME AS TABLE_NAME,");
        sql.append("GRANTORS.NAME AS GRANTOR,");
        sql.append("GRANTEES.NAME AS GRANTEE,");
        sql.append("SF_GET_SYS_PRIV(CAST (TVGRANTS.PRIVID AS INT)) AS PRIVILEGE,");
        sql.append("CASE TVGRANTS.GRANTABLE WHEN 'Y' THEN 'YES' WHEN 'N' THEN 'NO' END AS IS_GRANTABLE");
        sql.append(" FROM ");
        String scheClause = this.makeSchemaClause(schemaname);
        sql.append(scheClause);
        sql.append(" USERS, ");
        String utbClause = this.makeTableClause_utab(tablename);
        sql.append(utbClause);
        sql.append(" TABS, ");
        sql.append("SYS.SYSGRANTS TVGRANTS, SYS.SYSOBJECTS AS GRANTORS, SYS.SYSOBJECTS AS GRANTEES ");
        sql.append("WHERE ");
        sql.append("GRANTORS.TYPE$ = 'UR' AND GRANTORS.SUBTYPE$ = 'USER' AND ");
        sql.append("GRANTEES.TYPE$ = 'UR' AND GRANTEES.SUBTYPE$ = 'USER' AND ");
        sql.append("TABS.SCHID = USERS.ID AND ");
        sql.append("TVGRANTS.OBJID = TABS.ID AND TVGRANTS.URID = GRANTEES.ID AND ");
        sql.append("TVGRANTS.GRANTOR = GRANTORS.ID AND TVGRANTS.PRIVID <> -1");
        sql.append("ORDER BY  TABLE_SCHEM ASC, TABLE_NAME ASC,  PRIVILEGE ASC;");
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    @Override
    public ResultSet getBestRowIdentifier(String catalog, String schema, String table, int scope, boolean nullable) throws SQLException {
        String sch = schema == null ? "%" : schema;
        String tab = table == null ? "%" : table;
        String sch2;
        String tab2;
        if (this.connection.getCaseSensitive()) {
            sch2 = StringUtil.getEscStringName(sch);
            tab2 = StringUtil.getEscStringName(tab);
        } else {
            sch2 = StringUtil.getEscStringName(sch).toUpperCase();
            tab2 = StringUtil.getEscStringName(tab).toUpperCase();
        }

        String sql = "";
        ResultSet pk = this.getPrimaryKeys(catalog, schema, table);
        if (pk.next()) {
            sql = sql + "SELECT /*+ MAX_OPT_N_TABLES(5) */ '" + scope + "' as \"SCOPE\",COLS.NAME AS COLUMN_NAME," + this.makeDataTypeClause("COLS.TYPE$", "COLS.SCALE") + "AS DATA_TYPE, " + this.makeDataTypeNameClause("COLS.TYPE$") + "AS TYPE_NAME, " + "CASE SF_GET_COLUMN_SIZE(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT), CAST (COLS.SCALE AS INT)) WHEN -2 THEN NULL ELSE SF_GET_COLUMN_SIZE(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT), CAST (COLS.SCALE AS INT)) END AS COLUMN_SIZE,CASE SF_GET_BUFFER_LEN(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT), CAST (COLS.SCALE AS INT)) WHEN -2 THEN NULL ELSE SF_GET_BUFFER_LEN(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT), CAST (COLS.SCALE AS INT)) END AS BUFFER_LENGTH,CASE SF_GET_DECIMAL_DIGITS(COLS.TYPE$, CAST (COLS.SCALE AS INT)) WHEN -2 THEN NULL ELSE SF_GET_DECIMAL_DIGITS(COLS.TYPE$, CAST (COLS.SCALE AS INT)) END AS DECIMAL_DIGITS,0 AS PSEUDO_COLUMN";
            sql = sql + " FROM SYS.SYSCOLUMNS COLS WHERE COLS.NAME IN (SELECT COLS.NAME FROM SYS.SYSINDEXES SYSIND,SYS.SYSCOLUMNS COLS, (SELECT ID, PID, NAME FROM SYS.SYSOBJECTS WHERE SUBTYPE$='INDEX') AS IND_OBJ, SYS.SYSCONS AS CONS WHERE CONS.TABLEID = (SELECT ID FROM SYS.SYSOBJECTS WHERE SUBTYPE$='UTAB' AND NAME = '" + tab2 + "' AND SCHID = (SELECT ID FROM " + "SYS.SYSOBJECTS WHERE TYPE$='SCH' AND NAME = '" + sch2 + "')) AND COLS.ID = CONS.TABLEID AND IND_OBJ.ID = CONS.INDEXID AND IND_OBJ.ID = SYSIND.ID AND CONS.TYPE$ = 'P' AND SF_COL_IS_IDX_KEY(SYSIND.KEYNUM, SYSIND.KEYINFO,COLS.COLID)=1) " + "AND COLS.ID = (SELECT ID FROM " + "SYS.SYSOBJECTS WHERE SUBTYPE$='UTAB' AND NAME = '" + tab2 + "' AND SCHID = (SELECT ID FROM " + "SYS.SYSOBJECTS WHERE TYPE$='SCH' AND NAME = '" + sch2 + "'))";
            if (!nullable) {
                sql = sql + " AND COLS.NULLABLE$ = 'N'";
            }
        } else {
            sql = sql + "select /*+ MAX_OPT_N_TABLES(5) */ '" + scope + "' as \"SCOPE\",'ROWID' as COLUMN_NAME,-2 as DATA_TYPE,'LONG' as TYPE_NAME,8 as COLUMN_SIZE,8 as BUFFER_LENGTH,0 as DECIMAL_DIGITS,0 as PSEUDO_COLUMN";
        }

        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    @Override
    public ResultSet getVersionColumns(String catalog, String schema, String table) throws SQLException {
        String sql = "";
        sql = sql + "SELECT /*+ MAX_OPT_N_TABLES(5) */ DISTINCT NULL AS \"SCOPE\",COLS.NAME AS COLUMN_NAME, ";
        sql = sql + this.makeDataTypeClause("COLS.TYPE$", "COLS.SCALE") + "AS DATA_TYPE, ";
        sql = sql + this.makeDataTypeNameClause("COLS.TYPE$") + "AS TYPE_NAME, ";
        sql = sql + "CASE SF_GET_COLUMN_SIZE(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT), CAST (COLS.SCALE AS INT)) WHEN -2 THEN NULL ELSE SF_GET_COLUMN_SIZE(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT), CAST (COLS.SCALE AS INT)) END AS COLUMN_SIZE,CASE SF_GET_BUFFER_LEN(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT), CAST (COLS.SCALE AS INT)) WHEN -2 THEN NULL ELSE SF_GET_BUFFER_LEN(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT), CAST (COLS.SCALE AS INT)) END AS BUFFER_LENGTH,CASE SF_GET_DECIMAL_DIGITS(COLS.TYPE$, CAST (COLS.SCALE AS INT)) WHEN -2 THEN NULL ELSE SF_GET_DECIMAL_DIGITS(COLS.TYPE$, CAST (COLS.SCALE AS INT)) END AS DECIMAL_DIGITS,0 AS PSEUDO_COLUMN";
        sql = sql + " FROM SYS.SYSCOLUMNS COLS WHERE 1 = 2;";
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    @Override
    public ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException {
        String schemaname = schema == null ? this.connection.getCurrentUserName() : StringUtil.getEscStringName(schema);
        String tablename = table == null ? "%" : StringUtil.getEscStringName(table);
        String sql = "SELECT /*+ MAX_OPT_N_TABLES(5) */ NULL AS TABLE_CAT, '" + schemaname + "' AS TABLE_SCHEM,'" + tablename + "' AS TABLE_NAME,COLS.NAME AS COLUMN_NAME,SF_GET_INDEX_KEY_SEQ(INDS.KEYNUM, INDS.KEYINFO, COLS.COLID) AS KEY_SEQ,CONS.NAME AS PK_NAME" + " FROM " + "SYS.SYSINDEXES INDS, (SELECT OBJ.NAME, CON.ID, CON.TYPE$, CON.TABLEID, CON.COLID, CON.INDEXID FROM " + "SYS.SYSCONS AS CON, " + "SYS.SYSOBJECTS AS OBJ WHERE OBJ.SUBTYPE$='CONS' AND OBJ.ID=CON.ID) CONS, " + "SYS.SYSCOLUMNS COLS, (SELECT NAME ,ID FROM " + "SYS.SYSOBJECTS WHERE SUBTYPE$='UTAB' AND NAME = '" + tablename + "' AND SCHID=(SELECT ID FROM " + "SYS.SYSOBJECTS WHERE NAME = '" + schemaname + "' AND TYPE$='SCH')) TAB, (SELECT ID, NAME FROM " + "SYS.SYSOBJECTS WHERE SUBTYPE$='INDEX')OBJ_INDS WHERE CONS.TYPE$='P' " + "AND CONS.INDEXID=INDS.ID AND INDS.ID=OBJ_INDS.ID AND TAB.ID=COLS.ID AND CONS.TABLEID=TAB.ID " + "AND SF_COL_IS_IDX_KEY(INDS.KEYNUM, INDS.KEYINFO,COLS.COLID)=1" + " ORDER BY COLUMN_NAME ASC;";
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    @Override
    public ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException {
        String schemaname = schema == null ? this.connection.getCurrentUserName() : schema;
        String tablename = table == null ? "%" : table;
        String sch2;
        String tab2;
        if (this.connection.getCaseSensitive()) {
            sch2 = StringUtil.getEscStringName(schemaname);
            tab2 = StringUtil.getEscStringName(tablename);
        } else {
            sch2 = StringUtil.getEscStringName(schemaname).toUpperCase();
            tab2 = StringUtil.getEscStringName(tablename).toUpperCase();
        }

        StringBuffer strBuf = new StringBuffer();
        strBuf.append("SELECT /*+ MAX_OPT_N_TABLES(5) */ NULL AS PKTABLE_CAT,");
        strBuf.append("T_REFED.SCHNAME AS PKTABLE_SCHEM, ");
        strBuf.append("T_REFED.NAME AS PKTABLE_NAME, ");
        strBuf.append("T_REFED.REFED_COL_NAME AS PKCOLUMN_NAME, NULL AS FKTABLE_CAT, '");
        strBuf.append(sch2);
        strBuf.append("' AS FKTABLE_SCHEM, '");
        strBuf.append(tab2);
        strBuf.append("' AS FKTABLE_NAME, T_REF.REF_COL_NAME AS FKCOLUMN_NAME, ");
        strBuf.append("T_REF.REF_KEYNO AS KEY_SEQ, SF_GET_UPD_RULE(T_REF.FACTION) AS UPDATE_RULE, SF_GET_DEL_RULE(T_REF.FACTION) AS DELETE_RULE, ");
        strBuf.append("T_REF.REF_CONS_NAME AS FK_NAME, T_REFED.REFED_CONS_NAME AS PK_NAME, ");
        strBuf.append("0 AS DEFERRABILITY ");
        strBuf.append("FROM ");
        strBuf.append("(SELECT T_REF_CONS.FINDEXID AS REFED_ID, T_REF_CONS.NAME AS REF_CONS_NAME, ");
        strBuf.append("SF_GET_INDEX_KEY_SEQ(T_REF_IND.KEYNUM, T_REF_IND.KEYINFO, T_REF_COL.COLID) AS REF_KEYNO, T_REF_COL.NAME AS REF_COL_NAME, T_REF_CONS.FACTION AS FACTION ");
        strBuf.append("FROM ");
        strBuf.append("(SELECT NAME, INDEXID, FINDEXID, TABLEID, FACTION, CONS.TYPE$ as TYPE FROM SYS.SYSCONS CONS, SYS.SYSOBJECTS OBJECTS WHERE CONS.ID = OBJECTS.ID) AS T_REF_CONS, ");
        strBuf.append("(SELECT NAME, ID FROM SYS.SYSOBJECTS WHERE SUBTYPE$='UTAB' AND NAME= '");
        strBuf.append(tab2);
        strBuf.append("' AND SCHID = (SELECT ID FROM SYS.SYSOBJECTS WHERE TYPE$='SCH' AND NAME = '");
        strBuf.append(sch2);
        strBuf.append("')) AS T_REF_TAB, ");
        strBuf.append("SYS.SYSINDEXES AS T_REF_IND, ");
        strBuf.append("(SELECT ID, PID FROM SYS.SYSOBJECTS WHERE SUBTYPE$='INDEX') AS T_REF_INDS_OBJ, ");
        strBuf.append("SYS.SYSCOLUMNS AS T_REF_COL ");
        strBuf.append("WHERE ");
        strBuf.append("T_REF_TAB.ID = T_REF_CONS.TABLEID AND T_REF_CONS.TYPE='F' AND T_REF_TAB.ID = T_REF_INDS_OBJ.PID AND T_REF_TAB.ID = T_REF_COL.ID ");
        strBuf.append("AND T_REF_CONS.INDEXID = T_REF_INDS_OBJ.ID AND T_REF_IND.ID = T_REF_INDS_OBJ.ID AND SF_COL_IS_IDX_KEY(T_REF_IND.KEYNUM, T_REF_IND.KEYINFO, T_REF_COL.COLID)=1) AS T_REF, ");
        strBuf.append("(SELECT T_REFED_CONS.INDEXID AS REFED_ID, T_REFED_TAB.SCH_NAME AS SCHNAME, ");
        strBuf.append("T_REFED_TAB.TAB_NAME AS NAME, T_REFED_IND.ID AS REFED_IND_ID, ");
        strBuf.append("T_REFED_CONS.NAME AS REFED_CONS_NAME, SF_GET_INDEX_KEY_SEQ(T_REFED_IND.KEYNUM, T_REFED_IND.KEYINFO, T_REFED_COL.COLID) AS REFED_KEYNO, ");
        strBuf.append("T_REFED_COL.NAME AS REFED_COL_NAME FROM ");
        strBuf.append("(SELECT NAME, INDEXID, FINDEXID, TABLEID, FACTION, CONS.TYPE$ as TYPE FROM SYS.SYSCONS CONS, SYS.SYSOBJECTS OBJECTS WHERE CONS.ID = OBJECTS.ID) AS T_REFED_CONS, ");
        strBuf.append("(SELECT TAB.ID AS ID, TAB.NAME AS TAB_NAME, SCH.NAME AS SCH_NAME FROM ");
        strBuf.append("SYS.SYSOBJECTS TAB, ");
        strBuf.append("SYS.SYSOBJECTS SCH WHERE TAB.SUBTYPE$='UTAB' AND SCH.TYPE$='SCH' AND TAB.SCHID=SCH.ID) AS T_REFED_TAB, ");
        strBuf.append("SYS.SYSINDEXES AS T_REFED_IND, (SELECT ID, PID, NAME FROM ");
        strBuf.append("SYS.SYSOBJECTS WHERE SUBTYPE$='INDEX') AS T_REFED_INDS_OBJ, ");
        strBuf.append("SYS.SYSCOLUMNS AS T_REFED_COL WHERE ");
        strBuf.append("T_REFED_TAB.ID = T_REFED_CONS.TABLEID AND T_REFED_CONS.TYPE='P' AND T_REFED_TAB.ID = T_REFED_INDS_OBJ.PID AND T_REFED_TAB.ID = T_REFED_COL.ID");
        strBuf.append(" AND T_REFED_CONS.INDEXID = T_REFED_INDS_OBJ.ID AND T_REFED_IND.ID = T_REFED_INDS_OBJ.ID AND SF_COL_IS_IDX_KEY(T_REFED_IND.KEYNUM, T_REFED_IND.KEYINFO, T_REFED_COL.COLID)=1) AS T_REFED ");
        strBuf.append("WHERE T_REF.REFED_ID = T_REFED.REFED_ID AND T_REF.REF_KEYNO = T_REFED.REFED_KEYNO ");
        strBuf.append("ORDER BY FKTABLE_CAT ASC, FKTABLE_SCHEM ASC, FKTABLE_NAME ASC, KEY_SEQ ASC");
        String sql = strBuf.toString();
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    @Override
    public ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException {
        String schemaname = schema == null ? this.connection.getCurrentUserName() : schema;
        String tablename = table == null ? "%" : table;
        String sch2;
        String tab2;
        if (this.connection.getCaseSensitive()) {
            sch2 = StringUtil.getEscStringName(schemaname);
            tab2 = StringUtil.getEscStringName(tablename);
        } else {
            sch2 = StringUtil.getEscStringName(schemaname).toUpperCase();
            tab2 = StringUtil.getEscStringName(tablename).toUpperCase();
        }

        StringBuffer strBuf = new StringBuffer();
        strBuf.append("SELECT /*+ MAX_OPT_N_TABLES(5) */ NULL AS PKTABLE_CAT, '");
        strBuf.append(sch2);
        strBuf.append("' AS PKTABLE_SCHEM, '");
        strBuf.append(tab2);
        strBuf.append("' AS PKTABLE_NAME, T_REFED.REFED_COL_NAME AS PKCOLUMN_NAME, ");
        strBuf.append("NULL AS FKTABLE_CAT, T_REF.REF_SCH_NAME AS FKTABLE_SCHEM, ");
        strBuf.append("T_REF.REF_TAB_NAME AS FKTABLE_NAME, T_REF.REF_COL_NAME AS FKCOLUMN_NAME, ");
        strBuf.append("T_REF.REF_KEYNO AS KEY_SEQ, SF_GET_UPD_RULE(T_REF.FACTION) AS UPDATE_RULE, SF_GET_DEL_RULE(T_REF.FACTION) AS DELETE_RULE, ");
        strBuf.append("(SELECT NAME FROM SYS.SYSOBJECTS WHERE ID = T_REF.REF_CONS_ID) AS FK_NAME, (SELECT NAME FROM SYS.SYSOBJECTS WHERE ID = T_REFED.REFED_CONS_ID) AS PK_NAME, ");
        strBuf.append("0 AS DEFERRABILITY FROM ");
        strBuf.append("(SELECT T_REF_TAB.SCH_NAME AS REF_SCH_NAME, T_REF_TAB.TAB_NAME AS REF_TAB_NAME, ");
        strBuf.append("T_REF_CONS.ID AS REF_CONS_ID, SF_GET_INDEX_KEY_SEQ(T_REF_IND.KEYNUM, T_REF_IND.KEYINFO, T_REF_COL.COLID) AS REF_KEYNO, ");
        strBuf.append("T_REF_COL.NAME AS REF_COL_NAME, T_REF_CONS.FINDEXID AS REFED_ID, T_REF_CONS.FACTION AS FACTION FROM ");
        strBuf.append("SYS.SYSCONS AS T_REF_CONS, ");
        strBuf.append("(SELECT TAB.ID AS ID, TAB.NAME AS TAB_NAME, SCH.NAME AS SCH_NAME FROM ");
        strBuf.append("SYS.SYSOBJECTS TAB, ");
        strBuf.append("SYS.SYSOBJECTS SCH WHERE TAB.SUBTYPE$='UTAB' AND SCH.TYPE$='SCH' AND TAB.SCHID=SCH.ID) AS T_REF_TAB, ");
        strBuf.append("SYS.SYSINDEXES AS T_REF_IND,");
        strBuf.append("(SELECT ID, PID, NAME FROM ");
        strBuf.append("SYS.SYSOBJECTS WHERE SUBTYPE$='INDEX') AS T_REF_INDS_OBJ, ");
        strBuf.append("SYS.SYSCOLUMNS AS T_REF_COL WHERE ");
        strBuf.append("T_REF_TAB.ID = T_REF_CONS.TABLEID AND T_REF_CONS.TYPE$='F' AND T_REF_TAB.ID = T_REF_INDS_OBJ.PID AND T_REF_TAB.ID = T_REF_COL.ID ");
        strBuf.append("AND T_REF_CONS.INDEXID = T_REF_INDS_OBJ.ID AND T_REF_IND.ID = T_REF_INDS_OBJ.ID AND SF_COL_IS_IDX_KEY(T_REF_IND.KEYNUM, T_REF_IND.KEYINFO, T_REF_COL.COLID)=1) AS T_REF, ");
        strBuf.append("(SELECT T_REFED_CONS.ID AS REFED_CONS_ID, SF_GET_INDEX_KEY_SEQ(T_REFED_IND.KEYNUM, T_REFED_IND.KEYINFO, T_REFED_COL.COLID) AS REFED_KEYNO, ");
        strBuf.append("T_REFED_COL.NAME AS REFED_COL_NAME, T_REFED_CONS.INDEXID AS REFED_ID FROM ");
        strBuf.append("SYS.SYSCONS AS T_REFED_CONS, (SELECT NAME, ID FROM ");
        strBuf.append("SYS.SYSOBJECTS WHERE SUBTYPE$='UTAB' AND NAME= '");
        strBuf.append(tab2);
        strBuf.append("' AND SCHID=(SELECT ID FROM ");
        strBuf.append("SYS.SYSOBJECTS WHERE TYPE$='SCH' AND NAME= '");
        strBuf.append(sch2);
        strBuf.append("')) AS T_REFED_TAB, ");
        strBuf.append("SYS.SYSINDEXES AS T_REFED_IND, ");
        strBuf.append("(SELECT ID, PID, NAME FROM ");
        strBuf.append("SYS.SYSOBJECTS WHERE SUBTYPE$='INDEX') AS T_REFED_INDS_OBJ, ");
        strBuf.append("SYS.SYSCOLUMNS AS T_REFED_COL WHERE ");
        strBuf.append("T_REFED_TAB.ID = T_REFED_CONS.TABLEID AND T_REFED_CONS.TYPE$='P' AND T_REFED_TAB.ID = T_REFED_INDS_OBJ.PID AND T_REFED_TAB.ID = T_REFED_COL.ID ");
        strBuf.append("AND T_REFED_CONS.INDEXID = T_REFED_INDS_OBJ.ID AND T_REFED_IND.ID = T_REFED_INDS_OBJ.ID AND SF_COL_IS_IDX_KEY(T_REFED_IND.KEYNUM, T_REFED_IND.KEYINFO, T_REFED_COL.COLID)=1) AS T_REFED ");
        strBuf.append(" WHERE T_REF.REFED_ID = T_REFED.REFED_ID AND ");
        strBuf.append("T_REF.REF_KEYNO = T_REFED.REFED_KEYNO ORDER BY FKTABLE_CAT ASC, ");
        strBuf.append("FKTABLE_SCHEM ASC, FKTABLE_NAME ASC, KEY_SEQ ASC");
        String sql = strBuf.toString();
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    @Override
    public ResultSet getCrossReference(String primaryCatalog, String primarySchema, String primaryTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException {
        String pschemaname = primarySchema == null ? this.connection.getCurrentUserName() : primarySchema;
        String ptablename = primaryTable == null ? "%" : primaryTable;
        String fschemaname = foreignSchema == null ? this.connection.getCurrentUserName() : foreignSchema;
        String ftablename = foreignTable == null ? "%" : foreignTable;
        String psch2;
        String ptab2;
        String fsch2;
        String ftab2;
        if (this.connection.getCaseSensitive()) {
            psch2 = StringUtil.getEscStringName(pschemaname);
            ptab2 = StringUtil.getEscStringName(ptablename);
            fsch2 = StringUtil.getEscStringName(fschemaname);
            ftab2 = StringUtil.getEscStringName(ftablename);
        } else {
            psch2 = StringUtil.getEscStringName(pschemaname).toUpperCase();
            ptab2 = StringUtil.getEscStringName(ptablename).toUpperCase();
            fsch2 = StringUtil.getEscStringName(fschemaname).toUpperCase();
            ftab2 = StringUtil.getEscStringName(ftablename).toUpperCase();
        }

        String sql = "SELECT /*+ MAX_OPT_N_TABLES(5) */ NULL AS PKTABLE_CAT, '" + psch2 + "' AS PKTABLE_SCHEM,'" + ptab2 + "' AS PKTABLE_NAME,T_REFED.REFED_COL_NAME AS PKCOLUMN_NAME, NULL AS FKTABLE_CAT, '" + fsch2 + "' AS FKTABLE_SCHEM,'" + ftab2 + "' AS FKTABLE_NAME,T_REF.REF_COL_NAME AS FKCOLUMN_NAME,T_REF.REF_KEYNO AS KEY_SEQ, SF_GET_UPD_RULE(FACTION) AS UPDATE_RULE, SF_GET_DEL_RULE(FACTION) AS DELETE_RULE,T_REF.REF_CONS_NAME AS FK_NAME,T_REFED.REFED_CONS_NAME AS PK_NAME,0 AS DEFERRABILITY";
        sql = sql + " FROM (SELECT T_REF_CONS.FINDEXID AS REFED_IND_ID,T_REF_INDS_OBJ.NAME AS REF_CONS_NAME, SF_GET_INDEX_KEY_SEQ(T_REF_INDS.KEYNUM, T_REF_INDS.KEYINFO, T_REF_COL.COLID) AS REF_KEYNO,T_REF_COL.NAME AS REF_COL_NAME, T_REF_CONS.FACTION AS FACTION FROM SYS.SYSCONS AS T_REF_CONS,(SELECT NAME,ID FROM SYS.SYSOBJECTS WHERE SUBTYPE$='UTAB' AND NAME = '" + ftab2 + "' AND SCHID = (SELECT ID FROM " + "SYS.SYSOBJECTS WHERE TYPE$='SCH' AND NAME = '" + fsch2 + "')) AS T_REF_TAB, " + "SYS.SYSINDEXES AS T_REF_INDS, (SELECT ID, PID, NAME FROM " + "SYS.SYSOBJECTS WHERE SUBTYPE$='INDEX') AS T_REF_INDS_OBJ, " + "SYS.SYSCOLUMNS AS T_REF_COL WHERE " + "T_REF_TAB.ID = T_REF_CONS.TABLEID AND T_REF_CONS.TYPE$='F' AND T_REF_TAB.ID = T_REF_INDS_OBJ.PID AND T_REF_TAB.ID = T_REF_COL.ID " + "AND T_REF_CONS.INDEXID = T_REF_INDS_OBJ.ID AND T_REF_INDS.ID = T_REF_INDS_OBJ.ID AND SF_COL_IS_IDX_KEY(T_REF_INDS.KEYNUM, T_REF_INDS.KEYINFO, T_REF_COL.COLID)=1) AS T_REF, ";
        sql = sql + "(SELECT T_REFED_INDS.ID AS REFED_IND_ID,T_REFED_INDS_OBJ.NAME AS REFED_CONS_NAME, SF_GET_INDEX_KEY_SEQ(T_REFED_INDS.KEYNUM, T_REFED_INDS.KEYINFO, T_REFED_COL.COLID) AS REFED_KEYNO,T_REFED_COL.NAME AS REFED_COL_NAME FROM SYS.SYSCONS AS T_REFED_CONS, (SELECT NAME, ID FROM SYS.SYSOBJECTS WHERE SUBTYPE$='UTAB' AND NAME = '" + ptab2 + "' AND SCHID = (SELECT ID FROM " + "SYS.SYSOBJECTS WHERE TYPE$='SCH' AND NAME = '" + psch2 + "' )) AS T_REFED_TAB, " + "SYS.SYSINDEXES AS T_REFED_INDS, (SELECT ID, PID, NAME FROM " + "SYS.SYSOBJECTS WHERE SUBTYPE$='INDEX') AS T_REFED_INDS_OBJ," + "SYS.SYSCOLUMNS AS T_REFED_COL WHERE " + "T_REFED_TAB.ID = T_REFED_CONS.TABLEID AND T_REFED_CONS.TYPE$='P' AND T_REFED_TAB.ID = T_REFED_INDS_OBJ.PID AND T_REFED_TAB.ID = T_REFED_COL.ID " + "AND T_REFED_CONS.INDEXID = T_REFED_INDS_OBJ.ID AND T_REFED_INDS.ID = T_REFED_INDS_OBJ.ID AND SF_COL_IS_IDX_KEY(T_REFED_INDS.KEYNUM, T_REFED_INDS.KEYINFO, T_REFED_COL.COLID)=1) AS T_REFED";
        sql = sql + " WHERE T_REF.REFED_IND_ID = T_REFED.REFED_IND_ID AND T_REF.REF_KEYNO = T_REFED.REFED_KEYNO ORDER BY FKTABLE_CAT ASC,FKTABLE_SCHEM ASC,FKTABLE_NAME ASC,KEY_SEQ ASC";
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    @Override
    public ResultSet getTypeInfo() throws SQLException {
        String sql = "select TYPEINFO.TYPE_NAME, TYPEINFO.DATA_TYPE, TYPEINFO.PRECISION, TYPEINFO.LITERAL_PREFIX, TYPEINFO.LITERAL_SUFFIX, TYPEINFO.CREATE_PARAMS, TYPEINFO.NULLABLE, TYPEINFO.CASE_SENSITIVE, TYPEINFO.SEARCHABLE,TYPEINFO.UNSIGNED_ATTRIBUTE, TYPEINFO.FIXED_PREC_SCALE, TYPEINFO.AUTO_INCREMENT, TYPEINFO.LOCAL_TYPE_NAME, TYPEINFO.MINIMUM_SCALE, TYPEINFO.MAXIMUM_SCALE, TYPEINFO.SQL_DATA_TYPE, TYPEINFO.SQL_DATETIME_SUB, TYPEINFO.NUM_PREC_RADIX from (";
        sql = sql + "SELECT /*+ MAX_OPT_N_TABLES(5) */ DISTINCT TYPE_NAME AS TYPE_NAME,";
        sql = sql + " CASE DATA_TYPE WHEN 101 THEN 2000 WHEN 102 THEN 2000 WHEN 103 THEN 2000 WHEN 104 THEN 2000 WHEN 105 THEN 2000 WHEN 106 THEN 2000 WHEN 107 THEN 2000 WHEN 108 THEN 2000 WHEN 109 THEN 2000 WHEN 110 THEN 2000 WHEN 111 THEN 2000 WHEN 112 THEN 2000 WHEN 113 THEN 2000 ELSE DATA_TYPE END AS DATA_TYPE,";
        sql = sql + " COLUMN_SIZE AS \"PRECISION\",LITERAL_PREFIX AS LITERAL_PREFIX,LITERAL_SUFFIX AS LITERAL_SUFFIX,CREATE_PARAMS AS CREATE_PARAMS,NULLABLE$ AS NULLABLE,CASE_SENSITIVE AS CASE_SENSITIVE,SEARCHABLE AS SEARCHABLE,UNSIGNED_ATTRIBUTE AS UNSIGNED_ATTRIBUTE,FIXED_PREC_SCALE AS FIXED_PREC_SCALE,AUTO_UNIQUE_VALUE AS AUTO_INCREMENT,LOCAL_TYPE_NAME AS LOCAL_TYPE_NAME,MINIMUM_SCALE AS MINIMUM_SCALE,MAXIMUM_SCALE AS MAXIMUM_SCALE,NULL AS SQL_DATA_TYPE,NULL AS SQL_DATETIME_SUB,NUM_PREC_RADIX AS NUM_PREC_RADIX";
        sql = sql + " FROM SYS.SYSTYPEINFOS WHERE (TYPE_VERSION = 'O3' OR TYPE_VERSION = 'J3') AND TYPE_NAME <> 'double precision' AND TYPE_NAME <> 'image' AND TYPE_NAME <> 'text' AND TYPE_NAME <> 'money'";
        sql = sql + " ORDER BY DATA_TYPE) TYPEINFO;";
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    @Override
    public ResultSet getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate) throws SQLException {
        String schemaname = schema == null ? "%" : StringUtil.getEscStringName(schema);
        String tablename = table == null ? "%" : StringUtil.getEscStringName(table);
        String schemaClause = this.makeSchemaClause(schemaname);
        String tableClause = this.makeTableClause_utab(tablename);
        StringBuffer sql = new StringBuffer();
        sql.append("SELECT /*+ MAX_OPT_N_TABLES(5) */ DISTINCT NULL");
        sql.append(" AS TABLE_CAT,USERS.NAME AS TABLE_SCHEM,TAB.NAME AS TABLE_NAME, ");
        sql.append("CASE INDS.ISUNIQUE WHEN 'Y' THEN 0 ELSE 1 END AS NON_UNIQUE, NULL AS INDEX_QUALIFIER, ");
        sql.append("OBJ_INDS.NAME AS INDEX_NAME, ");
        sql.append("CASE INDS.XTYPE & 0x01 WHEN 0 THEN 1 ");
        sql.append("ELSE 3 END AS \"TYPE\", ");
        sql.append("SF_GET_INDEX_KEY_SEQ(INDS.KEYNUM, INDS.KEYINFO, COLS.COLID) AS ORDINAL_POSITION, ");
        sql.append("COLS.NAME AS COLUMN_NAME, ");
        sql.append("SF_GET_INDEX_KEY_ORDER(INDS.KEYNUM, INDS.KEYINFO, COLS.COLID) AS ASC_OR_DESC, ");
        sql.append("0 AS CARDINALITY, 0 AS PAGES, NULL AS FILTER_CONDITION ");
        sql.append(" FROM ");
        sql.append(schemaClause);
        sql.append(" AS USERS, ");
        sql.append(tableClause);
        sql.append(" AS TAB, ");
        sql.append("(SELECT ID, PID, NAME FROM SYS.SYSOBJECTS WHERE SUBTYPE$='INDEX') AS OBJ_INDS,");
        sql.append("SYS.SYSINDEXES AS INDS,");
        sql.append("SYS.SYSCOLUMNS AS COLS ");
        sql.append("WHERE TAB.ID=COLS.ID AND TAB.ID=OBJ_INDS.PID ");
        sql.append("AND INDS.ID=OBJ_INDS.ID AND TAB.SCHID = USERS.ID AND ");
        sql.append("SF_COL_IS_IDX_KEY(INDS.KEYNUM, INDS.KEYINFO, COLS.COLID)=1");
        if (unique) {
            sql.append(" AND INDS.ISUNIQUE = 'Y' ORDER BY NON_UNIQUE ASC,TYPE ASC,INDEX_NAME ASC,ORDINAL_POSITION ASC;");
        } else {
            sql.append(" ORDER BY NON_UNIQUE ASC,TYPE ASC,INDEX_NAME ASC,ORDINAL_POSITION ASC;");
        }

        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    @Override
    public boolean supportsResultSetType(int type) throws SQLException {
        return type == 1003 || type == 1004;
    }

    @Override
    public boolean supportsResultSetConcurrency(int type, int concurrency) throws SQLException {
        return true;
    }

    @Override
    public boolean ownUpdatesAreVisible(int type) throws SQLException {
        return false;
    }

    @Override
    public boolean ownDeletesAreVisible(int type) throws SQLException {
        return false;
    }

    @Override
    public boolean ownInsertsAreVisible(int type) throws SQLException {
        return false;
    }

    @Override
    public boolean othersUpdatesAreVisible(int type) throws SQLException {
        return false;
    }

    @Override
    public boolean othersDeletesAreVisible(int type) throws SQLException {
        return false;
    }

    @Override
    public boolean othersInsertsAreVisible(int type) throws SQLException {
        return false;
    }

    @Override
    public boolean updatesAreDetected(int type) throws SQLException {
        return false;
    }

    @Override
    public boolean deletesAreDetected(int type) throws SQLException {
        return false;
    }

    @Override
    public boolean insertsAreDetected(int type) throws SQLException {
        return false;
    }

    @Override
    public boolean supportsBatchUpdates() throws SQLException {
        return true;
    }

    @Override
    public ResultSet getUDTs(String catalog, String schemaPattern, String typeNamePattern, int[] types) throws SQLException {
        DmdbColumn[] fields = new DmdbColumn[7];
        fields[0] = new DmdbColumn(this.connection);
        fields[0].getDesc().setName("TYPE_CAT");
        fields[0].getDesc().setDType(2);
        fields[0].getDesc().setPrec(128);
        fields[0].getDesc().setScale(0);
        fields[0].getDesc().setNullable(true);
        fields[1] = new DmdbColumn(this.connection);
        fields[1].getDesc().setName("TYPE_SCHEM");
        fields[1].getDesc().setDType(2);
        fields[1].getDesc().setPrec(128);
        fields[1].getDesc().setScale(0);
        fields[1].getDesc().setNullable(true);
        fields[2] = new DmdbColumn(this.connection);
        fields[2].getDesc().setName("TYPE_NAME");
        fields[2].getDesc().setDType(2);
        fields[2].getDesc().setPrec(128);
        fields[2].getDesc().setScale(0);
        fields[2].getDesc().setNullable(false);
        fields[3] = new DmdbColumn(this.connection);
        fields[3].getDesc().setName("CLASS_NAME");
        fields[3].getDesc().setDType(2);
        fields[3].getDesc().setPrec(128);
        fields[3].getDesc().setScale(0);
        fields[3].getDesc().setNullable(false);
        fields[4] = new DmdbColumn(this.connection);
        fields[4].getDesc().setName("DATA_TYPE");
        fields[4].getDesc().setDType(7);
        fields[4].getDesc().setPrec(4);
        fields[4].getDesc().setScale(0);
        fields[4].getDesc().setNullable(false);
        fields[5] = new DmdbColumn(this.connection);
        fields[5].getDesc().setName("REMARKS");
        fields[5].getDesc().setDType(2);
        fields[5].getDesc().setPrec(1024);
        fields[5].getDesc().setScale(0);
        fields[5].getDesc().setNullable(false);
        fields[6] = new DmdbColumn(this.connection);
        fields[6].getDesc().setName("BASE_TYPE");
        fields[6].getDesc().setDType(6);
        fields[6].getDesc().setPrec(2);
        fields[6].getDesc().setScale(0);
        fields[6].getDesc().setNullable(false);
        DmdbInfo dmInfo = new DmdbInfo();
        dmInfo.setColumnsInfo(fields);
        if (catalog == null) {
            String s1 = this.connection.getCatalog();
        }

        if (schemaPattern == null) {
            String s2 = "%";
        }

        if (typeNamePattern == null) {
            String s3 = "%";
        }

        dmInfo.setRowCount(0L);
        DmdbResultSet_bs rs = new DmdbResultSet_bs(dmInfo, false);
        return rs;
    }

    @Override
    public Connection getConnection() throws SQLException {
        return this.connection;
    }

    @Override
    public boolean supportsSavepoints() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsNamedParameters() throws SQLException {
        return true;
    }

    @Override
    public boolean supportsMultipleOpenResults() throws SQLException {
        return false;
    }

    @Override
    public boolean supportsGetGeneratedKeys() throws SQLException {
        return true;
    }

    @Override
    public ResultSet getSuperTypes(String catalog, String schemaPattern, String typeNamePattern) throws SQLException {
        DmdbColumn[] field = new DmdbColumn[6];
        field[0] = new DmdbColumn(this.connection);
        field[0].getDesc().setName("TYPE_CAT");
        field[0].getDesc().setDType(2);
        field[0].getDesc().setPrec(128);
        field[0].getDesc().setScale(0);
        field[0].getDesc().setNullable(true);
        field[1] = new DmdbColumn(this.connection);
        field[1].getDesc().setName("TYPE_SCHEM");
        field[1].getDesc().setDType(2);
        field[1].getDesc().setPrec(128);
        field[1].getDesc().setScale(0);
        field[1].getDesc().setNullable(true);
        field[2] = new DmdbColumn(this.connection);
        field[2].getDesc().setName("TYPE_NAME");
        field[2].getDesc().setDType(2);
        field[2].getDesc().setPrec(128);
        field[2].getDesc().setScale(0);
        field[2].getDesc().setNullable(false);
        field[3] = new DmdbColumn(this.connection);
        field[3].getDesc().setName("SUPERTYPE_CAT");
        field[3].getDesc().setDType(2);
        field[3].getDesc().setPrec(128);
        field[3].getDesc().setScale(0);
        field[3].getDesc().setNullable(true);
        field[4] = new DmdbColumn(this.connection);
        field[4].getDesc().setName("SUPERTYPE_SCHEM");
        field[4].getDesc().setDType(2);
        field[4].getDesc().setPrec(128);
        field[4].getDesc().setScale(0);
        field[4].getDesc().setNullable(true);
        field[5] = new DmdbColumn(this.connection);
        field[5].getDesc().setName("SUPERTYPE_NAME");
        field[5].getDesc().setDType(2);
        field[5].getDesc().setPrec(128);
        field[5].getDesc().setScale(0);
        field[5].getDesc().setNullable(false);
        DmdbInfo dmInfo = new DmdbInfo();
        dmInfo.setColumnsInfo(field);
        if (catalog == null) {
            String s1 = this.connection.getCatalog();
        }

        if (schemaPattern == null) {
            String s2 = "%";
        }

        if (typeNamePattern == null) {
            String s3 = "%";
        }

        dmInfo.setRowCount(0L);
        DmdbResultSet_bs rs = new DmdbResultSet_bs(dmInfo, false);
        return rs;
    }

    @Override
    public ResultSet getSuperTables(String catalog, String schemaPattern, String tableNamePattern) throws SQLException {
        DmdbColumn[] field = new DmdbColumn[4];
        field[0] = new DmdbColumn(this.connection);
        field[0].getDesc().setName("TABLE_CAT");
        field[0].getDesc().setDType(2);
        field[0].getDesc().setPrec(128);
        field[0].getDesc().setScale(0);
        field[0].getDesc().setNullable(true);
        field[1] = new DmdbColumn(this.connection);
        field[1].getDesc().setName("TABLE_SCHEM");
        field[1].getDesc().setDType(2);
        field[1].getDesc().setPrec(128);
        field[1].getDesc().setScale(0);
        field[1].getDesc().setNullable(true);
        field[2] = new DmdbColumn(this.connection);
        field[2].getDesc().setName("TABLE_NAME");
        field[2].getDesc().setDType(2);
        field[2].getDesc().setPrec(128);
        field[2].getDesc().setScale(0);
        field[2].getDesc().setNullable(false);
        field[3] = new DmdbColumn(this.connection);
        field[3].getDesc().setName("SUPERTABLE_NAME");
        field[3].getDesc().setDType(2);
        field[3].getDesc().setPrec(128);
        field[3].getDesc().setScale(0);
        field[3].getDesc().setNullable(false);
        DmdbInfo dmInfo = new DmdbInfo();
        dmInfo.setColumnsInfo(field);
        if (catalog == null) {
            String s1 = this.connection.getCatalog();
        }

        if (schemaPattern == null) {
            String s2 = "%";
        }

        if (tableNamePattern == null) {
            String s3 = "%";
        }

        dmInfo.setRowCount(0L);
        DmdbResultSet_bs rs = new DmdbResultSet_bs(dmInfo, false);
        return rs;
    }

    @Override
    public ResultSet getAttributes(String catalog, String schemaPattern, String typeNamePattern, String attributeNamePattern) throws SQLException {
        DmdbColumn[] field = new DmdbColumn[21];
        field[0] = new DmdbColumn(this.connection);
        field[0].getDesc().setName("TYPE_CAT");
        field[0].getDesc().setDType(2);
        field[0].getDesc().setPrec(128);
        field[0].getDesc().setScale(0);
        field[0].getDesc().setNullable(true);
        field[1] = new DmdbColumn(this.connection);
        field[1].getDesc().setName("TYPE_SCHEM");
        field[1].getDesc().setDType(2);
        field[1].getDesc().setPrec(128);
        field[1].getDesc().setScale(0);
        field[1].getDesc().setNullable(true);
        field[2] = new DmdbColumn(this.connection);
        field[2].getDesc().setName("TYPE_NAME");
        field[2].getDesc().setDType(2);
        field[2].getDesc().setPrec(128);
        field[2].getDesc().setScale(0);
        field[2].getDesc().setNullable(false);
        field[3] = new DmdbColumn(this.connection);
        field[3].getDesc().setName("ATTR_NAME");
        field[3].getDesc().setDType(2);
        field[3].getDesc().setPrec(128);
        field[3].getDesc().setScale(0);
        field[3].getDesc().setNullable(false);
        field[4] = new DmdbColumn(this.connection);
        field[4].getDesc().setName("DATA_TYPE");
        field[4].getDesc().setDType(7);
        field[4].getDesc().setPrec(4);
        field[4].getDesc().setScale(0);
        field[4].getDesc().setNullable(false);
        field[5] = new DmdbColumn(this.connection);
        field[5].getDesc().setName("ATTR_TYPE_NAME");
        field[5].getDesc().setDType(2);
        field[5].getDesc().setPrec(128);
        field[5].getDesc().setScale(0);
        field[5].getDesc().setNullable(false);
        field[6] = new DmdbColumn(this.connection);
        field[6].getDesc().setName("ATTR_SIZE");
        field[6].getDesc().setDType(7);
        field[6].getDesc().setPrec(4);
        field[6].getDesc().setScale(0);
        field[6].getDesc().setNullable(false);
        field[7] = new DmdbColumn(this.connection);
        field[7].getDesc().setName("DECIMAL_DIGITS");
        field[7].getDesc().setDType(7);
        field[7].getDesc().setPrec(4);
        field[7].getDesc().setScale(0);
        field[7].getDesc().setNullable(false);
        field[8] = new DmdbColumn(this.connection);
        field[8].getDesc().setName("NUM_PREC_RADIX");
        field[8].getDesc().setDType(7);
        field[8].getDesc().setPrec(4);
        field[8].getDesc().setScale(0);
        field[8].getDesc().setNullable(false);
        field[9] = new DmdbColumn(this.connection);
        field[9].getDesc().setName("NULLABLE");
        field[9].getDesc().setDType(7);
        field[9].getDesc().setPrec(4);
        field[9].getDesc().setScale(0);
        field[9].getDesc().setNullable(false);
        field[10] = new DmdbColumn(this.connection);
        field[10].getDesc().setName("REMARKS");
        field[10].getDesc().setDType(2);
        field[10].getDesc().setPrec(128);
        field[10].getDesc().setScale(0);
        field[10].getDesc().setNullable(false);
        field[11] = new DmdbColumn(this.connection);
        field[11].getDesc().setName("ATTR_DEF");
        field[11].getDesc().setDType(2);
        field[11].getDesc().setPrec(128);
        field[11].getDesc().setScale(0);
        field[11].getDesc().setNullable(true);
        field[12] = new DmdbColumn(this.connection);
        field[12].getDesc().setName("SQL_DATA_TYPE");
        field[12].getDesc().setDType(7);
        field[12].getDesc().setPrec(4);
        field[12].getDesc().setScale(0);
        field[12].getDesc().setNullable(false);
        field[13] = new DmdbColumn(this.connection);
        field[13].getDesc().setName("SQL_DATETIME_SUB");
        field[13].getDesc().setDType(7);
        field[13].getDesc().setPrec(4);
        field[13].getDesc().setScale(0);
        field[13].getDesc().setNullable(false);
        field[14] = new DmdbColumn(this.connection);
        field[14].getDesc().setName("CHAR_OCTET_LENGTH");
        field[14].getDesc().setDType(7);
        field[14].getDesc().setPrec(4);
        field[14].getDesc().setScale(0);
        field[14].getDesc().setNullable(false);
        field[15] = new DmdbColumn(this.connection);
        field[15].getDesc().setName("ORDINAL_POSITION");
        field[15].getDesc().setDType(7);
        field[15].getDesc().setPrec(4);
        field[15].getDesc().setScale(0);
        field[15].getDesc().setNullable(false);
        field[16] = new DmdbColumn(this.connection);
        field[16].getDesc().setName("IS_NULLABLE");
        field[16].getDesc().setDType(2);
        field[16].getDesc().setPrec(128);
        field[16].getDesc().setScale(0);
        field[16].getDesc().setNullable(false);
        field[17] = new DmdbColumn(this.connection);
        field[17].getDesc().setName("SCOPE_CATALOG");
        field[17].getDesc().setDType(2);
        field[17].getDesc().setPrec(128);
        field[17].getDesc().setScale(0);
        field[17].getDesc().setNullable(false);
        field[18] = new DmdbColumn(this.connection);
        field[18].getDesc().setName("SCOPE_SCHEMA");
        field[18].getDesc().setDType(2);
        field[18].getDesc().setPrec(128);
        field[18].getDesc().setScale(0);
        field[18].getDesc().setNullable(false);
        field[19] = new DmdbColumn(this.connection);
        field[19].getDesc().setName("SCOPE_TABLE");
        field[19].getDesc().setDType(2);
        field[19].getDesc().setPrec(128);
        field[19].getDesc().setScale(0);
        field[19].getDesc().setNullable(false);
        field[20] = new DmdbColumn(this.connection);
        field[20].getDesc().setName("SOURCE_DATA_TYPE");
        field[20].getDesc().setDType(6);
        field[20].getDesc().setPrec(2);
        field[20].getDesc().setScale(0);
        field[20].getDesc().setNullable(false);
        DmdbInfo dmInfo = new DmdbInfo();
        dmInfo.setColumnsInfo(field);
        dmInfo.setRowCount(0L);
        DmdbResultSet_bs rs = new DmdbResultSet_bs(dmInfo, false);
        return rs;
    }

    @Override
    public RowIdLifetime getRowIdLifetime() throws SQLException {
        return null;
    }

    @Override
    public boolean supportsStoredFunctionsUsingCallSyntax() throws SQLException {
        return false;
    }

    @Override
    public boolean autoCommitFailureClosesAllResultSets() throws SQLException {
        return false;
    }

    @Override
    public ResultSet getClientInfoProperties() throws SQLException {
        return null;
    }

    @Override
    public ResultSet getPseudoColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException {
        return null;
    }

    @Override
    public boolean generatedKeyAlwaysReturned() throws SQLException {
        return false;
    }

    @Override
    public <T> T unwrap(Class<T> iface) throws SQLException {
        return null;
    }

    @Override
    public boolean isWrapperFor(Class<?> iface) throws SQLException {
        return false;
    }

    @Override
    public boolean supportsResultSetHoldability(int holdability) throws SQLException {
        return holdability == 2 || holdability == 1;
    }

    @Override
    public int getResultSetHoldability() throws SQLException {
        return 1;
    }

    @Override
    public int getDatabaseMajorVersion() throws SQLException {
        String[] versions = this.getDatabaseProductVersion().split("\\.");
        String majorVersion = versions[0];
        if (!StringUtils.isEmpty(majorVersion)) {
            majorVersion = majorVersion.replaceAll("^\\s+ |\\s+$", "");
        }
        return Integer.parseInt(majorVersion);
    }

    @Override
    public int getDatabaseMinorVersion() throws SQLException {
        String[] versions = this.getDatabaseProductVersion().split("\\.");
        return Integer.parseInt(versions[1]);
    }

    @Override
    public int getJDBCMajorVersion() throws SQLException {
        return DmdbType.JDBC_VERSION;
    }

    @Override
    public int getJDBCMinorVersion() throws SQLException {
        return 0;
    }

    @Override
    public int getSQLStateType() throws SQLException {
        return this.XOpen;
    }

    @Override
    public boolean locatorsUpdateCopy() throws SQLException {
        return false;
    }

    @Override
    public boolean supportsStatementPooling() throws SQLException {
        return true;
    }

    @Override
    public ResultSet getSchemas(String catalog, String schemaPattern) throws SQLException {
        String catalog2 = catalog == null ? this.connection.getCatalog() : StringUtil.getEscStringName(catalog.trim());
        String schemaname = schemaPattern == null ? "%" : StringUtil.getEscStringName(schemaPattern);
        String sql = "";
        if (catalog2 == null) {
            sql = "SELECT DISTINCT NAME AS TABLE_SCHEM, NULL AS TABLE_CATALOG FROM ";
        } else {
            sql = "SELECT DISTINCT NAME AS TABLE_SCHEM, '" + catalog2 + "' AS TABLE_CATALOG FROM ";
        }

        if (this.getEscape(schemaname)) {
            if (!schemaname.equalsIgnoreCase("%")) {
                sql = sql + "SYS.SYSOBJECTS USERS WHERE TYPE$='SCH' AND NAME LIKE '" + schemaname + "'" + this.m_esp;
            } else {
                sql = sql + "SYS.SYSOBJECTS USERS WHERE TYPE$='SCH' ";
            }
        } else {
            sql = sql + "SYS.SYSOBJECTS USERS WHERE TYPE$='SCH' AND NAME = '" + schemaname + "'";
        }

        sql = sql + " ORDER BY TABLE_SCHEM ASC;";
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    @Override
    public ResultSet getFunctions(String catalog, String schemaPattern, String functionNamePattern) throws SQLException {
        if (this.connection.isCompatibleOracle() && StringUtil.isNotEmpty(catalog)) {
            try {
                return this.getPkgProcedures(schemaPattern, catalog, functionNamePattern, 2);
            } catch (SQLException var10) {
            }
        }

        String catalog2 = catalog == null ? this.connection.getCatalog() : StringUtil.getEscStringName(catalog.trim());
        String schemaname = schemaPattern == null ? "%" : StringUtil.getEscStringName(schemaPattern);
        String funcname = functionNamePattern == null ? "%" : StringUtil.getEscStringName(functionNamePattern);
        StringBuffer sql = new StringBuffer("");
        sql.append("SELECT DISTINCT ");
        if (catalog2 == null) {
            sql.append("NULL");
        } else {
            sql.append("'" + catalog2 + "'");
        }

        sql.append(" AS FUNCTION_CAT, SCHEMAS.NAME AS FUNCTION_SCHEM, FUNCS.NAME AS FUNCTION_NAME, NULL AS REMARKS, 2 AS FUNCTION_TYPE, FUNCS.NAME AS SPECIFIC_NAME");
        sql.append(" FROM ");
        sql.append("(SELECT * FROM SYS.SYSOBJECTS WHERE SUBTYPE$='PROC' AND INFO1&0x01=0");
        String funClause = this.makeClause_objWithoutPrec(funcname);
        if (funClause != null) {
            sql.append(" AND NAME ");
            sql.append(funClause);
        }

        sql.append(")FUNCS, ");
        String schemaClause = this.makeSchemaClause(schemaname);
        sql.append(schemaClause);
        sql.append("SCHEMAS");
        sql.append(" ORDER BY FUNCTION_SCHEM ASC,FUNCTION_NAME ASC;");
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }

    @Override
    public ResultSet getFunctionColumns(String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern) throws SQLException {
        if (this.connection.isCompatibleOracle() && StringUtil.isNotEmpty(catalog)) {
            try {
                return this.getPkgProcedureColumns(schemaPattern, catalog, functionNamePattern, columnNamePattern, 2);
            } catch (SQLException var13) {
            }
        }

        String catalog2 = catalog == null ? this.connection.getCatalog() : StringUtil.getEscStringName(catalog.trim());
        String schemaname = schemaPattern == null ? "%" : StringUtil.getEscStringName(schemaPattern);
        String funcname = functionNamePattern == null ? "%" : StringUtil.getEscStringName(functionNamePattern);
        String colname = columnNamePattern == null ? "%" : StringUtil.getEscStringName(columnNamePattern);
        StringBuffer sql = new StringBuffer();
        sql.append("SELECT DISTINCT ");
        if (catalog2 == null) {
            sql.append("NULL");
        } else {
            sql.append("'" + catalog2 + "'");
        }

        sql.append(" AS FUNCTION_CAT,");
        sql.append("USERS.NAME AS FUNCTION_SCHEM,");
        sql.append("FUNCS.NAME AS FUNCTION_NAME,");
        if (this.connection.isCompatibleOracle()) {
            sql.append("CASE ARG.INFO1 WHEN 3 THEN NULL ELSE ARG.NAME END AS COLUMN_NAME, ");
        } else {
            sql.append("ARG.NAME AS COLUMN_NAME,");
        }

        sql.append("CASE ARG.INFO1 WHEN 0 THEN 1 WHEN 1 THEN 3 WHEN 2 THEN 2 WHEN 3 THEN 4 END AS COLUMN_TYPE,");
        sql.append(this.makeDataTypeClause("ARG.TYPE$", "ARG.SCALE"));
        sql.append("AS DATA_TYPE,");
        sql.append(this.makeDataTypeNameClause("ARG.TYPE$"));
        sql.append("AS TYPE_NAME,");
        sql.append("CASE SF_GET_COLUMN_SIZE(ARG.TYPE$, CAST (ARG.LENGTH$ AS INT), CAST (ARG.SCALE AS INT)) WHEN -2 THEN NULL ");
        sql.append("ELSE SF_GET_COLUMN_SIZE(ARG.TYPE$, CAST (ARG.LENGTH$ AS INT), CAST (ARG.SCALE AS INT)) END AS \"PRECISION\",");
        sql.append("CASE SF_GET_BUFFER_LEN(ARG.TYPE$, CAST (ARG.LENGTH$ AS INT), CAST (ARG.SCALE AS INT)) WHEN -2 THEN NULL ");
        sql.append("ELSE SF_GET_BUFFER_LEN(ARG.TYPE$, CAST (ARG.LENGTH$ AS INT), CAST (ARG.SCALE AS INT)) END AS LENGTH,");
        sql.append("CASE SF_GET_DECIMAL_DIGITS(ARG.TYPE$, CAST (ARG.SCALE AS INT)) WHEN -2 THEN NULL ");
        sql.append("ELSE SF_GET_DECIMAL_DIGITS(ARG.TYPE$, CAST (ARG.SCALE AS INT)) END AS SCALE,");
        sql.append("10 AS RADIX,");
        sql.append("1 AS NULLABLE,");
        sql.append("NULL AS REMARKS, ");
        sql.append("CASE SF_GET_OCT_LENGTH(ARG.TYPE$, CAST (ARG.LENGTH$ AS INT)) WHEN -2 THEN NULL ");
        sql.append("ELSE SF_GET_OCT_LENGTH(ARG.TYPE$, CAST (ARG.LENGTH$ AS INT)) END AS CHAR_OCTET_LENGTH, ");
        sql.append("CASE ARG.INFO1 WHEN 3 THEN 0 ELSE ARG.COLID + 1 END AS ORDINAL_POSITION, ");
        sql.append("CASE ARG.NULLABLE$ WHEN 'Y' THEN 'YES' ELSE 'NO' END AS IS_NULLABLE, ");
        sql.append("FUNCS.NAME AS SPECIFIC_NAME");
        sql.append(" FROM ");
        String schemaClause = this.makeSchemaClause(schemaname);
        sql.append(schemaClause);
        sql.append(" AS USERS, ");
        String funClause = this.makeFuncClause(funcname);
        sql.append(funClause);
        sql.append(" AS FUNCS, ");
        sql.append("SYS.SYSCOLUMNS ARG ");
        sql.append("WHERE ");
        String argClause = this.makeClause_objWithoutPrec(colname);
        if (argClause != null) {
            sql.append("ARG.NAME ");
            sql.append(argClause);
            sql.append(" AND ");
        }

        sql.append(" USERS.ID = FUNCS.SCHID AND FUNCS.ID = ARG.ID");
        sql.append(" ORDER BY FUNCTION_SCHEM ASC,FUNCTION_NAME ASC;");
        return DmJdbcUtil.executeQuery(this.connection, sql.toString());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值