Skip to main content

ForClause

Enum ForClause 

Source
pub enum ForClause {
    Xml {
        mode: ForXmlMode,
        elements: Option<ForXmlElements>,
        binary_base64: bool,
        typed: bool,
        root: Option<ForRoot>,
        meta: Meta,
    },
    Json {
        mode: ForJsonMode,
        root: Option<ForRoot>,
        include_null_values: bool,
        without_array_wrapper: bool,
        meta: Meta,
    },
}
Expand description

MSSQL FOR XML / FOR JSON result-shaping tail on a Query (Query::for_clause): SELECT … FOR XML {RAW|AUTO|EXPLICIT|PATH} [, …] and SELECT … FOR JSON {AUTO|PATH} [, …], which serialize the result set as XML or JSON instead of a rowset.

§Parity with sqlparser-rs ForClause

Mirrors sqlparser-rs’s ForClause enum (its Xml { for_xml, elements, binary_base64, root, r#type } / Json { for_json, root, include_null_values, without_array_wrapper } variants), with three deliberate reshapings:

  • The RAW/AUTO/EXPLICIT/PATH and AUTO/PATH selectors are their own ForXmlMode / ForJsonMode axes carrying the optional ('name') element name on the arms that take one (RAW/PATH), rather than sqlparser-rs’s flatter ForXml/ForJson with a separate name — the name is a property of the mode, so it rides the mode arm (the canonical-shape doctrine, ADR-0011).
  • ELEMENTS is Option<ForXmlElements>None for the attribute-centric default, Some carrying the XSINIL/ABSENT null-handling refinement — where sqlparser-rs drops the refinement onto a bare elements: bool.
  • ROOT ['name'] is Option<ForRoot> (presence = the ROOT keyword; the inner name is optional) shared by both variants, where sqlparser-rs models it per-variant as root: Option<String> — losing the bare-ROOT vs no-ROOT distinction our shape keeps.

sqlparser-rs’s ForClause::Browse (FOR BROWSE) is out of scope: this ticket covers only the FOR XML/FOR JSON result-shaping tails.

§Gating and FOR disambiguation

Gated by QueryTailSyntax::for_xml_json_clause — on for MSSQL and the permissive Lenient union, off elsewhere; with the gate off the FOR keyword in this position is left unconsumed and surfaces as a clean parse error. FOR also introduces the row-locking clauses (Query::locking, gated by QueryTailSyntax::locking_clauses); the two share the FOR lead but partition on the follow tokenXML/JSON here versus UPDATE/SHARE/NO/KEY for locking — so the dispatch is unambiguous under every preset combination, including Lenient (the one preset that enables both), and needs no GrammarConflict registry entry.

There is no MSSQL oracle, so the accepted grammar is the recorded acceptance bound (self-consistent round-trip tests plus the MSSQL FOR XML/FOR JSON docs cited on the gating flag). Options are accepted order-independently and rendered in the canonical MSSQL directive order. Carries only mode tags and quoted-name Literals (no Expr), so it is not generic over the extension parameter.

Variants§

§

Xml

FOR XML {RAW|AUTO|EXPLICIT|PATH} [, BINARY BASE64] [, TYPE] [, ROOT ['name']] [, ELEMENTS [XSINIL|ABSENT]].

Fields

§mode: ForXmlMode

Mode selected by this syntax.

§elements: Option<ForXmlElements>

The ELEMENTS [XSINIL|ABSENT] element-centric directive; None for the attribute-centric default.

§binary_base64: bool

BINARY BASE64 — encode binary columns as Base64 rather than a URL reference.

§typed: bool

TYPE — return the result as an xml-typed value rather than text.

§root: Option<ForRoot>

ROOT ['name'] wrapper element; None when no ROOT directive is written.

§meta: Meta

Source location and node identity.

§

Json

FOR JSON {AUTO|PATH} [, ROOT ['name']] [, INCLUDE_NULL_VALUES] [, WITHOUT_ARRAY_WRAPPER].

Fields

§mode: ForJsonMode

Mode selected by this syntax.

§root: Option<ForRoot>

ROOT ['name'] wrapper property; None when no ROOT directive is written.

§include_null_values: bool

INCLUDE_NULL_VALUES — emit null-valued properties instead of omitting them.

§without_array_wrapper: bool

WITHOUT_ARRAY_WRAPPER — emit a single object rather than a JSON array.

§meta: Meta

Source location and node identity.

Trait Implementations§

Source§

impl Clone for ForClause

Source§

fn clone(&self) -> ForClause

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 Debug for ForClause

Source§

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

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

impl<'de> Deserialize<'de> for ForClause

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 Eq for ForClause

Source§

impl Hash for ForClause

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 PartialEq for ForClause

Source§

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

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

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

Inequality operator !=. Read more
Source§

impl Render for ForClause

Source§

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

Renders the MSSQL FOR XML/FOR JSON tail with the directives in the canonical MSSQL order (parse accepts them order-independently). Callers write the leading space.

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 Serialize for ForClause

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 Spanned for ForClause

Source§

fn span(&self) -> Span

Return the span for this value.
Source§

impl StructuralPartialEq for ForClause

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