From a32bf2d7f74f2fa18db056b15409903a96d3035b Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Fri, 22 Aug 2025 20:08:54 -0400 Subject: [PATCH] linter: fix ban char to be case insensitive --- .../squawk_linter/src/rules/ban_char_field.rs | 31 ++++++++++++++++--- ...an_char_field__test__case_insensitive.snap | 13 ++++++++ 2 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__case_insensitive.snap diff --git a/crates/squawk_linter/src/rules/ban_char_field.rs b/crates/squawk_linter/src/rules/ban_char_field.rs index 45f69cf3..35e614d0 100644 --- a/crates/squawk_linter/src/rules/ban_char_field.rs +++ b/crates/squawk_linter/src/rules/ban_char_field.rs @@ -1,16 +1,25 @@ +use std::collections::HashSet; + use squawk_syntax::{ Parse, SourceFile, TokenText, ast::{self, AstNode}, }; -use crate::visitors::check_not_allowed_types; use crate::{Linter, Rule, Violation}; +use crate::{identifier::Identifier, visitors::check_not_allowed_types}; + +use lazy_static::lazy_static; + +lazy_static! { + static ref CHAR_TYPES: HashSet = HashSet::from([ + Identifier::new("char"), + Identifier::new("character"), + Identifier::new("bpchar"), + ]); +} fn is_char_type(x: TokenText<'_>) -> bool { - if x == "char" || x == "character" || x == "bpchar" { - return true; - } - false + CHAR_TYPES.contains(&Identifier::new(&x.to_string())) } fn check_path_type(ctx: &mut Linter, path_type: ast::PathType) { @@ -126,6 +135,18 @@ create table t ( assert_debug_snapshot!(errors); } + #[test] + fn case_insensitive() { + let sql = r#" +create table t ( + a Char +); + "#; + let errors = lint(sql, Rule::BanCharField); + assert_ne!(errors.len(), 0); + assert_debug_snapshot!(errors); + } + #[test] fn array_char_type_err() { let sql = r#" diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__case_insensitive.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__case_insensitive.snap new file mode 100644 index 00000000..9b1cfdc7 --- /dev/null +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__case_insensitive.snap @@ -0,0 +1,13 @@ +--- +source: crates/squawk_linter/src/rules/ban_char_field.rs +expression: errors +--- +[ + Violation { + code: BanCharField, + message: "Using `character` is likey a mistake and should almost always be replaced by `text` or `varchar`.", + text_range: 22..26, + help: None, + fix: None, + }, +]