pub struct ColumnInfo {
pub name: String,
pub data_type: SqlDataType,
pub nullable: bool,
pub is_primary_key: bool,
pub default: Option<String>,
pub raw_type: Option<String>,
pub int_width: Option<IntWidth>,
pub float_width: Option<FloatWidth>,
}Expand description
Metadata about a single column.
Fields§
§name: String§data_type: SqlDataType§nullable: bool§is_primary_key: bool§default: Option<String>Default value expression (e.g. “UUID_V7”, “ULID”, “NANOID(10)”, “0”, “‘active’”).
raw_type: Option<String>Raw type string as stored in the catalog (e.g. "JSON", "TEXT", "FLOAT64").
None for columns synthesized by the planner (e.g. auto-injected id).
Columnar INSERT converters use this to reconstruct the exact ColumnType
so JSON / Geometry / UUID columns are not incorrectly inferred as String.
Write coercion reads a VECTOR(dim) declaration from it on a column
whose data_type advertises text.
int_width: Option<IntWidth>Declared width of an integer column, resolved once from the catalog at
adapter-construction time. None for non-integer columns and for
integer columns whose declared type carried no width.
This is deliberately a resolved [IntWidth] rather than another raw
string: it is read on both the write path (range validation) and the
read path (RowDescription OID and binary payload width), and those
two must agree exactly. Resolving once at the catalog boundary is what
makes disagreement unrepresentable.
float_width: Option<FloatWidth>Declared width of a floating-point column, resolved once from the
catalog at adapter-construction time. None for non-float columns and
for float columns whose declared type the catalog never recorded.
The float analogue of ColumnInfo::int_width, and resolved from the
same source. Read on the read path to select the RowDescription OID
(700 vs 701) and the binary payload width (4 vs 8 bytes), and read on
the write path by check_declared_float_ranges — but only for the
narrower failure mode a float has: narrowing an f64 to f32 rounds
rather than wraps (PostgreSQL accepts-and-rounds a double literal
into a real column, and so does nodedb), so only a finite value
that would overflow to infinity is rejected, not the full out-of-range
check int_width gets.
Trait Implementations§
Source§impl Clone for ColumnInfo
impl Clone for ColumnInfo
Auto Trait Implementations§
impl Freeze for ColumnInfo
impl RefUnwindSafe for ColumnInfo
impl Send for ColumnInfo
impl Sync for ColumnInfo
impl Unpin for ColumnInfo
impl UnsafeUnpin for ColumnInfo
impl UnwindSafe for ColumnInfo
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> ErasedDestructor for Twhere
T: 'static,
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 moreSource§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.Source§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.