From 6567c6fd4f5909781d279ea6d6552cd5fa4b20ce Mon Sep 17 00:00:00 2001 From: Noah Treuhaft Date: Tue, 14 Jul 2026 17:58:36 -0400 Subject: [PATCH] sio/csupio, sio/parquetio: fix non-Boolean metadata filter result handling csupio.VectorReader.ConcurrentPull can skip objects incorrectly because csupio.pruneObject can produce a false positive when the metadata filter evaluates to a non-Boolean value, like null or an error. Fix this by checking explicitly for super.False instead of calling super.Value.AsBool. parquet.VectorReader.ConcurrentPull has a similar problem and fix. --- sio/csupio/vectorreader.go | 2 +- sio/csupio/ztests/metadata.yaml | 12 ++++++++++++ sio/parquetio/vectorreader.go | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 sio/csupio/ztests/metadata.yaml diff --git a/sio/csupio/vectorreader.go b/sio/csupio/vectorreader.go index f50ca03d4..6384d3ea4 100644 --- a/sio/csupio/vectorreader.go +++ b/sio/csupio/vectorreader.go @@ -142,7 +142,7 @@ func (v *VectorReader) ConcurrentPull(done bool, n int) (vector.Any, error) { func pruneObject(sctx *super.Context, mf *metafilter, o *csup.Object) bool { vals := o.ProjectMetadata(sctx, mf.projection) for _, val := range vals { - if mf.filter.Eval(val).Ptr().AsBool() { + if !mf.filter.Eval(val).Equal(super.False) { return false } } diff --git a/sio/csupio/ztests/metadata.yaml b/sio/csupio/ztests/metadata.yaml new file mode 100644 index 000000000..4a7b7fd75 --- /dev/null +++ b/sio/csupio/ztests/metadata.yaml @@ -0,0 +1,12 @@ +script: | + super -f csup -o t.csup - + super -s -c 'from t.csup | where x.y==1' + +inputs: + - name: stdin + data: &stdin | + {x?:{y:1}} + +outputs: + - name: stdout + data: *stdin diff --git a/sio/parquetio/vectorreader.go b/sio/parquetio/vectorreader.go index 994a51ed7..641586c0a 100644 --- a/sio/parquetio/vectorreader.go +++ b/sio/parquetio/vectorreader.go @@ -145,7 +145,7 @@ func (p *VectorReader) ConcurrentPull(done bool, id int) (vector.Any, error) { if len(p.metadataFilters) > 0 { rgMetadata := pr.MetaData().RowGroup(rowGroup) val := buildMetadataValue(p.sctx, rgMetadata, p.metadataColIndexes, p.colIndexToField) - if !p.metadataFilters[id].Eval(val).Ptr().AsBool() { + if p.metadataFilters[id].Eval(val).Equal(super.False) { continue } }