[INFO] cloning repository https://github.com/maartenvanvliet/ddlint
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/maartenvanvliet/ddlint" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fmaartenvanvliet%2Fddlint", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fmaartenvanvliet%2Fddlint'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] 87efcafe50ca2c7fc52b11700972e171041da81d
[INFO] testing maartenvanvliet/ddlint/87efcafe50ca2c7fc52b11700972e171041da81d against 1.98.0-beta.8+cargoflags=--release for beta-release-1.99-2
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fmaartenvanvliet%2Fddlint" "/workspace/builds/worker-7-tc1/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-7-tc1/source'...
[INFO] [stderr] done.
[INFO] started tweaking git repo https://github.com/maartenvanvliet/ddlint
[INFO] finished tweaking git repo https://github.com/maartenvanvliet/ddlint
[INFO] tweaked toml for git repo https://github.com/maartenvanvliet/ddlint written to /workspace/builds/worker-7-tc1/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/maartenvanvliet/ddlint on toolchain 1.98.0-beta.8
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.98.0-beta.8" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/maartenvanvliet/ddlint already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.98.0-beta.8" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] [stderr]     Updating crates.io index
[INFO] [stderr]  Downloading crates ...
[INFO] [stderr]   Downloaded recursive v0.1.1
[INFO] [stderr]   Downloaded tempfile v3.10.1
[INFO] [stderr]   Downloaded recursive-proc-macro-impl v0.1.1
[INFO] [stderr]   Downloaded ar_archive_writer v0.5.2
[INFO] [stderr]   Downloaded colored v2.2.0
[INFO] [stderr]   Downloaded cc v1.2.63
[INFO] [stderr]   Downloaded yaml-rust v0.4.5
[INFO] [stderr]   Downloaded serde_yaml v0.8.26
[INFO] [stderr]   Downloaded clap v4.4.18
[INFO] [stderr]   Downloaded memchr v2.8.1
[INFO] [stderr]   Downloaded clap_builder v4.4.18
[INFO] [stderr]   Downloaded sqlparser v0.62.0
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:8683fc1fc2eb5c9ac98e0d076ab094b2ffac7f99da555d2b6a2e27f346de2ec7" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] 2ed941e67545f0fd4d68e20f042c0e8b2784d7866b3772b4afe04858f4d84436
[INFO] running `Command { std: "docker" "start" "2ed941e67545f0fd4d68e20f042c0e8b2784d7866b3772b4afe04858f4d84436", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "2ed941e67545f0fd4d68e20f042c0e8b2784d7866b3772b4afe04858f4d84436", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "2ed941e67545f0fd4d68e20f042c0e8b2784d7866b3772b4afe04858f4d84436" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.8" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "2ed941e67545f0fd4d68e20f042c0e8b2784d7866b3772b4afe04858f4d84436", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "2ed941e67545f0fd4d68e20f042c0e8b2784d7866b3772b4afe04858f4d84436" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.8" "build" "--frozen" "--message-format=json" "--release", kill_on_drop: false }`
[INFO] [stderr]    Compiling object v0.37.3
[INFO] [stderr]    Compiling shlex v2.0.1
[INFO] [stderr]    Compiling memchr v2.8.1
[INFO] [stderr]    Compiling autocfg v1.5.1
[INFO] [stderr]    Compiling syn v2.0.117
[INFO] [stderr]    Compiling anstream v0.6.21
[INFO] [stderr]    Compiling hashbrown v0.12.3
[INFO] [stderr]    Compiling anyhow v1.0.102
[INFO] [stderr]    Compiling cc v1.2.63
[INFO] [stderr]    Compiling clap_lex v0.6.0
[INFO] [stderr]    Compiling heck v0.4.1
[INFO] [stderr]    Compiling indexmap v1.9.3
[INFO] [stderr]    Compiling linked-hash-map v0.5.6
[INFO] [stderr]    Compiling strsim v0.10.0
[INFO] [stderr]    Compiling yaml-rust v0.4.5
[INFO] [stderr]    Compiling log v0.4.32
[INFO] [stderr]    Compiling clap_builder v4.4.18
[INFO] [stderr]    Compiling same-file v1.0.6
[INFO] [stderr]    Compiling walkdir v2.5.0
[INFO] [stderr]    Compiling colored v2.2.0
[INFO] [stderr]    Compiling stacker v0.1.24
[INFO] [stderr]    Compiling glob v0.3.3
[INFO] [stderr]    Compiling recursive-proc-macro-impl v0.1.1
[INFO] [stderr]    Compiling serde_derive v1.0.228
[INFO] [stderr]    Compiling clap_derive v4.4.7
[INFO] [stderr]    Compiling ar_archive_writer v0.5.2
[INFO] [stderr]    Compiling clap v4.4.18
[INFO] [stderr]    Compiling psm v0.1.31
[INFO] [stderr]    Compiling recursive v0.1.1
[INFO] [stderr]    Compiling sqlparser v0.62.0
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling serde_yaml v0.8.26
[INFO] [stderr]    Compiling ddlint v0.3.0 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `release` profile [optimized] target(s) in 3m 24s
[INFO] running `Command { std: "docker" "inspect" "2ed941e67545f0fd4d68e20f042c0e8b2784d7866b3772b4afe04858f4d84436", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "2ed941e67545f0fd4d68e20f042c0e8b2784d7866b3772b4afe04858f4d84436" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.8" "test" "--frozen" "--no-run" "--message-format=json" "--release", kill_on_drop: false }`
[INFO] [stderr]    Compiling rustix v0.38.44
[INFO] [stderr]    Compiling bitflags v2.13.0
[INFO] [stderr]    Compiling tempfile v3.10.1
[INFO] [stderr]    Compiling ddlint v0.3.0 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `release` profile [optimized] target(s) in 19.73s
[INFO] running `Command { std: "docker" "inspect" "2ed941e67545f0fd4d68e20f042c0e8b2784d7866b3772b4afe04858f4d84436", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "2ed941e67545f0fd4d68e20f042c0e8b2784d7866b3772b4afe04858f4d84436" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.8" "test" "--frozen" "--release", kill_on_drop: false }`
[INFO] [stderr]     Finished `release` profile [optimized] target(s) in 0.08s
[INFO] [stderr]      Running unittests src/main.rs (/opt/rustwide/target/release/deps/ddlint-91d48256d71853c5)
[INFO] [stdout] 
[INFO] [stdout] running 116 tests
[INFO] [stdout] test analyzer::tests::inline_directive_suppresses_finding ... ok
[INFO] [stdout] test analyzer::tests::above_directive_suppresses_finding ... ok
[INFO] [stdout] test analyzer::tests::file_wide_directive_suppresses_file_level_rule ... ok
[INFO] [stdout] test analyzer::tests::is_glob_plain_path_is_not_glob ... ok
[INFO] [stdout] test analyzer::tests::is_glob_question ... ok
[INFO] [stdout] test analyzer::tests::is_glob_star ... ok
[INFO] [stdout] test analyzer::tests::resolve_deduplicates_overlapping_inputs ... ok
[INFO] [stdout] test analyzer::tests::resolve_directory_collects_sql_files ... ok
[INFO] [stdout] test analyzer::tests::is_glob_bracket ... ok
[INFO] [stdout] test analyzer::tests::resolve_glob_no_match_returns_error ... ok
[INFO] [stdout] test analyzer::tests::resolve_invalid_glob_returns_error ... ok
[INFO] [stdout] test analyzer::tests::resolve_mixed_file_dir_and_glob ... ok
[INFO] [stdout] test analyzer::tests::resolve_directory_recurses ... ok
[INFO] [stdout] test analyzer::tests::resolve_glob_matches_sql_files ... ok
[INFO] [stdout] test config::tests::danger_level_maps_to_danger_severity ... ok
[INFO] [stdout] test config::tests::empty_config_is_valid ... ok
[INFO] [stdout] test analyzer::tests::resolve_multiple_explicit_files ... ok
[INFO] [stdout] test config::tests::empty_file_is_valid ... ok
[INFO] [stdout] test config::tests::ignore_level_maps_to_none ... ok
[INFO] [stdout] test config::tests::known_rules_has_no_duplicates ... ok
[INFO] [stdout] test config::tests::no_override_uses_default_danger ... ok
[INFO] [stdout] test config::tests::no_override_uses_default_warning ... ok
[INFO] [stdout] test config::tests::known_rules_is_non_empty ... ok
[INFO] [stdout] test analyzer::tests::resolve_single_file ... ok
[INFO] [stdout] test config::tests::override_downgrade_danger_to_warn ... ok
[INFO] [stdout] test config::tests::override_ignore_suppresses_rule ... ok
[INFO] [stdout] test analyzer::tests::suppression_does_not_bleed_to_next_statement ... ok
[INFO] [stdout] test analyzer::tests::unsuppressed_finding_still_fires_alongside_suppressed_one ... ok
[INFO] [stdout] test config::tests::rule_level_from_str_case_insensitive ... ok
[INFO] [stdout] test config::tests::override_upgrade_warn_to_error ... ok
[INFO] [stdout] test config::tests::rule_level_from_str_invalid ... ok
[INFO] [stdout] test config::tests::parses_all_level_spellings ... ok
[INFO] [stdout] test config::tests::rule_level_from_str_valid ... ok
[INFO] [stdout] test config::tests::unknown_field_at_top_level_is_error ... ok
[INFO] [stdout] test config::tests::unknown_rule_is_validation_error ... ok
[INFO] [stdout] test config::tests::warn_level_maps_to_warning_severity ... ok
[INFO] [stdout] test dialect::tests::default_is_mysql ... ok
[INFO] [stdout] test dialect::tests::from_str_mysql ... ok
[INFO] [stdout] test dialect::tests::display_mysql ... ok
[INFO] [stdout] test dialect::tests::from_str_unknown_errors ... ok
[INFO] [stdout] test output::tests::count_severity_correct ... ok
[INFO] [stdout] test output::tests::gha_danger_emits_error_level ... ok
[INFO] [stdout] test output::tests::gha_detail_collapses_paragraphs ... ok
[INFO] [stdout] test output::tests::gha_escape_encodes_special_chars ... ok
[INFO] [stdout] test output::tests::gha_warning_emits_warning_level ... ok
[INFO] [stdout] test output::tests::has_issues_false_when_clean ... ok
[INFO] [stdout] test output::tests::has_issues_true_on_parse_error ... ok
[INFO] [stdout] test output::tests::has_issues_true_when_findings_present ... ok
[INFO] [stdout] test output::tests::parse_format_case_insensitive ... ok
[INFO] [stdout] test output::tests::parse_format_gha ... ok
[INFO] [stdout] test output::tests::parse_format_text ... ok
[INFO] [stdout] test output::tests::parse_format_unknown_errors ... ok
[INFO] [stdout] test rules::tests::add_column_enum_is_warning ... ok
[INFO] [stdout] test rules::tests::add_column_enum_not_null_no_default_gets_both_rules ... ok
[INFO] [stdout] test rules::tests::add_column_no_algorithm_instant_fires_once_per_statement ... ok
[INFO] [stdout] test rules::tests::add_column_nullable_is_safe ... ok
[INFO] [stdout] test rules::tests::add_column_not_null_with_default_is_safe ... ok
[INFO] [stdout] test rules::tests::add_column_with_algorithm_inplace_still_warns ... ok
[INFO] [stdout] test rules::tests::add_column_with_algorithm_instant_is_clean ... ok
[INFO] [stdout] test rules::tests::add_column_without_algorithm_instant_is_warning ... ok
[INFO] [stdout] test rules::tests::add_column_with_algorithm_copy_still_warns ... ok
[INFO] [stdout] test rules::tests::add_column_not_null_no_default_is_danger ... ok
[INFO] [stdout] test rules::tests::add_foreign_key_is_danger ... ok
[INFO] [stdout] test rules::tests::add_foreign_key_detail_names_table ... ok
[INFO] [stdout] test rules::tests::add_primary_key_is_danger ... ok
[INFO] [stdout] test rules::tests::add_unique_constraint_is_warning ... ok
[INFO] [stdout] test rules::tests::alter_fk_drop_and_add_without_fk_checks_is_danger ... ok
[INFO] [stdout] test rules::tests::alter_fk_missing_disable_is_danger ... ok
[INFO] [stdout] test rules::tests::alter_fk_missing_restore_is_danger ... ok
[INFO] [stdout] test rules::tests::alter_fk_with_fk_checks_disabled_is_safe ... ok
[INFO] [stdout] test rules::tests::change_column_enum_gets_both_rules ... ok
[INFO] [stdout] test rules::tests::change_column_is_danger ... ok
[INFO] [stdout] test rules::tests::config_downgrade_danger_to_warn ... ok
[INFO] [stdout] test rules::tests::config_ignore_only_suppresses_named_rule ... ok
[INFO] [stdout] test rules::tests::config_ignore_suppresses_finding ... ok
[INFO] [stdout] test rules::tests::config_upgrade_warn_to_error ... ok
[INFO] [stdout] test rules::tests::create_index_non_unique_is_safe ... ok
[INFO] [stdout] test rules::tests::create_table_is_safe ... ok
[INFO] [stdout] test rules::tests::create_unique_index_is_warning ... ok
[INFO] [stdout] test rules::tests::danger_findings_have_danger_severity ... ok
[INFO] [stdout] test rules::tests::default_config_preserves_all_built_in_severities ... ok
[INFO] [stdout] test rules::tests::drop_column_fires_per_column ... ok
[INFO] [stdout] test rules::tests::drop_column_is_danger ... ok
[INFO] [stdout] test rules::tests::drop_primary_key_is_danger ... ok
[INFO] [stdout] test rules::tests::drop_table_if_exists_is_danger ... ok
[INFO] [stdout] test rules::tests::drop_table_is_danger ... ok
[INFO] [stdout] test rules::tests::findings_have_non_empty_detail ... ok
[INFO] [stdout] test rules::tests::fresh_add_fk_without_drop_does_not_trigger_alter_rule ... ok
[INFO] [stdout] test rules::tests::lock_tables_is_danger ... ok
[INFO] [stdout] test rules::tests::lock_tables_multiple_tables_fires_once ... ok
[INFO] [stdout] test rules::tests::lock_tables_read_is_danger ... ok
[INFO] [stdout] test rules::tests::modify_column_enum_gets_both_rules ... ok
[INFO] [stdout] test rules::tests::modify_column_is_danger ... ok
[INFO] [stdout] test rules::tests::multi_op_alter_catches_all_issues ... ok
[INFO] [stdout] test rules::tests::multi_statement_finding_is_warning ... ok
[INFO] [stdout] test rules::tests::multi_statement_fires_once_not_per_statement ... ok
[INFO] [stdout] test rules::tests::multiple_safe_statements_are_clean ... ok
[INFO] [stdout] test rules::tests::non_add_column_alter_does_not_trigger_algorithm_rule ... ok
[INFO] [stdout] test rules::tests::rename_column_is_danger ... ok
[INFO] [stdout] test rules::tests::rename_table_statement_is_danger ... ok
[INFO] [stdout] test rules::tests::rename_table_statement_multi_fires_per_pair ... ok
[INFO] [stdout] test rules::tests::rename_table_via_alter_is_danger ... ok
[INFO] [stdout] test rules::tests::set_statement_not_counted_as_ddl ... ok
[INFO] [stdout] test rules::tests::single_ddl_statement_is_clean ... ok
[INFO] [stdout] test rules::tests::truncate_is_danger ... ok
[INFO] [stdout] test rules::tests::two_ddl_statements_triggers_rule ... ok
[INFO] [stdout] test rules::tests::warning_findings_have_warning_severity ... ok
[INFO] [stdout] test suppress::tests::above_statement_directive_applies_to_next_statement ... ok
[INFO] [stdout] test suppress::tests::directive_does_not_bleed_to_subsequent_statements ... ok
[INFO] [stdout] test suppress::tests::directive_on_second_statement ... ok
[INFO] [stdout] test suppress::tests::file_wide_directive_is_collected ... ok
[INFO] [stdout] test suppress::tests::ignore_file_does_not_affect_per_stmt ... ok
[INFO] [stdout] test suppress::tests::inline_directive_applies_to_same_statement ... ok
[INFO] [stdout] test suppress::tests::multiple_rules_in_one_directive ... ok
[INFO] [stdout] test suppress::tests::rule_ids_are_uppercased ... ok
[INFO] [stdout] test suppress::tests::semicolon_in_string_not_counted_as_statement_end ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 116 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s
[INFO] [stdout] 
[INFO] [stderr]      Running tests/integration.rs (/opt/rustwide/target/release/deps/integration-ab1485cb6ae3bd60)
[INFO] [stdout] 
[INFO] [stdout] running 37 tests
[INFO] [stdout] ddlint — 1 migration file(s)
[INFO] [stderr] error: invalid value 'oracle' for '--dialect <ENGINE>': unknown dialect `oracle` — valid values: mysql
[INFO] [stdout] 
[INFO] [stderr] 
[INFO] [stdout] 
[INFO] [stderr] For more information, try '--help'.
[INFO] [stdout] ── /tmp/.tmpXl9mYd/safe.sql
[INFO] [stdout]   WARN   [ADD_COLUMN_NO_ALGORITHM_INSTANT]
[INFO] [stdout]   ADD COLUMN on `t` does not specify ALGORITHM=INSTANT
[INFO] [stdout] 
[INFO] [stdout]     MySQL 8.0+ supports ALGORITHM=INSTANT for adding columns, which completes in
[INFO] [stdout]     milliseconds regardless of table size by only updating the data dictionary — no
[INFO] [stdout]     table rebuild or row scanning required.
[INFO] [stdout] 
[INFO] [stdout]     Without ALGORITHM=INSTANT, MySQL chooses the algorithm automatically. It will often
[INFO] [stdout]     pick INPLACE or COPY, both of which read the entire table and hold locks for the
[INFO] [stdout]     duration.
[INFO] [stdout] 
[INFO] [stdout]     Fix: append ALGORITHM=INSTANT to the statement: ALTER TABLE t ADD COLUMN x TEXT,
[INFO] [stdout]     ALGORITHM=INSTANT; If MySQL rejects it (e.g. the column has a non-null default on
[INFO] [stdout]     MySQL < 8.0), the statement will fail fast rather than silently running a slow
[INFO] [stdout]     rebuild.
[INFO] [stdout] 
[INFO] [stdout]     sql: ALTER TABLE t ADD COLUMN x TEXT
[INFO] [stdout] 
[INFO] [stdout] ────────────────────────────────────────────────────────────
[INFO] [stdout] Checked 1 migration(s)  ·  1 file(s) with issues
[INFO] [stdout]   0 danger  1 warning
[INFO] [stdout] ddlint — 1 migration file(s)
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] ── /tmp/.tmp2moO7Q/safe.sql
[INFO] [stdout]   WARN   [ADD_COLUMN_NO_ALGORITHM_INSTANT]
[INFO] [stdout]   ADD COLUMN on `t` does not specify ALGORITHM=INSTANT
[INFO] [stdout] 
[INFO] [stdout]     MySQL 8.0+ supports ALGORITHM=INSTANT for adding columns, which completes in
[INFO] [stdout]     milliseconds regardless of table size by only updating the data dictionary — no
[INFO] [stdout]     table rebuild or row scanning required.
[INFO] [stdout] 
[INFO] [stdout]     Without ALGORITHM=INSTANT, MySQL chooses the algorithm automatically. It will often
[INFO] [stdout]     pick INPLACE or COPY, both of which read the entire table and hold locks for the
[INFO] [stdout]     duration.
[INFO] [stdout] 
[INFO] [stdout]     Fix: append ALGORITHM=INSTANT to the statement: ALTER TABLE t ADD COLUMN x TEXT,
[INFO] [stdout]     ALGORITHM=INSTANT; If MySQL rejects it (e.g. the column has a non-null default on
[INFO] [stdout]     MySQL < 8.0), the statement will fail fast rather than silently running a slow
[INFO] [stdout]     rebuild.
[INFO] [stdout] 
[INFO] [stdout]     sql: ALTER TABLE t ADD COLUMN x TEXT
[INFO] [stdout] 
[INFO] [stdout] ────────────────────────────────────────────────────────────
[INFO] [stdout] Checked 1 migration(s)  ·  1 file(s) with issues
[INFO] [stdout]   0 danger  1 warning
[INFO] [stdout] test dialect_flag_mysql_accepted ... ok
[INFO] [stdout] test dialect_flag_unknown_exits_two ... ok
[INFO] [stdout] test config_upgrade_promotes_to_danger ... ok
[INFO] [stdout] test config_dialect_field_accepted ... ok
[INFO] [stdout] ddlint — 1 migration file(s)
[INFO] [stdout] 
[INFO] [stdout] ddlint — 1 migration file(s)
[INFO] [stdout] 
[INFO] [stderr] No .sql files found for the given inputs
[INFO] [stdout] 
[INFO] [stdout] ── /tmp/.tmpfvBFlq/danger.sql
[INFO] [stdout]   DANGER [DROP_TABLE]
[INFO] [stdout]   DROP TABLE `legacy` is irreversible
[INFO] [stdout] 
[INFO] [stdout]     Dropping `legacy` permanently destroys all data and the table definition. Any live app
[INFO] [stdout]     code referencing `legacy` will immediately start throwing errors. In a rolling deploy
[INFO] [stdout]     this affects old pods that haven't been restarted yet.
[INFO] [stdout] 
[INFO] [stdout]     Fix: ensure all application code referencing `legacy` has been removed and fully
[INFO] [stdout]     deployed before running this migration. Consider renaming the table first and waiting
[INFO] [stdout]     one deploy cycle to confirm nothing breaks.
[INFO] [stdout] 
[INFO] [stdout]     sql: DROP TABLE legacy
[INFO] [stdout] 
[INFO] [stdout] ────────────────────────────────────────────────────────────
[INFO] [stdout] Checked 1 migration(s)  ·  1 file(s) with issues
[INFO] [stdout]   1 danger  0 warning
[INFO] [stdout] test directory_with_no_sql_files_exits_two ... ok
[INFO] [stdout] test gha_annotation_includes_file_path ... ok
[INFO] [stdout] test dangerous_sql_exits_one ... 
[INFO] [stdout] ok
[INFO] [stdout] ── /tmp/.tmpcH2poT/safe.sql
[INFO] [stdout]   WARN   [ADD_COLUMN_NO_ALGORITHM_INSTANT]
[INFO] [stdout]   ADD COLUMN on `users` does not specify ALGORITHM=INSTANT
[INFO] [stdout] 
[INFO] [stdout]     MySQL 8.0+ supports ALGORITHM=INSTANT for adding columns, which completes in
[INFO] [stdout]     milliseconds regardless of table size by only updating the data dictionary — no
[INFO] [stdout]     table rebuild or row scanning required.
[INFO] [stdout] 
[INFO] [stdout]     Without ALGORITHM=INSTANT, MySQL chooses the algorithm automatically. It will often
[INFO] [stdout]     pick INPLACE or COPY, both of which read the entire table and hold locks for the
[INFO] [stdout]     duration.
[INFO] [stdout] 
[INFO] [stdout]     Fix: append ALGORITHM=INSTANT to the statement: ALTER TABLE t ADD COLUMN x TEXT,
[INFO] [stdout]     ALGORITHM=INSTANT; If MySQL rejects it (e.g. the column has a non-null default on
[INFO] [stdout]     MySQL < 8.0), the statement will fail fast rather than silently running a slow
[INFO] [stdout]     rebuild.
[INFO] [stdout] 
[INFO] [stdout]     sql: ALTER TABLE users ADD COLUMN notes TEXT
[INFO] [stdout] 
[INFO] [stdout] ────────────────────────────────────────────────────────────
[INFO] [stdout] Checked 1 migration(s)  ·  1 file(s) with issues
[INFO] [stdout]   0 danger  1 warning
[INFO] [stdout] test config_downgrade_sets_warn_severity ... ok
[INFO] [stdout] test gha_parse_error_emits_error_annotation ... ok
[INFO] [stdout] test clean_file_exits_zero ... ok
[INFO] [stdout] test directory_input_recurses_for_sql_files ... ok
[INFO] [stdout] test config_ignore_suppresses_rule ... ok
[INFO] [stdout] test gha_warning_emits_warning_annotation ... ok
[INFO] [stdout] test gha_danger_emits_error_annotation ... ok
[INFO] [stdout] test ignore_above_statement_suppresses_finding ... ok
[INFO] [stdout] ddlint — 1 migration file(s)
[INFO] [stdout] 
[INFO] [stdout]   OK     /tmp/.tmpNIzNhI/m.sql
[INFO] [stdout] ────────────────────────────────────────────────────────────
[INFO] [stdout] Checked 1 migration(s)  ·  0 file(s) with issues
[INFO] [stdout]   0 danger  0 warning
[INFO] [stdout] ddlint — 1 migration file(s)
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] PARSE ERR /nonexistent/path/file.sql
[INFO] [stdout]   Cannot read file: No such file or directory (os error 2)
[INFO] [stdout] 
[INFO] [stdout] ────────────────────────────────────────────────────────────
[INFO] [stdout] Checked 1 migration(s)  ·  1 file(s) with issues
[INFO] [stdout]   0 danger  0 warning
[INFO] [stderr] error: Config file not found: /nonexistent/ddlint.yml
[INFO] [stdout] test gha_clean_file_produces_no_annotations ... ok
[INFO] [stdout] test ignore_only_suppresses_named_rule ... ok
[INFO] [stdout] test ignore_inline_suppresses_finding ... ok
[INFO] [stdout] test missing_file_exits_one ... ok
[INFO] [stdout] test nonexistent_explicit_config_exits_two ... ok
[INFO] [stdout] test glob_input_matches_sql_files ... ok
[INFO] [stdout] test ignore_file_suppresses_file_level_rule ... ok
[INFO] [stdout] test print_config_dialect_flag_changes_dialect_field ... ok
[INFO] [stdout] test text_output_shows_ok_for_clean_file ... ok
[INFO] [stdout] test multiple_explicit_files_all_checked ... ok
[INFO] [stdout] test text_output_shows_danger_label ... ok
[INFO] [stdout] test print_config_lists_all_rules ... ok
[INFO] [stdout] test print_config_requires_no_inputs ... ok
[INFO] [stdout] test one_clean_one_dirty_shows_correct_counts ... ok
[INFO] [stdout] ddlint — 1 migration file(s)
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] PARSE ERR /tmp/.tmp8GlVX2/bad.sql
[INFO] [stdout]   SQL parse error: sql parser error: Expected: an SQL statement, found: THIS at Line: 1, Column: 1
[INFO] [stdout] 
[INFO] [stdout] ────────────────────────────────────────────────────────────
[INFO] [stdout] Checked 1 migration(s)  ·  1 file(s) with issues
[INFO] [stdout]   0 danger  0 warning
[INFO] [stdout] test unparseable_sql_exits_one ... ok
[INFO] [stdout] ddlint — 1 migration file(s)
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] ddlint — 1 migration file(s)
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] ── /tmp/.tmpdISpmj/warn.sql
[INFO] [stdout]   WARN   [CREATE_UNIQUE_INDEX]
[INFO] [stdout]   CREATE UNIQUE INDEX `idx` on `users` requires a duplicate scan
[INFO] [stdout] 
[INFO] [stdout]     Building a unique index requires a full table read to verify there are no duplicate
[INFO] [stdout]     values. The index build itself is online, but the migration will fail if duplicates
[INFO] [stdout]     exist at the time it runs.
[INFO] [stdout] 
[INFO] [stdout]     Fix: run SELECT COUNT(*) vs SELECT COUNT(DISTINCT col) first to confirm uniqueness. If
[INFO] [stdout]     cleaning up duplicates, do that in a prior migration.
[INFO] [stdout] 
[INFO] [stdout]     sql: CREATE UNIQUE INDEX idx ON users(email)
[INFO] [stdout] 
[INFO] [stdout] ────────────────────────────────────────────────────────────
[INFO] [stdout] Checked 1 migration(s)  ·  1 file(s) with issues
[INFO] [stdout]   0 danger  1 warning
[INFO] [stdout] ── /tmp/.tmpBfvNuq/warn.sql
[INFO] [stdout]   WARN   [CREATE_UNIQUE_INDEX]
[INFO] [stdout]   CREATE UNIQUE INDEX `idx` on `users` requires a duplicate scan
[INFO] [stdout] 
[INFO] [stdout]     Building a unique index requires a full table read to verify there are no duplicate
[INFO] [stdout]     values. The index build itself is online, but the migration will fail if duplicates
[INFO] [stdout]     exist at the time it runs.
[INFO] [stdout] 
[INFO] [stdout]     Fix: run SELECT COUNT(*) vs SELECT COUNT(DISTINCT col) first to confirm uniqueness. If
[INFO] [stdout]     cleaning up duplicates, do that in a prior migration.
[INFO] [stdout] 
[INFO] [stdout]     sql: CREATE UNIQUE INDEX idx ON users(email)
[INFO] [stdout] 
[INFO] [stdout] ────────────────────────────────────────────────────────────
[INFO] [stdout] Checked 1 migration(s)  ·  1 file(s) with issues
[INFO] [stdout]   0 danger  1 warning
[INFO] [stdout] test text_output_summary_counts_danger_and_warning ... ok
[INFO] [stdout] test warning_sql_exits_zero_without_strict ... ok
[INFO] [stdout] test warning_sql_exits_one_with_strict ... ok
[INFO] [stdout] test text_output_includes_summary_line ... ok
[INFO] [stdout] test print_config_outputs_yaml ... ok
[INFO] [stdout] test text_output_shows_rule_name_for_danger ... ok
[INFO] [stdout] test text_output_shows_warn_label_for_warning ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 37 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s
[INFO] [stdout] 
[INFO] running `Command { std: "docker" "inspect" "2ed941e67545f0fd4d68e20f042c0e8b2784d7866b3772b4afe04858f4d84436", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "2ed941e67545f0fd4d68e20f042c0e8b2784d7866b3772b4afe04858f4d84436", kill_on_drop: false }`
[INFO] [stdout] 2ed941e67545f0fd4d68e20f042c0e8b2784d7866b3772b4afe04858f4d84436
