Skip to main content

surql_parser/upstream/sql/statements/alter/
field.rs

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