squawk-linter 2.50.0

Linter for Postgres migrations & SQL
Documentation
use squawk_syntax::{
    Parse, SourceFile,
    ast::{self, AstNode},
};

use crate::{Linter, Rule, Violation};

pub(crate) fn ban_alter_domain_with_add_constraint(ctx: &mut Linter, parse: &Parse<SourceFile>) {
    let file = parse.tree();
    for stmt in file.stmts() {
        if let ast::Stmt::AlterDomain(alter_domain) = stmt {
            if let Some(ast::AlterDomainAction::AddConstraint(add_constraint)) =
                alter_domain.action()
            {
                ctx.report(Violation::for_node(
                    Rule::BanAlterDomainWithAddConstraint,
                        "Domains with constraints have poor support for online migrations. Use table and column constraints instead.".into(),
                        add_constraint.syntax(),
                    ))
            }
        }
    }
}

#[cfg(test)]
mod test {
    use insta::assert_snapshot;

    use crate::Rule;
    use crate::test_utils::{lint_errors, lint_ok};

    #[test]
    fn err() {
        let sql = r#"
     ALTER DOMAIN domain_name ADD CONSTRAINT constraint_name CHECK (value > 0);
        "#;
        assert_snapshot!(lint_errors(sql, Rule::BanAlterDomainWithAddConstraint));
    }

    #[test]
    fn ok() {
        let sql = r#"
     ALTER DOMAIN domain_name_2 SET NOT NULL;
     ALTER DOMAIN domain_name_3 DROP CONSTRAINT other_domain_name;
     ALTER DOMAIN domain_name_4 RENAME CONSTRAINT constraint_name TO other_constraint_name;
     ALTER DOMAIN domain_name_5 RENAME TO other_domain_name;
     ALTER DOMAIN domain_name_6 VALIDATE CONSTRAINT constraint_name;
     ALTER DOMAIN domain_name_7 OWNER TO you;
     ALTER DOMAIN domain_name_8 SET SCHEMA foo;
        "#;
        lint_ok(sql, Rule::BanAlterDomainWithAddConstraint);
    }
}