aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/odbc/pgtypes.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/odbc/pgtypes.c')
-rw-r--r--src/interfaces/odbc/pgtypes.c1136
1 files changed, 646 insertions, 490 deletions
diff --git a/src/interfaces/odbc/pgtypes.c b/src/interfaces/odbc/pgtypes.c
index ebee8ab262f..a70d989e667 100644
--- a/src/interfaces/odbc/pgtypes.c
+++ b/src/interfaces/odbc/pgtypes.c
@@ -1,17 +1,17 @@
-/* Module: pgtypes.c
+/* Module: pgtypes.c
*
- * Description: This module contains routines for getting information
- * about the supported Postgres data types. Only the function
- * pgtype_to_sqltype() returns an unknown condition. All other
- * functions return a suitable default so that even data types that
- * are not directly supported can be used (it is handled as char data).
+ * Description: This module contains routines for getting information
+ * about the supported Postgres data types. Only the function
+ * pgtype_to_sqltype() returns an unknown condition. All other
+ * functions return a suitable default so that even data types that
+ * are not directly supported can be used (it is handled as char data).
*
- * Classes: n/a
+ * Classes: n/a
*
- * API functions: none
+ * API functions: none
*
- * Comments: See "notice.txt" for copyright and license information.
+ * Comments: See "notice.txt" for copyright and license information.
*
*/
@@ -39,48 +39,48 @@
extern GLOBAL_VALUES globals;
-Int4 getCharPrecision(StatementClass *stmt, Int4 type, int col, int handle_unknown_size_as);
+Int4 getCharPrecision(StatementClass *stmt, Int4 type, int col, int handle_unknown_size_as);
-/* these are the types we support. all of the pgtype_ functions should */
-/* return values for each one of these. */
-/* Even types not directly supported are handled as character types
+/* these are the types we support. all of the pgtype_ functions should */
+/* return values for each one of these. */
+/* Even types not directly supported are handled as character types
so all types should work (points, etc.) */
/* ALL THESE TYPES ARE NO LONGER REPORTED in SQLGetTypeInfo. Instead, all
- the SQL TYPES are reported and mapped to a corresponding Postgres Type
+ the SQL TYPES are reported and mapped to a corresponding Postgres Type
*/
/*
-Int4 pgtypes_defined[] = {
+Int4 pgtypes_defined[] = {
PG_TYPE_CHAR,
PG_TYPE_CHAR2,
PG_TYPE_CHAR4,
- PG_TYPE_CHAR8,
+ PG_TYPE_CHAR8,
PG_TYPE_CHAR16,
- PG_TYPE_NAME,
- PG_TYPE_VARCHAR,
- PG_TYPE_BPCHAR,
+ PG_TYPE_NAME,
+ PG_TYPE_VARCHAR,
+ PG_TYPE_BPCHAR,
PG_TYPE_DATE,
PG_TYPE_TIME,
PG_TYPE_DATETIME,
PG_TYPE_ABSTIME,
PG_TYPE_TIMESTAMP,
- PG_TYPE_TEXT,
- PG_TYPE_INT2,
- PG_TYPE_INT4,
- PG_TYPE_FLOAT4,
- PG_TYPE_FLOAT8,
- PG_TYPE_OID,
+ PG_TYPE_TEXT,
+ PG_TYPE_INT2,
+ PG_TYPE_INT4,
+ PG_TYPE_FLOAT4,
+ PG_TYPE_FLOAT8,
+ PG_TYPE_OID,
PG_TYPE_MONEY,
PG_TYPE_BOOL,
PG_TYPE_BYTEA,
PG_TYPE_LO,
- 0 };
+ 0 };
*/
/* These are NOW the SQL Types reported in SQLGetTypeInfo. */
-Int2 sqlTypes [] = {
+Int2 sqlTypes[] = {
SQL_BIGINT,
/* SQL_BINARY, -- Commented out because VarBinary is more correct. */
SQL_BIT,
@@ -103,232 +103,303 @@ Int2 sqlTypes [] = {
0
};
-Int4 sqltype_to_pgtype(SWORD fSqlType)
+Int4
+sqltype_to_pgtype(SWORD fSqlType)
{
-Int4 pgType;
+ Int4 pgType;
- switch(fSqlType) {
+ switch (fSqlType)
+ {
- case SQL_BINARY:
- pgType = PG_TYPE_BYTEA;
- break;
+ case SQL_BINARY:
+ pgType = PG_TYPE_BYTEA;
+ break;
- case SQL_CHAR:
- pgType = PG_TYPE_BPCHAR;
- break;
+ case SQL_CHAR:
+ pgType = PG_TYPE_BPCHAR;
+ break;
- case SQL_BIT:
- pgType = globals.bools_as_char ? PG_TYPE_CHAR : PG_TYPE_BOOL;
- break;
+ case SQL_BIT:
+ pgType = globals.bools_as_char ? PG_TYPE_CHAR : PG_TYPE_BOOL;
+ break;
- case SQL_DATE:
- pgType = PG_TYPE_DATE;
- break;
+ case SQL_DATE:
+ pgType = PG_TYPE_DATE;
+ break;
- case SQL_DOUBLE:
- case SQL_FLOAT:
- pgType = PG_TYPE_FLOAT8;
- break;
+ case SQL_DOUBLE:
+ case SQL_FLOAT:
+ pgType = PG_TYPE_FLOAT8;
+ break;
- case SQL_DECIMAL:
- case SQL_NUMERIC:
- pgType = PG_TYPE_NUMERIC;
- break;
+ case SQL_DECIMAL:
+ case SQL_NUMERIC:
+ pgType = PG_TYPE_NUMERIC;
+ break;
- case SQL_BIGINT:
- pgType = PG_TYPE_INT8;
- break;
+ case SQL_BIGINT:
+ pgType = PG_TYPE_INT8;
+ break;
- case SQL_INTEGER:
- pgType = PG_TYPE_INT4;
- break;
+ case SQL_INTEGER:
+ pgType = PG_TYPE_INT4;
+ break;
- case SQL_LONGVARBINARY:
- pgType = PG_TYPE_LO;
- break;
+ case SQL_LONGVARBINARY:
+ pgType = PG_TYPE_LO;
+ break;
- case SQL_LONGVARCHAR:
- pgType = globals.text_as_longvarchar ? PG_TYPE_TEXT : PG_TYPE_VARCHAR;
- break;
+ case SQL_LONGVARCHAR:
+ pgType = globals.text_as_longvarchar ? PG_TYPE_TEXT : PG_TYPE_VARCHAR;
+ break;
- case SQL_REAL:
- pgType = PG_TYPE_FLOAT4;
- break;
+ case SQL_REAL:
+ pgType = PG_TYPE_FLOAT4;
+ break;
- case SQL_SMALLINT:
- case SQL_TINYINT:
- pgType = PG_TYPE_INT2;
- break;
+ case SQL_SMALLINT:
+ case SQL_TINYINT:
+ pgType = PG_TYPE_INT2;
+ break;
- case SQL_TIME:
- pgType = PG_TYPE_TIME;
- break;
+ case SQL_TIME:
+ pgType = PG_TYPE_TIME;
+ break;
- case SQL_TIMESTAMP:
- pgType = PG_TYPE_DATETIME;
- break;
+ case SQL_TIMESTAMP:
+ pgType = PG_TYPE_DATETIME;
+ break;
- case SQL_VARBINARY:
- pgType = PG_TYPE_BYTEA;
- break;
+ case SQL_VARBINARY:
+ pgType = PG_TYPE_BYTEA;
+ break;
- case SQL_VARCHAR:
- pgType = PG_TYPE_VARCHAR;
- break;
+ case SQL_VARCHAR:
+ pgType = PG_TYPE_VARCHAR;
+ break;
- default:
- pgType = 0; /* ??? */
- break;
+ default:
+ pgType = 0; /* ??? */
+ break;
}
return pgType;
}
-/* There are two ways of calling this function:
+/* There are two ways of calling this function:
1. When going through the supported PG types (SQLGetTypeInfo)
2. When taking any type id (SQLColumns, SQLGetData)
The first type will always work because all the types defined are returned here.
- The second type will return a default based on global parameter when it does not
- know. This allows for supporting
+ The second type will return a default based on global parameter when it does not
+ know. This allows for supporting
types that are unknown. All other pg routines in here return a suitable default.
*/
-Int2 pgtype_to_sqltype(StatementClass *stmt, Int4 type)
+Int2
+pgtype_to_sqltype(StatementClass *stmt, Int4 type)
{
- switch(type) {
- case PG_TYPE_CHAR:
- case PG_TYPE_CHAR2:
- case PG_TYPE_CHAR4:
- case PG_TYPE_CHAR8:
- case PG_TYPE_NAME: return SQL_CHAR;
-
- case PG_TYPE_BPCHAR: return SQL_CHAR;
-
- case PG_TYPE_VARCHAR: return SQL_VARCHAR;
-
- case PG_TYPE_TEXT: return globals.text_as_longvarchar ? SQL_LONGVARCHAR : SQL_VARCHAR;
-
- case PG_TYPE_BYTEA: return SQL_VARBINARY;
- case PG_TYPE_LO: return SQL_LONGVARBINARY;
-
- case PG_TYPE_INT2: return SQL_SMALLINT;
-
- case PG_TYPE_OID:
- case PG_TYPE_XID:
- case PG_TYPE_INT4: return SQL_INTEGER;
-
- /* Change this to SQL_BIGINT for ODBC v3 bjm 2001-01-23 */
- case PG_TYPE_INT8: return SQL_CHAR;
-
- case PG_TYPE_NUMERIC: return SQL_NUMERIC;
-
- case PG_TYPE_FLOAT4: return SQL_REAL;
- case PG_TYPE_FLOAT8: return SQL_FLOAT;
- case PG_TYPE_DATE: return SQL_DATE;
- case PG_TYPE_TIME: return SQL_TIME;
- case PG_TYPE_ABSTIME:
- case PG_TYPE_DATETIME:
- case PG_TYPE_TIMESTAMP: return SQL_TIMESTAMP;
- case PG_TYPE_MONEY: return SQL_FLOAT;
- case PG_TYPE_BOOL: return globals.bools_as_char ? SQL_CHAR : SQL_BIT;
-
- default:
-
- /* first, check to see if 'type' is in list. If not, look up with query.
- Add oid, name to list. If it's already in list, just return.
- */
- if (type == stmt->hdbc->lobj_type) /* hack until permanent type is available */
+ switch (type)
+ {
+ case PG_TYPE_CHAR:
+ case PG_TYPE_CHAR2:
+ case PG_TYPE_CHAR4:
+ case PG_TYPE_CHAR8:
+ case PG_TYPE_NAME:return SQL_CHAR;
+
+ case PG_TYPE_BPCHAR:
+ return SQL_CHAR;
+
+ case PG_TYPE_VARCHAR:
+ return SQL_VARCHAR;
+
+ case PG_TYPE_TEXT:
+ return globals.text_as_longvarchar ? SQL_LONGVARCHAR : SQL_VARCHAR;
+
+ case PG_TYPE_BYTEA:
+ return SQL_VARBINARY;
+ case PG_TYPE_LO:
return SQL_LONGVARBINARY;
- return globals.unknowns_as_longvarchar ? SQL_LONGVARCHAR : SQL_VARCHAR;
+ case PG_TYPE_INT2:
+ return SQL_SMALLINT;
+
+ case PG_TYPE_OID:
+ case PG_TYPE_XID:
+ case PG_TYPE_INT4:
+ return SQL_INTEGER;
+
+ /* Change this to SQL_BIGINT for ODBC v3 bjm 2001-01-23 */
+ case PG_TYPE_INT8:
+ return SQL_CHAR;
+
+ case PG_TYPE_NUMERIC:
+ return SQL_NUMERIC;
+
+ case PG_TYPE_FLOAT4:
+ return SQL_REAL;
+ case PG_TYPE_FLOAT8:
+ return SQL_FLOAT;
+ case PG_TYPE_DATE:
+ return SQL_DATE;
+ case PG_TYPE_TIME:
+ return SQL_TIME;
+ case PG_TYPE_ABSTIME:
+ case PG_TYPE_DATETIME:
+ case PG_TYPE_TIMESTAMP:
+ return SQL_TIMESTAMP;
+ case PG_TYPE_MONEY:
+ return SQL_FLOAT;
+ case PG_TYPE_BOOL:
+ return globals.bools_as_char ? SQL_CHAR : SQL_BIT;
+
+ default:
+
+ /*
+ * first, check to see if 'type' is in list. If not, look up
+ * with query. Add oid, name to list. If it's already in
+ * list, just return.
+ */
+ if (type == stmt->hdbc->lobj_type) /* hack until permanent
+ * type is available */
+ return SQL_LONGVARBINARY;
+
+ return globals.unknowns_as_longvarchar ? SQL_LONGVARCHAR : SQL_VARCHAR;
}
}
-Int2 pgtype_to_ctype(StatementClass *stmt, Int4 type)
+Int2
+pgtype_to_ctype(StatementClass *stmt, Int4 type)
{
- switch(type) {
- case PG_TYPE_INT8: return SQL_C_CHAR;
- case PG_TYPE_NUMERIC: return SQL_C_CHAR;
- case PG_TYPE_INT2: return SQL_C_SSHORT;
- case PG_TYPE_OID:
- case PG_TYPE_XID:
- case PG_TYPE_INT4: return SQL_C_SLONG;
- case PG_TYPE_FLOAT4: return SQL_C_FLOAT;
- case PG_TYPE_FLOAT8: return SQL_C_DOUBLE;
- case PG_TYPE_DATE: return SQL_C_DATE;
- case PG_TYPE_TIME: return SQL_C_TIME;
- case PG_TYPE_ABSTIME:
- case PG_TYPE_DATETIME:
- case PG_TYPE_TIMESTAMP: return SQL_C_TIMESTAMP;
- case PG_TYPE_MONEY: return SQL_C_FLOAT;
- case PG_TYPE_BOOL: return globals.bools_as_char ? SQL_C_CHAR : SQL_C_BIT;
-
- case PG_TYPE_BYTEA: return SQL_C_BINARY;
- case PG_TYPE_LO: return SQL_C_BINARY;
-
- default:
-
- if (type == stmt->hdbc->lobj_type) /* hack until permanent type is available */
+ switch (type)
+ {
+ case PG_TYPE_INT8:return SQL_C_CHAR;
+ case PG_TYPE_NUMERIC:
+ return SQL_C_CHAR;
+ case PG_TYPE_INT2:
+ return SQL_C_SSHORT;
+ case PG_TYPE_OID:
+ case PG_TYPE_XID:
+ case PG_TYPE_INT4:
+ return SQL_C_SLONG;
+ case PG_TYPE_FLOAT4:
+ return SQL_C_FLOAT;
+ case PG_TYPE_FLOAT8:
+ return SQL_C_DOUBLE;
+ case PG_TYPE_DATE:
+ return SQL_C_DATE;
+ case PG_TYPE_TIME:
+ return SQL_C_TIME;
+ case PG_TYPE_ABSTIME:
+ case PG_TYPE_DATETIME:
+ case PG_TYPE_TIMESTAMP:
+ return SQL_C_TIMESTAMP;
+ case PG_TYPE_MONEY:
+ return SQL_C_FLOAT;
+ case PG_TYPE_BOOL:
+ return globals.bools_as_char ? SQL_C_CHAR : SQL_C_BIT;
+
+ case PG_TYPE_BYTEA:
return SQL_C_BINARY;
+ case PG_TYPE_LO:
+ return SQL_C_BINARY;
+
+ default:
+
+ if (type == stmt->hdbc->lobj_type) /* hack until permanent
+ * type is available */
+ return SQL_C_BINARY;
- return SQL_C_CHAR;
+ return SQL_C_CHAR;
}
}
-char *pgtype_to_name(StatementClass *stmt, Int4 type)
+char *
+pgtype_to_name(StatementClass *stmt, Int4 type)
{
- switch(type) {
- case PG_TYPE_CHAR: return "char";
- case PG_TYPE_CHAR2: return "char2";
- case PG_TYPE_CHAR4: return "char4";
- case PG_TYPE_CHAR8: return "char8";
- case PG_TYPE_INT8: return "int8";
- case PG_TYPE_NUMERIC: return "numeric";
- case PG_TYPE_VARCHAR: return "varchar";
- case PG_TYPE_BPCHAR: return "char";
- case PG_TYPE_TEXT: return "text";
- case PG_TYPE_NAME: return "name";
- case PG_TYPE_INT2: return "int2";
- case PG_TYPE_OID: return "oid";
- case PG_TYPE_INT4: return "int4";
- case PG_TYPE_FLOAT4: return "float4";
- case PG_TYPE_FLOAT8: return "float8";
- case PG_TYPE_DATE: return "date";
- case PG_TYPE_TIME: return "time";
- case PG_TYPE_ABSTIME: return "abstime";
- case PG_TYPE_DATETIME: return "datetime";
- case PG_TYPE_TIMESTAMP: return "timestamp";
- case PG_TYPE_MONEY: return "money";
- case PG_TYPE_BOOL: return "bool";
- case PG_TYPE_BYTEA: return "bytea";
-
- case PG_TYPE_LO: return PG_TYPE_LO_NAME;
-
- default:
- if (type == stmt->hdbc->lobj_type) /* hack until permanent type is available */
+ switch (type)
+ {
+ case PG_TYPE_CHAR:return "char";
+ case PG_TYPE_CHAR2:
+ return "char2";
+ case PG_TYPE_CHAR4:
+ return "char4";
+ case PG_TYPE_CHAR8:
+ return "char8";
+ case PG_TYPE_INT8:
+ return "int8";
+ case PG_TYPE_NUMERIC:
+ return "numeric";
+ case PG_TYPE_VARCHAR:
+ return "varchar";
+ case PG_TYPE_BPCHAR:
+ return "char";
+ case PG_TYPE_TEXT:
+ return "text";
+ case PG_TYPE_NAME:
+ return "name";
+ case PG_TYPE_INT2:
+ return "int2";
+ case PG_TYPE_OID:
+ return "oid";
+ case PG_TYPE_INT4:
+ return "int4";
+ case PG_TYPE_FLOAT4:
+ return "float4";
+ case PG_TYPE_FLOAT8:
+ return "float8";
+ case PG_TYPE_DATE:
+ return "date";
+ case PG_TYPE_TIME:
+ return "time";
+ case PG_TYPE_ABSTIME:
+ return "abstime";
+ case PG_TYPE_DATETIME:
+ return "datetime";
+ case PG_TYPE_TIMESTAMP:
+ return "timestamp";
+ case PG_TYPE_MONEY:
+ return "money";
+ case PG_TYPE_BOOL:
+ return "bool";
+ case PG_TYPE_BYTEA:
+ return "bytea";
+
+ case PG_TYPE_LO:
return PG_TYPE_LO_NAME;
- /* "unknown" can actually be used in alter table because it is a real PG type! */
- return "unknown";
- }
+ default:
+ if (type == stmt->hdbc->lobj_type) /* hack until permanent
+ * type is available */
+ return PG_TYPE_LO_NAME;
+
+ /*
+ * "unknown" can actually be used in alter table because it is
+ * a real PG type!
+ */
+ return "unknown";
+ }
}
static Int2
getNumericScale(StatementClass *stmt, Int4 type, int col)
{
-Int4 atttypmod;
-QResultClass *result;
-ColumnInfoClass *flds;
+ Int4 atttypmod;
+ QResultClass *result;
+ ColumnInfoClass *flds;
-mylog("getNumericScale: type=%d, col=%d, unknown = %d\n", type,col);
+ mylog("getNumericScale: type=%d, col=%d, unknown = %d\n", type, col);
if (col < 0)
return PG_NUMERIC_MAX_SCALE;
result = SC_get_Result(stmt);
- /* Manual Result Sets -- use assigned column width (i.e., from set_tuplefield_string) */
- if (stmt->manual_result) {
+ /*
+ * Manual Result Sets -- use assigned column width (i.e., from
+ * set_tuplefield_string)
+ */
+ if (stmt->manual_result)
+ {
flds = result->fields;
if (flds)
return flds->adtsize[col];
@@ -337,30 +408,34 @@ mylog("getNumericScale: type=%d, col=%d, unknown = %d\n", type,col);
}
atttypmod = QR_get_atttypmod(result, col);
- if ( atttypmod > -1 )
+ if (atttypmod > -1)
return (atttypmod & 0xffff);
else
- return ( QR_get_display_size(result, col) ?
- QR_get_display_size(result, col) :
- PG_NUMERIC_MAX_SCALE);
+ return (QR_get_display_size(result, col) ?
+ QR_get_display_size(result, col) :
+ PG_NUMERIC_MAX_SCALE);
}
static Int4
getNumericPrecision(StatementClass *stmt, Int4 type, int col)
{
-Int4 atttypmod;
-QResultClass *result;
-ColumnInfoClass *flds;
+ Int4 atttypmod;
+ QResultClass *result;
+ ColumnInfoClass *flds;
-mylog("getNumericPrecision: type=%d, col=%d, unknown = %d\n", type,col);
+ mylog("getNumericPrecision: type=%d, col=%d, unknown = %d\n", type, col);
if (col < 0)
return PG_NUMERIC_MAX_PRECISION;
result = SC_get_Result(stmt);
- /* Manual Result Sets -- use assigned column width (i.e., from set_tuplefield_string) */
- if (stmt->manual_result) {
+ /*
+ * Manual Result Sets -- use assigned column width (i.e., from
+ * set_tuplefield_string)
+ */
+ if (stmt->manual_result)
+ {
flds = result->fields;
if (flds)
return flds->adtsize[col];
@@ -369,55 +444,62 @@ mylog("getNumericPrecision: type=%d, col=%d, unknown = %d\n", type,col);
}
atttypmod = QR_get_atttypmod(result, col);
- if ( atttypmod > -1 )
+ if (atttypmod > -1)
return (atttypmod >> 16) & 0xffff;
else
- return ( QR_get_display_size(result, col) >= 0 ?
- QR_get_display_size(result, col) :
- PG_NUMERIC_MAX_PRECISION );
+ return (QR_get_display_size(result, col) >= 0 ?
+ QR_get_display_size(result, col) :
+ PG_NUMERIC_MAX_PRECISION);
}
Int4
getCharPrecision(StatementClass *stmt, Int4 type, int col, int handle_unknown_size_as)
{
-int p = -1, maxsize;
-QResultClass *result;
-ColumnInfoClass *flds;
-
-mylog("getCharPrecision: type=%d, col=%d, unknown = %d\n", type,col,handle_unknown_size_as);
-
- /* Assign Maximum size based on parameters */
- switch(type) {
- case PG_TYPE_TEXT:
- if (globals.text_as_longvarchar)
- maxsize = globals.max_longvarchar_size;
- else
- maxsize = globals.max_varchar_size;
- break;
-
- case PG_TYPE_VARCHAR:
- case PG_TYPE_BPCHAR:
- maxsize = globals.max_varchar_size;
- break;
-
- default:
- if (globals.unknowns_as_longvarchar)
- maxsize = globals.max_longvarchar_size;
- else
+ int p = -1,
+ maxsize;
+ QResultClass *result;
+ ColumnInfoClass *flds;
+
+ mylog("getCharPrecision: type=%d, col=%d, unknown = %d\n", type, col, handle_unknown_size_as);
+
+ /* Assign Maximum size based on parameters */
+ switch (type)
+ {
+ case PG_TYPE_TEXT:
+ if (globals.text_as_longvarchar)
+ maxsize = globals.max_longvarchar_size;
+ else
+ maxsize = globals.max_varchar_size;
+ break;
+
+ case PG_TYPE_VARCHAR:
+ case PG_TYPE_BPCHAR:
maxsize = globals.max_varchar_size;
- break;
+ break;
+
+ default:
+ if (globals.unknowns_as_longvarchar)
+ maxsize = globals.max_longvarchar_size;
+ else
+ maxsize = globals.max_varchar_size;
+ break;
}
- /* Static Precision (i.e., the Maximum Precision of the datatype)
- This has nothing to do with a result set.
- */
+ /*
+ * Static Precision (i.e., the Maximum Precision of the datatype) This
+ * has nothing to do with a result set.
+ */
if (col < 0)
return maxsize;
result = SC_get_Result(stmt);
- /* Manual Result Sets -- use assigned column width (i.e., from set_tuplefield_string) */
- if (stmt->manual_result) {
+ /*
+ * Manual Result Sets -- use assigned column width (i.e., from
+ * set_tuplefield_string)
+ */
+ if (stmt->manual_result)
+ {
flds = result->fields;
if (flds)
return flds->adtsize[col];
@@ -425,11 +507,12 @@ mylog("getCharPrecision: type=%d, col=%d, unknown = %d\n", type,col,handle_unkno
return maxsize;
}
- /* Size is unknown -- handle according to parameter */
+ /* Size is unknown -- handle according to parameter */
if (QR_get_atttypmod(result, col) > -1)
return QR_get_atttypmod(result, col);
- if (type == PG_TYPE_BPCHAR || handle_unknown_size_as == UNKNOWNS_AS_LONGEST) {
+ if (type == PG_TYPE_BPCHAR || handle_unknown_size_as == UNKNOWNS_AS_LONGEST)
+ {
p = QR_get_display_size(result, col);
mylog("getCharPrecision: LONGEST: p = %d\n", p);
}
@@ -440,351 +523,424 @@ mylog("getCharPrecision: type=%d, col=%d, unknown = %d\n", type,col,handle_unkno
return p;
}
-/* For PG_TYPE_VARCHAR, PG_TYPE_BPCHAR, PG_TYPE_NUMERIC, SQLColumns will
+/* For PG_TYPE_VARCHAR, PG_TYPE_BPCHAR, PG_TYPE_NUMERIC, SQLColumns will
override this length with the atttypmod length from pg_attribute .
If col >= 0, then will attempt to get the info from the result set.
This is used for functions SQLDescribeCol and SQLColAttributes.
*/
-Int4 pgtype_precision(StatementClass *stmt, Int4 type, int col, int handle_unknown_size_as)
+Int4
+pgtype_precision(StatementClass *stmt, Int4 type, int col, int handle_unknown_size_as)
{
- switch(type) {
+ switch (type)
+ {
- case PG_TYPE_CHAR: return 1;
- case PG_TYPE_CHAR2: return 2;
- case PG_TYPE_CHAR4: return 4;
- case PG_TYPE_CHAR8: return 8;
+ case PG_TYPE_CHAR:return 1;
+ case PG_TYPE_CHAR2:
+ return 2;
+ case PG_TYPE_CHAR4:
+ return 4;
+ case PG_TYPE_CHAR8:
+ return 8;
- case PG_TYPE_NAME: return NAME_FIELD_SIZE;
+ case PG_TYPE_NAME:
+ return NAME_FIELD_SIZE;
- case PG_TYPE_INT2: return 5;
+ case PG_TYPE_INT2:
+ return 5;
- case PG_TYPE_OID:
- case PG_TYPE_XID:
- case PG_TYPE_INT4: return 10;
+ case PG_TYPE_OID:
+ case PG_TYPE_XID:
+ case PG_TYPE_INT4:
+ return 10;
- case PG_TYPE_INT8: return 19; /* signed */
+ case PG_TYPE_INT8:
+ return 19; /* signed */
- case PG_TYPE_NUMERIC: return getNumericPrecision(stmt,type,col);
+ case PG_TYPE_NUMERIC:
+ return getNumericPrecision(stmt, type, col);
- case PG_TYPE_FLOAT4:
- case PG_TYPE_MONEY: return 7;
+ case PG_TYPE_FLOAT4:
+ case PG_TYPE_MONEY:
+ return 7;
- case PG_TYPE_FLOAT8: return 15;
+ case PG_TYPE_FLOAT8:
+ return 15;
- case PG_TYPE_DATE: return 10;
- case PG_TYPE_TIME: return 8;
+ case PG_TYPE_DATE:
+ return 10;
+ case PG_TYPE_TIME:
+ return 8;
- case PG_TYPE_ABSTIME:
- case PG_TYPE_DATETIME:
- case PG_TYPE_TIMESTAMP: return 19;
+ case PG_TYPE_ABSTIME:
+ case PG_TYPE_DATETIME:
+ case PG_TYPE_TIMESTAMP:
+ return 19;
- case PG_TYPE_BOOL: return 1;
+ case PG_TYPE_BOOL:
+ return 1;
- case PG_TYPE_LO: return SQL_NO_TOTAL;
+ case PG_TYPE_LO:
+ return SQL_NO_TOTAL;
- default:
+ default:
- if (type == stmt->hdbc->lobj_type) /* hack until permanent type is available */
- return SQL_NO_TOTAL;
+ if (type == stmt->hdbc->lobj_type) /* hack until permanent
+ * type is available */
+ return SQL_NO_TOTAL;
- /* Handle Character types and unknown types */
- return getCharPrecision(stmt, type, col, handle_unknown_size_as);
- }
+ /* Handle Character types and unknown types */
+ return getCharPrecision(stmt, type, col, handle_unknown_size_as);
+ }
}
-Int4 pgtype_display_size(StatementClass *stmt, Int4 type, int col, int handle_unknown_size_as)
+Int4
+pgtype_display_size(StatementClass *stmt, Int4 type, int col, int handle_unknown_size_as)
{
- switch(type) {
- case PG_TYPE_INT2: return 6;
+ switch (type)
+ {
+ case PG_TYPE_INT2:return 6;
+
+ case PG_TYPE_OID:
+ case PG_TYPE_XID:
+ return 10;
- case PG_TYPE_OID:
- case PG_TYPE_XID: return 10;
+ case PG_TYPE_INT4:
+ return 11;
- case PG_TYPE_INT4: return 11;
+ case PG_TYPE_INT8:
+ return 20; /* signed: 19 digits + sign */
- case PG_TYPE_INT8: return 20; /* signed: 19 digits + sign */
+ case PG_TYPE_NUMERIC:
+ return getNumericPrecision(stmt, type, col) + 2;
- case PG_TYPE_NUMERIC: return getNumericPrecision(stmt,type,col) + 2;
+ case PG_TYPE_MONEY:
+ return 15; /* ($9,999,999.99) */
- case PG_TYPE_MONEY: return 15; /* ($9,999,999.99) */
+ case PG_TYPE_FLOAT4:
+ return 13;
- case PG_TYPE_FLOAT4: return 13;
+ case PG_TYPE_FLOAT8:
+ return 22;
- case PG_TYPE_FLOAT8: return 22;
-
- /* Character types use regular precision */
- default:
- return pgtype_precision(stmt, type, col, handle_unknown_size_as);
+ /* Character types use regular precision */
+ default:
+ return pgtype_precision(stmt, type, col, handle_unknown_size_as);
}
}
-/* For PG_TYPE_VARCHAR, PG_TYPE_BPCHAR, SQLColumns will
- override this length with the atttypmod length from pg_attribute
+/* For PG_TYPE_VARCHAR, PG_TYPE_BPCHAR, SQLColumns will
+ override this length with the atttypmod length from pg_attribute
*/
-Int4 pgtype_length(StatementClass *stmt, Int4 type, int col, int handle_unknown_size_as)
+Int4
+pgtype_length(StatementClass *stmt, Int4 type, int col, int handle_unknown_size_as)
{
- switch(type) {
+ switch (type)
+ {
- case PG_TYPE_INT2: return 2;
+ case PG_TYPE_INT2:return 2;
- case PG_TYPE_OID:
- case PG_TYPE_XID:
- case PG_TYPE_INT4: return 4;
+ case PG_TYPE_OID:
+ case PG_TYPE_XID:
+ case PG_TYPE_INT4:
+ return 4;
- case PG_TYPE_INT8: return 20; /* signed: 19 digits + sign */
+ case PG_TYPE_INT8:
+ return 20; /* signed: 19 digits + sign */
- case PG_TYPE_NUMERIC: return getNumericPrecision(stmt,type,col) + 2;
+ case PG_TYPE_NUMERIC:
+ return getNumericPrecision(stmt, type, col) + 2;
- case PG_TYPE_FLOAT4:
- case PG_TYPE_MONEY: return 4;
+ case PG_TYPE_FLOAT4:
+ case PG_TYPE_MONEY:
+ return 4;
- case PG_TYPE_FLOAT8: return 8;
+ case PG_TYPE_FLOAT8:
+ return 8;
- case PG_TYPE_DATE:
- case PG_TYPE_TIME: return 6;
+ case PG_TYPE_DATE:
+ case PG_TYPE_TIME:
+ return 6;
- case PG_TYPE_ABSTIME:
- case PG_TYPE_DATETIME:
- case PG_TYPE_TIMESTAMP: return 16;
+ case PG_TYPE_ABSTIME:
+ case PG_TYPE_DATETIME:
+ case PG_TYPE_TIMESTAMP:
+ return 16;
- /* Character types (and NUMERIC) use the default precision */
- default:
- return pgtype_precision(stmt, type, col, handle_unknown_size_as);
- }
+ /* Character types (and NUMERIC) use the default precision */
+ default:
+ return pgtype_precision(stmt, type, col, handle_unknown_size_as);
+ }
}
-Int2 pgtype_scale(StatementClass *stmt, Int4 type, int col)
+Int2
+pgtype_scale(StatementClass *stmt, Int4 type, int col)
{
- switch(type) {
-
- case PG_TYPE_INT2:
- case PG_TYPE_OID:
- case PG_TYPE_XID:
- case PG_TYPE_INT4:
- case PG_TYPE_INT8:
- case PG_TYPE_FLOAT4:
- case PG_TYPE_FLOAT8:
- case PG_TYPE_MONEY:
- case PG_TYPE_BOOL:
-
- /* Number of digits to the right of the decimal point in "yyyy-mm=dd hh:mm:ss[.f...]" */
- case PG_TYPE_ABSTIME:
- case PG_TYPE_DATETIME:
- case PG_TYPE_TIMESTAMP: return 0;
-
- case PG_TYPE_NUMERIC: return getNumericScale(stmt,type,col);
-
- default: return -1;
+ switch (type)
+ {
+
+ case PG_TYPE_INT2:
+ case PG_TYPE_OID:
+ case PG_TYPE_XID:
+ case PG_TYPE_INT4:
+ case PG_TYPE_INT8:
+ case PG_TYPE_FLOAT4:
+ case PG_TYPE_FLOAT8:
+ case PG_TYPE_MONEY:
+ case PG_TYPE_BOOL:
+
+ /*
+ * Number of digits to the right of the decimal point in
+ * "yyyy-mm=dd hh:mm:ss[.f...]"
+ */
+ case PG_TYPE_ABSTIME:
+ case PG_TYPE_DATETIME:
+ case PG_TYPE_TIMESTAMP:return 0;
+
+ case PG_TYPE_NUMERIC:
+ return getNumericScale(stmt, type, col);
+
+ default:
+ return -1;
}
}
-Int2 pgtype_radix(StatementClass *stmt, Int4 type)
+Int2
+pgtype_radix(StatementClass *stmt, Int4 type)
{
- switch(type) {
- case PG_TYPE_INT2:
- case PG_TYPE_OID:
- case PG_TYPE_INT4:
- case PG_TYPE_INT8:
- case PG_TYPE_NUMERIC:
- case PG_TYPE_FLOAT4:
- case PG_TYPE_MONEY:
- case PG_TYPE_FLOAT8: return 10;
-
- default: return -1;
- }
+ switch (type)
+ {
+ case PG_TYPE_INT2:
+ case PG_TYPE_OID:
+ case PG_TYPE_INT4:
+ case PG_TYPE_INT8:
+ case PG_TYPE_NUMERIC:
+ case PG_TYPE_FLOAT4:
+ case PG_TYPE_MONEY:
+ case PG_TYPE_FLOAT8:return 10;
+
+ default:
+ return -1;
+ }
}
-Int2 pgtype_nullable(StatementClass *stmt, Int4 type)
+Int2
+pgtype_nullable(StatementClass *stmt, Int4 type)
{
- return SQL_NULLABLE; /* everything should be nullable */
+ return SQL_NULLABLE; /* everything should be nullable */
}
-Int2 pgtype_auto_increment(StatementClass *stmt, Int4 type)
+Int2
+pgtype_auto_increment(StatementClass *stmt, Int4 type)
{
- switch(type) {
-
- case PG_TYPE_INT2:
- case PG_TYPE_OID:
- case PG_TYPE_XID:
- case PG_TYPE_INT4:
- case PG_TYPE_FLOAT4:
- case PG_TYPE_MONEY:
- case PG_TYPE_BOOL:
- case PG_TYPE_FLOAT8:
- case PG_TYPE_INT8:
- case PG_TYPE_NUMERIC:
-
- case PG_TYPE_DATE:
- case PG_TYPE_TIME:
- case PG_TYPE_ABSTIME:
- case PG_TYPE_DATETIME:
- case PG_TYPE_TIMESTAMP: return FALSE;
-
- default: return -1;
- }
+ switch (type)
+ {
+
+ case PG_TYPE_INT2:
+ case PG_TYPE_OID:
+ case PG_TYPE_XID:
+ case PG_TYPE_INT4:
+ case PG_TYPE_FLOAT4:
+ case PG_TYPE_MONEY:
+ case PG_TYPE_BOOL:
+ case PG_TYPE_FLOAT8:
+ case PG_TYPE_INT8:
+ case PG_TYPE_NUMERIC:
+
+ case PG_TYPE_DATE:
+ case PG_TYPE_TIME:
+ case PG_TYPE_ABSTIME:
+ case PG_TYPE_DATETIME:
+ case PG_TYPE_TIMESTAMP:return FALSE;
+
+ default:
+ return -1;
+ }
}
-Int2 pgtype_case_sensitive(StatementClass *stmt, Int4 type)
+Int2
+pgtype_case_sensitive(StatementClass *stmt, Int4 type)
{
- switch(type) {
- case PG_TYPE_CHAR:
+ switch (type)
+ {
+ case PG_TYPE_CHAR:
- case PG_TYPE_CHAR2:
- case PG_TYPE_CHAR4:
- case PG_TYPE_CHAR8:
+ case PG_TYPE_CHAR2:
+ case PG_TYPE_CHAR4:
+ case PG_TYPE_CHAR8:
- case PG_TYPE_VARCHAR:
- case PG_TYPE_BPCHAR:
- case PG_TYPE_TEXT:
- case PG_TYPE_NAME: return TRUE;
+ case PG_TYPE_VARCHAR:
+ case PG_TYPE_BPCHAR:
+ case PG_TYPE_TEXT:
+ case PG_TYPE_NAME:return TRUE;
- default: return FALSE;
- }
+ default:
+ return FALSE;
+ }
}
-Int2 pgtype_money(StatementClass *stmt, Int4 type)
+Int2
+pgtype_money(StatementClass *stmt, Int4 type)
{
- switch(type) {
- case PG_TYPE_MONEY: return TRUE;
- default: return FALSE;
- }
+ switch (type)
+ {
+ case PG_TYPE_MONEY:return TRUE;
+ default:
+ return FALSE;
+ }
}
-Int2 pgtype_searchable(StatementClass *stmt, Int4 type)
+Int2
+pgtype_searchable(StatementClass *stmt, Int4 type)
{
- switch(type) {
- case PG_TYPE_CHAR:
- case PG_TYPE_CHAR2:
- case PG_TYPE_CHAR4:
- case PG_TYPE_CHAR8:
-
- case PG_TYPE_VARCHAR:
- case PG_TYPE_BPCHAR:
- case PG_TYPE_TEXT:
- case PG_TYPE_NAME: return SQL_SEARCHABLE;
-
- default: return SQL_ALL_EXCEPT_LIKE;
- }
+ switch (type)
+ {
+ case PG_TYPE_CHAR:
+ case PG_TYPE_CHAR2:
+ case PG_TYPE_CHAR4:
+ case PG_TYPE_CHAR8:
+
+ case PG_TYPE_VARCHAR:
+ case PG_TYPE_BPCHAR:
+ case PG_TYPE_TEXT:
+ case PG_TYPE_NAME:return SQL_SEARCHABLE;
+
+ default:
+ return SQL_ALL_EXCEPT_LIKE;
+ }
}
-Int2 pgtype_unsigned(StatementClass *stmt, Int4 type)
+Int2
+pgtype_unsigned(StatementClass *stmt, Int4 type)
{
- switch(type) {
- case PG_TYPE_OID:
- case PG_TYPE_XID: return TRUE;
-
- case PG_TYPE_INT2:
- case PG_TYPE_INT4:
- case PG_TYPE_INT8:
- case PG_TYPE_NUMERIC:
- case PG_TYPE_FLOAT4:
- case PG_TYPE_FLOAT8:
- case PG_TYPE_MONEY: return FALSE;
-
- default: return -1;
+ switch (type)
+ {
+ case PG_TYPE_OID:
+ case PG_TYPE_XID:return TRUE;
+
+ case PG_TYPE_INT2:
+ case PG_TYPE_INT4:
+ case PG_TYPE_INT8:
+ case PG_TYPE_NUMERIC:
+ case PG_TYPE_FLOAT4:
+ case PG_TYPE_FLOAT8:
+ case PG_TYPE_MONEY:
+ return FALSE;
+
+ default:
+ return -1;
}
}
-char *pgtype_literal_prefix(StatementClass *stmt, Int4 type)
+char *
+pgtype_literal_prefix(StatementClass *stmt, Int4 type)
{
- switch(type) {
-
- case PG_TYPE_INT2:
- case PG_TYPE_OID:
- case PG_TYPE_XID:
- case PG_TYPE_INT4:
- case PG_TYPE_INT8:
- case PG_TYPE_NUMERIC:
- case PG_TYPE_FLOAT4:
- case PG_TYPE_FLOAT8:
- case PG_TYPE_MONEY: return NULL;
-
- default: return "'";
+ switch (type)
+ {
+
+ case PG_TYPE_INT2:
+ case PG_TYPE_OID:
+ case PG_TYPE_XID:
+ case PG_TYPE_INT4:
+ case PG_TYPE_INT8:
+ case PG_TYPE_NUMERIC:
+ case PG_TYPE_FLOAT4:
+ case PG_TYPE_FLOAT8:
+ case PG_TYPE_MONEY:return NULL;
+
+ default:
+ return "'";
}
}
-char *pgtype_literal_suffix(StatementClass *stmt, Int4 type)
+char *
+pgtype_literal_suffix(StatementClass *stmt, Int4 type)
{
- switch(type) {
-
- case PG_TYPE_INT2:
- case PG_TYPE_OID:
- case PG_TYPE_XID:
- case PG_TYPE_INT4:
- case PG_TYPE_INT8:
- case PG_TYPE_NUMERIC:
- case PG_TYPE_FLOAT4:
- case PG_TYPE_FLOAT8:
- case PG_TYPE_MONEY: return NULL;
-
- default: return "'";
+ switch (type)
+ {
+
+ case PG_TYPE_INT2:
+ case PG_TYPE_OID:
+ case PG_TYPE_XID:
+ case PG_TYPE_INT4:
+ case PG_TYPE_INT8:
+ case PG_TYPE_NUMERIC:
+ case PG_TYPE_FLOAT4:
+ case PG_TYPE_FLOAT8:
+ case PG_TYPE_MONEY:return NULL;
+
+ default:
+ return "'";
}
}
-char *pgtype_create_params(StatementClass *stmt, Int4 type)
+char *
+pgtype_create_params(StatementClass *stmt, Int4 type)
{
- switch(type) {
- case PG_TYPE_CHAR:
- case PG_TYPE_VARCHAR: return "max. length";
- default: return NULL;
+ switch (type)
+ {
+ case PG_TYPE_CHAR:
+ case PG_TYPE_VARCHAR:return "max. length";
+ default:
+ return NULL;
}
}
-Int2 sqltype_to_default_ctype(Int2 sqltype)
+Int2
+sqltype_to_default_ctype(Int2 sqltype)
{
- /* from the table on page 623 of ODBC 2.0 Programmer's Reference */
- /* (Appendix D) */
- switch(sqltype) {
- case SQL_CHAR:
- case SQL_VARCHAR:
- case SQL_LONGVARCHAR:
- case SQL_DECIMAL:
- case SQL_NUMERIC:
- case SQL_BIGINT:
- return SQL_C_CHAR;
-
- case SQL_BIT:
- return SQL_C_BIT;
-
- case SQL_TINYINT:
- return SQL_C_STINYINT;
-
- case SQL_SMALLINT:
- return SQL_C_SSHORT;
-
- case SQL_INTEGER:
- return SQL_C_SLONG;
-
- case SQL_REAL:
- return SQL_C_FLOAT;
-
- case SQL_FLOAT:
- case SQL_DOUBLE:
- return SQL_C_DOUBLE;
-
- case SQL_BINARY:
- case SQL_VARBINARY:
- case SQL_LONGVARBINARY:
- return SQL_C_BINARY;
+ /* from the table on page 623 of ODBC 2.0 Programmer's Reference */
+ /* (Appendix D) */
+ switch (sqltype)
+ {
+ case SQL_CHAR:
+ case SQL_VARCHAR:
+ case SQL_LONGVARCHAR:
+ case SQL_DECIMAL:
+ case SQL_NUMERIC:
+ case SQL_BIGINT:
+ return SQL_C_CHAR;
+
+ case SQL_BIT:
+ return SQL_C_BIT;
+
+ case SQL_TINYINT:
+ return SQL_C_STINYINT;
+
+ case SQL_SMALLINT:
+ return SQL_C_SSHORT;
+
+ case SQL_INTEGER:
+ return SQL_C_SLONG;
+
+ case SQL_REAL:
+ return SQL_C_FLOAT;
+
+ case SQL_FLOAT:
+ case SQL_DOUBLE:
+ return SQL_C_DOUBLE;
+
+ case SQL_BINARY:
+ case SQL_VARBINARY:
+ case SQL_LONGVARBINARY:
+ return SQL_C_BINARY;
- case SQL_DATE:
- return SQL_C_DATE;
+ case SQL_DATE:
+ return SQL_C_DATE;
- case SQL_TIME:
- return SQL_C_TIME;
+ case SQL_TIME:
+ return SQL_C_TIME;
- case SQL_TIMESTAMP:
- return SQL_C_TIMESTAMP;
+ case SQL_TIMESTAMP:
+ return SQL_C_TIMESTAMP;
- default: /* should never happen */
- return SQL_C_CHAR;
- }
+ default: /* should never happen */
+ return SQL_C_CHAR;
+ }
}
-