From e16c3e9b412762b85483f3831ee586a5e6631313 Mon Sep 17 00:00:00 2001 From: David Symonds Date: Wed, 9 Dec 2020 20:54:10 +1100 Subject: [PATCH] feat(spanner/spannertest): implement ANY_VALUE aggregation function (#3428) Fixes #3375. --- spanner/spannertest/funcs.go | 13 +++++++++++++ spanner/spansql/keywords.go | 1 + 2 files changed, 14 insertions(+) diff --git a/spanner/spannertest/funcs.go b/spanner/spannertest/funcs.go index 3cfa53211e4..53c12c318f7 100644 --- a/spanner/spannertest/funcs.go +++ b/spanner/spannertest/funcs.go @@ -37,6 +37,19 @@ type aggregateFunc struct { // TODO: more aggregate funcs. var aggregateFuncs = map[string]aggregateFunc{ + "ANY_VALUE": { + // https://cloud.google.com/spanner/docs/aggregate_functions#any_value + Eval: func(values []interface{}, typ spansql.Type) (interface{}, spansql.Type, error) { + // Return the first non-NULL value. + for _, v := range values { + if v != nil { + return v, typ, nil + } + } + // Either all values are NULL, or there are no values. + return nil, typ, nil + }, + }, "ARRAY_AGG": { // https://cloud.google.com/spanner/docs/aggregate_functions#array_agg Eval: func(values []interface{}, typ spansql.Type) (interface{}, spansql.Type, error) { diff --git a/spanner/spansql/keywords.go b/spanner/spansql/keywords.go index 39a0493f1ac..7296b486155 100644 --- a/spanner/spansql/keywords.go +++ b/spanner/spansql/keywords.go @@ -129,6 +129,7 @@ var keywords = map[string]bool{ // https://cloud.google.com/spanner/docs/functions-and-operators var funcs = map[string]bool{ // Aggregate functions. + "ANY_VALUE": true, "ARRAY_AGG": true, "AVG": true, "BIT_XOR": true,