Skip to main content

surql_parser/upstream/sql/statements/define/
table.rs

1use super::DefineKind;
2use crate::upstream::fmt::{CoverStmts, EscapeKwFreeIdent};
3use crate::upstream::sql::changefeed::ChangeFeed;
4use crate::upstream::sql::{Expr, Literal, Permissions, TableType, View};
5use surrealdb_types::{SqlFormat, ToSql, write_sql};
6#[derive(Clone, Debug, PartialEq, Eq)]
7#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
8pub struct DefineTableStatement {
9	pub kind: DefineKind,
10	pub id: Option<u32>,
11	pub name: Expr,
12	pub drop: bool,
13	pub full: bool,
14	pub view: Option<View>,
15	pub permissions: Permissions,
16	pub changefeed: Option<ChangeFeed>,
17	pub comment: Expr,
18	pub table_type: TableType,
19}
20impl Default for DefineTableStatement {
21	fn default() -> Self {
22		Self {
23			kind: DefineKind::Default,
24			id: None,
25			name: Expr::Literal(Literal::None),
26			drop: false,
27			full: false,
28			view: None,
29			permissions: Permissions::none(),
30			changefeed: None,
31			comment: Expr::Literal(Literal::None),
32			table_type: TableType::default(),
33		}
34	}
35}
36impl ToSql for DefineTableStatement {
37	fn fmt_sql(&self, f: &mut String, sql_fmt: SqlFormat) {
38		f.push_str("DEFINE TABLE");
39		match self.kind {
40			DefineKind::Default => {}
41			DefineKind::Overwrite => f.push_str(" OVERWRITE"),
42			DefineKind::IfNotExists => f.push_str(" IF NOT EXISTS"),
43		}
44		write_sql!(f, sql_fmt, " {}", CoverStmts(&self.name));
45		f.push_str(" TYPE");
46		match &self.table_type {
47			TableType::Normal => f.push_str(" NORMAL"),
48			TableType::Relation(rel) => {
49				f.push_str(" RELATION");
50				if !rel.from.is_empty() {
51					f.push_str(" IN ");
52					for (idx, k) in rel.from.iter().enumerate() {
53						if idx != 0 {
54							f.push_str(" | ");
55						}
56						write_sql!(f, sql_fmt, "{}", EscapeKwFreeIdent(k));
57					}
58				}
59				if !rel.to.is_empty() {
60					f.push_str(" OUT ");
61					for (idx, k) in rel.to.iter().enumerate() {
62						if idx != 0 {
63							f.push_str(" | ");
64						}
65						write_sql!(f, sql_fmt, "{}", EscapeKwFreeIdent(k));
66					}
67				}
68				if rel.enforced {
69					f.push_str(" ENFORCED");
70				}
71			}
72			TableType::Any => f.push_str(" ANY"),
73		}
74		if self.drop {
75			f.push_str(" DROP");
76		}
77		f.push_str(if self.full {
78			" SCHEMAFULL"
79		} else {
80			" SCHEMALESS"
81		});
82		if !matches!(self.comment, Expr::Literal(Literal::None)) {
83			write_sql!(f, sql_fmt, " COMMENT {}", CoverStmts(&self.comment));
84		}
85		if let Some(ref v) = self.view {
86			write_sql!(f, sql_fmt, " {}", v);
87		}
88		if let Some(ref v) = self.changefeed {
89			write_sql!(f, sql_fmt, " {}", v);
90		}
91		if sql_fmt.is_pretty() {
92			f.push('\n');
93			let inner_fmt = sql_fmt.increment();
94			inner_fmt.write_indent(f);
95		} else {
96			f.push(' ');
97		}
98		write_sql!(f, sql_fmt, "{}", self.permissions);
99	}
100}