SQLRETURN SQL_API RsDrvInfo::RS_SQLGetInfo()

in src/odbc/rsodbc/rsdrvinfo.cpp [157:1194]


SQLRETURN  SQL_API RsDrvInfo::RS_SQLGetInfo(SQLHDBC phdbc,
                                    SQLUSMALLINT hInfoType, 
                                    SQLPOINTER pInfoValue,
                                    SQLSMALLINT cbLen, 
                                    SQLSMALLINT *pcbLen,
                                    int *piRetType)
{
    SQLRETURN rc = SQL_SUCCESS;
    char *pVal = (char *) pInfoValue;
    SQLUSMALLINT *phVal = (SQLUSMALLINT *)pInfoValue;
    SQLUINTEGER     *piVal = (SQLUINTEGER *)pInfoValue;
    RS_CONN_INFO *pConn = (RS_CONN_INFO *)phdbc;
    SQLUINTEGER iVal;
    SQLUSMALLINT hVal;
    char *pTemp;
    char szSrvrBuf[MAX_TEMP_BUF_LEN];

    if(!VALID_HDBC(phdbc))
    {
        rc = SQL_INVALID_HANDLE;
        goto error; 
    }

    // Clear error list
    pConn->pErrorList = clearErrorList(pConn->pErrorList);

    if(cbLen < 0)
    {
        rc = SQL_ERROR;
        addError(&pConn->pErrorList,"HY090", "Invalid string or buffer length", 0, NULL);
        goto error; 
    }

    switch (hInfoType) 
    {
        case SQL_ACCESSIBLE_PROCEDURES:
        case SQL_ACCESSIBLE_TABLES:
        case SQL_DATA_SOURCE_READ_ONLY:
        case SQL_ODBC_SQL_OPT_IEF: /* SQL_INTEGRITY */
        case SQL_ORDER_BY_COLUMNS_IN_SELECT:
        case SQL_ROW_UPDATES:
        {
            rc = strInfoResponse("N", pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_COLLATION_SEQ:
        {
            rc = strInfoResponse("", pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_SPECIAL_CHARACTERS:
        {
            rc = strInfoResponse("_", pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_QUALIFIER_NAME_SEPARATOR: /* SQL_CATALOG_NAME_SEPARATOR */
        {
            rc = strInfoResponse(".", pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_QUALIFIER_TERM:           /* SQL_CATALOG_TERM */
        {
            rc = strInfoResponse("database", pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_CATALOG_NAME:
        case SQL_COLUMN_ALIAS:
        case SQL_DESCRIBE_PARAMETER:
        case SQL_EXPRESSIONS_IN_ORDERBY:
        case SQL_LIKE_ESCAPE_CLAUSE:
        case SQL_MAX_ROW_SIZE_INCLUDES_LONG:
        case SQL_MULT_RESULT_SETS:
        case SQL_MULTIPLE_ACTIVE_TXN:
        case SQL_NEED_LONG_DATA_LEN:
        case SQL_OUTER_JOINS:
        case SQL_PROCEDURES:
        {
            rc = strInfoResponse("Y", pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_ACTIVE_CONNECTIONS: /* SQL_MAX_DRIVER_CONNECTIONS */
        case SQL_ACTIVE_ENVIRONMENTS:
        case SQL_MAX_COLUMNS_IN_GROUP_BY:
        case SQL_MAX_COLUMNS_IN_INDEX:
        case SQL_MAX_COLUMNS_IN_ORDER_BY:
        case SQL_MAX_COLUMNS_IN_SELECT:
        case SQL_MAX_COLUMNS_IN_TABLE:
        case SQL_MAX_TABLES_IN_SELECT:
        {
            rc = shortInfoResponse(0, phVal, pcbLen, piRetType);
            break;
        }

        case SQL_QUALIFIER_LOCATION: /* SQL_CATALOG_LOCATION */
        {
            iVal= SQL_CL_START;
            rc = shortInfoResponse(iVal, phVal, pcbLen, piRetType);
            break;
        }

        case SQL_ACTIVE_STATEMENTS: /* SQL_MAX_CONCURRENT_ACTIVITIES */
        case SQL_MAX_ASYNC_CONCURRENT_STATEMENTS:
        {
            rc = shortInfoResponse(1, phVal, pcbLen, piRetType);
            break;
        }

        case SQL_CREATE_ASSERTION:
        case SQL_CREATE_CHARACTER_SET:
        case SQL_CREATE_COLLATION:
        case SQL_CREATE_TRANSLATION:
        case SQL_DROP_ASSERTION:
        case SQL_DROP_CHARACTER_SET:
        case SQL_DROP_COLLATION:
        case SQL_DROP_TRANSLATION:
        case SQL_DYNAMIC_CURSOR_ATTRIBUTES1:
        case SQL_DYNAMIC_CURSOR_ATTRIBUTES2:
        case SQL_INDEX_KEYWORDS:
        case SQL_INFO_SCHEMA_VIEWS:
        case SQL_KEYSET_CURSOR_ATTRIBUTES1:
        case SQL_KEYSET_CURSOR_ATTRIBUTES2:
        case SQL_MAX_BINARY_LITERAL_LEN:
        case SQL_MAX_CHAR_LITERAL_LEN:
        case SQL_MAX_ROW_SIZE:
        case SQL_MAX_STATEMENT_LEN:
        case SQL_STATIC_SENSITIVITY:
        case SQL_TIMEDATE_ADD_INTERVALS:
        case SQL_TIMEDATE_DIFF_INTERVALS:
        {
            rc = integerInfoResponse(0, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_QUALIFIER_USAGE: /* SQL_CATALOG_USAGE */
        {
            iVal = SQL_CU_DML_STATEMENTS;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_AGGREGATE_FUNCTIONS:
        {
            iVal = SQL_AF_ALL 
                    | SQL_AF_AVG 
                    | SQL_AF_COUNT 
                    | SQL_AF_DISTINCT 
                    | SQL_AF_MAX 
                    | SQL_AF_MIN 
                    | SQL_AF_SUM ;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_ALTER_DOMAIN:
        {
            iVal = 0;

            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_ALTER_TABLE:
        {
            iVal = SQL_AT_ADD_COLUMN |
                SQL_AT_DROP_COLUMN |
                SQL_AT_ADD_CONSTRAINT |
                SQL_AT_ADD_COLUMN_SINGLE |
                SQL_AT_DROP_COLUMN_CASCADE |
                SQL_AT_DROP_COLUMN_RESTRICT |
                SQL_AT_ADD_TABLE_CONSTRAINT |
                SQL_AT_DROP_TABLE_CONSTRAINT_CASCADE |
                SQL_AT_DROP_TABLE_CONSTRAINT_RESTRICT |
                SQL_AT_CONSTRAINT_INITIALLY_DEFERRED |
                SQL_AT_CONSTRAINT_INITIALLY_IMMEDIATE |
                SQL_AT_CONSTRAINT_DEFERRABLE;

            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_ASYNC_MODE:
        {
            iVal = SQL_AM_STATEMENT;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_BATCH_ROW_COUNT:
        {
            iVal = SQL_BRC_EXPLICIT;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_BATCH_SUPPORT:
        {
            iVal = SQL_BS_SELECT_EXPLICIT
                    | SQL_BS_ROW_COUNT_EXPLICIT;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_BOOKMARK_PERSISTENCE:
        {
            iVal = SQL_BP_DROP;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_CONCAT_NULL_BEHAVIOR:
        {
            hVal = SQL_CB_NULL;
            rc = shortInfoResponse(hVal, phVal, pcbLen, piRetType);
            break;
        }

        case SQL_CONVERT_CHAR:
        case SQL_CONVERT_LONGVARCHAR:
        case SQL_CONVERT_VARCHAR:
        {
            iVal = SQL_CVT_CHAR
                    | SQL_CVT_NUMERIC | SQL_CVT_DECIMAL | SQL_CVT_INTEGER | SQL_CVT_SMALLINT | SQL_CVT_FLOAT
                    | SQL_CVT_REAL | SQL_CVT_DOUBLE | SQL_CVT_VARCHAR | SQL_CVT_LONGVARCHAR | SQL_CVT_BIT
                    | SQL_CVT_TINYINT | SQL_CVT_BIGINT | SQL_CVT_DATE | SQL_CVT_TIME | SQL_CVT_TIMESTAMP;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_CONVERT_BIGINT:
        case SQL_CONVERT_INTEGER:
        case SQL_CONVERT_NUMERIC:
        case SQL_CONVERT_REAL:
        case SQL_CONVERT_SMALLINT:
        case SQL_CONVERT_TINYINT:
        {
            iVal = SQL_CVT_CHAR
                    | SQL_CVT_NUMERIC | SQL_CVT_DECIMAL | SQL_CVT_INTEGER | SQL_CVT_SMALLINT | SQL_CVT_FLOAT
                    | SQL_CVT_REAL | SQL_CVT_DOUBLE | SQL_CVT_VARCHAR | SQL_CVT_LONGVARCHAR
                    | SQL_CVT_TINYINT |  SQL_CVT_BIT | SQL_CVT_BIGINT;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_CONVERT_BIT:
        {
            iVal = SQL_CVT_CHAR | SQL_CVT_INTEGER
                | SQL_CVT_VARCHAR | SQL_CVT_LONGVARCHAR | SQL_CVT_BIT | SQL_CVT_BIGINT;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_CONVERT_DATE:
        {
            iVal = SQL_CVT_CHAR | SQL_CVT_VARCHAR
                | SQL_CVT_LONGVARCHAR | SQL_CVT_DATE | SQL_CVT_TIMESTAMP;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_CONVERT_TIME:
        {
            iVal = SQL_CVT_CHAR | SQL_CVT_VARCHAR
                | SQL_CVT_LONGVARCHAR | SQL_CVT_TIME;

            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_CONVERT_TIMESTAMP:
        {
            iVal = SQL_CVT_CHAR | SQL_CVT_VARCHAR
                | SQL_CVT_LONGVARCHAR | SQL_CVT_DATE | SQL_CVT_TIME | SQL_CVT_TIMESTAMP;

            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }


        case SQL_CONVERT_DECIMAL:
        case SQL_CONVERT_DOUBLE:
        case SQL_CONVERT_FLOAT:
        {
            iVal = SQL_CVT_CHAR | SQL_CVT_NUMERIC
                | SQL_CVT_DECIMAL | SQL_CVT_INTEGER | SQL_CVT_SMALLINT | SQL_CVT_FLOAT | SQL_CVT_REAL
                | SQL_CVT_DOUBLE | SQL_CVT_VARCHAR | SQL_CVT_LONGVARCHAR | SQL_CVT_BIGINT;

            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_CONVERT_BINARY:
        case SQL_CONVERT_INTERVAL_YEAR_MONTH:
        case SQL_CONVERT_INTERVAL_DAY_TIME:
        case SQL_CONVERT_LONGVARBINARY:
        case SQL_CONVERT_VARBINARY:
        {
            iVal = 0;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_CONVERT_WCHAR:
        case SQL_CONVERT_WLONGVARCHAR:
        case SQL_CONVERT_WVARCHAR:
        {
            iVal =  SQL_CVT_NUMERIC
                | SQL_CVT_DECIMAL | SQL_CVT_INTEGER | SQL_CVT_SMALLINT | SQL_CVT_REAL | SQL_CVT_DOUBLE
                | SQL_CVT_BINARY | SQL_CVT_BIT | SQL_CVT_BIGINT | SQL_CVT_DATE | SQL_CVT_TIME
                | SQL_CVT_TIMESTAMP | SQL_CVT_WCHAR | SQL_CVT_WLONGVARCHAR | SQL_CVT_WVARCHAR;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }


        case SQL_CONVERT_FUNCTIONS:
        {
            iVal = SQL_FN_CVT_CONVERT;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_CORRELATION_NAME:
        {
            hVal = SQL_CN_ANY;
            rc = shortInfoResponse(hVal, phVal, pcbLen, piRetType);
            break;
        }

        case SQL_CREATE_DOMAIN:
        {
            iVal = 0;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_CREATE_SCHEMA:
        {
            iVal = SQL_CS_CREATE_SCHEMA
                    | SQL_CS_AUTHORIZATION;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_CREATE_TABLE:
        {
            iVal = SQL_CT_CREATE_TABLE
                     | SQL_CT_COMMIT_PRESERVE | SQL_CT_COMMIT_DELETE | SQL_CT_GLOBAL_TEMPORARY
                     | SQL_CT_LOCAL_TEMPORARY | SQL_CT_COLUMN_CONSTRAINT | SQL_CT_COLUMN_DEFAULT
                     | SQL_CT_TABLE_CONSTRAINT | SQL_CT_CONSTRAINT_NAME_DEFINITION;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_CREATE_VIEW:
        {
            iVal = SQL_CV_CREATE_VIEW;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_CURSOR_COMMIT_BEHAVIOR:
        case SQL_CURSOR_ROLLBACK_BEHAVIOR:
        {
            hVal = SQL_CB_PRESERVE;
            rc = shortInfoResponse(hVal, phVal, pcbLen, piRetType);
            break;
        }

        case SQL_CURSOR_SENSITIVITY:
        {
            iVal = SQL_INSENSITIVE;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_DATA_SOURCE_NAME:
        {
            rc = strInfoResponse((char *)((pConn->pConnectProps) ? pConn->pConnectProps->szDSN : ""),
                                    pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_DATABASE_NAME:
        {
            rc = strInfoResponse((char *)((pConn->pConnectProps) ? pConn->pConnectProps->szDatabase : ""),
                                    pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_DATETIME_LITERALS:
        {
            iVal = SQL_DL_SQL92_DATE
                   | SQL_DL_SQL92_TIME
                   | SQL_DL_SQL92_TIMESTAMP
                   | SQL_DL_SQL92_INTERVAL_YEAR
                   | SQL_DL_SQL92_INTERVAL_MONTH
                   | SQL_DL_SQL92_INTERVAL_DAY
                   | SQL_DL_SQL92_INTERVAL_HOUR
                   | SQL_DL_SQL92_INTERVAL_MINUTE
                   | SQL_DL_SQL92_INTERVAL_SECOND
                   | SQL_DL_SQL92_INTERVAL_YEAR_TO_MONTH
                   | SQL_DL_SQL92_INTERVAL_DAY_TO_HOUR
                   | SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTE
                   | SQL_DL_SQL92_INTERVAL_DAY_TO_SECOND
                   | SQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTE
                   | SQL_DL_SQL92_INTERVAL_HOUR_TO_SECOND
                   | SQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND;

            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_DBMS_NAME:
        {
            rc = strInfoResponse("Redshift", pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_DBMS_VER:
        {
            //  Server version in the form of ##.##.####
            pTemp = libpqParameterStatus(pConn,"padb_version"); // server_version
            rc = strInfoResponse(pTemp, pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_DDL_INDEX:
        {
/*            iVal = SQL_DI_CREATE_INDEX
                    | SQL_DI_DROP_INDEX; */
            iVal = 0;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_DEFAULT_TXN_ISOLATION:
        {
            iVal = SQL_TXN_SERIALIZABLE;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_DM_VER:
        {
            rc = strInfoResponse("", pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_DRIVER_NAME:
        {
            char fullPathDllName[MAX_PATH + _MAX_FNAME];
            char fname[_MAX_FNAME];
            char ext[_MAX_EXT];
            char driverName[_MAX_FNAME + _MAX_EXT];

             fullPathDllName[0] = '\0';
             fname[0] = '\0';
             ext[0] = '\0';
             driverName[0] = '\0';

#ifdef WIN32
             GetModuleFileName(gRsGlobalVars.hModule,fullPathDllName, sizeof(fullPathDllName));
             _splitpath(fullPathDllName, NULL, NULL, fname, ext);
             snprintf(driverName,sizeof(driverName),"%s%s",fname,ext);
#endif
#if defined LINUX 
             snprintf(driverName, sizeof(driverName), DRIVER_SO_NAME);
#endif

            rc = strInfoResponse(driverName, pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_DRIVER_ODBC_VER:
        {
            // ##.##
            rc = strInfoResponse("03.52", pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_DRIVER_VER:
        {
            // ##.##.#### format.
            rc = strInfoResponse(ODBC_DRIVER_VERSION, pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_DROP_DOMAIN:
        {
            iVal = 0;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_DROP_SCHEMA:
        {
            iVal = SQL_DS_DROP_SCHEMA
                    | SQL_DS_RESTRICT | SQL_DS_CASCADE;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_DROP_TABLE:
        {
            iVal = SQL_DT_DROP_TABLE
                    | SQL_DT_RESTRICT | SQL_DT_CASCADE;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_DROP_VIEW:
        {
            iVal = SQL_DV_DROP_VIEW
                    | SQL_DV_RESTRICT | SQL_DV_CASCADE;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_FETCH_DIRECTION:
        {
            iVal = SQL_FD_FETCH_NEXT
                    | SQL_FD_FETCH_FIRST | SQL_FD_FETCH_LAST | SQL_FD_FETCH_PRIOR | SQL_FD_FETCH_ABSOLUTE
                    | SQL_FD_FETCH_RELATIVE | SQL_FD_FETCH_BOOKMARK;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_FILE_USAGE:
        {
            hVal = SQL_FILE_NOT_SUPPORTED;
            rc = shortInfoResponse(hVal, phVal, pcbLen, piRetType);
            break;
        }

        case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1:
        {
            iVal = SQL_CA1_NEXT | SQL_CA1_BULK_ADD;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2:
        {
            iVal = SQL_CA2_READ_ONLY_CONCURRENCY | SQL_CA2_MAX_ROWS_SELECT | SQL_CA2_CRC_EXACT;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_GETDATA_EXTENSIONS:
        {
            iVal = SQL_GD_ANY_COLUMN
                    | SQL_GD_ANY_ORDER | SQL_GD_BOUND;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_GROUP_BY:
        {
            hVal = SQL_GB_GROUP_BY_EQUALS_SELECT;
            rc = shortInfoResponse(hVal, phVal, pcbLen, piRetType);
            break;
        }

        case SQL_IDENTIFIER_CASE:
        {
            hVal = SQL_IC_LOWER;
            rc = shortInfoResponse(hVal, phVal, pcbLen, piRetType);
            break;
        }

        case SQL_IDENTIFIER_QUOTE_CHAR:
        {
            rc = strInfoResponse("\"", pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_INSERT_STATEMENT:
        {
            iVal = SQL_IS_INSERT_LITERALS
                    | SQL_IS_INSERT_SEARCHED | SQL_IS_SELECT_INTO;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_KEYWORDS:
        {
            char *pKeywords = "ANALYSE,ANALYZE,ARRAY,ASYMMETRIC,BINARY,CURRENT_ROLE,DO,FREEZE,ILIKE,ISNULL,LIMIT,LOCALTIME,LOCALTIMESTAMP,NEW,NOTNULL,OFF,OFFSET,OLD,PLACING,SIMILAR,SYMMETRIC,VERBOSE";
            rc = strInfoResponse(pKeywords, pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_LOCK_TYPES:
        {
            iVal = SQL_LCK_NO_CHANGE;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_MAX_QUALIFIER_NAME_LEN: /* SQL_MAX_CATALOG_NAME_LEN */
        case SQL_MAX_COLUMN_NAME_LEN:
        case SQL_MAX_CURSOR_NAME_LEN:
        case SQL_MAX_IDENTIFIER_LEN:
        case SQL_MAX_PROCEDURE_NAME_LEN:
        case SQL_MAX_OWNER_NAME_LEN: /* SQL_MAX_SCHEMA_NAME_LEN */
        case SQL_MAX_TABLE_NAME_LEN:
        case SQL_MAX_USER_NAME_LEN:
        {
            hVal = MAX_IDEN_LEN - 2; // 127
            rc = shortInfoResponse(hVal, phVal, pcbLen, piRetType);
            break;
        }

        case SQL_MAX_INDEX_SIZE:
        {
            iVal = 0;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_NON_NULLABLE_COLUMNS:
        {
            hVal = SQL_NNC_NON_NULL;
            rc = shortInfoResponse(hVal, phVal, pcbLen, piRetType);
            break;
        }

        case SQL_NULL_COLLATION:
        {
            hVal = SQL_NC_HIGH;
            rc = shortInfoResponse(hVal, phVal, pcbLen, piRetType);
            break;
        }

        case SQL_NUMERIC_FUNCTIONS:
        {
            iVal = SQL_FN_NUM_ABS
                     | SQL_FN_NUM_ACOS 
                     | SQL_FN_NUM_ASIN 
                     | SQL_FN_NUM_ATAN 
                     | SQL_FN_NUM_ATAN2
                     | SQL_FN_NUM_CEILING 
                     | SQL_FN_NUM_COS 
                     | SQL_FN_NUM_COT 
                     | SQL_FN_NUM_DEGREES
                     | SQL_FN_NUM_EXP 
                     | SQL_FN_NUM_FLOOR
                     | SQL_FN_NUM_LOG 
                     | SQL_FN_NUM_LOG10
                     | SQL_FN_NUM_MOD 
                     | SQL_FN_NUM_PI 
                     | SQL_FN_NUM_POWER 
                     | SQL_FN_NUM_RADIANS
                     | SQL_FN_NUM_ROUND 
                     | SQL_FN_NUM_SIGN 
                     | SQL_FN_NUM_SIN 
                     | SQL_FN_NUM_SQRT
                     | SQL_FN_NUM_TAN  
                     | SQL_FN_NUM_TRUNCATE;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_ODBC_API_CONFORMANCE:
        {
            hVal = SQL_OAC_LEVEL2;
            rc = shortInfoResponse(hVal, phVal, pcbLen, piRetType);
            break;
        }

        case SQL_ODBC_INTERFACE_CONFORMANCE:
        {
            iVal = SQL_OIC_CORE;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_ODBC_SAG_CLI_CONFORMANCE:
        {
            hVal = SQL_OSCC_COMPLIANT;
            rc = shortInfoResponse(hVal, phVal, pcbLen, piRetType);
            break;
        }

        case SQL_ODBC_SQL_CONFORMANCE:
        {
            hVal = SQL_OSC_CORE;
            rc = shortInfoResponse(hVal, phVal, pcbLen, piRetType);
            break;
        }

        case SQL_OJ_CAPABILITIES:
        {
            iVal = SQL_OJ_LEFT
                     | SQL_OJ_RIGHT | SQL_OJ_FULL | SQL_OJ_NESTED | SQL_OJ_NOT_ORDERED | SQL_OJ_INNER
                     | SQL_OJ_ALL_COMPARISON_OPS;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_OWNER_TERM: /* SQL_SCHEMA_TERM */
        {
            rc = strInfoResponse("schema", pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_OWNER_USAGE: /* SQL_SCHEMA_USAGE */
        {
            iVal = SQL_OU_DML_STATEMENTS
                     | SQL_OU_PROCEDURE_INVOCATION | SQL_OU_TABLE_DEFINITION | SQL_OU_INDEX_DEFINITION
                     | SQL_OU_PRIVILEGE_DEFINITION;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_PARAM_ARRAY_ROW_COUNTS:
        {
            iVal = SQL_PARC_NO_BATCH;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_PARAM_ARRAY_SELECTS:
        {
            iVal = SQL_PAS_NO_SELECT;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_POS_OPERATIONS:
        {
            iVal = SQL_POS_POSITION
                    | SQL_POS_REFRESH | SQL_POS_UPDATE | SQL_POS_DELETE | SQL_POS_ADD;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_POSITIONED_STATEMENTS:
        {
            iVal = SQL_PS_POSITIONED_DELETE | SQL_PS_POSITIONED_UPDATE | SQL_PS_SELECT_FOR_UPDATE;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_PROCEDURE_TERM:
        {
            rc = strInfoResponse("procedure", pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_QUOTED_IDENTIFIER_CASE:
        {
            if(pConn->isConnectionOpen())
            {
                getGucVariableVal(pConn, "downcase_delimited_identifier",szSrvrBuf,sizeof(szSrvrBuf));

                if(_stricmp(szSrvrBuf,"off") == 0)
                    hVal = SQL_IC_SENSITIVE;
                else
                    hVal = SQL_IC_LOWER;
            }
            else
                hVal = SQL_IC_LOWER;

            rc = shortInfoResponse(hVal, phVal, pcbLen, piRetType);
            break;
        }

        case SQL_SCROLL_OPTIONS:
        {
            iVal = SQL_SO_FORWARD_ONLY
                    | SQL_SO_STATIC;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_SCROLL_CONCURRENCY:
        {
            iVal = SQL_SCCO_READ_ONLY
                    | SQL_SCCO_OPT_VALUES;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_SEARCH_PATTERN_ESCAPE:
        {
            rc = strInfoResponse("\\", pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_SERVER_NAME:
        {
            rc = strInfoResponse((char *)((pConn->pConnectProps) ? pConn->pConnectProps->szHost : ""),
                                    pVal, cbLen, pcbLen, piRetType);

            break;
        }

        case SQL_SQL_CONFORMANCE:
        {
            iVal = SQL_SC_SQL92_ENTRY;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_SQL92_DATETIME_FUNCTIONS:
        {
            iVal = SQL_SDF_CURRENT_DATE | SQL_SDF_CURRENT_TIME | SQL_SDF_CURRENT_TIMESTAMP;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_SQL92_FOREIGN_KEY_DELETE_RULE:
        {
            iVal = SQL_SFKD_CASCADE | SQL_SFKD_NO_ACTION | SQL_SFKD_SET_DEFAULT | SQL_SFKD_SET_NULL;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_SQL92_FOREIGN_KEY_UPDATE_RULE:
        {
            iVal = SQL_SFKU_CASCADE | SQL_SFKU_NO_ACTION | SQL_SFKU_SET_DEFAULT | SQL_SFKU_SET_NULL;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_SQL92_GRANT:
        {
            iVal = SQL_SG_WITH_GRANT_OPTION
                     | SQL_SG_DELETE_TABLE | SQL_SG_INSERT_TABLE | SQL_SG_INSERT_COLUMN | SQL_SG_REFERENCES_TABLE
                     | SQL_SG_SELECT_TABLE | SQL_SG_UPDATE_TABLE | SQL_SG_UPDATE_COLUMN;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_SQL92_NUMERIC_VALUE_FUNCTIONS:
        {
            iVal = SQL_SNVF_BIT_LENGTH | SQL_SNVF_CHAR_LENGTH | SQL_SNVF_CHARACTER_LENGTH | SQL_SNVF_EXTRACT
                    | SQL_SNVF_OCTET_LENGTH | SQL_SNVF_POSITION;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_SQL92_PREDICATES:
        {
            iVal = SQL_SP_EXISTS
                     | SQL_SP_ISNOTNULL | SQL_SP_ISNULL | SQL_SP_OVERLAPS | SQL_SP_UNIQUE | SQL_SP_LIKE
                     | SQL_SP_IN | SQL_SP_BETWEEN | SQL_SP_COMPARISON | SQL_SP_QUANTIFIED_COMPARISON;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_SQL92_RELATIONAL_JOIN_OPERATORS:
        {
            iVal = SQL_SRJO_CROSS_JOIN | SQL_SRJO_EXCEPT_JOIN | SQL_SRJO_FULL_OUTER_JOIN | SQL_SRJO_INNER_JOIN
                     | SQL_SRJO_INTERSECT_JOIN | SQL_SRJO_LEFT_OUTER_JOIN | SQL_SRJO_NATURAL_JOIN
                     | SQL_SRJO_RIGHT_OUTER_JOIN | SQL_SRJO_UNION_JOIN;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_SQL92_REVOKE:
        {
            iVal = SQL_SR_GRANT_OPTION_FOR
                     | SQL_SR_CASCADE | SQL_SR_RESTRICT | SQL_SR_DELETE_TABLE | SQL_SR_INSERT_TABLE
                     | SQL_SR_REFERENCES_TABLE | SQL_SR_SELECT_TABLE | SQL_SR_UPDATE_TABLE | SQL_SR_UPDATE_COLUMN;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_SQL92_ROW_VALUE_CONSTRUCTOR:
        {
            iVal = SQL_SRVC_VALUE_EXPRESSION | SQL_SRVC_NULL;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_SQL92_STRING_FUNCTIONS:
        {
            iVal = SQL_SSF_CONVERT
                     | SQL_SSF_LOWER | SQL_SSF_UPPER | SQL_SSF_SUBSTRING | SQL_SSF_TRANSLATE
                     | SQL_SSF_TRIM_BOTH | SQL_SSF_TRIM_LEADING | SQL_SSF_TRIM_TRAILING;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_SQL92_VALUE_EXPRESSIONS:
        {
            iVal = SQL_SVE_CASE
                    | SQL_SVE_CAST | SQL_SVE_COALESCE | SQL_SVE_NULLIF;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_STANDARD_CLI_CONFORMANCE:
        {
            iVal = SQL_SCC_ISO92_CLI;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_STATIC_CURSOR_ATTRIBUTES1:
        {
            iVal = SQL_CA1_NEXT
                     | SQL_CA1_ABSOLUTE | SQL_CA1_RELATIVE | SQL_CA1_BOOKMARK | SQL_CA1_LOCK_NO_CHANGE
                     | SQL_CA1_POS_POSITION | SQL_CA1_POS_UPDATE | SQL_CA1_POS_DELETE | SQL_CA1_POS_REFRESH
                     | SQL_CA1_POSITIONED_UPDATE | SQL_CA1_POSITIONED_DELETE | SQL_CA1_SELECT_FOR_UPDATE
                     | SQL_CA1_BULK_ADD;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_STATIC_CURSOR_ATTRIBUTES2:
        {
            iVal = SQL_CA2_READ_ONLY_CONCURRENCY | SQL_CA2_OPT_VALUES_CONCURRENCY | SQL_CA2_CRC_EXACT
                    | SQL_CA2_SIMULATE_TRY_UNIQUE;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_STRING_FUNCTIONS:
        {
            iVal =  SQL_FN_STR_ASCII
                     | SQL_FN_STR_BIT_LENGTH
                     | SQL_FN_STR_CHAR
                     | SQL_FN_STR_CHAR_LENGTH 
                     | SQL_FN_STR_CHARACTER_LENGTH 
                     | SQL_FN_STR_CONCAT
                     | SQL_FN_STR_LCASE
                     | SQL_FN_STR_LENGTH
                     | SQL_FN_STR_LOCATE_2 
                     | SQL_FN_STR_LTRIM 
                     | SQL_FN_STR_OCTET_LENGTH
                     | SQL_FN_STR_POSITION
                     | SQL_FN_STR_REPEAT
                     | SQL_FN_STR_REPLACE 
                     | SQL_FN_STR_RTRIM 
                     | SQL_FN_STR_SUBSTRING 
                     | SQL_FN_STR_UCASE;

            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_SUBQUERIES:
        {
            iVal = SQL_SQ_COMPARISON
                    | SQL_SQ_EXISTS | SQL_SQ_IN | SQL_SQ_QUANTIFIED | SQL_SQ_CORRELATED_SUBQUERIES;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_SYSTEM_FUNCTIONS:
        {
            iVal = SQL_FN_SYS_DBNAME
                    | SQL_FN_SYS_IFNULL
                    | SQL_FN_SYS_USERNAME;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_TABLE_TERM:
        {
            rc = strInfoResponse("table", pVal, cbLen, pcbLen, piRetType);
            break;
        }

        case SQL_TIMEDATE_FUNCTIONS:
        {
            iVal =  SQL_FN_TD_CURRENT_DATE
                     | SQL_FN_TD_CURRENT_TIME
                     | SQL_FN_TD_CURRENT_TIMESTAMP
                     | SQL_FN_TD_CURDATE  
                     | SQL_FN_TD_CURTIME 
                     | SQL_FN_TD_EXTRACT
                     | SQL_FN_TD_NOW;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_TXN_CAPABLE:
        {
            hVal = SQL_TC_ALL;
            rc = shortInfoResponse(hVal, phVal, pcbLen, piRetType);
            break;
        }

        case SQL_TXN_ISOLATION_OPTION:
        {
            iVal = SQL_TXN_READ_UNCOMMITTED | SQL_TXN_READ_COMMITTED | SQL_TXN_REPEATABLE_READ
                    | SQL_TXN_SERIALIZABLE;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_UNION:
        {
            iVal = SQL_U_UNION | SQL_U_UNION_ALL;
            rc = integerInfoResponse(iVal, piVal, pcbLen, piRetType);
            break;
        }

        case SQL_USER_NAME:
        {
            rc = strInfoResponse((char *)((pConn->pConnectProps) ? pConn->pConnectProps->szUser : ""),
                                    pVal, cbLen, pcbLen, piRetType);

            break;
        }

        case SQL_XOPEN_CLI_YEAR:
        {
            rc = strInfoResponse("1995", pVal, cbLen, pcbLen, piRetType);

            break;
        }

        default: 
        {
            rc = SQL_ERROR;
            addError(&pConn->pErrorList,"HYC00", "Optional field not implemented.", 0, NULL);
            goto error; 
        }
     } // Switch

    // Add warning
    if(rc == SQL_SUCCESS_WITH_INFO)
        addWarning(&pConn->pErrorList,"01004", "String data, right truncated", 0, NULL);

error:

    return rc;
}