nushell/crates/nu-command/tests/commands
Stefan Holderbach 0569a9c92e
Disallow duplicated columns in table literals (#10875)
# Description
Pretty much all operations/commands in Nushell assume that the column
names/keys in a record and thus also in a table (which consists of a
list of records) are unique.
Access through a string-like cell path should refer to a single column
or key/value pair and our output through `table` will only show the last
mention of a repeated column name.

```nu
[[a a]; [1 2]]
╭─#─┬─a─╮
│ 0 │ 2 │
╰───┴───╯
```

While the record parsing already either errors with the
`ShellError::ColumnDefinedTwice` or silently overwrites the first
occurence with the second occurence, the table literal syntax `[[header
columns]; [val1 val2]]` currently still allowed the creation of tables
(and internally records with more than one entry with the same name.

This is not only confusing, but also breaks some assumptions around how
we can efficiently perform operations or in the past lead to outright
bugs (e.g. #8431 fixed by #8446).

This PR proposes to make this an error.
After this change another hole which allowed the construction of records
with non-unique column names will be plugged.

## Parts
- Fix `SE::ColumnDefinedTwice` error code
- Remove previous tests permitting duplicate columns
- Deny duplicate column in table literal eval
- Deny duplicate column in const eval
- Deny duplicate column in `from nuon`

# User-Facing Changes
`[[a a]; [1 2]]` will now return an error:

```
Error: nu:🐚:column_defined_twice

  × Record field or table column used twice
   ╭─[entry #2:1:1]
 1 │ [[a a]; [1 2]]
   ·   ┬ ┬
   ·   │ ╰── field redefined here
   ·   ╰── field first defined here
   ╰────
```

this may under rare circumstances block code from evaluating.

Furthermore this makes some NUON files invalid if they previously
contained tables with repeated column names.

# Tests + Formatting
Added tests for each of the different evaluation paths that materialize
tables.
2023-11-01 21:25:35 +01:00
..
assignment Clean up tests containing unnecessary cwd: tokens (#9692) 2023-07-17 18:43:51 +02:00
conversions Fix 9156 endian consistency (#9873) 2023-08-24 07:08:58 -05:00
date rename from date format to format date (#9902) 2023-08-04 06:06:00 +12:00
hash_ Clean up tests containing unnecessary cwd: tokens (#9692) 2023-07-17 18:43:51 +02:00
math Add long options for generators and math (#10752) 2023-10-19 18:17:42 +02:00
move_ Allow filesystem commands to access files with glob metachars in name (#10694) 2023-10-18 13:31:15 -05:00
network fix #10319: allow json request of value type list (#10356) 2023-09-13 16:54:03 +02:00
path Add long options for path (#10775) 2023-10-19 22:07:01 +02:00
platform Add long options for platform and random (#10776) 2023-10-19 22:04:33 +02:00
query Feature cleanup (#7182) 2022-11-22 16:58:11 -08:00
random Add long options for platform and random (#10776) 2023-10-19 22:04:33 +02:00
skip Fix 9156 endian consistency (#9873) 2023-08-24 07:08:58 -05:00
str_ use to_lowercase in str downcase (#10850) 2023-10-27 19:16:17 +02:00
take Clean up tests containing unnecessary cwd: tokens (#9692) 2023-07-17 18:43:51 +02:00
url Add url decode command (#10611) 2023-10-05 18:43:58 +02:00
alias.rs split $nu variable into scope commands and simpler $nu (#9487) 2023-06-21 09:33:01 +12:00
all.rs Removes unnecessary cwd and pipeline from various tests (#9202) 2023-05-17 18:55:26 -05:00
any.rs Removes unnecessary cwd and pipeline from various tests (#9202) 2023-05-17 18:55:26 -05:00
append.rs fix(nu-command/tests): further remove unnecessary pipeline() and cwd() (#8793) 2023-04-07 14:09:55 -07:00
break_.rs fix(nu-command/tests): further remove unnecessary pipeline() and cwd() (#8793) 2023-04-07 14:09:55 -07:00
cal.rs fix(nu-command/tests): further remove unnecessary pipeline() and cwd() (#8793) 2023-04-07 14:09:55 -07:00
cd.rs fix(nu-command/tests): further remove unnecessary pipeline() and cwd() (#8793) 2023-04-07 14:09:55 -07:00
compact.rs fix(nu-command/tests): further remove unnecessary pipeline() and cwd() (#8793) 2023-04-07 14:09:55 -07:00
config_env_default.rs Command: Add config env/nu --default to print defaults (#10480) 2023-09-25 08:00:59 -05:00
config_nu_default.rs Command: Add config env/nu --default to print defaults (#10480) 2023-09-25 08:00:59 -05:00
continue_.rs fix(nu-command/tests): further remove unnecessary pipeline() and cwd() (#8793) 2023-04-07 14:09:55 -07:00
cp.rs readd update flag to cp command (#10824) 2023-10-25 11:30:13 +02:00
debug_info.rs Make debug info lazy (#10728) 2023-10-24 12:48:05 -05:00
def.rs Add --env and --wrapped flags to def (#10566) 2023-10-02 21:13:31 +03:00
default.rs fix default after an empty where (#10240) 2023-09-06 16:39:35 +08:00
detect_columns.rs Use long options for string (#10777) 2023-10-19 22:08:09 +02:00
do_.rs remove the $nothing variable (#10478) 2023-09-26 18:49:28 +02:00
drop.rs Input output checking (#9680) 2023-07-14 15:20:35 +12:00
each.rs REFACTOR: move the 0% commands to nu-cmd-extra (#9404) 2023-07-06 08:31:31 -07:00
echo.rs Change echo to print when not redirected (#10338) 2023-09-13 06:35:01 +12:00
empty.rs fix(nu-command/tests): further remove unnecessary pipeline() and cwd() (#8793) 2023-04-07 14:09:55 -07:00
error_make.rs fix(nu-command/tests): further remove unnecessary pipeline() and cwd() (#8793) 2023-04-07 14:09:55 -07:00
every.rs fix(nu-command/tests): further remove unnecessary pipeline() and cwd() (#8793) 2023-04-07 14:09:55 -07:00
exec.rs Add "fall-through" signatures (#7527) 2022-12-22 00:33:26 +02:00
export_def.rs Removes unnecessary cwd and pipeline from various tests (#9202) 2023-05-17 18:55:26 -05:00
fill.rs Removes unnecessary cwd and pipeline from various tests (#9202) 2023-05-17 18:55:26 -05:00
find.rs Fix find puts extra cols into record (#9397) 2023-06-10 16:57:26 -05:00
first.rs remove --column from length command and remove record processing (#10091) 2023-08-23 16:03:26 -05:00
flatten.rs Fix: remove unnecessary r#"..."# (#8670) (#9764) 2023-07-21 17:32:37 +02:00
for_.rs Change echo to print when not redirected (#10338) 2023-09-13 06:35:01 +12:00
format.rs update format signature to allow record to be passed in (#9898) 2023-08-02 10:57:58 -05:00
generate.rs rename unfold to generate (#10770) 2023-10-19 09:30:34 -05:00
get.rs Fix: remove unnecessary r#"..."# (#8670) (#9764) 2023-07-21 17:32:37 +02:00
glob.rs fix clippy (#10659) 2023-10-10 03:31:15 +13:00
group_by.rs Allow empty list inputs in group-by and return empty record (#10730) 2023-10-19 12:20:52 +02:00
headers.rs Fix: remove unnecessary r#"..."# (#8670) (#9764) 2023-07-21 17:32:37 +02:00
help.rs Tests: clean up unnecessary use of pipeline() (#10170) 2023-08-31 23:10:29 +02:00
histogram.rs Fix: remove unnecessary r#"..."# (#8670) (#9764) 2023-07-21 17:32:37 +02:00
insert.rs allow values command to support LazyRecords (#10418) 2023-09-20 12:57:29 -05:00
inspect.rs throw an error instead of a panic if no input is provided to inspect (#9259) 2023-05-22 13:54:04 -05:00
into_datetime.rs add table -> table to into datetime (#9775) 2023-07-23 20:14:51 +02:00
into_filesize.rs Update internal use of decimal to float (#10333) 2023-09-13 23:53:55 +02:00
into_int.rs fix some new chrono warnings (#10384) 2023-09-15 15:46:25 -05:00
join.rs Removes unnecessary cwd and pipeline from various tests (#9202) 2023-05-17 18:55:26 -05:00
last.rs remove --column from length command and remove record processing (#10091) 2023-08-23 16:03:26 -05:00
length.rs Spanned Value step 1: span all value cases (#10042) 2023-08-25 08:48:05 +12:00
let_.rs fix 'let' to properly redirect (#10360) 2023-09-14 10:18:29 +12:00
lines.rs fix panic with lines on an error (#9967) 2023-08-09 14:12:58 +02:00
loop_.rs Change echo to print when not redirected (#10338) 2023-09-13 06:35:01 +12:00
ls.rs treat path contains '?' as pattern (#10142) 2023-09-03 19:25:00 -05:00
match_.rs Support pattern matching null literals (#10829) 2023-10-25 06:30:45 +08:00
merge.rs Fix: remove unnecessary r#"..."# (#8670) (#9764) 2023-07-21 17:32:37 +02:00
mkdir.rs Fix: remove unnecessary r#"..."# (#8670) (#9764) 2023-07-21 17:32:37 +02:00
mod.rs Add umkdir command (#10785) 2023-10-30 07:59:48 -05:00
mut_.rs Fix: remove unnecessary r#"..."# (#8670) (#9764) 2023-07-21 17:32:37 +02:00
nu_check.rs Use long options for string (#10777) 2023-10-19 22:08:09 +02:00
open.rs allow multiple extensions (#10593) 2023-10-13 13:45:36 -05:00
par_each.rs Fix: remove unnecessary r#"..."# (#8670) (#9764) 2023-07-21 17:32:37 +02:00
parse.rs Clippy in tests (#10394) 2023-09-16 21:49:10 +02:00
prepend.rs Fix warnings and old names (#8457) 2023-03-15 18:54:55 +13:00
print.rs Clean up tests containing unnecessary cwd: tokens (#9692) 2023-07-17 18:43:51 +02:00
range.rs Fix: remove unnecessary r#"..."# (#8670) (#9764) 2023-07-21 17:32:37 +02:00
redirection.rs redirection: fix internal commands error with o+e> redirection (#10816) 2023-10-25 16:35:51 +02:00
reduce.rs Add long options for filters (#10641) 2023-10-08 13:12:46 +02:00
reject.rs Disallow duplicated columns in table literals (#10875) 2023-11-01 21:25:35 +01:00
rename.rs Add long options for filters (#10641) 2023-10-08 13:12:46 +02:00
return_.rs allow early return outside of main (#10514) 2023-09-28 18:49:42 +02:00
reverse.rs Clean up tests containing unnecessary cwd: tokens (#9692) 2023-07-17 18:43:51 +02:00
rm.rs Deref &String arguments to &str where appropriate (#10321) 2023-09-12 14:06:56 +08:00
roll.rs Fix: remove unnecessary r#"..."# (#8670) (#9764) 2023-07-21 17:32:37 +02:00
rotate.rs Clean up tests containing unnecessary cwd: tokens (#9692) 2023-07-17 18:43:51 +02:00
run_external.rs Fix: remove unnecessary r#"..."# (#8670) (#9764) 2023-07-21 17:32:37 +02:00
save.rs Fix wrong path expansion in save (#10046) 2023-08-18 20:45:10 +03:00
select.rs Use long options for string (#10777) 2023-10-19 22:08:09 +02:00
semicolon.rs Slim down tests (#9021) 2023-04-28 13:25:44 +02:00
seq.rs Slim down tests (#9021) 2023-04-28 13:25:44 +02:00
seq_char.rs Slim down tests (#9021) 2023-04-28 13:25:44 +02:00
sort.rs Fix: remove unnecessary r#"..."# (#8670) (#9764) 2023-07-21 17:32:37 +02:00
sort_by.rs Fix: remove unnecessary r#"..."# (#8670) (#9764) 2023-07-21 17:32:37 +02:00
source_env.rs Tests: clean up unnecessary use of pipeline() (#10170) 2023-08-31 23:10:29 +02:00
split_by.rs Fix: remove unnecessary r#"..."# (#8670) (#9764) 2023-07-21 17:32:37 +02:00
split_column.rs Use long options for string (#10777) 2023-10-19 22:08:09 +02:00
split_row.rs Simplify rawstrings in tests (#10180) 2023-09-01 00:08:27 +02:00
table.rs nu-table: Fix failing test (relied on termwidth assumptions) (#10492) 2023-09-25 18:17:42 +02:00
to_text.rs Make to text stream ListStreams (#7577) 2022-12-22 16:38:07 -08:00
touch.rs Fix: remove unnecessary r#"..."# (#8670) (#9764) 2023-07-21 17:32:37 +02:00
transpose.rs Slim down tests (#9021) 2023-04-28 13:25:44 +02:00
try_.rs Clean up tests containing unnecessary cwd: tokens (#9692) 2023-07-17 18:43:51 +02:00
ucp.rs Allow filesystem commands to access files with glob metachars in name (#10694) 2023-10-18 13:31:15 -05:00
umkdir.rs Add umkdir command (#10785) 2023-10-30 07:59:48 -05:00
unfold.rs add unfold back with a deprecation warning (#10771) 2023-10-19 19:23:06 +02:00
uniq.rs Add long options for filters (#10641) 2023-10-08 13:12:46 +02:00
uniq_by.rs Fix: remove unnecessary r#"..."# (#8670) (#9764) 2023-07-21 17:32:37 +02:00
update.rs Remove dead tests depending on inc (#10179) 2023-08-31 23:11:04 +02:00
upsert.rs Remove dead tests depending on inc (#10179) 2023-08-31 23:11:04 +02:00
use_.rs Add --env and --wrapped flags to def (#10566) 2023-10-02 21:13:31 +03:00
where_.rs remove warnings in nu_command tests (#10145) 2023-08-29 13:18:52 -07:00
which.rs change the output of which to be more explicit (#9646) 2023-07-20 19:10:53 -05:00
while_.rs Change echo to print when not redirected (#10338) 2023-09-13 06:35:01 +12:00
with_env.rs Clean up tests containing unnecessary cwd: tokens (#9692) 2023-07-17 18:43:51 +02:00
wrap.rs Fix: remove unnecessary r#"..."# (#8670) (#9764) 2023-07-21 17:32:37 +02:00
zip.rs Fix: remove unnecessary r#"..."# (#8670) (#9764) 2023-07-21 17:32:37 +02:00