diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index 1470edc0aba..827c65cc852 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -4250,9 +4250,9 @@ ExecEvalPreOrderedDistinctSingle(AggState *aggstate, AggStatePerTrans pertrans) if (!pertrans->haslast || pertrans->lastisnull != isnull || - !DatumGetBool(FunctionCall2Coll(&pertrans->equalfnOne, - pertrans->aggCollation, - pertrans->lastdatum, value))) + (!isnull && !DatumGetBool(FunctionCall2Coll(&pertrans->equalfnOne, + pertrans->aggCollation, + pertrans->lastdatum, value)))) { if (pertrans->haslast && !pertrans->inputtypeByVal) pfree(DatumGetPointer(pertrans->lastdatum)); diff --git a/src/test/regress/expected/aggregates.out b/src/test/regress/expected/aggregates.out index 82d09615248..52046c33dc8 100644 --- a/src/test/regress/expected/aggregates.out +++ b/src/test/regress/expected/aggregates.out @@ -1506,6 +1506,14 @@ group by ten; -> Seq Scan on tenk1 (5 rows) +-- Ensure consecutive NULLs are properly treated as distinct from each other +select array_agg(distinct val) +from (select null as val from generate_series(1, 2)); + array_agg +----------- + {NULL} +(1 row) + -- Ensure no ordering is requested when enable_presorted_aggregate is off set enable_presorted_aggregate to off; explain (costs off) diff --git a/src/test/regress/sql/aggregates.sql b/src/test/regress/sql/aggregates.sql index e81a22465b2..e7970983c36 100644 --- a/src/test/regress/sql/aggregates.sql +++ b/src/test/regress/sql/aggregates.sql @@ -567,6 +567,10 @@ select from tenk1 group by ten; +-- Ensure consecutive NULLs are properly treated as distinct from each other +select array_agg(distinct val) +from (select null as val from generate_series(1, 2)); + -- Ensure no ordering is requested when enable_presorted_aggregate is off set enable_presorted_aggregate to off; explain (costs off)