Struct sqlx_postgres::PgTypeInfo

source ·
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

source

pub fn kind(&self) -> &PgTypeKind

Returns the kind (simple, array, enum, etc.) for this type.

source

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.

source

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""#);
source

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.

source

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.

source

pub fn type_eq(&self, other: &Self) -> bool

Returns true if self can be compared exactly to other.

Unlike ==, this will return false if

Trait Implementations§

source§

impl Clone for PgTypeInfo

source§

fn clone(&self) -> PgTypeInfo

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for PgTypeInfo

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Deref for PgTypeInfo

§

type Target = PgType

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.
source§

impl Display for PgTypeInfo

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for PgTypeInfo

source§

fn eq(&self, other: &PgTypeInfo) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl TypeInfo for PgTypeInfo

source§

fn name(&self) -> &str

Returns the database system name of the type. Length specifiers should not be included. Common type names are 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.
source§

fn is_null(&self) -> bool

source§

fn type_compatible(&self, other: &Self) -> bool
where Self: Sized,

Return true if self and other represent mutually compatible types. Read more
source§

impl StructuralPartialEq for PgTypeInfo

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

source§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more