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/PATHandAUTO/PATHselectors are their ownForXmlMode/ForJsonModeaxes carrying the optional('name')element name on the arms that take one (RAW/PATH), rather than sqlparser-rs’s flatterForXml/ForJsonwith a separate name — the name is a property of the mode, so it rides the mode arm (the canonical-shape doctrine, ADR-0011). ELEMENTSisOption<ForXmlElements>—Nonefor the attribute-centric default,Somecarrying theXSINIL/ABSENTnull-handling refinement — where sqlparser-rs drops the refinement onto a bareelements: bool.ROOT ['name']isOption<ForRoot>(presence = theROOTkeyword; the inner name is optional) shared by both variants, where sqlparser-rs models it per-variant asroot: Option<String>— losing the bare-ROOTvs no-ROOTdistinction 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 token — XML/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: ForXmlModeMode selected by this syntax.
elements: Option<ForXmlElements>The ELEMENTS [XSINIL|ABSENT] element-centric directive; None for the
attribute-centric default.
Json
FOR JSON {AUTO|PATH} [, ROOT ['name']] [, INCLUDE_NULL_VALUES] [, WITHOUT_ARRAY_WRAPPER].
Fields
mode: ForJsonModeMode selected by this syntax.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for ForClause
impl<'de> Deserialize<'de> for ForClause
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Eq for ForClause
Source§impl Render for ForClause
impl Render for ForClause
Source§fn render(&self, ctx: &RenderCtx<'_>, f: &mut Formatter<'_>) -> Result
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>
fn operand_binding_power(&self) -> Option<BindingPower>
None (the default) for a self-delimiting node — an atom, call, or
constructor — that never needs parentheses. Read moreimpl StructuralPartialEq for ForClause
Auto Trait Implementations§
impl Freeze for ForClause
impl RefUnwindSafe for ForClause
impl Send for ForClause
impl Sync for ForClause
impl Unpin for ForClause
impl UnsafeUnpin for ForClause
impl UnwindSafe for ForClause
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,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> DynAstExt for T
impl<T> DynAstExt for T
Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&dyn Any for downcasting a node back to its concrete type.Source§fn dyn_clone(&self) -> Box<dyn DynAstExt>
fn dyn_clone(&self) -> Box<dyn DynAstExt>
Clone (whose
Self-returning signature cannot go through a vtable).Source§fn dyn_eq(&self, other: &dyn DynAstExt) -> bool
fn dyn_eq(&self, other: &dyn DynAstExt) -> bool
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.