From ffc8319761e1b0e3a1b3d4da65710fe02583531d Mon Sep 17 00:00:00 2001 From: Junichi Furukawa Date: Fri, 2 Oct 2026 10:22:36 -0700 Subject: [PATCH] fix(vm): stop warning once per entity on BETWEEN with an unsupported left-hand type walkTernary logged "between not implemented for type ..." every time it evaluated BETWEEN against a map, slice or string value. Filters are evaluated per entity, so one audience using BETWEEN on a whole map[string]time field flooded lio's metaforarunner logs. The result is unchanged: (nil, false), i.e. no match, the same silent outcome evalBinary already gives a map compared with < or >. Checks run: - go test ./... : all packages pass - new vm cases (map BETWEEN, map NOT BETWEEN, slice BETWEEN) pass before and after; they pin the no-match result, not the log line - go test -v ./vm/ -args -vv : "between not implemented" printed 3 times before the change, 0 after Co-Authored-By: Claude Opus 5.5 --- vm/vm.go | 4 +++- vm/vm_test.go | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/vm/vm.go b/vm/vm.go index 9f3bcb0..b6a3bea 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -942,7 +942,9 @@ func walkTernary(ctx expr.EvalContext, includer expr.Includer, node *expr.TriNod return value.NewBoolValue(false), true default: - u.Warnf("between not implemented for type %s %#v", a.Type().String(), node) + // Unsupported left-hand types (maps, slices, strings) don't match, silently like evalBinary: + // a filter is evaluated per entity, so a warning here fires once per entity. + return nil, false } default: u.Warnf("ternary node walk not implemented for node %#v", node) diff --git a/vm/vm_test.go b/vm/vm_test.go index e0c22ea..09567f8 100644 --- a/vm/vm_test.go +++ b/vm/vm_test.go @@ -137,6 +137,9 @@ var ( vmtall(`10 BETWEEN 20 AND true`, nil, parseOk, evalError), vmt(`created BETWEEN "12/18/2015" AND "12/18/2050"`, true, noError), vmt(`created BETWEEN "now-50w" AND "12/18/2050"`, true, noError), + vmtall(`mt BETWEEN "12/18/2015" AND "12/18/2050"`, nil, parseOk, evalError), + vmtall(`mt NOT BETWEEN "12/18/2015" AND "12/18/2050"`, nil, parseOk, evalError), + vmtall(`urls BETWEEN "a" AND "z"`, nil, parseOk, evalError), // In: Multi Arg Tests vmtall(`10 IN ("a","b",10, 4.5)`, true, parseOk, evalError),