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