Skip to main content

limbo_sqlite3_parser/to_sql_string/stmt/
create_virtual_table.rs

1use crate::{ast, to_sql_string::ToSqlString};
2
3impl ToSqlString for ast::CreateVirtualTable {
4    fn to_sql_string<C: crate::to_sql_string::ToSqlContext>(&self, context: &C) -> String {
5        format!(
6            "CREATE VIRTUAL TABLE {}{} USING {}{};",
7            self.if_not_exists.then_some("IF NOT EXISTS ").unwrap_or(""),
8            self.tbl_name.to_sql_string(context),
9            self.module_name.0,
10            self.args
11                .as_ref()
12                .map_or("".to_string(), |args| format!("({})", args.join(", ")))
13        )
14    }
15}
16
17#[cfg(test)]
18mod tests {
19    use crate::to_sql_string_test;
20
21    to_sql_string_test!(
22        test_create_virtual_table_fts5_basic,
23        "CREATE VIRTUAL TABLE docs USING fts5(title, content);"
24    );
25
26    to_sql_string_test!(
27        test_create_virtual_table_fts5_tokenizer,
28        "CREATE VIRTUAL TABLE docs USING fts5(title, content, tokenize = 'porter');"
29    );
30
31    to_sql_string_test!(
32        test_create_virtual_table_fts5_unindexed,
33        "CREATE VIRTUAL TABLE docs USING fts5(title, content, metadata UNINDEXED);"
34    );
35
36    to_sql_string_test!(
37        test_create_virtual_table_fts5_prefix,
38        "CREATE VIRTUAL TABLE docs USING fts5(title, content, tokenize = 'unicode61', prefix = '2 4');"
39    );
40
41    to_sql_string_test!(
42        test_create_virtual_table_fts5_contentless,
43        "CREATE VIRTUAL TABLE docs USING fts5(title, content, content = '');"
44    );
45
46    to_sql_string_test!(
47        test_create_virtual_table_fts5_external_content,
48        "CREATE VIRTUAL TABLE docs_fts USING fts5(title, content, content = 'documents');"
49    );
50
51    to_sql_string_test!(
52        test_create_virtual_table_rtree,
53        "CREATE VIRTUAL TABLE geo USING rtree(id, min_x, max_x, min_y, max_y);"
54    );
55
56    to_sql_string_test!(
57        test_create_virtual_table_rtree_aux,
58        "CREATE VIRTUAL TABLE geo USING rtree(id, min_x, max_x, min_y, max_y, +name TEXT, +category INTEGER);"
59    );
60
61    to_sql_string_test!(
62        test_create_virtual_table_if_not_exists,
63        "CREATE VIRTUAL TABLE IF NOT EXISTS docs USING fts5(title, content);"
64    );
65
66    to_sql_string_test!(
67        test_create_virtual_table_fts4,
68        "CREATE VIRTUAL TABLE docs USING fts4(title, content, matchinfo = 'fts3');"
69    );
70
71    to_sql_string_test!(
72        test_create_virtual_table_fts5_detail,
73        "CREATE VIRTUAL TABLE docs USING fts5(title, body TEXT, detail = 'none');"
74    );
75
76    to_sql_string_test!(
77        test_create_virtual_table_schema,
78        "CREATE VIRTUAL TABLE main.docs USING fts5(title, content);"
79    );
80}