From 6aa3d724d30563b455aa0b7ea1ab2ea2077e4e4c Mon Sep 17 00:00:00 2001 From: Nick Tobey Date: Thu, 15 May 2025 14:58:36 -0700 Subject: [PATCH] Unwrap wrapper values used in JSON aggregation functions, and un-skip accidentally-skipped tests for this behavior. --- enginetest/enginetests.go | 12 +++++++----- sql/expression/function/aggregation/json_agg.go | 11 ++++++++--- .../function/aggregation/unary_agg_buffers.go | 6 +++++- .../function/aggregation/window_functions.go | 12 ++++++++++-- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/enginetest/enginetests.go b/enginetest/enginetests.go index e1a4ff9c6b..f3d22b651c 100644 --- a/enginetest/enginetests.go +++ b/enginetest/enginetests.go @@ -5155,12 +5155,14 @@ func TestNullRanges(t *testing.T, harness Harness) { func TestJsonScripts(t *testing.T, harness Harness, skippedTests []string) { for _, script := range queries.JsonScripts { - for _, skippedTest := range skippedTests { - if strings.Contains(script.Name, skippedTest) { - t.Skip() + t.Run(script.Name, func(t *testing.T) { + for _, skippedTest := range skippedTests { + if strings.Contains(script.Name, skippedTest) { + t.Skip() + } } - } - TestScript(t, harness, script) + TestScript(t, harness, script) + }) } } diff --git a/sql/expression/function/aggregation/json_agg.go b/sql/expression/function/aggregation/json_agg.go index ad8bfe1d6a..6d4e49b8d6 100644 --- a/sql/expression/function/aggregation/json_agg.go +++ b/sql/expression/function/aggregation/json_agg.go @@ -157,7 +157,11 @@ func (j *jsonObjectBuffer) Update(ctx *sql.Context, row sql.Row) error { return err } - // unwrap JSON values + // unwrap wrapper values + val, err = sql.UnwrapAny(ctx, val) + if err != nil { + return err + } if js, ok := val.(sql.JSONWrapper); ok { val, err = js.ToInterface() if err != nil { @@ -166,11 +170,12 @@ func (j *jsonObjectBuffer) Update(ctx *sql.Context, row sql.Row) error { } // Update the map. - keyAsString, _, err := types.LongText.Convert(ctx, key) + convertedKey, _, err := types.LongText.Convert(ctx, key) if err != nil { return nil } - j.vals[keyAsString.(string)] = val + keyAsString, _, err := sql.Unwrap[string](ctx, convertedKey) + j.vals[keyAsString] = val return nil } diff --git a/sql/expression/function/aggregation/unary_agg_buffers.go b/sql/expression/function/aggregation/unary_agg_buffers.go index 6ca26669cc..df2b1c82fb 100644 --- a/sql/expression/function/aggregation/unary_agg_buffers.go +++ b/sql/expression/function/aggregation/unary_agg_buffers.go @@ -646,7 +646,11 @@ func (j *jsonArrayBuffer) Update(ctx *sql.Context, row sql.Row) error { return err } - // unwrap JSON values + // unwrap wrapper values + v, err = sql.UnwrapAny(ctx, v) + if err != nil { + return err + } if js, ok := v.(sql.JSONWrapper); ok { v, err = js.ToInterface() if err != nil { diff --git a/sql/expression/function/aggregation/window_functions.go b/sql/expression/function/aggregation/window_functions.go index 4316d9b899..76a3ff5622 100644 --- a/sql/expression/function/aggregation/window_functions.go +++ b/sql/expression/function/aggregation/window_functions.go @@ -1049,7 +1049,11 @@ func (a *WindowedJSONArrayAgg) aggregateVals(ctx *sql.Context, interval sql.Wind return nil, err } - // unwrap JSON values + // unwrap wrapper values + v, err = sql.UnwrapAny(ctx, v) + if err != nil { + return nil, err + } if js, ok := v.(sql.JSONWrapper); ok { v, err = js.ToInterface() if err != nil { @@ -1136,7 +1140,11 @@ func (a *WindowedJSONObjectAgg) aggregateVals(ctx *sql.Context, interval sql.Win return nil, err } - // unwrap JSON values + // unwrap wrapper values + val, err = sql.UnwrapAny(ctx, val) + if err != nil { + return nil, err + } if js, ok := val.(sql.JSONWrapper); ok { val, err = js.ToInterface() if err != nil {