From bc54739291d33095ef867b35be1ddf84e6a32c12 Mon Sep 17 00:00:00 2001 From: shihao zhong Date: Mon, 5 Oct 2026 11:41:30 -0400 Subject: [PATCH v1 2/2] Add test for eager aggregation with a bpchar column Rows whose bpchar value differs only in trailing spaces must not be grouped together below a join that can tell them apart. Discussion: https://postgr.es/m/19749-d46adf7c7d910b07@postgresql.org --- src/test/regress/expected/eager_aggregate.out | 36 +++++++++++++++++++ src/test/regress/sql/eager_aggregate.sql | 21 +++++++++++ 2 files changed, 57 insertions(+) diff --git a/src/test/regress/expected/eager_aggregate.out b/src/test/regress/expected/eager_aggregate.out index b420a125e1c..12f553a9e62 100644 --- a/src/test/regress/expected/eager_aggregate.out +++ b/src/test/regress/expected/eager_aggregate.out @@ -600,6 +600,42 @@ GROUP BY s1.a; DROP TABLE eager_agg_s1; DROP TABLE eager_agg_s2; +-- Ensure eager aggregation is not applied to a bpchar key. bpchar equality +-- ignores trailing spaces, but LIKE does not. +CREATE TABLE eager_agg_bpchar (c bpchar); +INSERT INTO eager_agg_bpchar + SELECT CASE WHEN i % 2 = 0 THEN 'a' ELSE 'a ' END + FROM generate_series(1, 1000) i; +ANALYZE eager_agg_bpchar; +EXPLAIN (COSTS OFF) +SELECT v.k, count(*) + FROM (VALUES (1, 'a'), (2, 'a ')) v (k, pat) + JOIN eager_agg_bpchar t ON t.c LIKE v.pat +GROUP BY v.k ORDER BY v.k; + QUERY PLAN +-------------------------------------------------------- + GroupAggregate + Group Key: "*VALUES*".column1 + -> Sort + Sort Key: "*VALUES*".column1 + -> Nested Loop + Join Filter: (t.c ~~ "*VALUES*".column2) + -> Seq Scan on eager_agg_bpchar t + -> Materialize + -> Values Scan on "*VALUES*" +(9 rows) + +SELECT v.k, count(*) + FROM (VALUES (1, 'a'), (2, 'a ')) v (k, pat) + JOIN eager_agg_bpchar t ON t.c LIKE v.pat +GROUP BY v.k ORDER BY v.k; + k | count +---+------- + 1 | 500 + 2 | 500 +(2 rows) + +DROP TABLE eager_agg_bpchar; DROP TABLE eager_agg_t1; DROP TABLE eager_agg_t2; DROP TABLE eager_agg_t3; diff --git a/src/test/regress/sql/eager_aggregate.sql b/src/test/regress/sql/eager_aggregate.sql index 7e3623aa6fd..b34a17233b9 100644 --- a/src/test/regress/sql/eager_aggregate.sql +++ b/src/test/regress/sql/eager_aggregate.sql @@ -226,6 +226,27 @@ GROUP BY s1.a; DROP TABLE eager_agg_s1; DROP TABLE eager_agg_s2; +-- Ensure eager aggregation is not applied to a bpchar key. bpchar equality +-- ignores trailing spaces, but LIKE does not. +CREATE TABLE eager_agg_bpchar (c bpchar); +INSERT INTO eager_agg_bpchar + SELECT CASE WHEN i % 2 = 0 THEN 'a' ELSE 'a ' END + FROM generate_series(1, 1000) i; +ANALYZE eager_agg_bpchar; + +EXPLAIN (COSTS OFF) +SELECT v.k, count(*) + FROM (VALUES (1, 'a'), (2, 'a ')) v (k, pat) + JOIN eager_agg_bpchar t ON t.c LIKE v.pat +GROUP BY v.k ORDER BY v.k; + +SELECT v.k, count(*) + FROM (VALUES (1, 'a'), (2, 'a ')) v (k, pat) + JOIN eager_agg_bpchar t ON t.c LIKE v.pat +GROUP BY v.k ORDER BY v.k; + +DROP TABLE eager_agg_bpchar; + DROP TABLE eager_agg_t1; DROP TABLE eager_agg_t2; DROP TABLE eager_agg_t3; -- 2.37.1 (Apple Git-137.1)