Author: turnstep
Date: Tue Mar 27 11:31:24 2007
New Revision: 9352
Modified:
DBD-Pg/trunk/types.c
DBD-Pg/trunk/types.h
Log:
Add SQL_INTERVAL, SQL_TIMESTAMP, and others.
Change code to allow for multiple SQL types per pg type.
Modified: DBD-Pg/trunk/types.c
==============================================================================
--- DBD-Pg/trunk/types.c (original)
+++ DBD-Pg/trunk/types.c Tue Mar 27 11:31:24 2007
@@ -23,7 +23,7 @@
{ANYARRAYOID, "anyarray", null_quote, null_dequote, {SQL_ARRAY},
DBDPG_TRUE},
{ANYELEMENTOID, "anyelement", 0, 0, {0}, DBDPG_FALSE},
{ANYOID, "any", null_quote, null_dequote, {0}, DBDPG_TRUE},
- {BITOID, "bitstring", null_quote, null_dequote, {0}, DBDPG_TRUE},
+ {BITOID, "bitstring", null_quote, null_dequote, {SQL_BIT}, DBDPG_TRUE},
{BOOLOID, "bool", quote_bool, dequote_bool, {SQL_BOOLEAN}, DBDPG_TRUE},
{BOXOID, "box", quote_geom, dequote_string, {0}, DBDPG_TRUE},
{BPCHAROID, "bpchar", quote_string, dequote_char, {SQL_CHAR},
DBDPG_TRUE},
@@ -35,14 +35,15 @@
{CIRCLEOID, "circle", quote_circle, dequote_string, {0}, DBDPG_TRUE},
{CSTRINGOID, "cstring", null_quote, null_dequote, {0}, DBDPG_TRUE},
{DATEOID, "date", null_quote, null_dequote, {SQL_TYPE_DATE},
DBDPG_TRUE},
- {FLOAT4OID, "float4", quote_string, dequote_char, {SQL_NUMERIC},
DBDPG_TRUE},
- {FLOAT8OID, "float8", null_quote, null_dequote, {SQL_REAL}, DBDPG_TRUE},
+ {FLOAT4ARRAYOID, "float4array", 0, 0, {0}, DBDPG_FALSE},
+ {FLOAT4OID, "float4", quote_string, dequote_char, {SQL_REAL},
DBDPG_TRUE},
+ {FLOAT8OID, "float8", null_quote, null_dequote, {SQL_FLOAT},
DBDPG_TRUE},
{INETOID, "IP address", null_quote, null_dequote, {0}, DBDPG_TRUE},
{INT2OID, "int2", null_quote, null_dequote, {SQL_SMALLINT}, DBDPG_TRUE},
{INT2VECTOROID, "int28", null_quote, null_dequote, {0}, DBDPG_TRUE},
{INT4ARRAYOID, "int4array", quote_string, dequote_string, {0},
DBDPG_TRUE},
{INT4OID, "int4", null_quote, null_dequote, {SQL_INTEGER}, DBDPG_TRUE},
- {INT8OID, "int8", null_quote, null_dequote, {SQL_DOUBLE}, DBDPG_TRUE},
+ {INT8OID, "int8", null_quote, null_dequote, {SQL_BIGINT}, DBDPG_TRUE},
{INTERNALOID, "internal", null_quote, null_dequote, {0}, DBDPG_TRUE},
{INTERVALOID, "timespan", quote_string, dequote_string, {SQL_INTERVAL},
DBDPG_TRUE},
{LANGUAGE_HANDLEROID, "languagehandle", null_quote, null_dequote, {0},
DBDPG_TRUE},
@@ -71,10 +72,10 @@
{REGTYPEARRAYOID, "regtypearray", null_quote, null_dequote, {0},
DBDPG_TRUE},
{REGTYPEOID, "regtype", null_quote, null_dequote, {0}, DBDPG_TRUE},
{RELTIMEOID, "reltime", null_quote, null_dequote, {0}, DBDPG_TRUE},
- {TEXTOID, "text", quote_string, dequote_string, {SQL_VARCHAR},
DBDPG_TRUE},
+ {TEXTOID, "text", quote_string, dequote_string, {SQL_LONGVARCHAR},
DBDPG_TRUE},
{TIDOID, "tid", quote_geom, dequote_string, {0}, DBDPG_TRUE},
{TIMEOID, "time", null_quote, null_dequote, {SQL_TYPE_TIME},
DBDPG_TRUE},
- {TIMESTAMPOID, "timestamp", quote_string, dequote_string,
{SQL_TYPE_TIMESTAMP}, DBDPG_TRUE},
+ {TIMESTAMPOID, "timestamp", quote_string, dequote_string,
{SQL_TIMESTAMP}, DBDPG_TRUE},
{TIMESTAMPTZOID, "datetime", quote_string, dequote_string,
{SQL_TYPE_TIMESTAMP_WITH_TIMEZONE}, DBDPG_TRUE},
{TIMETZOID, "timestamptz", null_quote, null_dequote,
{SQL_TYPE_TIME_WITH_TIMEZONE}, DBDPG_TRUE},
{TINTERVALOID, "tinterval", null_quote, null_dequote, {0}, DBDPG_TRUE},
@@ -84,6 +85,7 @@
{VARCHAROID, "varchar", quote_string, dequote_string, {SQL_VARCHAR},
DBDPG_TRUE},
{VOIDOID, "void", null_quote, null_dequote, {0}, DBDPG_TRUE},
{XIDOID, "xid", null_quote, null_dequote, {0}, DBDPG_TRUE},
+ {XMLOID, "xml", null_quote, null_dequote, {0}, DBDPG_TRUE},
};
sql_type_info_t* pg_type_data(sql_type)
@@ -108,93 +110,109 @@
case CIRCLEOID: return &pg_types[14];
case CSTRINGOID: return &pg_types[15];
case DATEOID: return &pg_types[16];
- case FLOAT4OID: return &pg_types[17];
- case FLOAT8OID: return &pg_types[18];
- case INETOID: return &pg_types[19];
- case INT2OID: return &pg_types[20];
- case INT2VECTOROID: return &pg_types[21];
- case INT4ARRAYOID: return &pg_types[22];
- case INT4OID: return &pg_types[23];
- case INT8OID: return &pg_types[24];
- case INTERNALOID: return &pg_types[25];
- case INTERVALOID: return &pg_types[26];
- case LANGUAGE_HANDLEROID: return &pg_types[27];
- case LINEOID: return &pg_types[28];
- case LSEGOID: return &pg_types[29];
- case MACADDROID: return &pg_types[30];
- case NAMEOID: return &pg_types[31];
- case NUMERICOID: return &pg_types[32];
- case OIDOID: return &pg_types[33];
- case OIDVECTOROID: return &pg_types[34];
- case OPAQUEOID: return &pg_types[35];
- case PATHOID: return &pg_types[36];
- case PG_ATTRIBUTE_RELTYPE_OID: return &pg_types[37];
- case PG_CLASS_RELTYPE_OID: return &pg_types[38];
- case PG_PROC_RELTYPE_OID: return &pg_types[39];
- case PG_TYPE_RELTYPE_OID: return &pg_types[40];
- case POINTOID: return &pg_types[41];
- case POLYGONOID: return &pg_types[42];
- case RECORDOID: return &pg_types[43];
- case REFCURSOROID: return &pg_types[44];
- case REGCLASSOID: return &pg_types[45];
- case REGOPERATOROID: return &pg_types[46];
- case REGOPEROID: return &pg_types[47];
- case REGPROCEDUREOID: return &pg_types[48];
- case REGPROCOID: return &pg_types[49];
- case REGTYPEARRAYOID: return &pg_types[50];
- case REGTYPEOID: return &pg_types[51];
- case RELTIMEOID: return &pg_types[52];
- case TEXTOID: return &pg_types[53];
- case TIDOID: return &pg_types[54];
- case TIMEOID: return &pg_types[55];
- case TIMESTAMPOID: return &pg_types[56];
- case TIMESTAMPTZOID: return &pg_types[57];
- case TIMETZOID: return &pg_types[58];
- case TINTERVALOID: return &pg_types[59];
- case TRIGGEROID: return &pg_types[60];
- case UNKNOWNOID: return &pg_types[61];
- case VARBITOID: return &pg_types[62];
- case VARCHAROID: return &pg_types[63];
- case VOIDOID: return &pg_types[64];
- case XIDOID: return &pg_types[65];
+ case FLOAT4ARRAYOID: return &pg_types[17];
+ case FLOAT4OID: return &pg_types[18];
+ case FLOAT8OID: return &pg_types[19];
+ case INETOID: return &pg_types[20];
+ case INT2OID: return &pg_types[21];
+ case INT2VECTOROID: return &pg_types[22];
+ case INT4ARRAYOID: return &pg_types[23];
+ case INT4OID: return &pg_types[24];
+ case INT8OID: return &pg_types[25];
+ case INTERNALOID: return &pg_types[26];
+ case INTERVALOID: return &pg_types[27];
+ case LANGUAGE_HANDLEROID: return &pg_types[28];
+ case LINEOID: return &pg_types[29];
+ case LSEGOID: return &pg_types[30];
+ case MACADDROID: return &pg_types[31];
+ case NAMEOID: return &pg_types[32];
+ case NUMERICOID: return &pg_types[33];
+ case OIDOID: return &pg_types[34];
+ case OIDVECTOROID: return &pg_types[35];
+ case OPAQUEOID: return &pg_types[36];
+ case PATHOID: return &pg_types[37];
+ case PG_ATTRIBUTE_RELTYPE_OID: return &pg_types[38];
+ case PG_CLASS_RELTYPE_OID: return &pg_types[39];
+ case PG_PROC_RELTYPE_OID: return &pg_types[40];
+ case PG_TYPE_RELTYPE_OID: return &pg_types[41];
+ case POINTOID: return &pg_types[42];
+ case POLYGONOID: return &pg_types[43];
+ case RECORDOID: return &pg_types[44];
+ case REFCURSOROID: return &pg_types[45];
+ case REGCLASSOID: return &pg_types[46];
+ case REGOPERATOROID: return &pg_types[47];
+ case REGOPEROID: return &pg_types[48];
+ case REGPROCEDUREOID: return &pg_types[49];
+ case REGPROCOID: return &pg_types[50];
+ case REGTYPEARRAYOID: return &pg_types[51];
+ case REGTYPEOID: return &pg_types[52];
+ case RELTIMEOID: return &pg_types[53];
+ case TEXTOID: return &pg_types[54];
+ case TIDOID: return &pg_types[55];
+ case TIMEOID: return &pg_types[56];
+ case TIMESTAMPOID: return &pg_types[57];
+ case TIMESTAMPTZOID: return &pg_types[58];
+ case TIMETZOID: return &pg_types[59];
+ case TINTERVALOID: return &pg_types[60];
+ case TRIGGEROID: return &pg_types[61];
+ case UNKNOWNOID: return &pg_types[62];
+ case VARBITOID: return &pg_types[63];
+ case VARCHAROID: return &pg_types[64];
+ case VOIDOID: return &pg_types[65];
+ case XIDOID: return &pg_types[66];
+ case XMLOID: return &pg_types[67];
default:return NULL;
}
}
static sql_type_info_t sql_types[] = {
+ {SQL_BIT, "SQL_BIT", null_quote, null_dequote, {BITOID}, DBDPG_TRUE},
{SQL_BOOLEAN, "SQL_BOOLEAN", quote_bool, dequote_bool, {BOOLOID},
DBDPG_TRUE},
{SQL_CHAR, "SQL_CHAR", quote_string, dequote_char, {BPCHAROID},
DBDPG_TRUE},
{SQL_VARBINARY, "SQL_VARBINARY", quote_bytea, dequote_bytea,
{BYTEAOID}, DBDPG_TRUE},
{SQL_TYPE_DATE, "SQL_TYPE_DATE", null_quote, null_dequote, {DATEOID},
DBDPG_TRUE},
+ {SQL_REAL, "SQL_REAL", quote_string, dequote_char, {FLOAT4OID},
DBDPG_TRUE},
{SQL_NUMERIC, "SQL_NUMERIC", quote_string, dequote_char, {FLOAT4OID},
DBDPG_TRUE},
- {SQL_REAL, "SQL_REAL", null_quote, null_dequote, {FLOAT8OID},
DBDPG_TRUE},
+ {SQL_FLOAT, "SQL_FLOAT", null_quote, null_dequote, {FLOAT8OID},
DBDPG_TRUE},
+ {SQL_DOUBLE, "SQL_DOUBLE", null_quote, null_dequote, {FLOAT8OID},
DBDPG_TRUE},
{SQL_SMALLINT, "SQL_SMALLINT", null_quote, null_dequote, {INT2OID},
DBDPG_TRUE},
+ {SQL_TINYINT, "SQL_TINYINT", null_quote, null_dequote, {INT2OID},
DBDPG_TRUE},
{SQL_INTEGER, "SQL_INTEGER", null_quote, null_dequote, {INT4OID},
DBDPG_TRUE},
- {SQL_DOUBLE, "SQL_DOUBLE", null_quote, null_dequote, {INT8OID},
DBDPG_TRUE},
+ {SQL_BIGINT, "SQL_BIGINT", null_quote, null_dequote, {INT8OID},
DBDPG_TRUE},
+ {SQL_INTERVAL, "SQL_INTERVAL", quote_string, dequote_string,
{INTERVALOID}, DBDPG_TRUE},
{SQL_DECIMAL, "SQL_DECIMAL", null_quote, null_dequote, {NUMERICOID},
DBDPG_TRUE},
{SQL_TYPE_TIME, "SQL_TYPE_TIME", null_quote, null_dequote, {TIMEOID},
DBDPG_TRUE},
+ {SQL_TIMESTAMP, "SQL_TIMESTAMP", quote_string, dequote_string,
{TIMESTAMPOID}, DBDPG_TRUE},
{SQL_TYPE_TIMESTAMP, "SQL_TYPE_TIMESTAMP", quote_string,
dequote_string, {TIMESTAMPOID}, DBDPG_TRUE},
{SQL_TYPE_TIMESTAMP_WITH_TIMEZONE, "SQL_TYPE_TIMESTAMP_WITH_TIMEZONE",
quote_string, dequote_string, {TIMESTAMPTZOID}, DBDPG_TRUE},
+ {SQL_UNKNOWN_TYPE, "SQL_UNKNOWN_TYPE", quote_string, dequote_string,
{UNKNOWNOID}, DBDPG_TRUE},
{SQL_VARCHAR, "SQL_VARCHAR", quote_string, dequote_string,
{VARCHAROID}, DBDPG_TRUE},
};
sql_type_info_t* sql_type_data(sql_type)
int sql_type;
{ switch(sql_type) {
- case SQL_BOOLEAN: return &sql_types[0];
- case SQL_CHAR: return &sql_types[1];
- case SQL_VARBINARY: return &sql_types[2];
- case SQL_TYPE_DATE: return &sql_types[3];
- case SQL_NUMERIC: return &sql_types[4];
+ case SQL_BIT: return &sql_types[0];
+ case SQL_BOOLEAN: return &sql_types[1];
+ case SQL_CHAR: return &sql_types[2];
+ case SQL_VARBINARY: return &sql_types[3];
+ case SQL_TYPE_DATE: return &sql_types[4];
case SQL_REAL: return &sql_types[5];
- case SQL_SMALLINT: return &sql_types[6];
- case SQL_INTEGER: return &sql_types[7];
+ case SQL_NUMERIC: return &sql_types[6];
+ case SQL_FLOAT: return &sql_types[7];
case SQL_DOUBLE: return &sql_types[8];
- case SQL_DECIMAL: return &sql_types[9];
- case SQL_TYPE_TIME: return &sql_types[10];
- case SQL_TYPE_TIMESTAMP: return &sql_types[11];
- case SQL_TYPE_TIMESTAMP_WITH_TIMEZONE: return &sql_types[12];
- case SQL_VARCHAR: return &sql_types[13];
+ case SQL_SMALLINT: return &sql_types[9];
+ case SQL_TINYINT: return &sql_types[10];
+ case SQL_INTEGER: return &sql_types[11];
+ case SQL_BIGINT: return &sql_types[12];
+ case SQL_INTERVAL: return &sql_types[13];
+ case SQL_DECIMAL: return &sql_types[14];
+ case SQL_TYPE_TIME: return &sql_types[15];
+ case SQL_TIMESTAMP: return &sql_types[16];
+ case SQL_TYPE_TIMESTAMP: return &sql_types[17];
+ case SQL_TYPE_TIMESTAMP_WITH_TIMEZONE: return &sql_types[18];
+ case SQL_UNKNOWN_TYPE: return &sql_types[19];
+ case SQL_VARCHAR: return &sql_types[20];
default: return NULL;
}
}
@@ -288,19 +306,8 @@
## Map all types into a sql_type_info structure
-#Each must have a "name" e.g. declared as column type name
-#whether we quote it or not (DBDPG_TRUE)
-#the quoting function to use
-#the dequoting function to use
-#the closest SQL_ match
-#whether this is the "master" for sql matches
-
-# Group by quoting function, then name
-# Start with bool
-
print OUT "static sql_type_info_t pg_types[] = {\n";
-
my %type;
while (<DATA>) {
last if /^__END__/;
@@ -319,8 +326,9 @@
next;
}
## {BOOLOID, "bool", quote_bool, dequote_bool, {SQL_BOOLEAN},
DBDPG_TRUE},
+ (my $sqltype = $type{$_}[3]) =~ s#^(\w+).*#$1#;
printf OUT qq!\t{$_, "%s", %s, %s, \{%s\}, %s\},\n!,
- $type{$_}[0], $type{$_}[1], $type{$_}[2], $type{$_}[3],
($type{$_}[1] ? "DBDPG_TRUE" : "DBDPG_FALSE");
+ $type{$_}[0], $type{$_}[1], $type{$_}[2], $sqltype,
($type{$_}[1] ? "DBDPG_TRUE" : "DBDPG_FALSE");
$pos{$_} = $item++;
}
@@ -333,7 +341,6 @@
\tswitch(sql_type) {
\n";
-
for (sort keys %type) {
if (!exists $oid{$_}) {
warn "Unreferenced type: $_\n";
@@ -354,11 +361,12 @@
warn "Unreferenced type: $_\n";
}
next unless $type{$_}[4];
- my $sql = $type{$_}[3];
- ## {SQL_VARCHAR, "SQL_VARCHAR", quote_string, dequote_string,
{VARCHAROID}, DBDPG_TRUE },
- printf OUT qq{\t\{$sql, "$sql", $type{$_}[1], $type{$_}[2], \{$_\},
DBDPG_TRUE\},\n};
- $pos{$sql} = $item++;
- $maxlen = length $sql if length $sql > $maxlen;
+ for my $sql (split m#\s*\|\s*# => $type{$_}[3]) {
+ ## {SQL_VARCHAR, "SQL_VARCHAR", quote_string, dequote_string,
{VARCHAROID}, DBDPG_TRUE },
+ printf OUT qq{\t\{$sql, "$sql", $type{$_}[1], $type{$_}[2],
\{$_\}, DBDPG_TRUE\},\n};
+ $maxlen = length $sql if length $sql > $maxlen;
+ $pos{$sql} = $item++;
+ }
}
print OUT "\};\n\n";
@@ -388,11 +396,11 @@
## Try to keep them grouped by the quoting function, SQL_ mapper, then the
internal name
## Numbers - no quoting needed
-INT2OID, int2, null_quote, null_dequote, SQL_SMALLINT, 1
+INT2OID, int2, null_quote, null_dequote, SQL_SMALLINT|SQL_TINYINT, 1
INT4OID, int4, null_quote, null_dequote, SQL_INTEGER, 1
-INT8OID, int8, null_quote, null_dequote, SQL_DOUBLE, 1
-FLOAT4OID, float4, quote_string, dequote_char, SQL_NUMERIC, 1
-FLOAT8OID, float8, null_quote,null_dequote, SQL_REAL, 1
+INT8OID, int8, null_quote, null_dequote, SQL_BIGINT, 1
+FLOAT4OID, float4, quote_string, dequote_char, SQL_REAL|SQL_NUMERIC, 1
+FLOAT8OID, float8, null_quote,null_dequote, SQL_FLOAT|SQL_DOUBLE, 1
NUMERICOID, numeric, null_quote, null_dequote, SQL_DECIMAL, 1
CIDOID, cid, null_quote, null_dequote, SQL_INTEGER, 0
OIDOID, oid, null_quote, null_dequote, SQL_INTEGER, 0
@@ -401,7 +409,7 @@
VARCHAROID, varchar, quote_string, dequote_string, SQL_VARCHAR, 1
BPCHAROID, bpchar, quote_string, dequote_char, SQL_CHAR, 1
NAMEOID, name, null_quote, null_dequote, SQL_VARCHAR, 0
-TEXTOID, text, quote_string, dequote_string, SQL_VARCHAR, 0
+TEXTOID, text, quote_string, dequote_string, SQL_LONGVARCHAR, 0
## Geometric types
POINTOID, point, quote_geom, dequote_string, 0, 0
@@ -425,7 +433,7 @@
## Time and date
DATEOID, date, null_quote, null_dequote, SQL_TYPE_DATE, 1
TIMEOID, time, null_quote, null_dequote, SQL_TYPE_TIME, 1
-TIMESTAMPOID, timestamp, quote_string, dequote_string, SQL_TYPE_TIMESTAMP, 1
+TIMESTAMPOID, timestamp, quote_string, dequote_string,
SQL_TIMESTAMP|SQL_TYPE_TIMESTAMP, 1
TIMESTAMPTZOID, datetime, quote_string, dequote_string,
SQL_TYPE_TIMESTAMP_WITH_TIMEZONE, 1
TIMETZOID, timestamptz, null_quote, null_dequote, SQL_TYPE_TIME_WITH_TIMEZONE, 0
@@ -436,15 +444,16 @@
ACLITEMOID, aclitem, null_quote, null_dequote, 0, 0
ANYARRAYOID, anyarray, null_quote, null_dequote, SQL_ARRAY, 0
ANYOID, any, null_quote, null_dequote, 0, 0
-BITOID, bitstring, null_quote, null_dequote, 0, 0
+BITOID, bitstring, null_quote, null_dequote, SQL_BIT, 1
CASHOID, money, null_quote, null_dequote, 0, 0
CIDROID, IP - cidr, null_quote, null_dequote, 0, 0
CSTRINGOID, cstring, null_quote, null_dequote, 0, 0
+FLOAT4ARRAYOID, float4array, 0, 0, 0, 0
INETOID, IP address, null_quote, null_dequote, 0, 0
INT2VECTOROID, int28, null_quote, null_dequote, 0, 0
INT4ARRAYOID, int4array, quote_string, dequote_string, 0, 0
INTERNALOID, internal, null_quote, null_dequote, 0, 0
-INTERVALOID, timespan, quote_string, dequote_string, SQL_INTERVAL, 0
+INTERVALOID, timespan, quote_string, dequote_string, SQL_INTERVAL, 1
LANGUAGE_HANDLEROID, languagehandle, null_quote, null_dequote, 0, 0
MACADDROID, MAC address, quote_string,dequote_string, 0, 0
OIDVECTOROID, oid8, null_quote, null_dequote, 0, 0
@@ -465,10 +474,11 @@
RELTIMEOID, reltime, null_quote, null_dequote, 0, 0
TINTERVALOID, tinterval, null_quote, null_dequote, 0, 0
TRIGGEROID, trigger, null_quote, null_dequote, 0, 0
-UNKNOWNOID, unknown, quote_string, dequote_string, SQL_UNKNOWN_TYPE, 0
+UNKNOWNOID, unknown, quote_string, dequote_string, SQL_UNKNOWN_TYPE, 1
VARBITOID, vbitstring, null_quote, null_dequote, 0, 0
VOIDOID, void, null_quote, null_dequote, 0, 0
XIDOID, xid, null_quote, null_dequote, 0, 0
+XMLOID, xml, null_quote, null_dequote, 0, 0
__END__
Modified: DBD-Pg/trunk/types.h
==============================================================================
--- DBD-Pg/trunk/types.h (original)
+++ DBD-Pg/trunk/types.h Tue Mar 27 11:31:24 2007
@@ -33,6 +33,7 @@
#define CIRCLEOID 718
#define CSTRINGOID 2275
#define DATEOID 1082
+#define FLOAT4ARRAYOID 1021
#define FLOAT4OID 700
#define FLOAT8OID 701
#define INETOID 869
@@ -82,5 +83,6 @@
#define VARCHAROID 1043
#define VOIDOID 2278
#define XIDOID 28
+#define XMLOID 142
#endif