Skip to main content

surql_parser/upstream/sql/statements/
upsert.rs

1use crate::upstream::fmt::{CoverStmts, Fmt};
2use crate::upstream::sql::{Cond, Data, Explain, Expr, Literal, Output, With};
3use surrealdb_types::{SqlFormat, ToSql, write_sql};
4#[derive(Clone, Debug, Eq, PartialEq)]
5#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
6pub struct UpsertStatement {
7	pub only: bool,
8	#[cfg_attr(
9        feature = "arbitrary",
10        arbitrary(with = crate::upstream::sql::arbitrary::atleast_one)
11    )]
12	pub what: Vec<Expr>,
13	pub with: Option<With>,
14	pub data: Option<Data>,
15	pub cond: Option<Cond>,
16	pub output: Option<Output>,
17	pub timeout: Expr,
18	pub explain: Option<Explain>,
19}
20impl Default for UpsertStatement {
21	fn default() -> Self {
22		Self {
23			only: Default::default(),
24			what: Default::default(),
25			with: Default::default(),
26			data: Default::default(),
27			cond: Default::default(),
28			output: Default::default(),
29			timeout: Expr::Literal(Literal::None),
30			explain: Default::default(),
31		}
32	}
33}
34impl ToSql for UpsertStatement {
35	fn fmt_sql(&self, f: &mut String, fmt: SqlFormat) {
36		f.push_str("UPSERT");
37		if self.only {
38			f.push_str(" ONLY")
39		}
40		write_sql!(
41			f,
42			fmt,
43			" {}",
44			Fmt::comma_separated(self.what.iter().map(CoverStmts))
45		);
46		if let Some(ref v) = self.with {
47			write_sql!(f, fmt, " {v}");
48		}
49		if let Some(ref v) = self.data {
50			write_sql!(f, fmt, " {v}");
51		}
52		if let Some(ref v) = self.cond {
53			write_sql!(f, fmt, " {v}");
54		}
55		if let Some(ref v) = self.output {
56			write_sql!(f, fmt, " {v}");
57		}
58		if !matches!(self.timeout, Expr::Literal(Literal::None)) {
59			write_sql!(f, fmt, " TIMEOUT {}", CoverStmts(&self.timeout));
60		}
61		if let Some(ref v) = self.explain {
62			write_sql!(f, fmt, " {v}");
63		}
64	}
65}