in src/odbc/rsodbc/rscatalog.cpp [1281:1866]
SQLRETURN SQL_API RsCatalog::RS_SQLProcedureColumns(SQLHSTMT phstmt,
SQLCHAR *pCatalogName,
SQLSMALLINT cbCatalogName,
SQLCHAR *pSchemaName,
SQLSMALLINT cbSchemaName,
SQLCHAR *pProcName,
SQLSMALLINT cbProcName,
SQLCHAR *pColumnName,
SQLSMALLINT cbColumnName)
{
SQLRETURN rc = SQL_SUCCESS;
RS_STMT_INFO *pStmt = (RS_STMT_INFO *)phstmt;
char szCatalogQuery[MAX_CATALOG_QUERY_LEN];
std::string procedureColQuery = "";
char catalogFilter[MAX_LARGE_TEMP_BUF_LEN];
char filterClause[MAX_CATALOG_QUERY_FILTER_LEN];
// String unknownColumnSize = "2147483647";
if(!VALID_HSTMT(phstmt))
{
rc = SQL_INVALID_HANDLE;
goto error;
}
// Clear error list
pStmt->pErrorList = clearErrorList(pStmt->pErrorList);
if(!checkForValidCatalogName(pStmt, pCatalogName))
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HYC00", "Optional feature not implemented::RS_SQLProcedureColumns", 0, NULL);
goto error;
}
getCatalogFilterCondition(catalogFilter, MAX_LARGE_TEMP_BUF_LEN, pStmt, (char *)pCatalogName, cbCatalogName,
TRUE, NULL);
procedureColQuery.append(
"SELECT PROCEDURE_CAT , PROCEDURE_SCHEM , PROCEDURE_NAME, COLUMN_NAME, "
" COLUMN_TYPE, DATA_TYPE, TYPE_NAME, COLUMN_SIZE , LENGTH AS BUFFER_LENGTH, DECIMAL_DIGITS , "
" NUM_PREC_RADIX, NULLABLE, REMARKS, COLUMN_DEF, SQL_DATA_TYPE, SQL_DATETIME_SUB, "
" CHAR_OCTET_LENGTH, ORDINAL_POSITION, IS_NULLABLE "
" FROM (");
procedureColQuery.append("SELECT current_database() AS PROCEDURE_CAT, "
" n.nspname as PROCEDURE_SCHEM, "
" p.proname AS PROCEDURE_NAME, "
" CAST(CASE ((array_upper(proargnames, 0) - array_lower(proargnames, 0)) > 0) "
" WHEN 't' THEN proargnames[array_upper(proargnames, 1)] "
" ELSE '' "
" END AS VARCHAR(256)) AS COLUMN_NAME, "
" CAST(CASE p.proretset "
" WHEN 't' THEN 3 "
" ELSE 0 "
" END AS SMALLINT) AS COLUMN_TYPE, "
" CAST(CASE pg_catalog.format_type(p.prorettype, NULL) "
" WHEN 'text' THEN 12 "
" WHEN 'bit' THEN -7 "
" WHEN 'bool' THEN -7 "
" WHEN 'boolean' THEN -7 "
" WHEN 'varchar' THEN 12 "
" WHEN 'character varying' THEN 12 "
" WHEN '\"char\"' THEN 1"
" WHEN 'char' THEN 1 "
" WHEN 'character' THEN 1 "
" WHEN 'nchar' THEN 1 "
" WHEN 'bpchar' THEN 1 "
" WHEN 'nvarchar' THEN 12 "
" WHEN 'date' THEN 91 "
" WHEN 'time' THEN 92 "
" WHEN 'time without time zone' THEN 92 "
" WHEN 'timetz' THEN 92 "
" WHEN 'time with time zone' THEN 92 "
" WHEN 'timestamp' THEN 93 "
" WHEN 'timestamp without time zone' THEN 93 "
" WHEN 'timestamptz' THEN 93 "
" WHEN 'timestamp with time zone' THEN 93 "
" WHEN 'smallint' THEN 5 "
" WHEN 'int2' THEN 5 "
" WHEN 'integer' THEN 4 "
" WHEN 'int' THEN 4 "
" WHEN 'int4' THEN 4 "
" WHEN 'bigint' THEN -5 "
" WHEN 'int8' THEN -5 "
" WHEN 'real' THEN 7 "
" WHEN 'float4' THEN 7 "
" WHEN 'double precision' THEN 6 "
" WHEN 'float8' THEN 6 "
" WHEN 'float' THEN 6 "
" WHEN 'decimal' THEN 3 "
" WHEN 'numeric' THEN 2 "
" WHEN '_float4' THEN 2003 "
" WHEN '_aclitem' THEN 2003 "
" WHEN '_text' THEN 2003 "
" WHEN 'bytea' THEN -2 "
" WHEN 'oid' THEN -5 "
" WHEN 'name' THEN 12 "
" WHEN '_int4' THEN 2003 "
" WHEN '_int2' THEN 2003 "
" WHEN 'ARRAY' THEN 2003 "
" WHEN 'geometry' THEN -4 "
" WHEN 'super' THEN -1 "
" WHEN 'varbyte' THEN -4 "
" WHEN 'geography' THEN -4 "
" WHEN 'intervaly2m' THEN 107 "
" WHEN 'intervald2s' THEN 110 "
" ELSE 0 "
" END AS SMALLINT) AS DATA_TYPE, "
" pg_catalog.format_type(p.prorettype, NULL) AS TYPE_NAME, "
" CASE pg_catalog.format_type(p.prorettype, NULL) "
" WHEN 'text' THEN NULL "
" WHEN 'varchar' THEN NULL "
" WHEN 'character varying' THEN NULL "
" WHEN '\"char\"' THEN NULL "
" WHEN 'character' THEN NULL "
" WHEN 'nchar' THEN NULL "
" WHEN 'bpchar' THEN NULL "
" WHEN 'nvarchar' THEN NULL "
" WHEN 'date' THEN 10 "
" WHEN 'time' THEN 15 "
" WHEN 'time without time zone' THEN 15 "
" WHEN 'timetz' THEN 21 "
" WHEN 'time with time zone' THEN 21 "
" WHEN 'timestamp' THEN 29 "
" WHEN 'timestamp without time zone' THEN 29 "
" WHEN 'timestamptz' THEN 35 "
" WHEN 'timestamp with time zone' THEN 35 "
" WHEN 'smallint' THEN 5 "
" WHEN 'int2' THEN 5 "
" WHEN 'integer' THEN 10 "
" WHEN 'int' THEN 10 "
" WHEN 'int4' THEN 10 "
" WHEN 'bigint' THEN 19 "
" WHEN 'int8' THEN 19 "
" WHEN 'decimal' THEN 38 "
" WHEN 'real' THEN 24 "
" WHEN 'float4' THEN 53 "
" WHEN 'double precision' THEN 53 "
" WHEN 'float8' THEN 53 "
" WHEN 'float' THEN 53 "
" WHEN 'geometry' THEN NULL "
" WHEN 'super' THEN 4194304 "
" WHEN 'varbyte' THEN NULL "
" WHEN 'geography' THEN NULL "
" WHEN 'intervaly2m' THEN 32 "
" WHEN 'intervald2s' THEN 64 "
" ELSE 2147483647 "
" END AS COLUMN_SIZE, "
" CASE pg_catalog.format_type(p.prorettype, NULL) "
" WHEN 'text' THEN NULL "
" WHEN 'varchar' THEN NULL "
" WHEN 'character varying' THEN NULL "
" WHEN '\"char\"' THEN NULL "
" WHEN 'character' THEN NULL "
" WHEN 'nchar' THEN NULL "
" WHEN 'bpchar' THEN NULL "
" WHEN 'nvarchar' THEN NULL "
" WHEN 'date' THEN 6 "
" WHEN 'time' THEN 15 "
" WHEN 'time without time zone' THEN 15 "
" WHEN 'timetz' THEN 21 "
" WHEN 'time with time zone' THEN 21 "
" WHEN 'timestamp' THEN 6 "
" WHEN 'timestamp without time zone' THEN 6 "
" WHEN 'timestamptz' THEN 35 "
" WHEN 'timestamp with time zone' THEN 35 "
" WHEN 'smallint' THEN 2 "
" WHEN 'int2' THEN 2 "
" WHEN 'integer' THEN 4 "
" WHEN 'int' THEN 4 "
" WHEN 'int4' THEN 4 "
" WHEN 'bigint' THEN 20 "
" WHEN 'int8' THEN 20 "
" WHEN 'decimal' THEN 8 "
" WHEN 'real' THEN 4 "
" WHEN 'float4' THEN 8 "
" WHEN 'double precision' THEN 8 "
" WHEN 'float8' THEN 8 "
" WHEN 'float' THEN 8 "
" WHEN 'geometry' THEN NULL "
" WHEN 'super' THEN 4194304 "
" WHEN 'varbyte' THEN NULL "
" WHEN 'geography' THEN NULL "
" WHEN 'intervaly2m' THEN 32 "
" WHEN 'intervald2s' THEN 64 "
" END AS LENGTH, "
" CAST(CASE pg_catalog.format_type(p.prorettype, NULL) "
" WHEN 'smallint' THEN 0 "
" WHEN 'int2' THEN 0 "
" WHEN 'integer' THEN 0 "
" WHEN 'int' THEN 0 "
" WHEN 'int4' THEN 0 "
" WHEN 'bigint' THEN 0 "
" WHEN 'int8' THEN 0 "
" WHEN 'decimal' THEN 0 "
" WHEN 'real' THEN 8 "
" WHEN 'float4' THEN 8 "
" WHEN 'double precision' THEN 17 "
" WHEN 'float' THEN 17 "
" WHEN 'float8' THEN 17 "
" WHEN 'time' THEN 6 "
" WHEN 'time without time zone' THEN 6 "
" WHEN 'timetz' THEN 6 "
" WHEN 'time with time zone' THEN 6 "
" WHEN 'timestamp' THEN 6 "
" WHEN 'timestamp without time zone' THEN 6 "
" WHEN 'timestamptz' THEN 6 "
" WHEN 'timestamp with time zone' THEN 6 "
" WHEN 'intervaly2m' THEN 0 "
" WHEN 'intervald2s' THEN 6 "
" ELSE NULL END AS SMALLINT) AS DECIMAL_DIGITS, "
" 10 AS NUM_PREC_RADIX, "
" CAST(2 AS SMALLINT) AS NULLABLE, "
" CAST('' AS VARCHAR(256)) AS REMARKS, "
" NULL AS COLUMN_DEF, "
" CAST(CASE pg_catalog.format_type(p.prorettype, NULL)"
" WHEN 'text' THEN 12 "
" WHEN 'bit' THEN -7 "
" WHEN 'bool' THEN -7 "
" WHEN 'boolean' THEN -7 "
" WHEN 'varchar' THEN 12 "
" WHEN 'character varying' THEN 12 "
" WHEN '\"char\"' THEN 1"
" WHEN 'char' THEN 1 "
" WHEN 'character' THEN 1 "
" WHEN 'nchar' THEN 1 "
" WHEN 'bpchar' THEN 1 "
" WHEN 'nvarchar' THEN 12 "
" WHEN 'date' THEN 9 "
" WHEN 'time' THEN 9 "
" WHEN 'time without time zone' THEN 9 "
" WHEN 'timetz' THEN 9 "
" WHEN 'time with time zone' THEN 9 "
" WHEN 'timestamp' THEN 9 "
" WHEN 'timestamp without time zone' THEN 9 "
" WHEN 'timestamptz' THEN 9 "
" WHEN 'timestamp with time zone' THEN 9 "
" WHEN 'smallint' THEN 5 "
" WHEN 'int2' THEN 5 "
" WHEN 'integer' THEN 4 "
" WHEN 'int' THEN 4 "
" WHEN 'int4' THEN 4 "
" WHEN 'bigint' THEN -5 "
" WHEN 'int8' THEN -5 "
" WHEN 'real' THEN 7 "
" WHEN 'float4' THEN 7 "
" WHEN 'double precision' THEN 6 "
" WHEN 'float8' THEN 6 "
" WHEN 'float' THEN 6 "
" WHEN 'decimal' THEN 3 "
" WHEN 'numeric' THEN 2 "
" WHEN 'bytea' THEN -2 "
" WHEN 'oid' THEN -5 "
" WHEN 'name' THEN 12 "
" WHEN 'ARRAY' THEN 2003 "
" WHEN 'geometry' THEN -4 "
" WHEN 'super' THEN -1 "
" WHEN 'varbyte' THEN -4 "
" WHEN 'geography' THEN -4 "
" WHEN 'intervaly2m' THEN 107 "
" WHEN 'intervald2s' THEN 110 "
" END AS SMALLINT) AS SQL_DATA_TYPE, "
" CAST(NULL AS SMALLINT) AS SQL_DATETIME_SUB, "
" CAST(NULL AS SMALLINT) AS CHAR_OCTET_LENGTH, "
" CAST(0 AS SMALLINT) AS ORDINAL_POSITION, "
" CAST('' AS VARCHAR(256)) AS IS_NULLABLE, "
" p.prooid as PROOID, "
" -1 AS PROARGINDEX "
" FROM pg_catalog.pg_proc_info p LEFT JOIN pg_namespace n ON n.oid = p.pronamespace "
" WHERE pg_catalog.format_type(p.prorettype, NULL) != 'void' ");
procedureColQuery.append(catalogFilter);
filterClause[0] = '\0';
addLikeOrEqualFilterCondition(pStmt, filterClause, "n.nspname", (char *)pSchemaName, cbSchemaName);
addLikeOrEqualFilterCondition(pStmt, filterClause, "proname", (char *)pProcName, cbProcName);
addLikeOrEqualFilterCondition(pStmt, filterClause, "COLUMN_NAME", (char *)pColumnName, cbColumnName);
procedureColQuery.append(filterClause);
procedureColQuery.append(" UNION ALL ");
procedureColQuery.append(" SELECT DISTINCT current_database() AS PROCEDURE_CAT, "
" PROCEDURE_SCHEM, "
" PROCEDURE_NAME, "
"CAST(CASE (char_length(COLUMN_NAME) > 0) WHEN 't' THEN COLUMN_NAME "
"ELSE '' "
"END AS VARCHAR(256)) AS COLUMN_NAME, "
" CAST( CASE COLUMN_TYPE "
" WHEN 105 THEN 1 "
" WHEN 98 THEN 2 "
" WHEN 111 THEN 4 "
" ELSE 0 END AS SMALLINT) AS COLUMN_TYPE, "
" CAST(CASE DATA_TYPE "
" WHEN 'text' THEN 12 "
" WHEN 'bit' THEN -7 "
" WHEN 'bool' THEN -7 "
" WHEN 'boolean' THEN -7 "
" WHEN 'varchar' THEN 12 "
" WHEN 'character varying' THEN 12 "
" WHEN '\"char\"' THEN 1 "
" WHEN 'char' THEN 1 "
" WHEN 'character' THEN 1 "
" WHEN 'nchar' THEN 1 "
" WHEN 'bpchar' THEN 1 "
" WHEN 'nvarchar' THEN 12 "
" WHEN 'date' THEN 91 "
" WHEN 'time' THEN 92 "
" WHEN 'time without time zone' THEN 92 "
" WHEN 'timetz' THEN 92 "
" WHEN 'time with time zone' THEN 92 "
" WHEN 'timestamp' THEN 93 "
" WHEN 'timestamp without time zone' THEN 93 "
" WHEN 'timestamptz' THEN 93 "
" WHEN 'timestamp with time zone' THEN 93 "
" WHEN 'smallint' THEN 5 "
" WHEN 'int2' THEN 5 "
" WHEN 'integer' THEN 4 "
" WHEN 'int' THEN 4 "
" WHEN 'int4' THEN 4 "
" WHEN 'bigint' THEN -5 "
" WHEN 'int8' THEN -5 "
" WHEN 'real' THEN 7 "
" WHEN 'float4' THEN 7 "
" WHEN 'double precision' THEN 6 "
" WHEN 'float8' THEN 6 "
" WHEN 'float' THEN 6 "
" WHEN 'decimal' THEN 3 "
" WHEN 'numeric' THEN 2 "
" WHEN 'bytea' THEN -2 "
" WHEN 'oid' THEN -5 "
" WHEN 'name' THEN 12 "
" WHEN 'ARRAY' THEN 2003 "
" WHEN 'geometry' THEN -4 "
" WHEN 'super' THEN -1 "
" WHEN 'varbyte' THEN -4 "
" WHEN 'geography' THEN -4 "
" WHEN 'intervaly2m' THEN 107 "
" WHEN 'intervald2s' THEN 110 "
" ELSE 0 "
" END AS SMALLINT) AS DATA_TYPE, "
" TYPE_NAME, "
" CASE COLUMN_SIZE "
" WHEN 'text' THEN COLUMN_BYTES "
" WHEN 'varchar' THEN COLUMN_BYTES "
" WHEN 'character varying' THEN COLUMN_BYTES "
" WHEN '\"char\"' THEN COLUMN_BYTES "
" WHEN 'character' THEN COLUMN_BYTES "
" WHEN 'nchar' THEN COLUMN_BYTES "
" WHEN 'bpchar' THEN COLUMN_BYTES "
" WHEN 'nvarchar' THEN COLUMN_BYTES "
" WHEN 'date' THEN 10 "
" WHEN 'time' THEN 15 "
" WHEN 'time without time zone' THEN 15 "
" WHEN 'timetz' THEN 21 "
" WHEN 'time with time zone' THEN 21 "
" WHEN 'timestamp' THEN 6 "
" WHEN 'timestamp without time zone' THEN 6 "
" WHEN 'timestamptz' THEN 35 "
" WHEN 'timestamp with time zone' THEN 35 "
" WHEN 'smallint' THEN 5 "
" WHEN 'int2' THEN 5 "
" WHEN 'integer' THEN 10 "
" WHEN 'int' THEN 10 "
" WHEN 'int4' THEN 10 "
" WHEN 'bigint' THEN 19 "
" WHEN 'int8' THEN 19 "
" WHEN 'decimal' THEN 38 "
" WHEN 'real' THEN 24 "
" WHEN 'float4' THEN 53 "
" WHEN 'double precision' THEN 53 "
" WHEN 'float8' THEN 53 "
" WHEN 'float' THEN 53 "
" WHEN 'numeric' THEN NUMERIC_PRECISION "
" WHEN 'geometry' THEN NULL "
" WHEN 'super' THEN 4194304 "
" WHEN 'varbyte' THEN NULL "
" WHEN 'geography' THEN NULL "
" WHEN 'intervaly2m' THEN 32 "
" WHEN 'intervald2s' THEN 64 "
" ELSE 2147483647 "
" END AS COLUMN_SIZE, "
" CASE LENGTH "
" WHEN 'text' THEN COLUMN_BYTES "
" WHEN 'varchar' THEN COLUMN_BYTES "
" WHEN 'character varying' THEN COLUMN_BYTES "
" WHEN '\"char\"' THEN COLUMN_BYTES "
" WHEN 'character' THEN COLUMN_BYTES "
" WHEN 'nchar' THEN COLUMN_BYTES "
" WHEN 'bpchar' THEN COLUMN_BYTES "
" WHEN 'nvarchar' THEN COLUMN_BYTES "
" WHEN 'date' THEN 6 "
" WHEN 'time' THEN 6 "
" WHEN 'time without time zone' THEN 6 "
" WHEN 'timetz' THEN 6 "
" WHEN 'time with time zone' THEN 6 "
" WHEN 'timestamp' THEN 6 "
" WHEN 'timestamp without time zone' THEN 6 "
" WHEN 'timestamptz' THEN 6 "
" WHEN 'timestamp with time zone' THEN 6 "
" WHEN 'smallint' THEN 2 "
" WHEN 'int2' THEN 2 "
" WHEN 'integer' THEN 4 "
" WHEN 'int' THEN 4 "
" WHEN 'int4' THEN 4 "
" WHEN 'bigint' THEN 20 "
" WHEN 'int8' THEN 20 "
" WHEN 'decimal' THEN 8 "
" WHEN 'real' THEN 4 "
" WHEN 'float4' THEN 8 "
" WHEN 'double precision' THEN 8 "
" WHEN 'float8' THEN 8 "
" WHEN 'float' THEN 8 "
" WHEN 'geometry' THEN NULL "
" WHEN 'super' THEN 4194304 "
" WHEN 'varbyte' THEN NULL "
" WHEN 'geography' THEN NULL "
" WHEN 'intervaly2m' THEN 32 "
" WHEN 'intervald2s' THEN 64 "
" END AS LENGTH, "
" CAST(CASE DECIMAL_DIGITS "
" WHEN 'smallint' THEN 0 "
" WHEN 'int2' THEN 0 "
" WHEN 'integer' THEN 0 "
" WHEN 'int' THEN 0 "
" WHEN 'int4' THEN 0 "
" WHEN 'bigint' THEN 0 "
" WHEN 'int8' THEN 0 "
" WHEN 'decimal' THEN 0 "
" WHEN 'real' THEN 8 "
" WHEN 'float4' THEN 8 "
" WHEN 'double precision' THEN 17 "
" WHEN 'float' THEN 17 "
" WHEN 'float8' THEN 17 "
" WHEN 'numeric' THEN NUMERIC_SCALE "
" WHEN 'time' THEN 6 "
" WHEN 'time without time zone' THEN 6 "
" WHEN 'timetz' THEN 6 "
" WHEN 'time with time zone' THEN 6 "
" WHEN 'timestamp' THEN 6 "
" WHEN 'timestamp without time zone' THEN 6 "
" WHEN 'timestamptz' THEN 6 "
" WHEN 'timestamp with time zone' THEN 6 "
" WHEN 'intervaly2m' THEN 0 "
" WHEN 'intervald2s' THEN 6 "
" ELSE NULL END AS SMALLINT) AS DECIMAL_DIGITS, "
" 10 AS NUM_PREC_RADIX, "
" CAST(2 AS SMALLINT) AS NULLABLE, "
" CAST(''AS VARCHAR(256)) AS REMARKS, "
" NULL AS COLUMN_DEF,"
" CAST( CASE SQL_DATA_TYPE"
" WHEN 'text' THEN 12 "
" WHEN 'bit' THEN -7 "
" WHEN 'bool' THEN -7 "
" WHEN 'boolean' THEN -7 "
" WHEN 'varchar' THEN 12 "
" WHEN 'character varying' THEN 12 "
" WHEN '\"char\"' THEN 1 "
" WHEN 'char' THEN 1 "
" WHEN 'character' THEN 1 "
" WHEN 'nchar' THEN 1 "
" WHEN 'bpchar' THEN 1 "
" WHEN 'nvarchar' THEN 12 "
" WHEN 'date' THEN 9 "
" WHEN 'time' THEN 9 "
" WHEN 'time without time zone' THEN 9 "
" WHEN 'timetz' THEN 9 "
" WHEN 'time with time zone' THEN 9 "
" WHEN 'timestamp' THEN 9 "
" WHEN 'timestamp without time zone' THEN 9 "
" WHEN 'timestamptz' THEN 9 "
" WHEN 'timestamp with time zone' THEN 9 "
" WHEN 'smallint' THEN 5 "
" WHEN 'int2' THEN 5 "
" WHEN 'integer' THEN 4 "
" WHEN 'int' THEN 4 "
" WHEN 'int4' THEN 4 "
" WHEN 'bigint' THEN -5 "
" WHEN 'int8' THEN -5 "
" WHEN 'real' THEN 7 "
" WHEN 'float4' THEN 7 "
" WHEN 'double precision' THEN 6 "
" WHEN 'float8' THEN 6 "
" WHEN 'float' THEN 6 "
" WHEN 'decimal' THEN 3 "
" WHEN 'numeric' THEN 2 "
" WHEN 'bytea' THEN -2 "
" WHEN 'oid' THEN -5 "
" WHEN 'name' THEN 12 "
" WHEN 'ARRAY' THEN 2003 "
" WHEN 'geometry' THEN -4 "
" WHEN 'super' THEN -1 "
" WHEN 'varbyte' THEN -4 "
" WHEN 'geography' THEN -4 "
" WHEN 'intervaly2m' THEN 107 "
" WHEN 'intervald2s' THEN 110 "
" END AS SMALLINT) AS SQL_DATA_TYPE, "
" CAST(NULL AS SMALLINT) AS SQL_DATETIME_SUB, "
" CAST(NULL AS SMALLINT) AS CHAR_OCTET_LENGTH, "
" PROARGINDEX AS ORDINAL_POSITION, "
" CAST(''AS VARCHAR(256)) AS IS_NULLABLE, "
" PROOID, PROARGINDEX "
" FROM ( "
" SELECT current_database() AS PROCEDURE_CAT,"
" n.nspname AS PROCEDURE_SCHEM, "
" proname AS PROCEDURE_NAME, "
" CASE WHEN (proallargtypes is NULL) THEN proargnames[pos+1] "
" ELSE proargnames[pos] END AS COLUMN_NAME,"
" CASE WHEN proargmodes is NULL THEN 105 "
" ELSE CAST(proargmodes[pos] AS INT) END AS COLUMN_TYPE, "
" CASE WHEN proallargtypes is NULL THEN pg_catalog.format_type(proargtypes[pos], NULL)"
" ELSE pg_catalog.format_type(proallargtypes[pos], NULL) END AS DATA_TYPE,"
" CASE WHEN proallargtypes is NULL THEN pg_catalog.format_type(proargtypes[pos], NULL) "
" ELSE pg_catalog.format_type(proallargtypes[pos], NULL) END AS TYPE_NAME,"
" CASE WHEN proallargtypes is NULL THEN pg_catalog.format_type(proargtypes[pos], NULL)"
" ELSE pg_catalog.format_type(proallargtypes[pos], NULL) END AS COLUMN_SIZE,"
" CASE WHEN (proallargtypes IS NOT NULL) and prokind='p' AND proallargtypes[pos] IN (1042, 1700, 1043) "
" THEN (string_to_array(textin(byteaout(substring(probin from 1 for length(probin)-3))),','))[pos]::integer "
" WHEN (proallargtypes IS NULL) AND prokind='p' AND proargtypes[pos] IN (1042,1700,1043) "
" THEN (string_to_array(textin(byteaout(substring(probin FROM 1 FOR length(probin)-3))), ',')) [pos+1]::integer "
" END AS PROBIN_BYTES, "
" CASE "
" WHEN (PROBIN_BYTES IS NOT NULL) "
" AND (proallargtypes[pos] IN (1042, 1043) or proargtypes[pos] in (1042,1043)) "
" THEN PROBIN_BYTES-4 "
" END AS COLUMN_BYTES, "
" CASE WHEN proallargtypes is NULL THEN pg_catalog.format_type(proargtypes[pos], NULL)"
" ELSE pg_catalog.format_type(proallargtypes[pos], NULL) END AS LENGTH,"
" CASE WHEN proallargtypes is NULL THEN pg_catalog.format_type(proargtypes[pos], NULL)"
" ELSE pg_catalog.format_type(proallargtypes[pos], NULL) END AS DECIMAL_DIGITS,"
" CASE WHEN proallargtypes is NULL THEN pg_catalog.format_type(proargtypes[pos], NULL)"
" ELSE pg_catalog.format_type(proallargtypes[pos], NULL) END AS RADIX,"
" CAST(2 AS SMALLINT) AS NULLABLE,"
" CAST(''AS VARCHAR(256)) AS REMARKS,"
" CAST(NULL AS SMALLINT) AS COLUMN_DEF,"
" pg_catalog.format_type(proargtypes[pos], NULL) AS SQL_DATA_TYPE,"
" CAST(NULL AS SMALLINT) AS SQL_DATETIME_SUB,"
" pg_catalog.format_type(proargtypes[pos], NULL) AS CHAR_OCTET_LENGTH,"
" CASE WHEN (proallargtypes is NULL) THEN pos+1"
" WHEN pos = array_upper(proallargtypes, 1) THEN 0"
" ELSE pos END AS ORDINAL_POSITION,"
" CAST('' AS VARCHAR(256)) AS IS_NULLABLE,"
" p.prooid AS PROOID,"
" CASE WHEN (proallargtypes is NULL) THEN pos+1"
" WHEN prokind = 'f' AND pos = array_upper(proallargtypes, 1) THEN 0"
" ELSE pos END AS PROARGINDEX, "
" CASE WHEN (proallargtypes IS NULL AND proargtypes[pos] = 1700 AND prokind='p') OR (proallargtypes IS NOT NULL AND proallargtypes[pos] = 1700 AND prokind='p' AND proallargtypes[pos] = 1700) THEN (PROBIN_BYTES-4)/65536 END as NUMERIC_PRECISION, "
" CASE WHEN (proallargtypes IS NULL AND proargtypes[pos] = 1700 AND prokind='p') OR (proallargtypes IS NOT NULL AND proallargtypes[pos] = 1700 AND prokind='p' AND proallargtypes[pos] = 1700) THEN (((PROBIN_BYTES::numeric-4)/65536 - (PROBIN_BYTES-4)/65536) * 65536)::INT END as NUMERIC_SCALE, "
" p.proname || '_' || p.prooid AS SPECIFIC_NAME "
" FROM (pg_catalog.pg_proc_info p LEFT JOIN pg_namespace n"
" ON n.oid = p.pronamespace)"
" LEFT JOIN (SELECT "
" CASE WHEN (proallargtypes IS NULL) "
" THEN generate_series(array_lower(proargnames, 1), array_upper(proargnames, 1))-1"
" ELSE generate_series(array_lower(proargnames, 1), array_upper(proargnames, 1)+1)-1 "
" END AS pos"
" FROM pg_catalog.pg_proc_info p ) AS s ON (pos >= 0)");
procedureColQuery.append(" WHERE true ");
procedureColQuery.append(catalogFilter);
filterClause[0] = '\0';
addLikeOrEqualFilterCondition(pStmt, filterClause, "n.nspname", (char *)pSchemaName, cbSchemaName);
addLikeOrEqualFilterCondition(pStmt, filterClause, "proname", (char *)pProcName, cbProcName);
addLikeOrEqualFilterCondition(pStmt, filterClause, "COLUMN_NAME", (char *)pColumnName, cbColumnName);
procedureColQuery.append(filterClause);
procedureColQuery.append(" ) AS INPUT_PARAM_TABLE"
" WHERE ORDINAL_POSITION IS NOT NULL"
" ) AS RESULT_SET WHERE (DATA_TYPE != 0 OR (TYPE_NAME IS NOT NULL AND TYPE_NAME != '-'))"
" ORDER BY PROCEDURE_CAT ,PROCEDURE_SCHEM,"
" PROCEDURE_NAME, PROARGINDEX, COLUMN_TYPE DESC"); // PROOID
rs_strncpy(szCatalogQuery, procedureColQuery.c_str(), sizeof(szCatalogQuery));
setCatalogQueryBuf(pStmt, szCatalogQuery);
rc = RsExecute::RS_SQLExecDirect(phstmt, (SQLCHAR *)szCatalogQuery, SQL_NTS, TRUE, FALSE, FALSE, TRUE);
resetCatalogQueryFlag(pStmt);
error:
return rc;
}