surrealdb_sql/statements/alter/
field.rs1use 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 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}