Skip to content

Commit 47b0c69

Browse files
committed
Add enum and pseudo type kinds
1 parent 8824d2a commit 47b0c69

File tree

2 files changed

+38
-25
lines changed

2 files changed

+38
-25
lines changed

src/lib.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,8 @@ impl InnerConnection {
464464
#[cfg_attr(rustfmt, rustfmt_skip)]
465465
fn setup_typeinfo_query(&mut self) -> result::Result<(), ConnectError> {
466466
match self.raw_prepare(TYPEINFO_QUERY,
467-
"SELECT t.typname, t.typelem, r.rngsubtype, t.typbasetype, n.nspname \
467+
"SELECT t.typname, t.typtype, t.typelem, r.rngsubtype, \
468+
t.typbasetype, n.nspname \
468469
FROM pg_catalog.pg_type t \
469470
LEFT OUTER JOIN pg_catalog.pg_range r ON \
470471
r.rngtypid = t.oid \
@@ -480,7 +481,8 @@ impl InnerConnection {
480481
}
481482

482483
match self.raw_prepare(TYPEINFO_QUERY,
483-
"SELECT t.typname, t.typelem, NULL::OID, t.typbasetype, n.nspname \
484+
"SELECT t.typname, t.typtype, t.typelem, NULL::OID, t.typbasetype, \
485+
n.nspname \
484486
FROM pg_catalog.pg_type t \
485487
INNER JOIN pg_catalog.pg_namespace n \
486488
ON t.typnamespace = n.oid \
@@ -751,26 +753,29 @@ impl InnerConnection {
751753
}
752754
_ => bad_response!(self),
753755
}
754-
let (name, elem_oid, rngsubtype, basetype, schema) = match try!(self.read_message()) {
756+
let (name, type_, elem_oid, rngsubtype, basetype, schema) = match try!(self.read_message()) {
755757
DataRow { row } => {
756758
let ctx = SessionInfo::new(self);
757759
let name = try!(String::from_sql(&Type::Name,
758760
&mut &**row[0].as_ref().unwrap(),
759761
&ctx));
762+
let type_ = try!(i8::from_sql(&Type::Char,
763+
&mut &**row[1].as_ref().unwrap(),
764+
&ctx));
760765
let elem_oid = try!(Oid::from_sql(&Type::Oid,
761-
&mut &**row[1].as_ref().unwrap(),
766+
&mut &**row[2].as_ref().unwrap(),
762767
&ctx));
763-
let rngsubtype = match row[2] {
768+
let rngsubtype = match row[3] {
764769
Some(ref data) => try!(Option::<Oid>::from_sql(&Type::Oid, &mut &**data, &ctx)),
765770
None => try!(Option::<Oid>::from_sql_null(&Type::Oid, &ctx)),
766771
};
767772
let basetype = try!(Oid::from_sql(&Type::Oid,
768-
&mut &**row[3].as_ref().unwrap(),
773+
&mut &**row[4].as_ref().unwrap(),
769774
&ctx));
770775
let schema = try!(String::from_sql(&Type::Name,
771-
&mut &**row[4].as_ref().unwrap(),
776+
&mut &**row[5].as_ref().unwrap(),
772777
&ctx));
773-
(name, elem_oid, rngsubtype, basetype, schema)
778+
(name, type_, elem_oid, rngsubtype, basetype, schema)
774779
}
775780
ErrorResponse { fields } => {
776781
try!(self.wait_for_ready());
@@ -788,7 +793,11 @@ impl InnerConnection {
788793
}
789794
try!(self.wait_for_ready());
790795

791-
let kind = if basetype != 0 {
796+
let kind = if type_ == b'e' as i8 {
797+
Kind::Enum
798+
} else if type_ == b'p' as i8 {
799+
Kind::Pseudo
800+
} else if basetype != 0 {
792801
Kind::Domain(try!(self.get_type(basetype)))
793802
} else if elem_oid != 0 {
794803
Kind::Array(try!(self.get_type(elem_oid)))

src/types/mod.rs

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ pub type Oid = u32;
105105
pub enum Kind {
106106
/// A simple type like `VARCHAR` or `INTEGER`.
107107
Simple,
108+
/// An enumerated type.
109+
Enum,
110+
/// A pseudo-type.
111+
Pseudo,
108112
/// An array type along with the type of its elements.
109113
Array(Type),
110114
/// A range type along with the type of its elements.
@@ -431,29 +435,29 @@ make_postgres_type! {
431435
/// REGTYPE[]
432436
2211: "_regtype" => RegtypeArray: Kind::Array(Type::Regtype),
433437
/// RECORD
434-
2249: "record" => Record: Kind::Simple,
438+
2249: "record" => Record: Kind::Pseudo,
435439
/// CSTRING
436-
2275: "cstring" => Cstring: Kind::Simple,
440+
2275: "cstring" => Cstring: Kind::Pseudo,
437441
/// ANY
438-
2276: "any" => Any: Kind::Simple,
442+
2276: "any" => Any: Kind::Pseudo,
439443
/// ANYARRAY
440-
2277: "anyarray" => AnyArray: Kind::Array(Type::Any),
444+
2277: "anyarray" => AnyArray: Kind::Pseudo,
441445
/// VOID
442-
2278: "void" => Void: Kind::Simple,
446+
2278: "void" => Void: Kind::Pseudo,
443447
/// TRIGGER
444-
2279: "trigger" => Trigger: Kind::Simple,
448+
2279: "trigger" => Trigger: Kind::Pseudo,
445449
/// LANGUAGE_HANDLER
446-
2280: "language_handler" => LanguageHandler: Kind::Simple,
450+
2280: "language_handler" => LanguageHandler: Kind::Pseudo,
447451
/// INTERNAL
448-
2281: "internal" => Internal: Kind::Simple,
452+
2281: "internal" => Internal: Kind::Pseudo,
449453
/// OPAQUE
450-
2282: "opaque" => Opaque: Kind::Simple,
454+
2282: "opaque" => Opaque: Kind::Pseudo,
451455
/// ANYELEMENT
452-
2283: "anyelement" => Anyelement: Kind::Simple,
456+
2283: "anyelement" => Anyelement: Kind::Pseudo,
453457
/// RECORD[]
454-
2287: "_record" => RecordArray: Kind::Array(Type::Record),
458+
2287: "_record" => RecordArray: Kind::Pseudo,
455459
/// ANYNONARRAY
456-
2776: "anynonarray" => Anynonarray: Kind::Simple,
460+
2776: "anynonarray" => Anynonarray: Kind::Pseudo,
457461
/// TXID_SNAPSHOT[]
458462
2949: "_txid_snapshot" => TxidSnapshotArray: Kind::Array(Type::TxidSnapshot),
459463
/// UUID - UUID datatype
@@ -463,13 +467,13 @@ make_postgres_type! {
463467
/// UUID[]
464468
2951: "_uuid" => UuidArray: Kind::Array(Type::Uuid),
465469
/// FDW_HANDLER
466-
3115: "fdw_handler" => FdwHandler: Kind::Simple,
470+
3115: "fdw_handler" => FdwHandler: Kind::Pseudo,
467471
/// PG_LSN - PostgreSQL LSN datatype
468472
3220: "pg_lsn" => PgLsn: Kind::Simple,
469473
/// PG_LSN[]
470474
3221: "_pg_lsn" => PgLsnArray: Kind::Array(Type::PgLsn),
471475
/// ANYENUM
472-
3500: "anyenum" => Anyenum: Kind::Simple,
476+
3500: "anyenum" => Anyenum: Kind::Pseudo,
473477
/// TSVECTOR - text representation for text search
474478
3614: "tsvector" => Tsvector: Kind::Simple,
475479
/// TSQUERY - query representation for text search
@@ -493,7 +497,7 @@ make_postgres_type! {
493497
/// JSONB
494498
3802: "jsonb" => Jsonb: Kind::Simple,
495499
/// ANYRANGE
496-
3831: "anyrange" => Anyrange: Kind::Simple,
500+
3831: "anyrange" => Anyrange: Kind::Pseudo,
497501
/// JSONB[]
498502
3807: "_jsonb" => JsonbArray: Kind::Array(Type::Jsonb),
499503
/// INT4RANGE - range of integers
@@ -521,7 +525,7 @@ make_postgres_type! {
521525
/// INT8RANGE[]
522526
3927: "_int8range" => Int8RangeArray: Kind::Array(Type::Int8Range),
523527
/// EVENT_TRIGGER
524-
3838: "event_trigger" => EventTrigger: Kind::Simple
528+
3838: "event_trigger" => EventTrigger: Kind::Pseudo
525529
}
526530

527531
/// Information about an unknown type.

0 commit comments

Comments
 (0)