| From: | Kirill Reshke <reshkekirill(at)gmail(dot)com> |
|---|---|
| To: | Chao Li <li(dot)evan(dot)chao(at)gmail(dot)com> |
| Cc: | PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org>, Dmitry Koval <d(dot)koval(at)postgrespro(dot)ru>, Alexander Korotkov <aekorotkov(at)gmail(dot)com> |
| Subject: | Re: Fix SPLIT PARTITION bound-overlap bug and other improvements |
| Date: | 2026-05-13 05:07:56 |
| Message-ID: | CALdSSPhquxjxisujDcfLqfoY2=SnUAHhsqgM9PvO0uO3uZC9jQ@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
On Wed, 13 May 2026 at 09:39, Chao Li <li(dot)evan(dot)chao(at)gmail(dot)com> wrote:
>
> Hi,
>
> While testing ALTER TABLE ... SPLIT PARTITION, I found a bug and a few behaviors and messages that seem worth improving.
>
> 0. A bound-overlap bug
>
> I numbered this item as 0 because I found it after finishing items 1, 2, and 3. While doing a final verification before sending this email, I was surprised to find that the partitioned table ended up with two overlapping partitions.
>
> Here is a simple repro:
> ```
> evantest=# drop table t;
> DROP TABLE
> evantest=# CREATE TABLE t (i int) PARTITION BY RANGE(i);
> CREATE TABLE
> evantest=# CREATE TABLE p0a PARTITION OF t FOR VALUES FROM (0) TO (51);
> CREATE TABLE
> evantest=# CREATE TABLE p0b PARTITION OF t FOR VALUES FROM (51) TO (100);
> CREATE TABLE
> evantest=# \d+ t;
> Partitioned table "public.t"
> Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description
> --------+---------+-----------+----------+---------+---------+-------------+--------------+-------------
> i | integer | | | | plain | | |
> Partition key: RANGE (i)
> Partitions:
> p0a FOR VALUES FROM (0) TO (51)
> p0b FOR VALUES FROM (51) TO (100)
>
> evantest=# ALTER TABLE t SPLIT PARTITION p0a INTO
> evantest-# (PARTITION p0a FOR VALUES FROM (0) TO (53),
> evantest(# PARTITION pdef DEFAULT);
> ALTER TABLE
> evantest=#
> evantest=#
> evantest=# \d+ t;
> Partitioned table "public.t"
> Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description
> --------+---------+-----------+----------+---------+---------+-------------+--------------+-------------
> i | integer | | | | plain | | |
> Partition key: RANGE (i)
> Partitions:
> p0a FOR VALUES FROM (0) TO (53)
> p0b FOR VALUES FROM (51) TO (100)
> pdef DEFAULT
> ```
>
> As shown above, p0a and p0b now overlap. I think this is a real bug.
that's 100% real issue because of planner partition pruning
```
reshke=# CREATE TABLE t (i int) PARTITION BY RANGE(i);
CREATE TABLE
reshke=# CREATE TABLE p0a PARTITION OF t FOR VALUES FROM (0) TO (51);
CREATE TABLE
reshke=# insert into t values (50);
INSERT 0 1
reshke=# CREATE TABLE p0b PARTITION OF t FOR VALUES FROM (51) TO (100);
CREATE TABLE
reshke=# insert into t values (51);
INSERT 0 1
reshke=# insert into t values (51);
INSERT 0 1
reshke=# insert into t values (51);
INSERT 0 1
reshke=# ALTER TABLE t SPLIT PARTITION p0a INTO(PARTITION p0a FOR
VALUES FROM (0) TO (53),PARTITION pdef DEFAULT);
ALTER TABLE
reshke=# table t;
i
----
50
51
51
51
(4 rows)
reshke=# select * from t where i = 51;
i
---
(0 rows)
reshke=# set enable_partition_pruning to off;
SET
reshke=# select * from t where i = 51;
i
----
51
51
51
(3 rows)
reshke=#
``
--
Best regards,
Kirill Reshke
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Michael Paquier | 2026-05-13 05:14:50 | Re: Remove invalid SS2/SS3 handling from EUC-KR routines |
| Previous Message | Shinya Kato | 2026-05-13 05:04:04 | Re: Call EndCopyFrom() after initial table sync in logical replication |