From 56add7d1f0f10f92773992e3e5cc902ff397eee8 Mon Sep 17 00:00:00 2001 From: John Kerl Date: Mon, 2 Mar 2026 23:41:32 -0500 Subject: [PATCH] Fix #1784: inconsistent `mapexcept` behavior (#2004) * Fix #1784 * test/cases/dsl-mapsum-mapdiff-mapexcept/0033/ --- pkg/bifs/collections.go | 6 ++++- .../dsl-mapsum-mapdiff-mapexcept/0033/cmd | 1 + .../dsl-mapsum-mapdiff-mapexcept/0033/experr | 0 .../dsl-mapsum-mapdiff-mapexcept/0033/expout | 23 +++++++++++++++++++ .../dsl-mapsum-mapdiff-mapexcept/0033/input | 1 + .../dsl-mapsum-mapdiff-mapexcept/0033/mlr | 4 ++++ 6 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 test/cases/dsl-mapsum-mapdiff-mapexcept/0033/cmd create mode 100644 test/cases/dsl-mapsum-mapdiff-mapexcept/0033/experr create mode 100644 test/cases/dsl-mapsum-mapdiff-mapexcept/0033/expout create mode 100644 test/cases/dsl-mapsum-mapdiff-mapexcept/0033/input create mode 100644 test/cases/dsl-mapsum-mapdiff-mapexcept/0033/mlr diff --git a/pkg/bifs/collections.go b/pkg/bifs/collections.go index 02629fac7..5bdc2e44b 100644 --- a/pkg/bifs/collections.go +++ b/pkg/bifs/collections.go @@ -222,6 +222,8 @@ func BIF_mapselect(mlrvals []*mlrval.Mlrval) *mlrval.Mlrval { for _, element := range selectArg.AcquireArrayValue() { if element.IsString() { newKeys[element.AcquireStringValue()] = true + } else if element.IsInt() { + newKeys[element.String()] = true } else { return mlrval.FromNotStringError("mapselect", element) } @@ -260,8 +262,10 @@ func BIF_mapexcept(mlrvals []*mlrval.Mlrval) *mlrval.Mlrval { for _, element := range exceptArg.AcquireArrayValue() { if element.IsString() { newMap.Remove(element.AcquireStringValue()) + } else if element.IsInt() { + newMap.Remove(element.String()) } else { - return mlrval.FromNotStringError("mapselect", element) + return mlrval.FromNotStringError("mapexcept", element) } } } else { diff --git a/test/cases/dsl-mapsum-mapdiff-mapexcept/0033/cmd b/test/cases/dsl-mapsum-mapdiff-mapexcept/0033/cmd new file mode 100644 index 000000000..73d8fedad --- /dev/null +++ b/test/cases/dsl-mapsum-mapdiff-mapexcept/0033/cmd @@ -0,0 +1 @@ +mlr --from ${CASEDIR}/input --ojson put -f ${CASEDIR}/mlr diff --git a/test/cases/dsl-mapsum-mapdiff-mapexcept/0033/experr b/test/cases/dsl-mapsum-mapdiff-mapexcept/0033/experr new file mode 100644 index 000000000..e69de29bb diff --git a/test/cases/dsl-mapsum-mapdiff-mapexcept/0033/expout b/test/cases/dsl-mapsum-mapdiff-mapexcept/0033/expout new file mode 100644 index 000000000..0b6f9808a --- /dev/null +++ b/test/cases/dsl-mapsum-mapdiff-mapexcept/0033/expout @@ -0,0 +1,23 @@ +[ +{ + "x": "a.b.c.d.e.f", + "y": { + "1": "a", + "2": "b", + "3": "c", + "4": "d", + "5": "e", + "6": "f" + }, + "z1": { + "2": "b", + "4": "d", + "6": "f" + }, + "z2": { + "2": "b", + "4": "d", + "6": "f" + } +} +] diff --git a/test/cases/dsl-mapsum-mapdiff-mapexcept/0033/input b/test/cases/dsl-mapsum-mapdiff-mapexcept/0033/input new file mode 100644 index 000000000..1908be9db --- /dev/null +++ b/test/cases/dsl-mapsum-mapdiff-mapexcept/0033/input @@ -0,0 +1 @@ +x=a.b.c.d.e.f diff --git a/test/cases/dsl-mapsum-mapdiff-mapexcept/0033/mlr b/test/cases/dsl-mapsum-mapdiff-mapexcept/0033/mlr new file mode 100644 index 000000000..0ac083bcc --- /dev/null +++ b/test/cases/dsl-mapsum-mapdiff-mapexcept/0033/mlr @@ -0,0 +1,4 @@ +# Issue #1784: mapexcept with array of ints should work like mapexcept with individual ints +$y = splitnv($x, "."); +$z1 = mapexcept($y, 1, 3, 5); +$z2 = mapexcept($y, [1, 3, 5]);