Skip to main content

surrealdb_sql/statements/
update.rs

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