diff --git a/Cargo.lock b/Cargo.lock index 53c70369..2a1246d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1950,6 +1950,7 @@ dependencies = [ name = "squawk-syntax" version = "2.33.2" dependencies = [ + "annotate-snippets", "camino", "dir-test", "insta", diff --git a/crates/squawk/src/reporter.rs b/crates/squawk/src/reporter.rs index 88197423..2ea0ff6e 100644 --- a/crates/squawk/src/reporter.rs +++ b/crates/squawk/src/reporter.rs @@ -91,10 +91,6 @@ fn render_lint_error( sql: &str, ) -> Result<()> { let renderer = Renderer::styled().decor_style(DecorStyle::Unicode); - let error_name = &err.rule_name; - - let title = &err.message; - let level = match err.level { ViolationLevel::Warning => Level::WARNING, ViolationLevel::Error => Level::ERROR, @@ -105,7 +101,10 @@ fn render_lint_error( .fold(true) .annotation(AnnotationKind::Primary.span(err.range.into())); - let mut group = level.primary_title(title).id(error_name).element(snippet); + let mut group = level + .primary_title(&err.message) + .id(&err.rule_name) + .element(snippet); if let Some(help) = &err.help { group = group.element(Level::HELP.message(help)); diff --git a/crates/squawk_linter/src/rules/ban_uncommitted_transaction.rs b/crates/squawk_linter/src/rules/ban_uncommitted_transaction.rs index 2f29b9f4..a717f244 100644 --- a/crates/squawk_linter/src/rules/ban_uncommitted_transaction.rs +++ b/crates/squawk_linter/src/rules/ban_uncommitted_transaction.rs @@ -53,7 +53,7 @@ BEGIN; CREATE TABLE users (id bigint); "#; assert_snapshot!(lint_errors(sql, Rule::BanUncommittedTransaction), @r" - error[BanUncommittedTransaction]: Transaction never committed or rolled back. + warning[ban-uncommitted-transaction]: Transaction never committed or rolled back. ╭▸ 2 │ BEGIN; │ ━━━━━ @@ -105,7 +105,7 @@ BEGIN; CREATE TABLE posts (id bigint); "#; assert_snapshot!(lint_errors(sql, Rule::BanUncommittedTransaction), @r" - error[BanUncommittedTransaction]: Transaction never committed or rolled back. + warning[ban-uncommitted-transaction]: Transaction never committed or rolled back. ╭▸ 6 │ BEGIN; │ ━━━━━ @@ -125,7 +125,7 @@ START TRANSACTION; CREATE TABLE users (id bigint); "#; assert_snapshot!(lint_errors(sql, Rule::BanUncommittedTransaction), @r" - error[BanUncommittedTransaction]: Transaction never committed or rolled back. + warning[ban-uncommitted-transaction]: Transaction never committed or rolled back. ╭▸ 2 │ START TRANSACTION; │ ━━━━━━━━━━━━━━━━━ @@ -155,7 +155,7 @@ BEGIN WORK; CREATE TABLE users (id bigint); "#; assert_snapshot!(lint_errors(sql, Rule::BanUncommittedTransaction), @r" - error[BanUncommittedTransaction]: Transaction never committed or rolled back. + warning[ban-uncommitted-transaction]: Transaction never committed or rolled back. ╭▸ 2 │ BEGIN WORK; │ ━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/require_timeout_settings.rs b/crates/squawk_linter/src/rules/require_timeout_settings.rs index 5404d3b8..dc02d342 100644 --- a/crates/squawk_linter/src/rules/require_timeout_settings.rs +++ b/crates/squawk_linter/src/rules/require_timeout_settings.rs @@ -123,7 +123,7 @@ mod test { ALTER TABLE t ADD COLUMN c BOOLEAN; "#; assert_snapshot!(lint_errors(sql, Rule::RequireTimeoutSettings), @r" - error[RequireTimeoutSettings]: Missing `set lock_timeout` before potentially slow operations + warning[require-timeout-settings]: Missing `set lock_timeout` before potentially slow operations ╭▸ 2 │ ALTER TABLE t ADD COLUMN c BOOLEAN; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -132,7 +132,7 @@ ALTER TABLE t ADD COLUMN c BOOLEAN; ╭╴ 2 + set lock_timeout = '1s'; ╰╴ - error[RequireTimeoutSettings]: Missing `set statement_timeout` before potentially slow operations + warning[require-timeout-settings]: Missing `set statement_timeout` before potentially slow operations ╭▸ 2 │ ALTER TABLE t ADD COLUMN c BOOLEAN; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -151,7 +151,7 @@ SET statement_timeout = '5s'; ALTER TABLE t ADD COLUMN c BOOLEAN; "#; assert_snapshot!(lint_errors(sql, Rule::RequireTimeoutSettings), @r" - error[RequireTimeoutSettings]: Missing `set lock_timeout` before potentially slow operations + warning[require-timeout-settings]: Missing `set lock_timeout` before potentially slow operations ╭▸ 3 │ ALTER TABLE t ADD COLUMN c BOOLEAN; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -170,7 +170,7 @@ SET lock_timeout = '1s'; ALTER TABLE t ADD COLUMN c BOOLEAN; "#; assert_snapshot!(lint_errors(sql, Rule::RequireTimeoutSettings), @r" - error[RequireTimeoutSettings]: Missing `set statement_timeout` before potentially slow operations + warning[require-timeout-settings]: Missing `set statement_timeout` before potentially slow operations ╭▸ 3 │ ALTER TABLE t ADD COLUMN c BOOLEAN; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -218,7 +218,7 @@ SET foo.statement_timeout = '5s'; ALTER TABLE t ADD COLUMN c BOOLEAN; "#; assert_snapshot!(lint_errors(sql, Rule::RequireTimeoutSettings), @r" - error[RequireTimeoutSettings]: Missing `set lock_timeout` before potentially slow operations + warning[require-timeout-settings]: Missing `set lock_timeout` before potentially slow operations ╭▸ 4 │ ALTER TABLE t ADD COLUMN c BOOLEAN; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -227,7 +227,7 @@ ALTER TABLE t ADD COLUMN c BOOLEAN; ╭╴ 2 + set lock_timeout = '1s'; ╰╴ - error[RequireTimeoutSettings]: Missing `set statement_timeout` before potentially slow operations + warning[require-timeout-settings]: Missing `set statement_timeout` before potentially slow operations ╭▸ 4 │ ALTER TABLE t ADD COLUMN c BOOLEAN; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -246,7 +246,7 @@ SET lock_timeout = '1s'; SET statement_timeout = '5s'; "#; assert_snapshot!(lint_errors(sql, Rule::RequireTimeoutSettings), @r" - error[RequireTimeoutSettings]: Missing `set lock_timeout` before potentially slow operations + warning[require-timeout-settings]: Missing `set lock_timeout` before potentially slow operations ╭▸ 2 │ ALTER TABLE t ADD COLUMN c BOOLEAN; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -255,7 +255,7 @@ SET statement_timeout = '5s'; ╭╴ 2 + set lock_timeout = '1s'; ╰╴ - error[RequireTimeoutSettings]: Missing `set statement_timeout` before potentially slow operations + warning[require-timeout-settings]: Missing `set statement_timeout` before potentially slow operations ╭▸ 2 │ ALTER TABLE t ADD COLUMN c BOOLEAN; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -273,7 +273,7 @@ SET statement_timeout = '5s'; CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy'); "#; assert_snapshot!(lint_errors(sql, Rule::RequireTimeoutSettings), @r" - error[RequireTimeoutSettings]: Missing `set lock_timeout` before potentially slow operations + warning[require-timeout-settings]: Missing `set lock_timeout` before potentially slow operations ╭▸ 2 │ CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy'); │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -282,7 +282,7 @@ CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy'); ╭╴ 2 + set lock_timeout = '1s'; ╰╴ - error[RequireTimeoutSettings]: Missing `set statement_timeout` before potentially slow operations + warning[require-timeout-settings]: Missing `set statement_timeout` before potentially slow operations ╭▸ 2 │ CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy'); │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__arbitrary_func_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__arbitrary_func_err.snap index bb5146e7..6c2cba1b 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__arbitrary_func_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__arbitrary_func_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/adding_field_with_default.rs expression: "lint_errors(sql, Rule::AddingFieldWithDefault)" --- -error[AddingFieldWithDefault]: Adding a generated column requires a table rewrite with an `ACCESS EXCLUSIVE` lock. In Postgres versions 11+, non-VOLATILE DEFAULTs can be added without a rewrite. +warning[adding-field-with-default]: Adding a generated column requires a table rewrite with an `ACCESS EXCLUSIVE` lock. In Postgres versions 11+, non-VOLATILE DEFAULTs can be added without a rewrite. ╭▸ 3 │ ALTER TABLE "core_recipe" ADD COLUMN "foo" jsonb DEFAULT myjsonb(); │ ━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__default_random_with_args_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__default_random_with_args_err.snap index 33e95266..76a78372 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__default_random_with_args_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__default_random_with_args_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/adding_field_with_default.rs expression: "lint_errors(sql, Rule::AddingFieldWithDefault)" --- -error[AddingFieldWithDefault]: Adding a generated column requires a table rewrite with an `ACCESS EXCLUSIVE` lock. In Postgres versions 11+, non-VOLATILE DEFAULTs can be added without a rewrite. +warning[adding-field-with-default]: Adding a generated column requires a table rewrite with an `ACCESS EXCLUSIVE` lock. In Postgres versions 11+, non-VOLATILE DEFAULTs can be added without a rewrite. ╭▸ 3 │ ALTER TABLE "core_recipe" ADD COLUMN "foo" timestamptz DEFAULT now(123); │ ━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__default_uuid_error.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__default_uuid_error.snap index 8e8a6a60..7d22e6de 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__default_uuid_error.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__default_uuid_error.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/adding_field_with_default.rs expression: "lint_errors(sql, Rule::AddingFieldWithDefault)" --- -error[AddingFieldWithDefault]: Adding a generated column requires a table rewrite with an `ACCESS EXCLUSIVE` lock. In Postgres versions 11+, non-VOLATILE DEFAULTs can be added without a rewrite. +warning[adding-field-with-default]: Adding a generated column requires a table rewrite with an `ACCESS EXCLUSIVE` lock. In Postgres versions 11+, non-VOLATILE DEFAULTs can be added without a rewrite. ╭▸ 2 │ ALTER TABLE "core_recipe" ADD COLUMN "foo" integer DEFAULT uuid(); │ ━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__default_uuid_error_multi_stmt.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__default_uuid_error_multi_stmt.snap index 25378817..e8bc79fc 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__default_uuid_error_multi_stmt.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__default_uuid_error_multi_stmt.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/adding_field_with_default.rs expression: "lint_errors(sql, Rule::AddingFieldWithDefault)" --- -error[AddingFieldWithDefault]: Adding a generated column requires a table rewrite with an `ACCESS EXCLUSIVE` lock. In Postgres versions 11+, non-VOLATILE DEFAULTs can be added without a rewrite. +warning[adding-field-with-default]: Adding a generated column requires a table rewrite with an `ACCESS EXCLUSIVE` lock. In Postgres versions 11+, non-VOLATILE DEFAULTs can be added without a rewrite. ╭▸ 2 │ alter table t set logged, add column c integer default uuid(); │ ━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__default_volatile_func_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__default_volatile_func_err.snap index a3afab8c..84bee438 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__default_volatile_func_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__default_volatile_func_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/adding_field_with_default.rs expression: "lint_errors(sql, Rule::AddingFieldWithDefault)" --- -error[AddingFieldWithDefault]: Adding a generated column requires a table rewrite with an `ACCESS EXCLUSIVE` lock. In Postgres versions 11+, non-VOLATILE DEFAULTs can be added without a rewrite. +warning[adding-field-with-default]: Adding a generated column requires a table rewrite with an `ACCESS EXCLUSIVE` lock. In Postgres versions 11+, non-VOLATILE DEFAULTs can be added without a rewrite. ╭▸ 3 │ ALTER TABLE "core_recipe" ADD COLUMN "foo" boolean DEFAULT random(); │ ━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__docs_example_error_on_pg_11.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__docs_example_error_on_pg_11.snap index 016d041d..6d66e655 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__docs_example_error_on_pg_11.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__docs_example_error_on_pg_11.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/adding_field_with_default.rs expression: "lint_errors_with(sql, LinterSettings\n{\n pg_version: \"11\".parse().expect(\"Invalid PostgreSQL version\"),\n ..Default::default()\n},)" --- -error[AddingFieldWithDefault]: Adding a generated column requires a table rewrite with an `ACCESS EXCLUSIVE` lock. In Postgres versions 11+, non-VOLATILE DEFAULTs can be added without a rewrite. +warning[adding-field-with-default]: Adding a generated column requires a table rewrite with an `ACCESS EXCLUSIVE` lock. In Postgres versions 11+, non-VOLATILE DEFAULTs can be added without a rewrite. ╭▸ 3 │ ALTER TABLE "core_recipe" ADD COLUMN "foo" integer DEFAULT 10; │ ━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__generated_stored_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__generated_stored_err.snap index adcaf02f..166ab635 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__generated_stored_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_field_with_default__test__generated_stored_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/adding_field_with_default.rs expression: "lint_errors(sql, Rule::AddingFieldWithDefault)" --- -error[AddingFieldWithDefault]: Adding a generated column requires a table rewrite with an `ACCESS EXCLUSIVE` lock. In Postgres versions 11+, non-VOLATILE DEFAULTs can be added without a rewrite. +warning[adding-field-with-default]: Adding a generated column requires a table rewrite with an `ACCESS EXCLUSIVE` lock. In Postgres versions 11+, non-VOLATILE DEFAULTs can be added without a rewrite. ╭▸ 3 │ ADD COLUMN bar numeric GENERATED ALWAYS AS (bar + baz) STORED; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_foreign_key_constraint__test__add_column_references_lock.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_foreign_key_constraint__test__add_column_references_lock.snap index 81806122..6a6c6795 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_foreign_key_constraint__test__add_column_references_lock.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_foreign_key_constraint__test__add_column_references_lock.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/adding_foreign_key_constraint.rs expression: "lint_errors(sql, Rule::AddingForeignKeyConstraint)" --- -error[AddingForeignKeyConstraint]: Adding a foreign key constraint requires a table scan and a `SHARE ROW EXCLUSIVE` lock on both tables, which blocks writes to each table. +warning[adding-foreign-key-constraint]: Adding a foreign key constraint requires a table scan and a `SHARE ROW EXCLUSIVE` lock on both tables, which blocks writes to each table. ╭▸ 3 │ ALTER TABLE "emails" ADD COLUMN "user_id" INT REFERENCES "user" ("id"); │ ━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_foreign_key_constraint__test__add_foreign_key_constraint_lock.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_foreign_key_constraint__test__add_foreign_key_constraint_lock.snap index 3ff9ca5f..33ef5057 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_foreign_key_constraint__test__add_foreign_key_constraint_lock.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_foreign_key_constraint__test__add_foreign_key_constraint_lock.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/adding_foreign_key_constraint.rs expression: "lint_errors(sql, Rule::AddingForeignKeyConstraint)" --- -error[AddingForeignKeyConstraint]: Adding a foreign key constraint requires a table scan and a `SHARE ROW EXCLUSIVE` lock on both tables, which blocks writes to each table. +warning[adding-foreign-key-constraint]: Adding a foreign key constraint requires a table scan and a `SHARE ROW EXCLUSIVE` lock on both tables, which blocks writes to each table. ╭▸ 4 │ ALTER TABLE "email" ADD CONSTRAINT "fk_user" FOREIGN KEY ("user_id") REFERENCES "user" ("id"); │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_not_null_field__test__regression_gh_issue_519.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_not_null_field__test__regression_gh_issue_519.snap index 7f48057c..645c12cb 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_not_null_field__test__regression_gh_issue_519.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_not_null_field__test__regression_gh_issue_519.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/adding_not_null_field.rs expression: "lint_errors(sql, Rule::AddingNotNullableField)" --- -error[AddingNotNullableField]: Setting a column `NOT NULL` blocks reads while the table is scanned. +warning[adding-not-nullable-field]: Setting a column `NOT NULL` blocks reads while the table is scanned. ╭▸ 4 │ ALTER TABLE my_table ALTER COLUMN my_column SET NOT NULL; │ ━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_not_null_field__test__set_not_null.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_not_null_field__test__set_not_null.snap index aebf4772..c3463da8 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_not_null_field__test__set_not_null.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_not_null_field__test__set_not_null.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/adding_not_null_field.rs expression: "lint_errors(sql, Rule::AddingNotNullableField)" --- -error[AddingNotNullableField]: Setting a column `NOT NULL` blocks reads while the table is scanned. +warning[adding-not-nullable-field]: Setting a column `NOT NULL` blocks reads while the table is scanned. ╭▸ 2 │ ALTER TABLE "core_recipe" ALTER COLUMN "foo" SET NOT NULL; │ ━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_primary_key_constraint__test__plain_primary_key.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_primary_key_constraint__test__plain_primary_key.snap index 1710661e..3b600d32 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_primary_key_constraint__test__plain_primary_key.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_primary_key_constraint__test__plain_primary_key.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/adding_primary_key_constraint.rs expression: "lint_errors(sql, Rule::AddingSerialPrimaryKeyField)" --- -error[AddingSerialPrimaryKeyField]: Adding a primary key constraint requires an `ACCESS EXCLUSIVE` lock that will block all reads and writes to the table while the primary key index is built. +warning[adding-serial-primary-key-field]: Adding a primary key constraint requires an `ACCESS EXCLUSIVE` lock that will block all reads and writes to the table while the primary key index is built. ╭▸ 2 │ ALTER TABLE items ADD PRIMARY KEY (id); │ ━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_primary_key_constraint__test__serial_primary_key.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_primary_key_constraint__test__serial_primary_key.snap index d59f5e75..19211e3e 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_primary_key_constraint__test__serial_primary_key.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_primary_key_constraint__test__serial_primary_key.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/adding_primary_key_constraint.rs expression: "lint_errors(sql, Rule::AddingSerialPrimaryKeyField)" --- -error[AddingSerialPrimaryKeyField]: Adding a primary key constraint requires an `ACCESS EXCLUSIVE` lock that will block all reads and writes to the table while the primary key index is built. +warning[adding-serial-primary-key-field]: Adding a primary key constraint requires an `ACCESS EXCLUSIVE` lock that will block all reads and writes to the table while the primary key index is built. ╭▸ 2 │ ALTER TABLE a ADD COLUMN b SERIAL PRIMARY KEY; │ ━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_required_field__test__not_null_without_default.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_required_field__test__not_null_without_default.snap index e949bafd..dd114f45 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_required_field__test__not_null_without_default.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__adding_required_field__test__not_null_without_default.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/adding_required_field.rs expression: "lint_errors(sql, Rule::AddingRequiredField)" --- -error[AddingRequiredField]: Adding a new column that is `NOT NULL` and has no default value to an existing table effectively makes it required. +warning[adding-required-field]: Adding a new column that is `NOT NULL` and has no default value to an existing table effectively makes it required. ╭▸ 2 │ ALTER TABLE "recipe" ADD COLUMN "public" boolean NOT NULL; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_alter_domain_with_add_constraint__test__err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_alter_domain_with_add_constraint__test__err.snap index fb797bcb..7f27abb2 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_alter_domain_with_add_constraint__test__err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_alter_domain_with_add_constraint__test__err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/ban_alter_domain_with_add_constraint.rs expression: "lint_errors(sql, Rule::BanAlterDomainWithAddConstraint)" --- -error[BanAlterDomainWithAddConstraint]: Domains with constraints have poor support for online migrations. Use table and column constraints instead. +warning[ban-alter-domain-with-add-constraint]: Domains with constraints have poor support for online migrations. Use table and column constraints instead. ╭▸ 2 │ ALTER DOMAIN domain_name ADD CONSTRAINT constraint_name CHECK (value > 0); ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__all_the_types.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__all_the_types.snap index 2875ce21..d8a7b7cc 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__all_the_types.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__all_the_types.snap @@ -2,14 +2,14 @@ source: crates/squawk_linter/src/rules/ban_char_field.rs expression: "lint_errors(sql, Rule::BanCharField)" --- -error[BanCharField]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. +warning[ban-char-field]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. ╭▸ 4 │ b char(100), │ ━━━━━━━━━ ╭╴ 4 │ b varchar(100), ╰╴ +++ -error[BanCharField]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. +warning[ban-char-field]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. ╭▸ 5 │ c character(100), │ ━━━━━━━━━━━━━━ @@ -17,7 +17,7 @@ error[BanCharField]: Using `character` is likely a mistake and should almost alw 5 - c character(100), 5 + c varchar(100), ╰╴ -error[BanCharField]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. +warning[ban-char-field]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. ╭▸ 6 │ d char, │ ━━━━ @@ -25,7 +25,7 @@ error[BanCharField]: Using `character` is likely a mistake and should almost alw 6 - d char, 6 + d text, ╰╴ -error[BanCharField]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. +warning[ban-char-field]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. ╭▸ 7 │ e character, │ ━━━━━━━━━ @@ -33,7 +33,7 @@ error[BanCharField]: Using `character` is likely a mistake and should almost alw 7 - e character, 7 + e text, ╰╴ -error[BanCharField]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. +warning[ban-char-field]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. ╭▸ 15 │ o pg_catalog.char, │ ━━━━━━━━━━━━━━━ @@ -41,7 +41,7 @@ error[BanCharField]: Using `character` is likely a mistake and should almost alw 15 - o pg_catalog.char, 15 + o pg_catalog.text, ╰╴ -error[BanCharField]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. +warning[ban-char-field]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. ╭▸ 16 │ p char[] │ ━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__alter_table_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__alter_table_err.snap index b380d412..4f2fb5fc 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__alter_table_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__alter_table_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/ban_char_field.rs expression: "lint_errors(sql, Rule::BanCharField)" --- -error[BanCharField]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. +warning[ban-char-field]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. ╭▸ 2 │ alter table t add column c char; │ ━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__array_char_type_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__array_char_type_err.snap index 93c1c2f6..156747b0 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__array_char_type_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__array_char_type_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/ban_char_field.rs expression: "lint_errors(sql, Rule::BanCharField)" --- -error[BanCharField]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. +warning[ban-char-field]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. ╭▸ 3 │ a char[] │ ━━━━ 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 index 650fc7f1..f388d15c 100644 --- 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 @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/ban_char_field.rs expression: "lint_errors(sql, Rule::BanCharField)" --- -error[BanCharField]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. +warning[ban-char-field]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. ╭▸ 3 │ a Char │ ━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__creating_table_with_char_errors.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__creating_table_with_char_errors.snap index 5e2a99d3..e7de12bb 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__creating_table_with_char_errors.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__creating_table_with_char_errors.snap @@ -2,14 +2,14 @@ source: crates/squawk_linter/src/rules/ban_char_field.rs expression: "lint_errors(sql, Rule::BanCharField)" --- -error[BanCharField]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. +warning[ban-char-field]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. ╭▸ 4 │ "alpha" char(100) NOT NULL, │ ━━━━━━━━━ ╭╴ 4 │ "alpha" varchar(100) NOT NULL, ╰╴ +++ -error[BanCharField]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. +warning[ban-char-field]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. ╭▸ 5 │ "beta" character(100) NOT NULL, │ ━━━━━━━━━━━━━━ @@ -17,7 +17,7 @@ error[BanCharField]: Using `character` is likely a mistake and should almost alw 5 - "beta" character(100) NOT NULL, 5 + "beta" varchar(100) NOT NULL, ╰╴ -error[BanCharField]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. +warning[ban-char-field]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. ╭▸ 6 │ "charlie" char NOT NULL, │ ━━━━ @@ -25,7 +25,7 @@ error[BanCharField]: Using `character` is likely a mistake and should almost alw 6 - "charlie" char NOT NULL, 6 + "charlie" text NOT NULL, ╰╴ -error[BanCharField]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. +warning[ban-char-field]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. ╭▸ 7 │ "delta" character NOT NULL │ ━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_concurrent_index_creation_in_transaction__test__assuming_in_transaction_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_concurrent_index_creation_in_transaction__test__assuming_in_transaction_err.snap index ac0128b8..257ff5ad 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_concurrent_index_creation_in_transaction__test__assuming_in_transaction_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_concurrent_index_creation_in_transaction__test__assuming_in_transaction_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/ban_concurrent_index_creation_in_transaction.rs expression: "lint_errors_with(sql, LinterSettings\n{ assume_in_transaction: true, ..Default::default() },)" --- -error[BanConcurrentIndexCreationInTransaction]: While regular index creation can happen inside a transaction, this is not allowed when the `CONCURRENTLY` option is used. +warning[ban-concurrent-index-creation-in-transaction]: While regular index creation can happen inside a transaction, this is not allowed when the `CONCURRENTLY` option is used. ╭▸ 3 │ CREATE UNIQUE INDEX CONCURRENTLY "field_name_idx" ON "table_name" ("field_name"); │ ━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_concurrent_index_creation_in_transaction__test__ban_concurrent_index_creation_in_transaction_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_concurrent_index_creation_in_transaction__test__ban_concurrent_index_creation_in_transaction_err.snap index 15de87f7..926db842 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_concurrent_index_creation_in_transaction__test__ban_concurrent_index_creation_in_transaction_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_concurrent_index_creation_in_transaction__test__ban_concurrent_index_creation_in_transaction_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/ban_concurrent_index_creation_in_transaction.rs expression: "lint_errors(sql, Rule::BanConcurrentIndexCreationInTransaction)" --- -error[BanConcurrentIndexCreationInTransaction]: While regular index creation can happen inside a transaction, this is not allowed when the `CONCURRENTLY` option is used. +warning[ban-concurrent-index-creation-in-transaction]: While regular index creation can happen inside a transaction, this is not allowed when the `CONCURRENTLY` option is used. ╭▸ 4 │ CREATE INDEX CONCURRENTLY "field_name_idx" ON "table_name" ("field_name"); │ ━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_create_domain_with_constraint__test__err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_create_domain_with_constraint__test__err.snap index ce823202..c383a06f 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_create_domain_with_constraint__test__err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_create_domain_with_constraint__test__err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/ban_create_domain_with_constraint.rs expression: "lint_errors(sql, Rule::BanCreateDomainWithConstraint)" --- -error[BanCreateDomainWithConstraint]: Domains with constraints have poor support for online migrations. Use table and column constraints instead. +warning[ban-create-domain-with-constraint]: Domains with constraints have poor support for online migrations. Use table and column constraints instead. ╭▸ 2 │ CREATE DOMAIN domain_name_3 AS NUMERIC(15,5) CHECK (value > 0); ╰╴ ━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_create_domain_with_constraint__test__err_with_multiple_constraints.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_create_domain_with_constraint__test__err_with_multiple_constraints.snap index 907b3fdc..da73a6ce 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_create_domain_with_constraint__test__err_with_multiple_constraints.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_create_domain_with_constraint__test__err_with_multiple_constraints.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/ban_create_domain_with_constraint.rs expression: "lint_errors(sql, Rule::BanCreateDomainWithConstraint)" --- -error[BanCreateDomainWithConstraint]: Domains with constraints have poor support for online migrations. Use table and column constraints instead. +warning[ban-create-domain-with-constraint]: Domains with constraints have poor support for online migrations. Use table and column constraints instead. ╭▸ 2 │ create domain d as t check (value > 0) not null; ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_drop_column__test__err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_drop_column__test__err.snap index faf85989..abb97889 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_drop_column__test__err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_drop_column__test__err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/ban_drop_column.rs expression: "lint_errors(sql, Rule::BanDropColumn)" --- -error[BanDropColumn]: Dropping a column may break existing clients. +warning[ban-drop-column]: Dropping a column may break existing clients. ╭▸ 2 │ ALTER TABLE "bar_tbl" DROP COLUMN "foo_col" CASCADE; ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_drop_database__test__ban_drop_database.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_drop_database__test__ban_drop_database.snap index 24caece0..778c1cd4 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_drop_database__test__ban_drop_database.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_drop_database__test__ban_drop_database.snap @@ -2,15 +2,15 @@ source: crates/squawk_linter/src/rules/ban_drop_database.rs expression: "lint_errors(sql, Rule::BanDropDatabase)" --- -error[BanDropDatabase]: Dropping a database may break existing clients. +warning[ban-drop-database]: Dropping a database may break existing clients. ╭▸ 2 │ DROP DATABASE "table_name"; ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━━ -error[BanDropDatabase]: Dropping a database may break existing clients. +warning[ban-drop-database]: Dropping a database may break existing clients. ╭▸ 3 │ DROP DATABASE IF EXISTS "table_name"; ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -error[BanDropDatabase]: Dropping a database may break existing clients. +warning[ban-drop-database]: Dropping a database may break existing clients. ╭▸ 4 │ DROP DATABASE IF EXISTS "table_name" ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_drop_not_null__test__err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_drop_not_null__test__err.snap index 043e9645..e5400331 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_drop_not_null__test__err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_drop_not_null__test__err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/ban_drop_not_null.rs expression: "lint_errors(sql, Rule::BanDropNotNull)" --- -error[BanDropNotNull]: Dropping a `NOT NULL` constraint may break existing clients. +warning[ban-drop-not-null]: Dropping a `NOT NULL` constraint may break existing clients. ╭▸ 2 │ ALTER TABLE "bar_tbl" ALTER COLUMN "foo_col" DROP NOT NULL; ╰╴ ━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_drop_table__test__err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_drop_table__test__err.snap index 5476d14a..539b66a1 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_drop_table__test__err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_drop_table__test__err.snap @@ -2,15 +2,15 @@ source: crates/squawk_linter/src/rules/ban_drop_table.rs expression: "lint_errors(sql, Rule::BanDropTable)" --- -error[BanDropTable]: Dropping a table may break existing clients. +warning[ban-drop-table]: Dropping a table may break existing clients. ╭▸ 2 │ DROP TABLE "table_name"; ╰╴━━━━━━━━━━━━━━━━━━━━━━━ -error[BanDropTable]: Dropping a table may break existing clients. +warning[ban-drop-table]: Dropping a table may break existing clients. ╭▸ 3 │ DROP TABLE IF EXISTS "table_name"; ╰╴━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -error[BanDropTable]: Dropping a table may break existing clients. +warning[ban-drop-table]: Dropping a table may break existing clients. ╭▸ 4 │ DROP TABLE IF EXISTS "table_name" ╰╴━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_truncate_cascade__test__err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_truncate_cascade__test__err.snap index 13171d75..5b6c2803 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_truncate_cascade__test__err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_truncate_cascade__test__err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/ban_truncate_cascade.rs expression: "lint_errors(sql, Rule::BanTruncateCascade)" --- -error[BanTruncateCascade]: Using `CASCADE` will recursively truncate any tables that foreign key to the referenced tables! So if you had foreign keys setup as `a <- b <- c` and truncated `a`, then `b` & `c` would also be truncated! +warning[ban-truncate-cascade]: Using `CASCADE` will recursively truncate any tables that foreign key to the referenced tables! So if you had foreign keys setup as `a <- b <- c` and truncated `a`, then `b` & `c` would also be truncated! ╭▸ 2 │ truncate a, b, c cascade; │ ━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__changing_column_type__test__another_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__changing_column_type__test__another_err.snap index dfcfe62f..6a2cf6b7 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__changing_column_type__test__another_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__changing_column_type__test__another_err.snap @@ -2,11 +2,11 @@ source: crates/squawk_linter/src/rules/changing_column_type.rs expression: "lint_errors(sql, Rule::ChangingColumnType)" --- -error[ChangingColumnType]: Changing a column type requires an `ACCESS EXCLUSIVE` lock on the table which blocks reads and writes while the table is rewritten. Changing the type of the column may also break other clients reading from the table. +warning[changing-column-type]: Changing a column type requires an `ACCESS EXCLUSIVE` lock on the table which blocks reads and writes while the table is rewritten. Changing the type of the column may also break other clients reading from the table. ╭▸ 6 │ ALTER TABLE "core_recipe" ALTER COLUMN "foo" TYPE varchar(255) USING "foo"::varchar(255); ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -error[ChangingColumnType]: Changing a column type requires an `ACCESS EXCLUSIVE` lock on the table which blocks reads and writes while the table is rewritten. Changing the type of the column may also break other clients reading from the table. +warning[changing-column-type]: Changing a column type requires an `ACCESS EXCLUSIVE` lock on the table which blocks reads and writes while the table is rewritten. Changing the type of the column may also break other clients reading from the table. ╭▸ 7 │ ALTER TABLE "core_recipe" ALTER COLUMN "foo" TYPE text USING "foo"::text; ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__changing_column_type__test__err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__changing_column_type__test__err.snap index 75a10bb0..f90fc2bd 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__changing_column_type__test__err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__changing_column_type__test__err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/changing_column_type.rs expression: "lint_errors(sql, Rule::ChangingColumnType)" --- -error[ChangingColumnType]: Changing a column type requires an `ACCESS EXCLUSIVE` lock on the table which blocks reads and writes while the table is rewritten. Changing the type of the column may also break other clients reading from the table. +warning[changing-column-type]: Changing a column type requires an `ACCESS EXCLUSIVE` lock on the table which blocks reads and writes while the table is rewritten. Changing the type of the column may also break other clients reading from the table. ╭▸ 6 │ ALTER TABLE "core_recipe" ALTER COLUMN "edits" TYPE text USING "edits"::text; ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__adding_check_constraint_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__adding_check_constraint_err.snap index 163bf5eb..c60d0e23 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__adding_check_constraint_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__adding_check_constraint_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/constraint_missing_not_valid.rs expression: "lint_errors_with(sql, LinterSettings\n{ assume_in_transaction: true, ..Default::default() },)" --- -error[ConstraintMissingNotValid]: By default new constraints require a table scan and block writes to the table while that scan occurs. +warning[constraint-missing-not-valid]: By default new constraints require a table scan and block writes to the table while that scan occurs. ╭▸ 3 │ ALTER TABLE "accounts" ADD CONSTRAINT "positive_balance" CHECK ("balance" >= 0); │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__adding_fk_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__adding_fk_err.snap index f8e4a8ce..88b57e57 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__adding_fk_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__adding_fk_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/constraint_missing_not_valid.rs expression: "lint_errors(sql, Rule::ConstraintMissingNotValid)" --- -error[ConstraintMissingNotValid]: By default new constraints require a table scan and block writes to the table while that scan occurs. +warning[constraint-missing-not-valid]: By default new constraints require a table scan and block writes to the table while that scan occurs. ╭▸ 3 │ ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address); │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__not_valid_validate_assume_transaction_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__not_valid_validate_assume_transaction_err.snap index e44ab58d..4c3eec5c 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__not_valid_validate_assume_transaction_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__not_valid_validate_assume_transaction_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/constraint_missing_not_valid.rs expression: "lint_errors_with(sql, LinterSettings\n{ assume_in_transaction: true, ..Default::default() },)" --- -error[ConstraintMissingNotValid]: Using `NOT VALID` and `VALIDATE CONSTRAINT` in the same transaction will block all reads while the constraint is validated. +warning[constraint-missing-not-valid]: Using `NOT VALID` and `VALIDATE CONSTRAINT` in the same transaction will block all reads while the constraint is validated. ╭▸ 3 │ ALTER TABLE "app_email" VALIDATE CONSTRAINT "fk_user"; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__not_valid_validate_transaction_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__not_valid_validate_transaction_err.snap index 607d16b8..8cddd532 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__not_valid_validate_transaction_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__not_valid_validate_transaction_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/constraint_missing_not_valid.rs expression: "lint_errors(sql, Rule::ConstraintMissingNotValid)" --- -error[ConstraintMissingNotValid]: Using `NOT VALID` and `VALIDATE CONSTRAINT` in the same transaction will block all reads while the constraint is validated. +warning[constraint-missing-not-valid]: Using `NOT VALID` and `VALIDATE CONSTRAINT` in the same transaction will block all reads while the constraint is validated. ╭▸ 4 │ ALTER TABLE "app_email" VALIDATE CONSTRAINT "fk_user"; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__not_valid_validate_with_assume_in_transaction_with_explicit_commit_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__not_valid_validate_with_assume_in_transaction_with_explicit_commit_err.snap index e44ab58d..4c3eec5c 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__not_valid_validate_with_assume_in_transaction_with_explicit_commit_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__constraint_missing_not_valid__test__not_valid_validate_with_assume_in_transaction_with_explicit_commit_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/constraint_missing_not_valid.rs expression: "lint_errors_with(sql, LinterSettings\n{ assume_in_transaction: true, ..Default::default() },)" --- -error[ConstraintMissingNotValid]: Using `NOT VALID` and `VALIDATE CONSTRAINT` in the same transaction will block all reads while the constraint is validated. +warning[constraint-missing-not-valid]: Using `NOT VALID` and `VALIDATE CONSTRAINT` in the same transaction will block all reads while the constraint is validated. ╭▸ 3 │ ALTER TABLE "app_email" VALIDATE CONSTRAINT "fk_user"; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__disallow_unique_constraint__test__adding_unique_constraint_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__disallow_unique_constraint__test__adding_unique_constraint_err.snap index 54f0cf58..b79a603d 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__disallow_unique_constraint__test__adding_unique_constraint_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__disallow_unique_constraint__test__adding_unique_constraint_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/disallow_unique_constraint.rs expression: "lint_errors(sql, Rule::DisallowedUniqueConstraint)" --- -error[DisallowedUniqueConstraint]: Adding a `UNIQUE` constraint requires an `ACCESS EXCLUSIVE` lock which blocks reads and writes to the table while the index is built. +warning[disallowed-unique-constraint]: Adding a `UNIQUE` constraint requires an `ACCESS EXCLUSIVE` lock which blocks reads and writes to the table while the index is built. ╭▸ 2 │ ALTER TABLE table_name ADD CONSTRAINT field_name_constraint UNIQUE (field_name); │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__disallow_unique_constraint__test__unique_constraint_inline_add_column_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__disallow_unique_constraint__test__unique_constraint_inline_add_column_err.snap index f4b9e216..52cb345c 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__disallow_unique_constraint__test__unique_constraint_inline_add_column_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__disallow_unique_constraint__test__unique_constraint_inline_add_column_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/disallow_unique_constraint.rs expression: "lint_errors(sql, Rule::DisallowedUniqueConstraint)" --- -error[DisallowedUniqueConstraint]: Adding a `UNIQUE` constraint requires an `ACCESS EXCLUSIVE` lock which blocks reads and writes to the table while the index is built. +warning[disallowed-unique-constraint]: Adding a `UNIQUE` constraint requires an `ACCESS EXCLUSIVE` lock which blocks reads and writes to the table while the index is built. ╭▸ 2 │ ALTER TABLE foo ADD COLUMN bar text CONSTRAINT foo_bar_unique UNIQUE; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__disallow_unique_constraint__test__unique_constraint_inline_add_column_unique_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__disallow_unique_constraint__test__unique_constraint_inline_add_column_unique_err.snap index 47191119..b78c429c 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__disallow_unique_constraint__test__unique_constraint_inline_add_column_unique_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__disallow_unique_constraint__test__unique_constraint_inline_add_column_unique_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/disallow_unique_constraint.rs expression: "lint_errors(sql, Rule::DisallowedUniqueConstraint)" --- -error[DisallowedUniqueConstraint]: Adding a `UNIQUE` constraint requires an `ACCESS EXCLUSIVE` lock which blocks reads and writes to the table while the index is built. +warning[disallowed-unique-constraint]: Adding a `UNIQUE` constraint requires an `ACCESS EXCLUSIVE` lock which blocks reads and writes to the table while the index is built. ╭▸ 2 │ ALTER TABLE foo ADD COLUMN bar text UNIQUE; │ ━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_bigint_over_int__test__err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_bigint_over_int__test__err.snap index e9d81540..b3d2f231 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_bigint_over_int__test__err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_bigint_over_int__test__err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/prefer_bigint_over_int.rs expression: "lint_errors(sql, Rule::PreferBigintOverInt)" --- -error[PreferBigintOverInt]: Using 32-bit integer fields can result in hitting the max `int` limit. +warning[prefer-bigint-over-int]: Using 32-bit integer fields can result in hitting the max `int` limit. ╭▸ 3 │ id int │ ━━━ @@ -11,7 +11,7 @@ error[PreferBigintOverInt]: Using 32-bit integer fields can result in hitting th ╭╴ 3 │ id bigint ╰╴ +++ -error[PreferBigintOverInt]: Using 32-bit integer fields can result in hitting the max `int` limit. +warning[prefer-bigint-over-int]: Using 32-bit integer fields can result in hitting the max `int` limit. ╭▸ 6 │ id integer │ ━━━━━━━ @@ -21,7 +21,7 @@ error[PreferBigintOverInt]: Using 32-bit integer fields can result in hitting th 6 - id integer 6 + id bigint ╰╴ -error[PreferBigintOverInt]: Using 32-bit integer fields can result in hitting the max `int` limit. +warning[prefer-bigint-over-int]: Using 32-bit integer fields can result in hitting the max `int` limit. ╭▸ 9 │ id int4 │ ━━━━ @@ -31,7 +31,7 @@ error[PreferBigintOverInt]: Using 32-bit integer fields can result in hitting th 9 - id int4 9 + id int8 ╰╴ -error[PreferBigintOverInt]: Using 32-bit integer fields can result in hitting the max `int` limit. +warning[prefer-bigint-over-int]: Using 32-bit integer fields can result in hitting the max `int` limit. ╭▸ 12 │ id serial │ ━━━━━━ @@ -40,7 +40,7 @@ error[PreferBigintOverInt]: Using 32-bit integer fields can result in hitting th ╭╴ 12 │ id bigserial ╰╴ +++ -error[PreferBigintOverInt]: Using 32-bit integer fields can result in hitting the max `int` limit. +warning[prefer-bigint-over-int]: Using 32-bit integer fields can result in hitting the max `int` limit. ╭▸ 15 │ id serial4 │ ━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_bigint_over_smallint__test__err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_bigint_over_smallint__test__err.snap index 19be6d91..49623f5a 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_bigint_over_smallint__test__err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_bigint_over_smallint__test__err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/prefer_bigint_over_smallint.rs expression: "lint_errors(sql, Rule::PreferBigintOverSmallint)" --- -error[PreferBigintOverSmallint]: Using 16-bit integer fields can result in hitting the max `int` limit. +warning[prefer-bigint-over-smallint]: Using 16-bit integer fields can result in hitting the max `int` limit. ╭▸ 3 │ id smallint │ ━━━━━━━━ @@ -12,7 +12,7 @@ error[PreferBigintOverSmallint]: Using 16-bit integer fields can result in hitti 3 - id smallint 3 + id bigint ╰╴ -error[PreferBigintOverSmallint]: Using 16-bit integer fields can result in hitting the max `int` limit. +warning[prefer-bigint-over-smallint]: Using 16-bit integer fields can result in hitting the max `int` limit. ╭▸ 6 │ id int2 │ ━━━━ @@ -22,7 +22,7 @@ error[PreferBigintOverSmallint]: Using 16-bit integer fields can result in hitti 6 - id int2 6 + id int8 ╰╴ -error[PreferBigintOverSmallint]: Using 16-bit integer fields can result in hitting the max `int` limit. +warning[prefer-bigint-over-smallint]: Using 16-bit integer fields can result in hitting the max `int` limit. ╭▸ 9 │ id smallserial │ ━━━━━━━━━━━ @@ -32,7 +32,7 @@ error[PreferBigintOverSmallint]: Using 16-bit integer fields can result in hitti 9 - id smallserial 9 + id bigserial ╰╴ -error[PreferBigintOverSmallint]: Using 16-bit integer fields can result in hitting the max `int` limit. +warning[prefer-bigint-over-smallint]: Using 16-bit integer fields can result in hitting the max `int` limit. ╭▸ 12 │ id serial2 │ ━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_identity__test__err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_identity__test__err.snap index 44581f3c..98835b3f 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_identity__test__err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_identity__test__err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/prefer_identity.rs expression: "lint_errors(sql, Rule::PreferIdentity)" --- -error[PreferIdentity]: Serial types make schema, dependency, and permission management difficult. +warning[prefer-identity]: Serial types make schema, dependency, and permission management difficult. ╭▸ 3 │ id serial │ ━━━━━━ @@ -12,7 +12,7 @@ error[PreferIdentity]: Serial types make schema, dependency, and permission mana 3 - id serial 3 + id integer generated by default as identity ╰╴ -error[PreferIdentity]: Serial types make schema, dependency, and permission management difficult. +warning[prefer-identity]: Serial types make schema, dependency, and permission management difficult. ╭▸ 6 │ id serial2 │ ━━━━━━━ @@ -22,7 +22,7 @@ error[PreferIdentity]: Serial types make schema, dependency, and permission mana 6 - id serial2 6 + id smallint generated by default as identity ╰╴ -error[PreferIdentity]: Serial types make schema, dependency, and permission management difficult. +warning[prefer-identity]: Serial types make schema, dependency, and permission management difficult. ╭▸ 9 │ id serial4 │ ━━━━━━━ @@ -32,7 +32,7 @@ error[PreferIdentity]: Serial types make schema, dependency, and permission mana 9 - id serial4 9 + id integer generated by default as identity ╰╴ -error[PreferIdentity]: Serial types make schema, dependency, and permission management difficult. +warning[prefer-identity]: Serial types make schema, dependency, and permission management difficult. ╭▸ 12 │ id serial8 │ ━━━━━━━ @@ -42,7 +42,7 @@ error[PreferIdentity]: Serial types make schema, dependency, and permission mana 12 - id serial8 12 + id bigint generated by default as identity ╰╴ -error[PreferIdentity]: Serial types make schema, dependency, and permission management difficult. +warning[prefer-identity]: Serial types make schema, dependency, and permission management difficult. ╭▸ 15 │ id smallserial │ ━━━━━━━━━━━ @@ -52,7 +52,7 @@ error[PreferIdentity]: Serial types make schema, dependency, and permission mana 15 - id smallserial 15 + id smallint generated by default as identity ╰╴ -error[PreferIdentity]: Serial types make schema, dependency, and permission management difficult. +warning[prefer-identity]: Serial types make schema, dependency, and permission management difficult. ╭▸ 18 │ id bigserial │ ━━━━━━━━━ @@ -62,7 +62,7 @@ error[PreferIdentity]: Serial types make schema, dependency, and permission mana 18 - id bigserial 18 + id bigint generated by default as identity ╰╴ -error[PreferIdentity]: Serial types make schema, dependency, and permission management difficult. +warning[prefer-identity]: Serial types make schema, dependency, and permission management difficult. ╭▸ 21 │ id BIGSERIAL │ ━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_identity__test__ok_when_quoted.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_identity__test__ok_when_quoted.snap index fd77017a..a47e65d8 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_identity__test__ok_when_quoted.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_identity__test__ok_when_quoted.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/prefer_identity.rs expression: "lint_errors(sql, Rule::PreferIdentity)" --- -error[PreferIdentity]: Serial types make schema, dependency, and permission management difficult. +warning[prefer-identity]: Serial types make schema, dependency, and permission management difficult. ╭▸ 3 │ id "serial" │ ━━━━━━━━ @@ -12,7 +12,7 @@ error[PreferIdentity]: Serial types make schema, dependency, and permission mana 3 - id "serial" 3 + id integer generated by default as identity ╰╴ -error[PreferIdentity]: Serial types make schema, dependency, and permission management difficult. +warning[prefer-identity]: Serial types make schema, dependency, and permission management difficult. ╭▸ 6 │ id "bigserial" │ ━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__alter_column_set_not_null.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__alter_column_set_not_null.snap index 32642898..de7b12c0 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__alter_column_set_not_null.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__alter_column_set_not_null.snap @@ -1,8 +1,8 @@ --- source: crates/squawk_linter/src/rules/prefer_robust_stmts.rs -expression: "lint_formatted(r#\"\nselect 1; -- so we don't skip checking\nalter table t alter column c set not null;\n \"#)" +expression: "lint_errors(r#\"\nselect 1; -- so we don't skip checking\nalter table t alter column c set not null;\n \"#)" --- -error[PreferRobustStmts]: Missing transaction, the migration can't be rerun if it fails part way through. +warning[prefer-robust-stmts]: Missing transaction, the migration can't be rerun if it fails part way through. ╭▸ 3 │ alter table t alter column c set not null; ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__alter_table_drop_column_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__alter_table_drop_column_err.snap index aa3a1aca..2b9224ad 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__alter_table_drop_column_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__alter_table_drop_column_err.snap @@ -1,8 +1,8 @@ --- source: crates/squawk_linter/src/rules/prefer_robust_stmts.rs -expression: "lint_formatted(r#\"\nselect 1; -- so we don't skip checking\nalter table t drop column c cascade;\n \"#)" +expression: "lint_errors(r#\"\nselect 1; -- so we don't skip checking\nalter table t drop column c cascade;\n \"#)" --- -error[PreferRobustStmts]: Missing `IF EXISTS`, the migration can't be rerun if it fails part way through. +warning[prefer-robust-stmts]: Missing `IF EXISTS`, the migration can't be rerun if it fails part way through. ╭▸ 3 │ alter table t drop column c cascade; │ ━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__alter_table_drop_constraint_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__alter_table_drop_constraint_err.snap index 9851b522..ca54c8cd 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__alter_table_drop_constraint_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__alter_table_drop_constraint_err.snap @@ -1,8 +1,8 @@ --- source: crates/squawk_linter/src/rules/prefer_robust_stmts.rs -expression: "lint_formatted(r#\"\nselect 1; -- so we don't skip checking\nALTER TABLE \"core_foo\" DROP CONSTRAINT \"core_foo_idx\";\n \"#)" +expression: "lint_errors(r#\"\nselect 1; -- so we don't skip checking\nALTER TABLE \"core_foo\" DROP CONSTRAINT \"core_foo_idx\";\n \"#)" --- -error[PreferRobustStmts]: Missing `IF EXISTS`, the migration can't be rerun if it fails part way through. +warning[prefer-robust-stmts]: Missing `IF EXISTS`, the migration can't be rerun if it fails part way through. ╭▸ 3 │ ALTER TABLE "core_foo" DROP CONSTRAINT "core_foo_idx"; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__alter_table_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__alter_table_err.snap index fa9a82bc..84c6ea0a 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__alter_table_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__alter_table_err.snap @@ -1,8 +1,8 @@ --- source: crates/squawk_linter/src/rules/prefer_robust_stmts.rs -expression: "lint_formatted(r#\"\nselect 1; -- so we don't skip checking\nALTER TABLE \"core_foo\" ADD COLUMN \"answer_id\" integer NULL;\n \"#)" +expression: "lint_errors(r#\"\nselect 1; -- so we don't skip checking\nALTER TABLE \"core_foo\" ADD COLUMN \"answer_id\" integer NULL;\n \"#)" --- -error[PreferRobustStmts]: Missing `IF NOT EXISTS`, the migration can't be rerun if it fails part way through. +warning[prefer-robust-stmts]: Missing `IF NOT EXISTS`, the migration can't be rerun if it fails part way through. ╭▸ 3 │ ALTER TABLE "core_foo" ADD COLUMN "answer_id" integer NULL; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__create_index_concurrently_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__create_index_concurrently_err.snap index 5629448a..d320296e 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__create_index_concurrently_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__create_index_concurrently_err.snap @@ -1,8 +1,8 @@ --- source: crates/squawk_linter/src/rules/prefer_robust_stmts.rs -expression: "lint_formatted(r#\"\nselect 1; -- so we don't skip checking\nCREATE INDEX CONCURRENTLY \"core_foo_idx\" ON \"core_foo\" (\"answer_id\");\n \"#)" +expression: "lint_errors(r#\"\nselect 1; -- so we don't skip checking\nCREATE INDEX CONCURRENTLY \"core_foo_idx\" ON \"core_foo\" (\"answer_id\");\n \"#)" --- -error[PreferRobustStmts]: Missing `IF NOT EXISTS`, the migration can't be rerun if it fails part way through. +warning[prefer-robust-stmts]: Missing `IF NOT EXISTS`, the migration can't be rerun if it fails part way through. ╭▸ 3 │ CREATE INDEX CONCURRENTLY "core_foo_idx" ON "core_foo" ("answer_id"); │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__create_table_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__create_table_err.snap index 63e5e83e..dd40b3bd 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__create_table_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__create_table_err.snap @@ -1,8 +1,8 @@ --- source: crates/squawk_linter/src/rules/prefer_robust_stmts.rs -expression: "lint_formatted(r#\"\nselect 1; -- so we don't skip checking\nCREATE TABLE \"core_bar\" ( \"id\" serial NOT NULL PRIMARY KEY, \"bravo\" text NOT NULL);\n \"#)" +expression: "lint_errors(r#\"\nselect 1; -- so we don't skip checking\nCREATE TABLE \"core_bar\" ( \"id\" serial NOT NULL PRIMARY KEY, \"bravo\" text NOT NULL);\n \"#)" --- -error[PreferRobustStmts]: Missing `IF NOT EXISTS`, the migration can't be rerun if it fails part way through. +warning[prefer-robust-stmts]: Missing `IF NOT EXISTS`, the migration can't be rerun if it fails part way through. ╭▸ 3 │ CREATE TABLE "core_bar" ( "id" serial NOT NULL PRIMARY KEY, "bravo" text NOT NULL); │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__create_table_with_on_commit_drop_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__create_table_with_on_commit_drop_err.snap index d8454ae7..a8dbab4e 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__create_table_with_on_commit_drop_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__create_table_with_on_commit_drop_err.snap @@ -1,8 +1,8 @@ --- source: crates/squawk_linter/src/rules/prefer_robust_stmts.rs -expression: "lint_formatted(r#\"\nselect 1; -- so we don't skip checking\nCREATE TABLE test_table (id int) ON COMMIT DROP;\n \"#)" +expression: "lint_errors(r#\"\nselect 1; -- so we don't skip checking\nCREATE TABLE test_table (id int) ON COMMIT DROP;\n \"#)" --- -error[PreferRobustStmts]: Missing `IF NOT EXISTS`, the migration can't be rerun if it fails part way through. +warning[prefer-robust-stmts]: Missing `IF NOT EXISTS`, the migration can't be rerun if it fails part way through. ╭▸ 3 │ CREATE TABLE test_table (id int) ON COMMIT DROP; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__create_temp_table_without_on_commit_drop_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__create_temp_table_without_on_commit_drop_err.snap index 5900db1e..5ce75b41 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__create_temp_table_without_on_commit_drop_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__create_temp_table_without_on_commit_drop_err.snap @@ -1,8 +1,8 @@ --- source: crates/squawk_linter/src/rules/prefer_robust_stmts.rs -expression: "lint_formatted(r#\"\nselect 1; -- so we don't skip checking\nCREATE TEMP TABLE test_table (id int);\n \"#)" +expression: "lint_errors(r#\"\nselect 1; -- so we don't skip checking\nCREATE TEMP TABLE test_table (id int);\n \"#)" --- -error[PreferRobustStmts]: Missing `IF NOT EXISTS`, the migration can't be rerun if it fails part way through. +warning[prefer-robust-stmts]: Missing `IF NOT EXISTS`, the migration can't be rerun if it fails part way through. ╭▸ 3 │ CREATE TEMP TABLE test_table (id int); │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__disable_row_level_security_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__disable_row_level_security_err.snap index 4ea297df..b6d01fea 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__disable_row_level_security_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__disable_row_level_security_err.snap @@ -1,8 +1,8 @@ --- source: crates/squawk_linter/src/rules/prefer_robust_stmts.rs -expression: "lint_formatted(r#\"\nCREATE TABLE IF NOT EXISTS test();\nALTER TABLE IF EXISTS test DISABLE ROW LEVEL SECURITY;\n \"#)" +expression: "lint_errors(r#\"\nCREATE TABLE IF NOT EXISTS test();\nALTER TABLE IF EXISTS test DISABLE ROW LEVEL SECURITY;\n \"#)" --- -error[PreferRobustStmts]: Missing transaction, the migration can't be rerun if it fails part way through. +warning[prefer-robust-stmts]: Missing transaction, the migration can't be rerun if it fails part way through. ╭▸ 3 │ ALTER TABLE IF EXISTS test DISABLE ROW LEVEL SECURITY; ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__double_add_after_drop_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__double_add_after_drop_err.snap index d4034730..4958973f 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__double_add_after_drop_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__double_add_after_drop_err.snap @@ -1,8 +1,8 @@ --- source: crates/squawk_linter/src/rules/prefer_robust_stmts.rs -expression: "lint_formatted(r#\"\nALTER TABLE \"app_email\" DROP CONSTRAINT IF EXISTS \"email_uniq\";\nALTER TABLE \"app_email\" ADD CONSTRAINT \"email_uniq\" UNIQUE USING INDEX \"email_idx\";\n-- this second add constraint should error because it's not robust\nALTER TABLE \"app_email\" ADD CONSTRAINT \"email_uniq\" UNIQUE USING INDEX \"email_idx\";\n \"#)" +expression: "lint_errors(r#\"\nALTER TABLE \"app_email\" DROP CONSTRAINT IF EXISTS \"email_uniq\";\nALTER TABLE \"app_email\" ADD CONSTRAINT \"email_uniq\" UNIQUE USING INDEX \"email_idx\";\n-- this second add constraint should error because it's not robust\nALTER TABLE \"app_email\" ADD CONSTRAINT \"email_uniq\" UNIQUE USING INDEX \"email_idx\";\n \"#)" --- -error[PreferRobustStmts]: Missing transaction, the migration can't be rerun if it fails part way through. +warning[prefer-robust-stmts]: Missing transaction, the migration can't be rerun if it fails part way through. ╭▸ 5 │ ALTER TABLE "app_email" ADD CONSTRAINT "email_uniq" UNIQUE USING INDEX "email_idx"; ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__drop_index_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__drop_index_err.snap index 1a360ba1..d0190ff8 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__drop_index_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__drop_index_err.snap @@ -1,8 +1,8 @@ --- source: crates/squawk_linter/src/rules/prefer_robust_stmts.rs -expression: "lint_formatted(r#\"\nselect 1; -- so we don't skip checking\nDROP INDEX CONCURRENTLY \"email_idx\";\n \"#)" +expression: "lint_errors(r#\"\nselect 1; -- so we don't skip checking\nDROP INDEX CONCURRENTLY \"email_idx\";\n \"#)" --- -error[PreferRobustStmts]: Missing `IF EXISTS`, the migration can't be rerun if it fails part way through. +warning[prefer-robust-stmts]: Missing `IF EXISTS`, the migration can't be rerun if it fails part way through. ╭▸ 3 │ DROP INDEX CONCURRENTLY "email_idx"; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__enable_row_level_security_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__enable_row_level_security_err.snap index 3c5d6540..05f67f6d 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__enable_row_level_security_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__enable_row_level_security_err.snap @@ -1,8 +1,8 @@ --- source: crates/squawk_linter/src/rules/prefer_robust_stmts.rs -expression: "lint_formatted(r#\"\nCREATE TABLE IF NOT EXISTS test();\nALTER TABLE IF EXISTS test ENABLE ROW LEVEL SECURITY;\n \"#)" +expression: "lint_errors(r#\"\nCREATE TABLE IF NOT EXISTS test();\nALTER TABLE IF EXISTS test ENABLE ROW LEVEL SECURITY;\n \"#)" --- -error[PreferRobustStmts]: Missing transaction, the migration can't be rerun if it fails part way through. +warning[prefer-robust-stmts]: Missing transaction, the migration can't be rerun if it fails part way through. ╭▸ 3 │ ALTER TABLE IF EXISTS test ENABLE ROW LEVEL SECURITY; ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__enable_row_level_security_without_exists_check_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__enable_row_level_security_without_exists_check_err.snap index 2ae4f8a7..7608c5a1 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__enable_row_level_security_without_exists_check_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_robust_stmts__test__enable_row_level_security_without_exists_check_err.snap @@ -1,8 +1,8 @@ --- source: crates/squawk_linter/src/rules/prefer_robust_stmts.rs -expression: "format_violations(sql, &errors)" +expression: "lint_errors(r#\"\nCREATE TABLE IF NOT EXISTS test();\nALTER TABLE test ENABLE ROW LEVEL SECURITY;\n \"#)" --- -error[PreferRobustStmts]: Missing transaction, the migration can't be rerun if it fails part way through. +warning[prefer-robust-stmts]: Missing transaction, the migration can't be rerun if it fails part way through. ╭▸ 3 │ ALTER TABLE test ENABLE ROW LEVEL SECURITY; ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_text_field__test__adding_column_non_text_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_text_field__test__adding_column_non_text_err.snap index a7c31664..4362be07 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_text_field__test__adding_column_non_text_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_text_field__test__adding_column_non_text_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/prefer_text_field.rs expression: "lint_errors(sql, Rule::PreferTextField)" --- -error[PreferTextField]: Changing the size of a `varchar` field requires an `ACCESS EXCLUSIVE` lock, that will prevent all reads and writes to the table. +warning[prefer-text-field]: Changing the size of a `varchar` field requires an `ACCESS EXCLUSIVE` lock, that will prevent all reads and writes to the table. ╭▸ 3 │ ALTER TABLE "foo_table" ADD COLUMN "foo_column" varchar(256) NULL; │ ━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_text_field__test__create_table_with_pgcatalog_varchar_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_text_field__test__create_table_with_pgcatalog_varchar_err.snap index 84a48fbf..c0d25211 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_text_field__test__create_table_with_pgcatalog_varchar_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_text_field__test__create_table_with_pgcatalog_varchar_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/prefer_text_field.rs expression: "lint_errors(sql, Rule::PreferTextField)" --- -error[PreferTextField]: Changing the size of a `varchar` field requires an `ACCESS EXCLUSIVE` lock, that will prevent all reads and writes to the table. +warning[prefer-text-field]: Changing the size of a `varchar` field requires an `ACCESS EXCLUSIVE` lock, that will prevent all reads and writes to the table. ╭▸ 4 │ "alpha" pg_catalog.varchar(100) NOT NULL │ ━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_text_field__test__create_table_with_varchar_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_text_field__test__create_table_with_varchar_err.snap index f1c8dbaf..cd05470c 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_text_field__test__create_table_with_varchar_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_text_field__test__create_table_with_varchar_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/prefer_text_field.rs expression: "lint_errors(sql, Rule::PreferTextField)" --- -error[PreferTextField]: Changing the size of a `varchar` field requires an `ACCESS EXCLUSIVE` lock, that will prevent all reads and writes to the table. +warning[prefer-text-field]: Changing the size of a `varchar` field requires an `ACCESS EXCLUSIVE` lock, that will prevent all reads and writes to the table. ╭▸ 8 │ "alpha" varchar(100) NOT NULL │ ━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_text_field__test__increase_varchar_size_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_text_field__test__increase_varchar_size_err.snap index 9bbe4cec..b2a5e4d2 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_text_field__test__increase_varchar_size_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_text_field__test__increase_varchar_size_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/prefer_text_field.rs expression: "lint_errors(sql, Rule::PreferTextField)" --- -error[PreferTextField]: Changing the size of a `varchar` field requires an `ACCESS EXCLUSIVE` lock, that will prevent all reads and writes to the table. +warning[prefer-text-field]: Changing the size of a `varchar` field requires an `ACCESS EXCLUSIVE` lock, that will prevent all reads and writes to the table. ╭▸ 6 │ ALTER TABLE "core_foo" ALTER COLUMN "kind" TYPE varchar(1000) USING "kind"::varchar(1000); │ ━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_timestamptz__test__alter_table_with_timestamp_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_timestamptz__test__alter_table_with_timestamp_err.snap index e0827d99..2d050ff9 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_timestamptz__test__alter_table_with_timestamp_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_timestamptz__test__alter_table_with_timestamp_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/prefer_timestamptz.rs expression: "lint_errors(sql, Rule::PreferTimestampTz)" --- -error[PreferTimestampTz]: When Postgres stores a datetime in a `timestamp` field, Postgres drops the UTC offset. This means 2019-10-11 21:11:24+02 and 2019-10-11 21:11:24-06 will both be stored as 2019-10-11 21:11:24 in the database, even though they are eight hours apart in time. +warning[prefer-timestamp-tz]: When Postgres stores a datetime in a `timestamp` field, Postgres drops the UTC offset. This means 2019-10-11 21:11:24+02 and 2019-10-11 21:11:24-06 will both be stored as 2019-10-11 21:11:24 in the database, even though they are eight hours apart in time. ╭▸ 3 │ alter column created_ts type timestamp; │ ━━━━━━━━━ @@ -11,7 +11,7 @@ error[PreferTimestampTz]: When Postgres stores a datetime in a `timestamp` field ╭╴ 3 │ alter column created_ts type timestamptz; ╰╴ ++ -error[PreferTimestampTz]: When Postgres stores a datetime in a `timestamp` field, Postgres drops the UTC offset. This means 2019-10-11 21:11:24+02 and 2019-10-11 21:11:24-06 will both be stored as 2019-10-11 21:11:24 in the database, even though they are eight hours apart in time. +warning[prefer-timestamp-tz]: When Postgres stores a datetime in a `timestamp` field, Postgres drops the UTC offset. This means 2019-10-11 21:11:24+02 and 2019-10-11 21:11:24-06 will both be stored as 2019-10-11 21:11:24 in the database, even though they are eight hours apart in time. ╭▸ 5 │ alter column created_ts type timestamp without time zone; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_timestamptz__test__create_table_with_timestamp_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_timestamptz__test__create_table_with_timestamp_err.snap index 0b25040e..56d3ab52 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_timestamptz__test__create_table_with_timestamp_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__prefer_timestamptz__test__create_table_with_timestamp_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/prefer_timestamptz.rs expression: "lint_errors(sql, Rule::PreferTimestampTz)" --- -error[PreferTimestampTz]: When Postgres stores a datetime in a `timestamp` field, Postgres drops the UTC offset. This means 2019-10-11 21:11:24+02 and 2019-10-11 21:11:24-06 will both be stored as 2019-10-11 21:11:24 in the database, even though they are eight hours apart in time. +warning[prefer-timestamp-tz]: When Postgres stores a datetime in a `timestamp` field, Postgres drops the UTC offset. This means 2019-10-11 21:11:24+02 and 2019-10-11 21:11:24-06 will both be stored as 2019-10-11 21:11:24 in the database, even though they are eight hours apart in time. ╭▸ 4 │ created_ts timestamp │ ━━━━━━━━━ @@ -11,7 +11,7 @@ error[PreferTimestampTz]: When Postgres stores a datetime in a `timestamp` field ╭╴ 4 │ created_ts timestamptz ╰╴ ++ -error[PreferTimestampTz]: When Postgres stores a datetime in a `timestamp` field, Postgres drops the UTC offset. This means 2019-10-11 21:11:24+02 and 2019-10-11 21:11:24-06 will both be stored as 2019-10-11 21:11:24 in the database, even though they are eight hours apart in time. +warning[prefer-timestamp-tz]: When Postgres stores a datetime in a `timestamp` field, Postgres drops the UTC offset. This means 2019-10-11 21:11:24+02 and 2019-10-11 21:11:24-06 will both be stored as 2019-10-11 21:11:24 in the database, even though they are eight hours apart in time. ╭▸ 8 │ created_ts timestamp without time zone │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__renaming_column__test__err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__renaming_column__test__err.snap index e184f73e..1241e3dc 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__renaming_column__test__err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__renaming_column__test__err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/renaming_column.rs expression: "lint_errors(sql, Rule::RenamingColumn)" --- -error[RenamingColumn]: Renaming a column may break existing clients. +warning[renaming-column]: Renaming a column may break existing clients. ╭▸ 2 │ ALTER TABLE "table_name" RENAME COLUMN "column_name" TO "new_column_name"; ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__renaming_table__test__err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__renaming_table__test__err.snap index e8052a00..d1dc6780 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__renaming_table__test__err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__renaming_table__test__err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/renaming_table.rs expression: "lint_errors(sql, Rule::RenamingTable)" --- -error[RenamingTable]: Renaming a table may break existing clients. +warning[renaming-table]: Renaming a table may break existing clients. ╭▸ 2 │ ALTER TABLE "table_name" RENAME TO "new_table_name"; ╰╴ ━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__require_concurrent_index_creation__test__adding_index_non_concurrently_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__require_concurrent_index_creation__test__adding_index_non_concurrently_err.snap index 1460a098..0f0c2802 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__require_concurrent_index_creation__test__adding_index_non_concurrently_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__require_concurrent_index_creation__test__adding_index_non_concurrently_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/require_concurrent_index_creation.rs expression: "lint_errors(sql, Rule::RequireConcurrentIndexCreation)" --- -error[RequireConcurrentIndexCreation]: During normal index creation, table updates are blocked, but reads are still allowed. +warning[require-concurrent-index-creation]: During normal index creation, table updates are blocked, but reads are still allowed. ╭▸ 3 │ CREATE INDEX "field_name_idx" ON "table_name" ("field_name"); │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__require_concurrent_index_deletion__test__drop_index_missing_concurrently_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__require_concurrent_index_deletion__test__drop_index_missing_concurrently_err.snap index 36e83262..1c85a67f 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__require_concurrent_index_deletion__test__drop_index_missing_concurrently_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__require_concurrent_index_deletion__test__drop_index_missing_concurrently_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/require_concurrent_index_deletion.rs expression: "lint_errors(sql, Rule::RequireConcurrentIndexDeletion)" --- -error[RequireConcurrentIndexDeletion]: A normal `DROP INDEX` acquires an `ACCESS EXCLUSIVE` lock on the table, blocking other accesses until the index drop can complete. +warning[require-concurrent-index-deletion]: A normal `DROP INDEX` acquires an `ACCESS EXCLUSIVE` lock on the table, blocking other accesses until the index drop can complete. ╭▸ 3 │ DROP INDEX IF EXISTS "field_name_idx"; │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__begin_assume_transaction_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__begin_assume_transaction_err.snap index 9f971cec..28c83f4d 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__begin_assume_transaction_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__begin_assume_transaction_err.snap @@ -2,19 +2,19 @@ source: crates/squawk_linter/src/rules/transaction_nesting.rs expression: "lint_errors_with(sql, settings)" --- -error[TransactionNesting]: There is an existing transaction already in progress, managed by your migration tool. +warning[transaction-nesting]: There is an existing transaction already in progress, managed by your migration tool. ╭▸ 2 │ BEGIN; │ ━━━━━ │ ╰ help: Put migration statements in separate files to have them be in separate transactions or don't use the assume-in-transaction setting. -error[TransactionNesting]: There is an existing transaction already in progress, managed by your migration tool. +warning[transaction-nesting]: There is an existing transaction already in progress, managed by your migration tool. ╭▸ 3 │ BEGIN; │ ━━━━━ │ ╰ help: Put migration statements in separate files to have them be in separate transactions or don't use the assume-in-transaction setting. -error[TransactionNesting]: Attempting to end the transaction that is managed by your migration tool +warning[transaction-nesting]: Attempting to end the transaction that is managed by your migration tool ╭▸ 5 │ COMMIT; │ ━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__begin_repeated_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__begin_repeated_err.snap index b1fd5cbc..c1f89bbe 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__begin_repeated_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__begin_repeated_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/transaction_nesting.rs expression: "lint_errors(sql, Rule::TransactionNesting)" --- -error[TransactionNesting]: There is an existing transaction already in progress. +warning[transaction-nesting]: There is an existing transaction already in progress. ╭▸ 3 │ BEGIN; │ ━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__commit_repeated_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__commit_repeated_err.snap index 3ff9f402..b02ef981 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__commit_repeated_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__commit_repeated_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/transaction_nesting.rs expression: "lint_errors(sql, Rule::TransactionNesting)" --- -error[TransactionNesting]: There is no transaction to `COMMIT` or `ROLLBACK`. +warning[transaction-nesting]: There is no transaction to `COMMIT` or `ROLLBACK`. ╭▸ 5 │ COMMIT; │ ━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__commit_with_assume_in_transaction_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__commit_with_assume_in_transaction_err.snap index 8ed94d6f..39fc18b8 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__commit_with_assume_in_transaction_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__commit_with_assume_in_transaction_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/transaction_nesting.rs expression: "lint_errors_with(sql, settings)" --- -error[TransactionNesting]: Attempting to end the transaction that is managed by your migration tool +warning[transaction-nesting]: Attempting to end the transaction that is managed by your migration tool ╭▸ 3 │ COMMIT; │ ━━━━━━ diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__rollback_with_assume_in_transaction_err.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__rollback_with_assume_in_transaction_err.snap index eff187cc..e4c5f0fc 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__rollback_with_assume_in_transaction_err.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__transaction_nesting__test__rollback_with_assume_in_transaction_err.snap @@ -2,7 +2,7 @@ source: crates/squawk_linter/src/rules/transaction_nesting.rs expression: "lint_errors_with(sql, settings)" --- -error[TransactionNesting]: Attempting to end the transaction that is managed by your migration tool +warning[transaction-nesting]: Attempting to end the transaction that is managed by your migration tool ╭▸ 4 │ ROLLBACK; │ ━━━━━━━━ diff --git a/crates/squawk_linter/src/test_utils.rs b/crates/squawk_linter/src/test_utils.rs index 703dccc3..b5893606 100644 --- a/crates/squawk_linter/src/test_utils.rs +++ b/crates/squawk_linter/src/test_utils.rs @@ -102,8 +102,8 @@ fn format_violations(sql: &str, violations: &[Violation]) -> String { .fold(true) .annotation(AnnotationKind::Primary.span(start..end)); - let code = format!("{:?}", violation.code); - let mut group = Level::ERROR + let code = format!("{}", violation.code); + let mut group = Level::WARNING .primary_title(&violation.message) .id(&code) .element(snippet); diff --git a/crates/squawk_parser/tests/tests.rs b/crates/squawk_parser/tests/tests.rs index b1afb547..6464bea4 100644 --- a/crates/squawk_parser/tests/tests.rs +++ b/crates/squawk_parser/tests/tests.rs @@ -31,7 +31,7 @@ fn parser_ok(fixture: Fixture<&str>) { // We check that all of our tests in `ok` also pass the Postgres parser, // if they don't, they should be moved to the `err` directory. assert!( - errors.is_empty(), + errors.is_none(), "tests defined in the `ok` can't have parser errors." ); // skipping pg17/pg18 specific stuff since our parser isn't using the latest parser @@ -69,7 +69,7 @@ fn parser_err(fixture: Fixture<&str>) { }); assert!( - !errors.is_empty(), + errors.is_some(), "tests defined in the `err` directory must have parser errors." ); } @@ -95,20 +95,22 @@ fn regression_suite(fixture: Fixture<&str>) { let snapshot_name = format!("regression_{test_name}"); + let has_errors = errors.is_none(); + with_settings!({ omit_expression => true, input_file => input_file }, { - assert_snapshot!(snapshot_name, errors.join("")); + assert_snapshot!(snapshot_name, errors.unwrap_or_default()); }); assert!( - errors.is_empty(), + has_errors, "tests defined in the regression suite can't have parser errors." ); } -fn parse_text(text: &str) -> (String, Vec) { +fn parse_text(text: &str) -> (String, Option) { let lexed = LexedStr::new(text); let input = lexed.to_input(); let output = parse(&input); @@ -154,13 +156,13 @@ fn parse_text(text: &str) -> (String, Vec) { errors.push((pos, msg.to_string())); } - if !errors.is_empty() { + let error_message = if !errors.is_empty() { errors.sort_by_key(|(pos, _)| *pos); - buf.push_str("---\n"); - let renderer = Renderer::plain().decor_style(DecorStyle::Unicode); + let mut out = "---\n".to_owned(); + for (pos, msg) in &errors { let group = Level::ERROR.primary_title(msg).id("syntax-error").element( Snippet::source(text) @@ -169,14 +171,17 @@ fn parse_text(text: &str) -> (String, Vec) { ); let rendered = renderer.render(&[group]).to_string(); - buf.push_str(&rendered); - buf.push('\n'); + out.push_str(&rendered); + out.push('\n'); } + Some(out) + } else { + None + }; + + if let Some(error_message) = error_message.clone() { + buf.push_str(&error_message); } - let error_vec = errors - .iter() - .map(|(pos, msg)| format!("ERROR@{pos}: {msg}\n")) - .collect(); - (buf, error_vec) + (buf, error_message) } diff --git a/crates/squawk_syntax/Cargo.toml b/crates/squawk_syntax/Cargo.toml index 12b7ed3c..b44f7ffa 100644 --- a/crates/squawk_syntax/Cargo.toml +++ b/crates/squawk_syntax/Cargo.toml @@ -16,6 +16,7 @@ rowan.workspace = true smol_str.workspace = true [dev-dependencies] +annotate-snippets.workspace = true insta.workspace = true dir-test.workspace = true camino.workspace = true diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__alter_aggregate_params_validation.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__alter_aggregate_params_validation.snap index f77ef89f..75e00484 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__alter_aggregate_params_validation.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__alter_aggregate_params_validation.snap @@ -72,4 +72,7 @@ SOURCE_FILE@0..101 SEMICOLON@99..100 ";" WHITESPACE@100..101 "\n" -ERROR@64:67 "Out params are not allowed with aggregates." +error[syntax-error]: Out params are not allowed with aggregates. + ╭▸ +2 │ create aggregate a(in x, out y) ( + ╰╴ ━━━ diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__array_exprs_validation.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__array_exprs_validation.snap index c7d582d8..4e21ef41 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__array_exprs_validation.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__array_exprs_validation.snap @@ -45,5 +45,11 @@ SOURCE_FILE@0..42 SEMICOLON@40..41 ";" WHITESPACE@41..42 "\n" -ERROR@7 "Array missing ARRAY keyword." -ERROR@32 "Array missing ARRAY keyword." +error[syntax-error]: Array missing ARRAY keyword. + ╭▸ +1 │ select ['a', 'b', 'c']; + ╰╴ ━ +error[syntax-error]: Array missing ARRAY keyword. + ╭▸ +3 │ select [[1, 2]]; + ╰╴ ━ diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__create_aggregate_params_validation.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__create_aggregate_params_validation.snap index 95c0aa57..19653f42 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__create_aggregate_params_validation.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__create_aggregate_params_validation.snap @@ -50,4 +50,7 @@ SOURCE_FILE@0..91 SEMICOLON@88..89 ";" WHITESPACE@89..91 "\n\n" -ERROR@64:67 "Out params are not allowed with aggregates." +error[syntax-error]: Out params are not allowed with aggregates. + ╭▸ +2 │ alter aggregate a (in t, out u) + ╰╴ ━━━ diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__create_table_validation.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__create_table_validation.snap index cadebe6b..695d0249 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__create_table_validation.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__create_table_validation.snap @@ -37,4 +37,7 @@ SOURCE_FILE@0..75 SEMICOLON@73..74 ";" WHITESPACE@74..75 "\n" -ERROR@39 "Missing column type" +error[syntax-error]: Missing column type + ╭▸ +3 │ description + ╰╴ ━ diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__custom_operators_validation.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__custom_operators_validation.snap index e22d02da..6b25f5f6 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__custom_operators_validation.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__custom_operators_validation.snap @@ -96,10 +96,31 @@ SOURCE_FILE@0..108 SEMICOLON@106..107 ";" WHITESPACE@107..108 "\n" -ERROR@39 "missing comma" -ERROR@49:50 "Invalid operator." -ERROR@60:61 "Invalid operator." -ERROR@71:72 "Invalid operator." -ERROR@82:83 "Invalid operator." -ERROR@93:94 "Invalid operator." -ERROR@104:105 "Invalid operator." +error[syntax-error]: missing comma + ╭▸ +2 │ select *c; + ╰╴ ━ +error[syntax-error]: Invalid operator. + ╭▸ +3 │ select /d; + ╰╴ ━ +error[syntax-error]: Invalid operator. + ╭▸ +4 │ select f; + ╰╴ ━ +error[syntax-error]: Invalid operator. + ╭▸ +6 │ select =g; + ╰╴ ━ +error[syntax-error]: Invalid operator. + ╭▸ +7 │ select %l; + ╰╴ ━ +error[syntax-error]: Invalid operator. + ╭▸ +8 │ select ^m; + ╰╴ ━ diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__drop_aggregate_params_validation.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__drop_aggregate_params_validation.snap index b01bf008..ebb42c26 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__drop_aggregate_params_validation.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__drop_aggregate_params_validation.snap @@ -244,6 +244,15 @@ SOURCE_FILE@0..389 SEMICOLON@386..387 ";" WHITESPACE@387..389 "\n\n" -ERROR@111:114 "Out params are not allowed with aggregates." -ERROR@265:268 "Out params are not allowed with aggregates." -ERROR@361:364 "Out params are not allowed with aggregates." +error[syntax-error]: Out params are not allowed with aggregates. + ╭▸ +9 │ out bar integer, + ╰╴ ━━━ +error[syntax-error]: Out params are not allowed with aggregates. + ╭▸ +22 │ out b numeric, + ╰╴ ━━━ +error[syntax-error]: Out params are not allowed with aggregates. + ╭▸ +29 │ out b numeric, + ╰╴ ━━━ diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__join_clauses_validation.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__join_clauses_validation.snap index 8b13f40f..2dee6b53 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__join_clauses_validation.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__join_clauses_validation.snap @@ -399,9 +399,27 @@ SOURCE_FILE@0..523 SEMICOLON@521..522 ";" WHITESPACE@522..523 "\n" -ERROR@30 "Join missing condition." -ERROR@60 "Join missing condition." -ERROR@91 "Join missing condition." -ERROR@121 "Join missing condition." -ERROR@203:213 "Join `using` clause is not allowed for natural joins." -ERROR@291:301 "Join `using` clause is not allowed for cross joins." +error[syntax-error]: Join missing condition. + ╭▸ +2 │ select * from t join u; + ╰╴ ━ +error[syntax-error]: Join missing condition. + ╭▸ +4 │ select * from t left join u; + ╰╴ ━ +error[syntax-error]: Join missing condition. + ╭▸ +6 │ select * from t right join u; + ╰╴ ━ +error[syntax-error]: Join missing condition. + ╭▸ +8 │ select * from t full join u; + ╰╴ ━ +error[syntax-error]: Join `using` clause is not allowed for natural joins. + ╭▸ +12 │ select * from t natural join u using (id); + ╰╴ ━━━━━━━━━━ +error[syntax-error]: Join `using` clause is not allowed for cross joins. + ╭▸ +15 │ select * from t cross join u using (id); + ╰╴ ━━━━━━━━━━ diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__non_standard_param_validation.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__non_standard_param_validation.snap index ece8685d..b7d99c4b 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__non_standard_param_validation.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__non_standard_param_validation.snap @@ -31,5 +31,11 @@ SOURCE_FILE@0..47 SEMICOLON@45..46 ";" WHITESPACE@46..47 "\n" -ERROR@29:31 "Invalid parameter type. Use positional params like $1 instead." -ERROR@40:45 "Invalid parameter type. Use positional params like $1 instead." +error[syntax-error]: Invalid parameter type. Use positional params like $1 instead. + ╭▸ +2 │ select :x; + ╰╴ ━━ +error[syntax-error]: Invalid parameter type. Use positional params like $1 instead. + ╭▸ +3 │ select : foo; + ╰╴ ━━━━━ diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__validate_string_continuation_validation.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__validate_string_continuation_validation.snap index 5013c596..f6e9a495 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__validate_string_continuation_validation.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__validate_string_continuation_validation.snap @@ -90,10 +90,31 @@ SOURCE_FILE@0..233 SEMICOLON@231..232 ";" WHITESPACE@232..233 "\n" -ERROR@12:13 "Expected new line or comma between string literals" -ERROR@33:46 "Comments between string literals are not allowed." -ERROR@69:82 "Comments between string literals are not allowed." -ERROR@89:110 "Comments between string literals are not allowed." -ERROR@137:147 "Comments between string literals are not allowed." -ERROR@218:219 "Expected new line or comma between string literals" -ERROR@224:225 "Expected new line or comma between string literals" +error[syntax-error]: Expected new line or comma between string literals + ╭▸ +1 │ select 'foo' 'bar'; + ╰╴ ━ +error[syntax-error]: Comments between string literals are not allowed. + ╭▸ +2 │ select 'foo' /* comment */ 'bar'; + ╰╴ ━━━━━━━━━━━━━ +error[syntax-error]: Comments between string literals are not allowed. + ╭▸ +3 │ select 'hello' /* comment */ 'bar' /* another comment */ ' world'; + ╰╴ ━━━━━━━━━━━━━ +error[syntax-error]: Comments between string literals are not allowed. + ╭▸ +3 │ select 'hello' /* comment */ 'bar' /* another comment */ ' world'; + ╰╴ ━━━━━━━━━━━━━━━━━━━━━ +error[syntax-error]: Comments between string literals are not allowed. + ╭▸ +5 │ select 'hello' -- comment + ╰╴ ━━━━━━━━━━ +error[syntax-error]: Expected new line or comma between string literals + ╭▸ +12 │ select 'foo' 'bar' 'buzz'; + ╰╴ ━ +error[syntax-error]: Expected new line or comma between string literals + ╭▸ +12 │ select 'foo' 'bar' 'buzz'; + ╰╴ ━ diff --git a/crates/squawk_syntax/src/test.rs b/crates/squawk_syntax/src/test.rs index c27bd552..16432607 100644 --- a/crates/squawk_syntax/src/test.rs +++ b/crates/squawk_syntax/src/test.rs @@ -1,9 +1,38 @@ // based on https://github.com/rust-lang/rust-analyzer/blob/d8887c0758bbd2d5f752d5bd405d4491e90e7ed6/crates/parser/src/tests.rs +use annotate_snippets::{AnnotationKind, Level, Renderer, Snippet, renderer::DecorStyle}; use camino::Utf8Path; use dir_test::{Fixture, dir_test}; use insta::{assert_snapshot, with_settings}; -use crate::SourceFile; +use crate::{SourceFile, syntax_error::SyntaxError}; + +fn render_errors(sql: &str, errors: &[SyntaxError]) -> String { + let mut rendered = String::new(); + let renderer = Renderer::plain().decor_style(DecorStyle::Unicode); + + for syntax_error in errors { + let range = syntax_error.range(); + let start: usize = range.start().into(); + let end: usize = range.end().into(); + let label = "syntax-error"; + + let snippet = Snippet::source(sql) + .fold(true) + .annotation(AnnotationKind::Primary.span(start..end)); + + let rendered_error = renderer + .render(&[Level::ERROR + .primary_title(syntax_error.message()) + .id(label) + .element(snippet)]) + .to_string(); + + rendered.push_str(&rendered_error); + rendered.push('\n'); + } + + rendered +} #[dir_test( dir: "$CARGO_MANIFEST_DIR/test_data", @@ -20,20 +49,11 @@ fn syntaxtest(fixture: Fixture<&str>) { let parent_dir = input_file.parent().and_then(|x| x.file_name()).unwrap(); let parse = SourceFile::parse(content); - let mut buffer = format!("{:#?}", parse.syntax_node()); let errors = parse.errors(); - for syntax_error in &errors { - let range = syntax_error.range(); - let text = syntax_error.message(); - // split into there own lines so that we can just grep - // for error without hitting this part - buffer += "\n"; - buffer += "ERROR"; - if range.start() == range.end() { - buffer += &format!("@{:?} {:?}", range.start(), text); - } else { - buffer += &format!("@{:?}:{:?} {:?}", range.start(), range.end(), text); - } + let mut buffer = format!("{:#?}", parse.syntax_node()); + if !errors.is_empty() { + buffer.push('\n'); + buffer.push_str(&render_errors(content, &errors)); } with_settings!({