Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion crates/pgls_cli/src/commands/dblint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use crate::{CliDiagnostic, CliSession, VcsIntegration};
use pgls_analyse::RuleCategoriesBuilder;
use pgls_configuration::PartialConfiguration;
use pgls_diagnostics::Error;
use pgls_diagnostics::category;
use pgls_workspace::features::diagnostics::{PullDatabaseDiagnosticsParams, PullDiagnosticsResult};

pub fn dblint(
Expand Down Expand Up @@ -44,5 +45,23 @@ pub fn dblint(
None,
);

session.report("dblint", cli_options, &report)
let exit_result = enforce_exit_codes(cli_options, &report);
session.report("dblint", cli_options, &report)?;
exit_result
}

fn enforce_exit_codes(cli_options: &CliOptions, payload: &Report) -> Result<(), CliDiagnostic> {
let errors = payload.errors;
let warnings = payload.warnings;
let category = category!("check");

if errors > 0 {
return Err(CliDiagnostic::check_error(category));
}

if warnings > 0 && cli_options.error_on_warnings {
return Err(CliDiagnostic::check_warnings(category));
}

Ok(())
}
32 changes: 32 additions & 0 deletions crates/pgls_cli/tests/assert_dblint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,17 @@ async fn dblint_empty_database_snapshot(test_db: PgPool) {
assert_snapshot!(output);
}

#[sqlx::test(migrator = "pgls_test_utils::MIGRATIONS")]
#[cfg_attr(
target_os = "windows",
ignore = "snapshot expectations only validated on unix-like platforms"
)]
async fn dblint_error_on_warnings_empty_database_snapshot(test_db: PgPool) {
let url = get_database_url(&test_db);
let output = run_dblint(&url, &["--error-on-warnings"]);
assert_snapshot!(output);
}

#[sqlx::test(migrator = "pgls_test_utils::MIGRATIONS")]
#[cfg_attr(
target_os = "windows",
Expand All @@ -45,6 +56,27 @@ async fn dblint_detects_issues_snapshot(test_db: PgPool) {
assert_snapshot!(output);
}

#[sqlx::test(migrator = "pgls_test_utils::MIGRATIONS")]
#[cfg_attr(
target_os = "windows",
ignore = "snapshot expectations only validated on unix-like platforms"
)]
async fn dblint_error_on_warnings_detects_issues_snapshot(test_db: PgPool) {
// Setup: create duplicate non-unique indexes (triggers duplicateIndex warning)
sqlx::raw_sql(
"CREATE TABLE test_duplicate_idx (id int primary key, email text);
CREATE INDEX idx_duplicate_a ON test_duplicate_idx (email);
CREATE INDEX idx_duplicate_b ON test_duplicate_idx (email);",
)
.execute(&test_db)
.await
.expect("Failed to create test schema");

let url = get_database_url(&test_db);
let output = run_dblint(&url, &["--error-on-warnings"]);
assert_snapshot!(output);
}

#[test]
#[cfg_attr(
target_os = "windows",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
---
source: crates/pgls_cli/tests/assert_dblint.rs
expression: output
snapshot_kind: text
---
status: failure
stdout:
Command completed in <duration>.
Found 1 warning(s).
stderr:
splinter/performance/duplicateIndex ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

! Table \`public.test_duplicate_idx\` has identical indexes {idx_duplicate_a,idx_duplicate_b}. Drop all except one of them

Detects cases where two ore more identical indexes exist.

i table: public.test_duplicate_idx

{"indexes":["idx_duplicate_a","idx_duplicate_b"]}

i Remediation: https://supabase.com/docs/guides/database/database-linter?lint=0009_duplicate_index


splinter/performance/unusedIndex ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i Index \`idx_duplicate_a\` on table \`public.test_duplicate_idx\` has not been used

Detects if an index has never been used and may be a candidate for removal.

i table: public.test_duplicate_idx

i Remediation: https://supabase.com/docs/guides/database/database-linter?lint=0005_unused_index


splinter/performance/unusedIndex ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i Index \`idx_duplicate_b\` on table \`public.test_duplicate_idx\` has not been used

Detects if an index has never been used and may be a candidate for removal.

i table: public.test_duplicate_idx

i Remediation: https://supabase.com/docs/guides/database/database-linter?lint=0005_unused_index


check ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

× Some warnings were emitted while running checks.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
source: crates/pgls_cli/tests/assert_dblint.rs
expression: output
snapshot_kind: text
---
status: success
stdout:
Command completed in <duration>.
stderr:
Loading