pub struct PgTypeInfo(/* private fields */);Expand description
Type information for a PostgreSQL type.
§Note: Implementation of == (PartialEq::eq())
Because == on TypeInfos has been used throughout the SQLx API as a synonym for type compatibility,
e.g. in the default impl of Type::compatible(),
some concessions have been made in the implementation.
When comparing two PgTypeInfos using the == operator (PartialEq::eq()),
if one was constructed with Self::with_oid() and the other with Self::with_name() or
Self::array_of(), == will return true:
// Potentially surprising result, this assert will pass:
assert_eq!(PgTypeInfo::with_oid(Oid(1)), PgTypeInfo::with_name("definitely_not_real"));Since it is not possible in this case to prove the types are not compatible (because
both PgTypeInfos need to be resolved by an active connection to know for sure)
and type compatibility is mainly done as a sanity check anyway,
it was deemed acceptable to fudge equality in this very specific case.
This also applies when querying with the text protocol (not using prepared statements,
e.g. sqlx::raw_sql()), as the connection will be unable
to look up the type info like it normally does when preparing a statement: it won’t know
what the OIDs of the output columns will be until it’s in the middle of reading the result,
and by that time it’s too late.
To compare types for exact equality, use Self::type_eq() instead.
Implementations§
Source§impl PgTypeInfo
 
impl PgTypeInfo
Sourcepub fn kind(&self) -> &PgTypeKind
 
pub fn kind(&self) -> &PgTypeKind
Returns the kind (simple, array, enum, etc.) for this type.
Sourcepub fn oid(&self) -> Option<Oid>
 
pub fn oid(&self) -> Option<Oid>
Returns the OID for this type, if available.
The OID may not be available if SQLx only knows the type by name.
It will have to be resolved by a PgConnection at runtime which
will yield a new and semantically distinct TypeInfo instance.
This method does not perform any such lookup.
§Note
With the exception of the default pg_type catalog, type OIDs are not stable in PostgreSQL.
If a type is added by an extension, its OID will be assigned when the CREATE EXTENSION statement is executed,
and so can change depending on what extensions are installed and in what order, as well as the exact
version of PostgreSQL.
Sourcepub const fn with_name(name: &'static str) -> Self
 
pub const fn with_name(name: &'static str) -> Self
Create a PgTypeInfo from a type name.
The OID for the type will be fetched from Postgres on use of a value of this type. The fetched OID will be cached per-connection.
§Note: Type Names Prefixed with _
In pg_catalog.pg_type, Postgres prefixes a type name with _ to denote an array of that
type, e.g. int4[] actually exists in pg_type as _int4.
Previously, it was necessary in manual PgHasArrayType impls
to return PgTypeInfo::with_name() with the type name prefixed with _ to denote
an array type, but this would not work with schema-qualified names.
As of 0.8, PgTypeInfo::array_of() is used to declare an array type,
and the Postgres driver is now able to properly resolve arrays of custom types,
even in other schemas, which was not previously supported.
It is highly recommended to migrate existing usages to PgTypeInfo::array_of() where
applicable.
However, to maintain compatibility, the driver now infers any type name prefixed with _
to be an array of that type. This may introduce some breakages for types which use
a _ prefix but which are not arrays.
As a workaround, type names with _ as a prefix but which are not arrays should be wrapped
in quotes, e.g.:
use sqlx::postgres::PgTypeInfo;
use sqlx::{Type, TypeInfo};
/// `CREATE TYPE "_foo" AS ENUM ('Bar', 'Baz');`
#[derive(sqlx::Type)]
// Will prevent SQLx from inferring `_foo` as an array type.
#[sqlx(type_name = r#""_foo""#)]
enum Foo {
    Bar,
    Baz
}
assert_eq!(Foo::type_info().name(), r#""_foo""#);Sourcepub fn array_of(elem_name: &'static str) -> Self
 
pub fn array_of(elem_name: &'static str) -> Self
Create a PgTypeInfo of an array from the name of its element type.
The array type OID will be fetched from Postgres on use of a value of this type. The fetched OID will be cached per-connection.
Sourcepub const fn with_oid(oid: Oid) -> Self
 
pub const fn with_oid(oid: Oid) -> Self
Create a PgTypeInfo from an OID.
Note that the OID for a type is very dependent on the environment. If you only ever use
one database or if this is an unhandled built-in type, you should be fine. Otherwise,
you will be better served using Self::with_name().
§Note: Interaction with ==
This constructor may give surprising results with ==.
See the type-level docs for details.
Trait Implementations§
Source§impl Clone for PgTypeInfo
 
impl Clone for PgTypeInfo
Source§fn clone(&self) -> PgTypeInfo
 
fn clone(&self) -> PgTypeInfo
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
 
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for PgTypeInfo
 
impl Debug for PgTypeInfo
Source§impl Deref for PgTypeInfo
 
impl Deref for PgTypeInfo
Source§impl Display for PgTypeInfo
 
impl Display for PgTypeInfo
Source§impl PartialEq for PgTypeInfo
 
impl PartialEq for PgTypeInfo
Source§impl TypeInfo for PgTypeInfo
 
impl TypeInfo for PgTypeInfo
Source§fn name(&self) -> &str
 
fn name(&self) -> &str
VARCHAR, TEXT, or INT. Type names should be uppercase. They
should be a rough approximation of how they are written in SQL in the given database.fn is_null(&self) -> bool
impl StructuralPartialEq for PgTypeInfo
Auto Trait Implementations§
impl Freeze for PgTypeInfo
impl RefUnwindSafe for PgTypeInfo
impl Send for PgTypeInfo
impl Sync for PgTypeInfo
impl Unpin for PgTypeInfo
impl UnwindSafe for PgTypeInfo
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
    T: ?Sized,
 
impl<T> BorrowMut<T> for Twhere
    T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
 
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
    T: Clone,
 
impl<T> CloneToUninit for Twhere
    T: Clone,
Source§impl<T> Instrument for T
 
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
 
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
 
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
 
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
 
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
 
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more