Skip to main content

PivotColumn

Struct PivotColumn 

Source
pub struct PivotColumn<X: Extension = NoExt> {
    pub expr: Expr<X>,
    pub values: ThinVec<PivotExpr<X>>,
    pub enum_source: Option<Ident>,
    pub value_source: Option<Box<PivotValueSource<X>>>,
    pub meta: Meta,
}
Expand description

One pivot column and its optional IN source — a statement ON entry (year, year IN (2000, 2010), year IN (SELECT …)) or a table-factor FOR head (FOR <col> IN (<values>), FOR <col> IN <enum>, FOR <col> IN (ANY [ORDER BY …]), FOR <col> IN (<subquery>)).

The value source is spread across three mutually-exclusive fields rather than one enum: values (the explicit list) and enum_source are DuckDB’s native shapes and stay untouched, while value_source carries the standard ANY/subquery forms added for the Snowflake/BigQuery/Oracle table factor. This deliberately deviates from sqlparser-rs’s single PivotValueSource { List, Any, Subquery } enum: that shape lives at the whole-pivot level and cannot express DuckDB’s per-column FOR y IN (…) m IN (…) heads or its IN <enum> form, so this node keeps the source per column and folds the two new forms into an Option beside the existing DuckDB fields (see PivotValueSource). Exactly one of the three is populated for any one column.

Fields§

§expr: Expr<X>

The pivoted column or expression (a grouped (a, b) reads as a row expression). A statement entry whose IN source is a subquery keeps the whole Expr::InSubquery here — the engine admits it (probed on 1.5.4) and the subquery is a value source, not a value list.

§values: ThinVec<PivotExpr<X>>

The explicit IN (<values>) list; empty for a statement ON column whose values DuckDB auto-detects at bind time (and whenever enum_source or value_source carries the IN instead).

§enum_source: Option<Ident>

The table factor’s IN <enum> form (FOR m IN month_enum): the values come from a named ENUM type rather than a written list. A single unqualified name — the engine rejects a qualified one (probed on 1.5.4) — and mutually exclusive with values.

§value_source: Option<Box<PivotValueSource<X>>>

The standard PIVOT’s non-list value sources — IN (ANY [ORDER BY …]) and IN (<subquery>) (Snowflake/BigQuery/Oracle), gated on TableFactorSyntax::pivot_value_sources. None for the explicit-list, enum, and auto-detected DuckDB forms; mutually exclusive with values/enum_source. Boxed to keep the common (list) column small while the source is wide.

§meta: Meta

Source location and node identity.

Trait Implementations§

Source§

impl<X: Clone + Extension> Clone for PivotColumn<X>

Source§

fn clone(&self) -> PivotColumn<X>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl<X: Debug + Extension> Debug for PivotColumn<X>

Source§

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

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

impl<'de, X> Deserialize<'de> for PivotColumn<X>
where X: Deserialize<'de> + Extension,

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl<X: Eq + Extension> Eq for PivotColumn<X>

Source§

impl<X: Hash + Extension> Hash for PivotColumn<X>

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl<X: PartialEq + Extension> PartialEq for PivotColumn<X>

Source§

fn eq(&self, other: &PivotColumn<X>) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

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

Inequality operator !=. Read more
Source§

impl<X: Extension + Render> Render for PivotColumn<X>

Source§

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

Return the render for this value.
Source§

fn operand_binding_power(&self) -> Option<BindingPower>

The binding power this node contributes when it appears as an operand, or None (the default) for a self-delimiting node — an atom, call, or constructor — that never needs parentheses. Read more
Source§

impl<X> Serialize for PivotColumn<X>
where X: Serialize + Extension,

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl<X: Extension> Spanned for PivotColumn<X>

Source§

fn span(&self) -> Span

Return the span for this value.
Source§

impl<X: PartialEq + Extension> StructuralPartialEq for PivotColumn<X>

Auto Trait Implementations§

§

impl<X> Freeze for PivotColumn<X>
where X: Freeze,

§

impl<X> RefUnwindSafe for PivotColumn<X>
where X: RefUnwindSafe,

§

impl<X> Send for PivotColumn<X>
where X: Send,

§

impl<X> Sync for PivotColumn<X>
where X: Sync,

§

impl<X> Unpin for PivotColumn<X>
where X: Unpin,

§

impl<X> UnsafeUnpin for PivotColumn<X>
where X: UnsafeUnpin,

§

impl<X> UnwindSafe for PivotColumn<X>
where X: UnwindSafe,

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, dest: *mut u8)

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

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> DynAstExt for T
where T: Extension + Render + 'static,

Source§

fn as_any(&self) -> &(dyn Any + 'static)

Erase to &dyn Any for downcasting a node back to its concrete type.
Source§

fn dyn_clone(&self) -> Box<dyn DynAstExt>

Clone into a fresh box — the object-safe stand-in for Clone (whose Self-returning signature cannot go through a vtable).
Source§

fn dyn_eq(&self, other: &dyn DynAstExt) -> bool

Structural equality against another erased node — the object-safe stand-in for PartialEq (whose &Self argument cannot go through a vtable). Equal iff other holds the same concrete type and that type deems the values equal; differently-typed nodes are never equal.
Source§

fn dyn_hash(&self, state: &mut dyn Hasher)

Feed this node’s hash into an erased hasher — the object-safe stand-in for Hash::hash (whose generic H: Hasher cannot go through a vtable).
Source§

impl<T> Extension for T
where T: Clone + Debug + Eq + Hash + Spanned,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> RenderExt for T
where T: Render,

Source§

fn displayed<'a>(&'a self, ctx: &'a RenderCtx<'a>) -> Displayed<'a, T>

Pair this node with an explicit canonical RenderCtx so format!, to_string, and {} render it. This is the canonical path: the ctx’s resolver and source must match the node’s parse.
Source§

fn debug_sql<'a>(&'a self, resolver: &'a dyn Resolver) -> DebugSql<'a, Self>
where Self: Sized,

Render this node for debugging against an explicitly-supplied resolver (the debug-SQL mitigation), returning a Display adapter. Read more
Source§

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

Source§

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, U> TryFrom<U> for T
where U: Into<T>,

Source§

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>,

Source§

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.