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