diff --git a/crates/nu-cli/src/commands/sort_by.rs b/crates/nu-cli/src/commands/sort_by.rs index 869853f43..a2cb055f2 100644 --- a/crates/nu-cli/src/commands/sort_by.rs +++ b/crates/nu-cli/src/commands/sort_by.rs @@ -135,6 +135,17 @@ pub fn sort( } => { let should_sort_case_insensitively = insensitive && vec.iter().all(|x| x.is_string()); + if !vec + .windows(2) + .all(|elem| coerce_compare(&elem[0], &elem[1]).is_ok()) + { + return Err(ShellError::labeled_error( + "Not all values can be compared", + "not all values compare", + tag, + )); + } + vec.sort_by(|a, b| { if should_sort_case_insensitively { let lowercase_a_string = a.expect_string().to_ascii_lowercase(); diff --git a/crates/nu-cli/tests/commands/sort_by.rs b/crates/nu-cli/tests/commands/sort_by.rs index 4aa22524e..98bdd51d8 100644 --- a/crates/nu-cli/tests/commands/sort_by.rs +++ b/crates/nu-cli/tests/commands/sort_by.rs @@ -45,6 +45,21 @@ fn by_invalid_column() { assert!(actual.err.contains("invalid column")); } +#[test] +fn by_invalid_types() { + let actual = nu!( + cwd: "tests/fixtures/formats", pipeline( + r#" + open cargo_sample.toml --raw + | echo [1 "foo"] + | sort-by + "# + )); + + assert!(actual.err.contains("Not all values can be compared")); + assert!(actual.err.contains("not all values compare")); +} + #[test] fn sort_primitive_values() { let actual = nu!(