Skip to main content

pgevolve_core/render/
schema.rs

1//! Schema renderer.
2
3use crate::ir::schema::Schema;
4use crate::plan::rewrite::sql as rewrite_sql;
5
6/// Render a `Schema` as SQL.
7///
8/// Emits `CREATE SCHEMA <name>;` followed by an optional
9/// `COMMENT ON SCHEMA <name> IS '...';`.
10#[must_use]
11pub fn render_schema(s: &Schema) -> String {
12    let mut out = rewrite_sql::create_schema(s);
13    out.push('\n');
14    if let Some(comment) = &s.comment {
15        out.push_str(&rewrite_sql::comment_on_schema(
16            &s.name,
17            Some(comment.as_str()),
18        ));
19        out.push('\n');
20    }
21    out
22}
23
24#[cfg(test)]
25mod tests {
26    use super::*;
27    use crate::identifier::Identifier;
28    use crate::ir::schema::Schema;
29
30    fn id(s: &str) -> Identifier {
31        Identifier::from_unquoted(s).unwrap()
32    }
33
34    #[test]
35    fn plain_schema_renders() {
36        let s = Schema::new(id("app"));
37        let sql = render_schema(&s);
38        assert!(sql.contains("CREATE SCHEMA app;"));
39        assert!(!sql.contains("COMMENT"));
40        let r = pg_query::parse(sql.trim());
41        assert!(r.is_ok(), "pg_query rejected: {sql:?}\nerr: {r:?}");
42    }
43
44    #[test]
45    fn schema_with_comment_renders() {
46        let s = Schema {
47            name: id("billing"),
48            comment: Some("billing namespace".into()),
49            owner: None,
50            grants: vec![],
51        };
52        let sql = render_schema(&s);
53        assert!(sql.contains("CREATE SCHEMA billing;"));
54        assert!(sql.contains("COMMENT ON SCHEMA billing IS 'billing namespace';"));
55
56        let r = pg_query::parse(&sql);
57        assert!(r.is_ok(), "pg_query rejected SQL:\n{sql}\nerr: {r:?}");
58    }
59
60    #[test]
61    fn quoted_schema_name_renders() {
62        // Quoted names must be preserved.
63        let s = Schema::new(Identifier::from_quoted("MySchema").unwrap());
64        let sql = render_schema(&s);
65        assert!(
66            sql.contains("\"MySchema\""),
67            "expected quoted name in: {sql}"
68        );
69        let r = pg_query::parse(&sql);
70        assert!(r.is_ok(), "pg_query rejected SQL:\n{sql}\nerr: {r:?}");
71    }
72}