SQLRETURN SQL_API RsCatalog::RS_SQLGetTypeInfo()

in src/odbc/rsodbc/rscatalog.cpp [2360:2521]


SQLRETURN  SQL_API RsCatalog::RS_SQLGetTypeInfo(SQLHSTMT phstmt,
                                        SQLSMALLINT hType)
{
    SQLRETURN rc = SQL_SUCCESS;
    RS_STMT_INFO *pStmt = (RS_STMT_INFO *)phstmt;
    char szCatalogQuery[MAX_CATALOG_QUERY_LEN];
    int i; 
    RS_TYPE_INFO typesInfo[MAX_TYPES] = 
    {
        { "boolean", SQL_BIT, 1, "", "", "", SQL_NULLABLE , SQL_FALSE,  SQL_PRED_BASIC , SQL_NULL_DATA , SQL_FALSE, SQL_NULL_DATA , "boolean", 
           0, 0, SQL_BIT, SQL_NULL_DATA, 10, SQL_NULL_DATA
        },
        { "bigint", SQL_BIGINT, 19, "", "", "", SQL_NULLABLE, SQL_FALSE, SQL_SEARCHABLE , SQL_FALSE, SQL_FALSE, SQL_FALSE, "bigint", 
           0, 0, SQL_BIGINT, SQL_NULL_DATA, 10, SQL_NULL_DATA
        },
        {
          "character", SQL_CHAR, 65535, "\\'", "\\'", "length", SQL_NULLABLE, SQL_TRUE, SQL_SEARCHABLE, SQL_NULL_DATA, SQL_FALSE, SQL_NULL_DATA, "char", 
          SQL_NULL_DATA, SQL_NULL_DATA, SQL_CHAR, SQL_NULL_DATA, SQL_NULL_DATA, SQL_NULL_DATA
        },
        {
          "numeric", SQL_NUMERIC, 19, "", "", "precision,scale", SQL_NULLABLE, SQL_FALSE, SQL_SEARCHABLE, SQL_FALSE, SQL_FALSE, SQL_FALSE, "numeric", 
          0, 18, SQL_NUMERIC, SQL_NULL_DATA, 10, SQL_NULL_DATA
        },
        {
          "integer", SQL_INTEGER, 10, "", "", "", SQL_NULLABLE, SQL_FALSE, SQL_SEARCHABLE, SQL_FALSE, SQL_FALSE, SQL_FALSE, "integer", 
          0, 0, SQL_INTEGER, SQL_NULL_DATA, 10, SQL_NULL_DATA
        },
        {
          "smallint", SQL_SMALLINT, 5, "", "", "", SQL_NULLABLE, SQL_FALSE, SQL_SEARCHABLE, SQL_FALSE, SQL_FALSE, SQL_FALSE, "smallint", 
          0, 0, SQL_SMALLINT, SQL_NULL_DATA, 10, SQL_NULL_DATA
        },
		{
          "real", SQL_REAL, 24, "", "", "", SQL_NULLABLE, SQL_FALSE, SQL_SEARCHABLE, SQL_FALSE, SQL_FALSE, SQL_FALSE, "real", 
          SQL_NULL_DATA, SQL_NULL_DATA, SQL_REAL, SQL_NULL_DATA, 2, SQL_NULL_DATA
        },
        {
          "double precision", SQL_DOUBLE, 53, "", "", "", SQL_NULLABLE, SQL_FALSE, SQL_SEARCHABLE, SQL_FALSE, SQL_FALSE, SQL_FALSE, "double precision", 
          SQL_NULL_DATA, SQL_NULL_DATA, SQL_DOUBLE, SQL_NULL_DATA, 2, SQL_NULL_DATA
        },
        {
          "character varying", SQL_VARCHAR , 65535, "\\'", "\\'", "max length", SQL_NULLABLE, SQL_TRUE, SQL_SEARCHABLE, SQL_NULL_DATA, SQL_FALSE, SQL_NULL_DATA, "varchar",
          SQL_NULL_DATA, SQL_NULL_DATA, SQL_VARCHAR, SQL_NULL_DATA, SQL_NULL_DATA, SQL_NULL_DATA
        },
        {
          "date", SQL_TYPE_DATE, 10, "{d \\'", "\\'}", "", SQL_NULLABLE, SQL_FALSE, SQL_SEARCHABLE, SQL_NULL_DATA, SQL_FALSE, SQL_NULL_DATA, "date", 
          SQL_NULL_DATA, SQL_NULL_DATA, SQL_DATE, SQL_CODE_DATE, SQL_NULL_DATA, SQL_NULL_DATA
        },
        {
          "timestamp", SQL_TYPE_TIMESTAMP, 26, "{ts \\'", "\\'}", "", SQL_NULLABLE, SQL_FALSE, SQL_SEARCHABLE, SQL_NULL_DATA, SQL_FALSE, SQL_NULL_DATA, "timestamp", 
          0, 6, SQL_DATE, SQL_CODE_TIMESTAMP, SQL_NULL_DATA, SQL_NULL_DATA
        },
        {
          "time", SQL_TYPE_TIME, 15, "{t \\'", "\\'}", "", SQL_NULLABLE, SQL_FALSE, SQL_SEARCHABLE, SQL_NULL_DATA, SQL_FALSE, SQL_NULL_DATA, "time", 
          0, 6, SQL_DATE, SQL_CODE_TIME, SQL_NULL_DATA, SQL_NULL_DATA
        },
		{
			"timetz", SQL_TYPE_TIME, 21,  "\\'", "\\'", "", SQL_NULLABLE, SQL_FALSE, SQL_SEARCHABLE, SQL_NULL_DATA, SQL_FALSE, SQL_NULL_DATA, "timetz",
			0, 6, SQL_DATE, SQL_CODE_TIME, SQL_NULL_DATA, SQL_NULL_DATA
		},
		{
			"timestamptz", SQL_TYPE_TIMESTAMP, 35,  "\\'", "\\'", "", SQL_NULLABLE, SQL_FALSE, SQL_SEARCHABLE, SQL_NULL_DATA, SQL_FALSE, SQL_NULL_DATA, "timestamptz",
			0, 6, SQL_DATE, SQL_CODE_TIMESTAMP, SQL_NULL_DATA, SQL_NULL_DATA
		},
		{
			"bpchar", SQL_CHAR, 256, "\\'", "\\'", "length", SQL_NULLABLE, SQL_TRUE, SQL_SEARCHABLE, SQL_NULL_DATA, SQL_FALSE, SQL_NULL_DATA, "bpchar",
			SQL_NULL_DATA, SQL_NULL_DATA, SQL_CHAR, SQL_NULL_DATA, SQL_NULL_DATA, SQL_NULL_DATA
		},
		{
			"geometry", SQL_LONGVARBINARY , 1000000, "\\'", "\\'", "max length", SQL_NULLABLE, SQL_TRUE, SQL_SEARCHABLE, SQL_NULL_DATA, SQL_FALSE, SQL_NULL_DATA, "geometry",
			SQL_NULL_DATA, SQL_NULL_DATA, SQL_LONGVARBINARY, SQL_NULL_DATA, SQL_NULL_DATA, SQL_NULL_DATA
		},
		{
			"super", SQL_LONGVARCHAR , 4194304, "\\'", "\\'", "max length", SQL_NULLABLE, SQL_TRUE, SQL_SEARCHABLE, SQL_NULL_DATA, SQL_FALSE, SQL_NULL_DATA, "super",
			SQL_NULL_DATA, SQL_NULL_DATA, SQL_LONGVARCHAR, SQL_NULL_DATA, SQL_NULL_DATA, SQL_NULL_DATA
		},
		{
			"varbyte", SQL_LONGVARBINARY , 1000000, "\\'", "\\'", "max length", SQL_NULLABLE, SQL_TRUE, SQL_SEARCHABLE, SQL_NULL_DATA, SQL_FALSE, SQL_NULL_DATA, "varbyte",
			SQL_NULL_DATA, SQL_NULL_DATA, SQL_LONGVARBINARY, SQL_NULL_DATA, SQL_NULL_DATA, SQL_NULL_DATA
		},
		{
			"geography", SQL_LONGVARBINARY , 1000000, "\\'", "\\'", "max length", SQL_NULLABLE, SQL_FALSE, SQL_SEARCHABLE, SQL_NULL_DATA, SQL_FALSE, SQL_NULL_DATA, "geography",
			SQL_NULL_DATA, SQL_NULL_DATA, SQL_LONGVARBINARY, SQL_NULL_DATA, SQL_NULL_DATA, SQL_NULL_DATA
		},
		{
			"intervaly2m", SQL_INTERVAL_YEAR_TO_MONTH, 32, "\\'", "\\'", "", SQL_NULLABLE, SQL_FALSE, SQL_SEARCHABLE, SQL_NULL_DATA, SQL_FALSE, SQL_NULL_DATA, "intervaly2m",
			0, 0, SQL_INTERVAL, SQL_CODE_YEAR_TO_MONTH, SQL_NULL_DATA, SQL_NULL_DATA
		},
		{
			"intervald2s", SQL_INTERVAL_DAY_TO_SECOND, 64, "\\'", "\\'", "", SQL_NULLABLE, SQL_FALSE, SQL_SEARCHABLE, SQL_NULL_DATA, SQL_FALSE, SQL_NULL_DATA, "intervald2s",
			0, 0, SQL_INTERVAL, SQL_CODE_DAY_TO_SECOND, SQL_NULL_DATA, SQL_NULL_DATA
		}
    };

    if(!VALID_HSTMT(phstmt))
    {
        rc = SQL_INVALID_HANDLE;
        goto error;
    }

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

    rs_strncpy(szCatalogQuery," SELECT ", sizeof(szCatalogQuery));
    if(hType == SQL_ALL_TYPES)
    {
        for(i = 0; i < MAX_TYPES;i++)
        {
            if(i != 0)
                rs_strncat(szCatalogQuery," UNION SELECT ", MAX_CATALOG_QUERY_LEN - strlen(szCatalogQuery));
            addTypeRow(szCatalogQuery, &(typesInfo[i]));
        }
    }
    else
    {
        int found = FALSE;

        // Convert 2.0 date/time types to 3.0 date/time types
        if(hType == SQL_DATE)
            hType = SQL_TYPE_DATE;
        else
        if(hType == SQL_TIMESTAMP)
            hType = SQL_TYPE_TIMESTAMP;
        else
        if(hType == SQL_TIME)
            hType = SQL_TYPE_TIME;
		else
		if (hType == SQL_TINYINT)
			hType = SQL_BIT;


        for(i = 0; i < MAX_TYPES;i++)
        {
            if(typesInfo[i].hType == hType)
            {
                if(found){
                    rs_strncat(szCatalogQuery," UNION SELECT ", MAX_CATALOG_QUERY_LEN - strlen(szCatalogQuery));
                }
                else{
                    found = TRUE;
                }
                addTypeRow(szCatalogQuery, &(typesInfo[i]));
            }
        }

        if(!found)
        {
            rc = SQL_ERROR;
            addError(&pStmt->pErrorList,"HY004", "Invalid SQL data type", 0, NULL);
            goto error; 
        }
    }

    addOrderByClause(szCatalogQuery,"DATA_TYPE"); 

    setCatalogQueryBuf(pStmt, szCatalogQuery);
    rc = RsExecute::RS_SQLExecDirect(phstmt, (SQLCHAR *)szCatalogQuery, SQL_NTS, TRUE, FALSE, FALSE, TRUE);
    resetCatalogQueryFlag(pStmt);

error:

    return rc;
}