surql_parser/upstream/sql/statements/
upsert.rs1use 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}