surrealdb_sql/statements/alter/
function.rs1use common::fmt::{EscapeKwFreeIdent, QuoteStr};
2use surrealdb_strand::Strand;
3use surrealdb_types::{SqlFormat, ToSql, write_sql};
4
5use super::AlterKind;
6use crate::{Block, Kind, Permission};
7
8#[derive(Clone, Debug, Default, Eq, PartialEq)]
9#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
10pub struct AlterFunctionStatement {
12 pub name: Strand,
13 pub if_exists: bool,
14 pub args: AlterKind<Vec<(String, Kind)>>,
15 pub block: AlterKind<Block>,
16 pub comment: AlterKind<String>,
17 pub permissions: Option<Permission>,
18 pub returns: AlterKind<Kind>,
19}
20
21impl ToSql for AlterFunctionStatement {
22 fn fmt_sql(&self, f: &mut String, fmt: SqlFormat) {
23 write_sql!(f, fmt, "ALTER FUNCTION");
24 if self.if_exists {
25 write_sql!(f, fmt, " IF EXISTS");
26 }
27 write_sql!(f, fmt, " fn");
28 for s in self.name.as_str().split("::") {
29 write_sql!(f, fmt, "::");
30 EscapeKwFreeIdent(s).fmt_sql(f, fmt);
31 }
32
33 if let AlterKind::Set(ref args) = self.args {
34 write_sql!(f, fmt, "(");
35 for (i, (name, kind)) in args.iter().enumerate() {
36 if i > 0 {
37 f.push_str(", ");
38 }
39 write_sql!(f, fmt, "${}: {kind}", EscapeKwFreeIdent(name));
40 }
41 f.push(')');
42 }
43
44 match self.returns {
45 AlterKind::Set(ref v) => write_sql!(f, fmt, " -> {v}"),
46 AlterKind::Drop => f.push_str(" DROP RETURNS"),
47 AlterKind::None => {}
48 }
49
50 if let AlterKind::Set(ref block) = self.block {
51 f.push(' ');
52 block.fmt_sql(f, fmt);
53 }
54
55 match self.comment {
56 AlterKind::Set(ref v) => write_sql!(f, fmt, " COMMENT {}", QuoteStr(v)),
57 AlterKind::Drop => f.push_str(" DROP COMMENT"),
58 AlterKind::None => {}
59 }
60
61 if let Some(ref p) = self.permissions {
62 let fmt = fmt.increment();
63 write_sql!(f, fmt, " PERMISSIONS {}", p);
64 }
65 }
66}