Skip to main content

surrealdb_sql/statements/alter/
function.rs

1use 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))]
10/// AST node for `ALTER FUNCTION`.
11pub 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}