@@ -844,6 +844,43 @@ impl fmt::Display for CaseWhen {
844844 }
845845}
846846
847+ /// Parsing mode for `XMLPARSE`.
848+ #[ derive( Debug , Clone , Copy , PartialEq , PartialOrd , Eq , Ord , Hash ) ]
849+ #[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) ) ]
850+ #[ cfg_attr( feature = "visitor" , derive( Visit , VisitMut ) ) ]
851+ pub enum XmlParseMode {
852+ /// `CONTENT`
853+ Content ,
854+ /// `DOCUMENT`
855+ Document ,
856+ }
857+
858+ impl fmt:: Display for XmlParseMode {
859+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
860+ match self {
861+ XmlParseMode :: Content => write ! ( f, "CONTENT" ) ,
862+ XmlParseMode :: Document => write ! ( f, "DOCUMENT" ) ,
863+ }
864+ }
865+ }
866+
867+ /// `XMLPARSE(CONTENT|DOCUMENT expr)`.
868+ #[ derive( Debug , Clone , PartialEq , PartialOrd , Eq , Ord , Hash ) ]
869+ #[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) ) ]
870+ #[ cfg_attr( feature = "visitor" , derive( Visit , VisitMut ) ) ]
871+ pub struct XmlParseExpr {
872+ /// Parsing mode.
873+ pub mode : XmlParseMode ,
874+ /// Expression to parse as XML.
875+ pub expr : Box < Expr > ,
876+ }
877+
878+ impl fmt:: Display for XmlParseExpr {
879+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
880+ write ! ( f, "XMLPARSE({} {})" , self . mode, self . expr)
881+ }
882+ }
883+
847884/// An SQL expression of any type.
848885///
849886/// # Semantics / Type Checking
@@ -1233,6 +1270,8 @@ pub enum Expr {
12331270 /// This can represent ANSI SQL `DATE`, `TIME`, and `TIMESTAMP` literals (such as `DATE '2020-01-01'`),
12341271 /// as well as constants of other types (a non-standard PostgreSQL extension).
12351272 TypedString ( TypedString ) ,
1273+ /// XML parse expression: `XMLPARSE(CONTENT|DOCUMENT expr)`.
1274+ XmlParse ( XmlParseExpr ) ,
12361275 /// Scalar function call e.g. `LEFT(foo, 5)`
12371276 Function ( Function ) ,
12381277 /// `CASE [<operand>] WHEN <condition> THEN <result> ... [ELSE <result>] END`
@@ -2015,6 +2054,7 @@ impl fmt::Display for Expr {
20152054 Expr :: Value ( v) => write ! ( f, "{v}" ) ,
20162055 Expr :: Prefixed { prefix, value } => write ! ( f, "{prefix} {value}" ) ,
20172056 Expr :: TypedString ( ts) => ts. fmt ( f) ,
2057+ Expr :: XmlParse ( xml_parse) => xml_parse. fmt ( f) ,
20182058 Expr :: Function ( fun) => fun. fmt ( f) ,
20192059 Expr :: Case {
20202060 case_token : _,
0 commit comments