| From: | Zhenwei Shang <a934172442(at)gmail(dot)com> |
|---|---|
| To: | Kirill Reshke <reshkekirill(at)gmail(dot)com> |
| Cc: | Chao Li <li(dot)evan(dot)chao(at)gmail(dot)com>, 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 09:32:09 |
| Message-ID: | CABv9HUmYhtCWWmq1vAqY79bNncDA07ZSVV=Ryg3y0s9usNQWNw@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
Kirill Reshke <reshkekirill(at)gmail(dot)com> 于2026年5月13日周三 13:08写道:
> 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
>
>
> I agree this is a bug. I applied the patch locally and confirmed the bug
is fixed with the patch.
Overall, the patch looks good to me.
Regards,
Zhenwei Shang
| From | Date | Subject | |
|---|---|---|---|
| Next Message | shveta malik | 2026-05-13 09:32:11 | Re: Parallel Apply |
| Previous Message | Chao Li | 2026-05-13 08:35:30 | Re: Fix REPACK with WITHOUT OVERLAPS replica identity indexes |