Skip to main content

surrealdb_sql/statements/alter/
field.rs

1use common::fmt::QuoteStr;
2use surrealdb_types::{SqlFormat, ToSql, write_sql};
3
4use super::AlterKind;
5use crate::reference::Reference;
6use crate::{CoverStmts, Expr, FieldPermissions, Kind, Literal, Permissions};
7
8#[derive(Clone, Debug, Default, Eq, PartialEq)]
9#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
10pub enum AlterDefault {
11	#[default]
12	None,
13	Drop,
14	Always(Expr),
15	Set(Expr),
16}
17
18#[derive(Clone, Debug, Eq, PartialEq)]
19#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
20pub struct AlterFieldStatement {
21	pub name: Expr,
22	pub what: Expr,
23	pub if_exists: bool,
24	pub kind: AlterKind<Kind>,
25	pub flexible: AlterKind<()>,
26	pub readonly: AlterKind<()>,
27	/// Set or drop the `INLINE` clause.
28	pub inline: AlterKind<()>,
29	pub value: AlterKind<Expr>,
30	pub assert: AlterKind<Expr>,
31	pub default: AlterDefault,
32	pub permissions: Option<Permissions>,
33	pub comment: AlterKind<String>,
34	pub reference: AlterKind<Reference>,
35}
36
37impl Default for AlterFieldStatement {
38	fn default() -> Self {
39		Self {
40			name: Expr::Literal(Literal::None),
41			what: Expr::Literal(Literal::None),
42			if_exists: false,
43			kind: AlterKind::None,
44			flexible: AlterKind::None,
45			readonly: AlterKind::None,
46			inline: AlterKind::None,
47			value: AlterKind::None,
48			assert: AlterKind::None,
49			default: AlterDefault::None,
50			permissions: None,
51			comment: AlterKind::None,
52			reference: AlterKind::None,
53		}
54	}
55}
56
57impl ToSql for AlterFieldStatement {
58	fn fmt_sql(&self, f: &mut String, fmt: SqlFormat) {
59		write_sql!(f, fmt, "ALTER FIELD");
60		if self.if_exists {
61			write_sql!(f, fmt, " IF EXISTS");
62		}
63		write_sql!(f, fmt, " {} ON {}", CoverStmts(&self.name), CoverStmts(&self.what));
64		match self.kind {
65			AlterKind::Set(ref x) => write_sql!(f, fmt, " TYPE {x}"),
66			AlterKind::Drop => write_sql!(f, fmt, " DROP TYPE"),
67			AlterKind::None => {}
68		}
69		match self.flexible {
70			AlterKind::Set(_) => write_sql!(f, fmt, " FLEXIBLE"),
71			AlterKind::Drop => write_sql!(f, fmt, " DROP FLEXIBLE"),
72			AlterKind::None => {}
73		}
74		match self.readonly {
75			AlterKind::Set(_) => write_sql!(f, fmt, " READONLY"),
76			AlterKind::Drop => write_sql!(f, fmt, " DROP READONLY"),
77			AlterKind::None => {}
78		}
79		match self.inline {
80			AlterKind::Set(_) => write_sql!(f, fmt, " INLINE"),
81			AlterKind::Drop => write_sql!(f, fmt, " DROP INLINE"),
82			AlterKind::None => {}
83		}
84		match self.value {
85			AlterKind::Set(ref x) => write_sql!(f, fmt, " VALUE {}", CoverStmts(x)),
86			AlterKind::Drop => write_sql!(f, fmt, " DROP VALUE"),
87			AlterKind::None => {}
88		}
89		match self.assert {
90			AlterKind::Set(ref x) => write_sql!(f, fmt, " ASSERT {}", CoverStmts(x)),
91			AlterKind::Drop => write_sql!(f, fmt, " DROP ASSERT"),
92			AlterKind::None => {}
93		}
94
95		match self.default {
96			AlterDefault::None => {}
97			AlterDefault::Drop => write_sql!(f, fmt, " DROP DEFAULT"),
98			AlterDefault::Always(ref d) => write_sql!(f, fmt, " DEFAULT ALWAYS {}", CoverStmts(d)),
99			AlterDefault::Set(ref d) => write_sql!(f, fmt, " DEFAULT {}", CoverStmts(d)),
100		}
101
102		if let Some(permissions) = &self.permissions {
103			write_sql!(f, fmt, " {}", FieldPermissions(permissions));
104		}
105
106		match self.comment {
107			AlterKind::Set(ref x) => write_sql!(f, fmt, " COMMENT {}", QuoteStr(x)),
108			AlterKind::Drop => write_sql!(f, fmt, " DROP COMMENT"),
109			AlterKind::None => {}
110		}
111		match self.reference {
112			AlterKind::Set(ref x) => write_sql!(f, fmt, " REFERENCE {x}"),
113			AlterKind::Drop => write_sql!(f, fmt, " DROP REFERENCE"),
114			AlterKind::None => {}
115		}
116	}
117}