11use crate :: rules:: utils:: tables_created_in_transaction;
22use crate :: violations:: { RuleViolation , RuleViolationKind } ;
3- use squawk_parser:: ast:: { RelationKind , RootStmt , Stmt } ;
3+ use squawk_parser:: ast:: { ObjectType , RelationKind , RootStmt , Stmt } ;
44
55#[ must_use]
66pub fn require_concurrent_index_creation ( tree : & [ RootStmt ] ) -> Vec < RuleViolation > {
@@ -19,11 +19,13 @@ pub fn require_concurrent_index_creation(tree: &[RootStmt]) -> Vec<RuleViolation
1919 ) ) ;
2020 }
2121 }
22- Stmt :: DropStmt ( stmt) if !stmt. concurrent => errs. push ( RuleViolation :: new (
23- RuleViolationKind :: RequireConcurrentIndexCreation ,
24- raw_stmt. into ( ) ,
25- None ,
26- ) ) ,
22+ Stmt :: DropStmt ( stmt) if !stmt. concurrent && stmt. remove_type == ObjectType :: Index => {
23+ errs. push ( RuleViolation :: new (
24+ RuleViolationKind :: RequireConcurrentIndexCreation ,
25+ raw_stmt. into ( ) ,
26+ None ,
27+ ) )
28+ }
2729 _ => continue ,
2830 }
2931 }
@@ -76,4 +78,28 @@ mod test_rules {
7678 "# ;
7779 assert_eq ! ( check_sql( ok_sql, & [ ] ) , Ok ( vec![ ] ) ) ;
7880 }
81+
82+ #[ test]
83+ fn regression_false_positive_drop_type ( ) {
84+ let sql = r#"
85+ DROP TYPE IF EXISTS foo;
86+ "# ;
87+ assert_eq ! ( check_sql( sql, & [ ] ) , Ok ( vec![ ] ) ) ;
88+ }
89+
90+ #[ test]
91+ fn regression_false_positive_drop_table ( ) {
92+ let sql = r#"
93+ DROP TABLE IF EXISTS some_table;
94+ "# ;
95+ assert_eq ! ( check_sql( sql, & [ ] ) , Ok ( vec![ ] ) ) ;
96+ }
97+
98+ #[ test]
99+ fn regression_false_positive_drop_trigger ( ) {
100+ let sql = r#"
101+ DROP TRIGGER IF EXISTS trigger on foo_table;
102+ "# ;
103+ assert_eq ! ( check_sql( sql, & [ ] ) , Ok ( vec![ ] ) ) ;
104+ }
79105}
0 commit comments