From 38bf102d4d07dac0c9b45e1f01035af747f790ee Mon Sep 17 00:00:00 2001 From: apstndb <803393+apstndb@users.noreply.github.com> Date: Mon, 6 Jul 2026 00:07:03 +0900 Subject: [PATCH 1/2] Remove dead jqresult API surface left over from input-mode split. Compile never used its mode argument, NormalizeForEncode had a no-op branch, and runJqOutput's read-write case was unreachable after eager materialization was forced for DML. Co-authored-by: Cursor --- integration_test.go | 6 +++--- jqresult/compile.go | 4 ++-- jqresult/normalize.go | 19 ------------------- jqresult/pipeline_test.go | 4 ++-- main.go | 5 ++--- yaml_golden_test.go | 2 +- 6 files changed, 10 insertions(+), 30 deletions(-) diff --git a/integration_test.go b/integration_test.go index fbd88a9..190e79b 100644 --- a/integration_test.go +++ b/integration_test.go @@ -75,7 +75,7 @@ func runEagerReadWriteDML(t *testing.T, client *spanner.Client, ctx context.Cont if err != nil { return err } - code, err := jqresult.Compile(filter, jqresult.InputEager) + code, err := jqresult.Compile(filter) if err != nil { return err } @@ -374,7 +374,7 @@ func TestWithCloudSpannerEmulator(t *testing.T) { spanner.Statement{SQL: "SELECT SingerId FROM Singers ORDER BY SingerId LIMIT 3"}, opts, ) - code, err := jqresult.Compile(filter, jqresult.InputLazy) + code, err := jqresult.Compile(filter) if err != nil { t.Fatal(err) } @@ -501,7 +501,7 @@ func TestWithCloudSpannerEmulator(t *testing.T) { if err != nil { return err } - code, err := jqresult.Compile("true", jqresult.InputEager) + code, err := jqresult.Compile("true") if err != nil { return err } diff --git a/jqresult/compile.go b/jqresult/compile.go index 26ec1a4..4ae0130 100644 --- a/jqresult/compile.go +++ b/jqresult/compile.go @@ -4,8 +4,8 @@ import ( "github.com/wader/gojq" ) -// Compile parses filter and returns executable jq code for the given input mode. -func Compile(filter string, mode InputMode) (*gojq.Code, error) { +// Compile parses filter and returns executable jq code. +func Compile(filter string) (*gojq.Code, error) { q, err := gojq.Parse(filter) if err != nil { return nil, err diff --git a/jqresult/normalize.go b/jqresult/normalize.go index 9ce11aa..29cd72a 100644 --- a/jqresult/normalize.go +++ b/jqresult/normalize.go @@ -1,9 +1,6 @@ package jqresult import ( - "encoding/json" - "math/big" - "github.com/wader/gojq" ) @@ -42,9 +39,6 @@ func NormalizeForEncode(v any) (any, error) { } return out, nil default: - if isEncodeLeaf(v) { - return v, nil - } return v, nil } } @@ -64,16 +58,3 @@ func normalizeIter(it gojq.Iter) ([]any, error) { } return out, nil } - -// isEncodeLeaf reports values that cannot contain gojq.Iter and need no further normalization. -func isEncodeLeaf(v any) bool { - switch v.(type) { - case nil, bool, int, int8, int16, int32, int64, - uint, uint8, uint16, uint32, uint64, - float32, float64, string, - json.Number, *big.Int: - return true - default: - return false - } -} diff --git a/jqresult/pipeline_test.go b/jqresult/pipeline_test.go index becb613..08c19bf 100644 --- a/jqresult/pipeline_test.go +++ b/jqresult/pipeline_test.go @@ -7,7 +7,7 @@ import ( func TestExecuteLazyNilRowIter(t *testing.T) { t.Parallel() - code, err := Compile(".", InputLazy) + code, err := Compile(".") if err != nil { t.Fatal(err) } @@ -20,7 +20,7 @@ func TestExecuteLazyNilRowIter(t *testing.T) { func TestExecuteEagerNilResultSet(t *testing.T) { t.Parallel() - code, err := Compile(".", InputEager) + code, err := Compile(".") if err != nil { t.Fatal(err) } diff --git a/main.go b/main.go index 66d352f..41516c0 100644 --- a/main.go +++ b/main.go @@ -380,7 +380,7 @@ func _main() error { jqFilter = jqresult.DefaultFilter(jqMode) } - jqCode, err = jqresult.Compile(jqFilter, jqMode) + jqCode, err = jqresult.Compile(jqFilter) if err != nil { return err } @@ -601,6 +601,7 @@ func runJqOutput( jqCode *gojq.Code, ) error { useEager := jqMode == jqresult.InputEager + // Read-write DML always materializes the full result set before jq runs. if _, ok := mode.(readWrite); ok { useEager = true } @@ -623,8 +624,6 @@ func runJqOutput( } switch mode := mode.(type) { - case readWrite: - panic("read-write jq uses eager materialization") case single: enc, err := newEncoder(os.Stdout, o.Format, o.CompactOutput, o.JqRawOutput) if err != nil { diff --git a/yaml_golden_test.go b/yaml_golden_test.go index de5d886..98417e7 100644 --- a/yaml_golden_test.go +++ b/yaml_golden_test.go @@ -12,7 +12,7 @@ import ( ) func encodeResultSetYAML(filter string, rs *sppb.ResultSet) ([]byte, error) { - code, err := jqresult.Compile(filter, jqresult.InputEager) + code, err := jqresult.Compile(filter) if err != nil { return nil, err } From 614c2570ff42bf1bfa41e6ba55b7557a1dbfe27f Mon Sep 17 00:00:00 2001 From: apstndb <803393+apstndb@users.noreply.github.com> Date: Fri, 10 Jul 2026 04:05:30 +0900 Subject: [PATCH 2/2] Preserve jqresult Compile API compatibility --- context_test.go | 26 -------------------------- integration_test.go | 6 +++--- jqresult/compile.go | 3 ++- jqresult/pipeline_test.go | 4 ++-- main.go | 2 +- yaml_golden_test.go | 2 +- 6 files changed, 9 insertions(+), 34 deletions(-) delete mode 100644 context_test.go diff --git a/context_test.go b/context_test.go deleted file mode 100644 index 65f2bfb..0000000 --- a/context_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package main - -import ( - "context" - "testing" - "time" -) - -func TestWithCancelPreservesParentDeadline(t *testing.T) { - t.Parallel() - - parent, cancel := context.WithTimeout(context.Background(), time.Minute) - defer cancel() - - child, childCancel := context.WithCancel(parent) - defer childCancel() - - got, ok := child.Deadline() - if !ok { - t.Fatal("child deadline missing") - } - want, _ := parent.Deadline() - if !got.Equal(want) { - t.Fatalf("deadline = %v, want %v", got, want) - } -} diff --git a/integration_test.go b/integration_test.go index 190e79b..fbd88a9 100644 --- a/integration_test.go +++ b/integration_test.go @@ -75,7 +75,7 @@ func runEagerReadWriteDML(t *testing.T, client *spanner.Client, ctx context.Cont if err != nil { return err } - code, err := jqresult.Compile(filter) + code, err := jqresult.Compile(filter, jqresult.InputEager) if err != nil { return err } @@ -374,7 +374,7 @@ func TestWithCloudSpannerEmulator(t *testing.T) { spanner.Statement{SQL: "SELECT SingerId FROM Singers ORDER BY SingerId LIMIT 3"}, opts, ) - code, err := jqresult.Compile(filter) + code, err := jqresult.Compile(filter, jqresult.InputLazy) if err != nil { t.Fatal(err) } @@ -501,7 +501,7 @@ func TestWithCloudSpannerEmulator(t *testing.T) { if err != nil { return err } - code, err := jqresult.Compile("true") + code, err := jqresult.Compile("true", jqresult.InputEager) if err != nil { return err } diff --git a/jqresult/compile.go b/jqresult/compile.go index 4ae0130..728e482 100644 --- a/jqresult/compile.go +++ b/jqresult/compile.go @@ -5,7 +5,8 @@ import ( ) // Compile parses filter and returns executable jq code. -func Compile(filter string) (*gojq.Code, error) { +// The mode parameter is retained for source compatibility; compilation is mode-independent. +func Compile(filter string, _ InputMode) (*gojq.Code, error) { q, err := gojq.Parse(filter) if err != nil { return nil, err diff --git a/jqresult/pipeline_test.go b/jqresult/pipeline_test.go index 08c19bf..becb613 100644 --- a/jqresult/pipeline_test.go +++ b/jqresult/pipeline_test.go @@ -7,7 +7,7 @@ import ( func TestExecuteLazyNilRowIter(t *testing.T) { t.Parallel() - code, err := Compile(".") + code, err := Compile(".", InputLazy) if err != nil { t.Fatal(err) } @@ -20,7 +20,7 @@ func TestExecuteLazyNilRowIter(t *testing.T) { func TestExecuteEagerNilResultSet(t *testing.T) { t.Parallel() - code, err := Compile(".") + code, err := Compile(".", InputEager) if err != nil { t.Fatal(err) } diff --git a/main.go b/main.go index 41516c0..cc2209d 100644 --- a/main.go +++ b/main.go @@ -380,7 +380,7 @@ func _main() error { jqFilter = jqresult.DefaultFilter(jqMode) } - jqCode, err = jqresult.Compile(jqFilter) + jqCode, err = jqresult.Compile(jqFilter, jqMode) if err != nil { return err } diff --git a/yaml_golden_test.go b/yaml_golden_test.go index 98417e7..de5d886 100644 --- a/yaml_golden_test.go +++ b/yaml_golden_test.go @@ -12,7 +12,7 @@ import ( ) func encodeResultSetYAML(filter string, rs *sppb.ResultSet) ([]byte, error) { - code, err := jqresult.Compile(filter) + code, err := jqresult.Compile(filter, jqresult.InputEager) if err != nil { return nil, err }