Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

[Bug] Wrong results: GROUP BY a constant expression returns one row for empty input

Open
#2,025 1 comment 2 reactions 0 assignees View on GitHub

Maintainers usually reply within 2 days

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
48/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Active
Tech stack
c, postgresql, sql
Domain
databases

Research direction

Start by reproducing the two queries with optimizer = off and inspecting the provided EXPLAIN output, then trace how the PostgreSQL planner handles constant GROUP BY keys and multiphase aggregation. Done means empty input produces zero rows in both cases, without regressing non-empty inputs or the GPORCA path.

Written by the indexing model from the issue text.

Description

type: Bug
Apache Cloudberry version

main branch

What happened

With the Postgres planner (optimizer = off), a query that groups by a constant expression returns one row when the input table is empty. A GROUP BY over zero input rows has zero groups, so the
correct answer is no rows.

GPORCA (optimizer = on) is not affected. Non-empty inputs are not affected — the extra row only appears when the input is empty.

What you think should happen instead

No response

How to reproduce
CREATE TABLE g(c0 boolean) DISTRIBUTED BY (c0);   -- left EMPTY
SET optimizer = off;

SELECT count(*) FROM g GROUP BY 'x'::text;
--  count
-- -------
--      0      <-- WRONG, expected 0 rows

SELECT 1 FROM g GROUP BY (0.25)::MONEY HAVING count(*) = 0;
--  ?column?
-- ----------
--         1   <-- WRONG, expected 0 rows

Expected in both cases: (0 rows).

The plan shows the grouping key disappearing and the final aggregate becoming a plain Aggregate, which always emits one row:

EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM g GROUP BY 'x'::text;

 Finalize Aggregate
   Output: count(*), 'x'::text
   ->  Gather Motion 3:1  (slice1; segments: 3)
         Output: (PARTIAL count(*))
         ->  Partial GroupAggregate
               Output: PARTIAL count(*)
               ->  Seq Scan on public.g

Workarounds

  • SET optimizer = on; (GPORCA), or
  • SET gp_enable_multiphase_agg = off;
Operating System

any

Anything else

No response

Are you willing to submit PR?
  • Yes, I am willing to submit a PR!
Code of Conduct
Dominant language
C
Stars
1.4k
Forks
256
Avg merge
4d 17h
Merged PRs (30d)
40

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from apache/cloudberry

All issues in apache/cloudberry

Similar issues

More C issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.