diff --git a/internal/function_aggregate.go b/internal/function_aggregate.go index 3b8a026..37f03d3 100644 --- a/internal/function_aggregate.go +++ b/internal/function_aggregate.go @@ -322,6 +322,9 @@ type LOGICAL_AND struct { } func (f *LOGICAL_AND) Step(cond Value, opt *AggregatorOption) error { + if cond == nil { + return nil + } b, err := cond.ToBool() if err != nil { return err @@ -341,6 +344,9 @@ type LOGICAL_OR struct { } func (f *LOGICAL_OR) Step(cond Value, opt *AggregatorOption) error { + if cond == nil { + return nil + } b, err := cond.ToBool() if err != nil { return err diff --git a/query_test.go b/query_test.go index b6c85e4..77d0500 100644 --- a/query_test.go +++ b/query_test.go @@ -815,11 +815,23 @@ SELECT ARRAY_CONCAT_AGG(x) AS array_concat_agg FROM ( query: `SELECT LOGICAL_AND(x) AS logical_and FROM UNNEST([true, false, true]) AS x`, expectedRows: [][]interface{}{{false}}, }, + { + name: "logical_and null", + query: ` WITH toks AS (SELECT FALSE AS x UNION ALL SELECT FALSE UNION ALL SELECT NULL) +SELECT LOGICAL_AND(x) AS logical_or FROM toks`, + expectedRows: [][]interface{}{{false}}, + }, { name: "logical_or", query: `SELECT LOGICAL_OR(x) AS logical_or FROM UNNEST([true, false, true]) AS x`, expectedRows: [][]interface{}{{true}}, }, + { + name: "logical_or null", + query: ` WITH toks AS (SELECT FALSE AS x UNION ALL SELECT FALSE UNION ALL SELECT NULL) +SELECT LOGICAL_OR(x) AS logical_or FROM toks`, + expectedRows: [][]interface{}{{false}}, + }, { name: "max from int group", query: `SELECT MAX(x) AS max FROM UNNEST([8, 37, 4, 55]) AS x`,