Thread
Commits
-
Fix "ANALYZE t, t" inside a transaction block.
- ceb850d4a30c 11.6 landed
- cabe0f298ea7 13.0 landed
- 6ce0366be2a3 12.0 landed
-
BUG #15946: "duplicate key" error on ANALYZE of table partitions in transaction
The Post Office <noreply@postgresql.org> — 2019-08-10T12:45:26Z
The following bug has been logged on the website: Bug reference: 15946 Logged by: Yaroslav Schekin Email address: ladayaroslav@yandex.ru PostgreSQL version: 11.5 Operating system: Any Description: Running this: ----- BEGIN TRANSACTION; CREATE TABLE sg ( id bigint NOT NULL, sc_fk bigint, geo_id bigint, sl smallint NOT NULL, a date NOT NULL, o boolean NOT NULL ) PARTITION BY RANGE (o, sl, a); CREATE TABLE sg_19_01_d PARTITION OF sg FOR VALUES FROM (false, '5', '2019-01-01') TO (false, '5', '2019-02-01'); CREATE TABLE sg_19_02_d PARTITION OF sg FOR VALUES FROM (false, '5', '2019-02-01') TO (false, '5', '2019-03-01'); CREATE TABLE sc ( id bigint, a date NOT NULL, sl smallint NOT NULL, o boolean NOT NULL ) PARTITION BY RANGE (o, sl, a); CREATE TABLE sc_19_01_d PARTITION OF sc FOR VALUES FROM (false, '5', '2019-01-01') TO (false, '5', '2019-02-01'); CREATE TABLE sc_19_02_d PARTITION OF sc FOR VALUES FROM (false, '5', '2019-02-01') TO (false, '5', '2019-03-01'); INSERT INTO sg_19_01_d(id, sc_fk, geo_id, sl, a, o) SELECT n, n, 0, 5, '2019-01-01', false FROM generate_series(1, 1000) AS g(n); INSERT INTO sg_19_02_d(id, sc_fk, geo_id, sl, a, o) SELECT n, n, 0, 5, '2019-02-01', false FROM generate_series(1, 1000) AS g(n); INSERT INTO sc_19_01_d(id, a, sl, o) SELECT n, '2019-01-01', 5, false FROM generate_series(1, 1000) AS g(n); INSERT INTO sc_19_02_d(id, a, sl, o) SELECT n, '2019-02-01', 5, false FROM generate_series(1, 1000) AS g(n); ANALYZE sg_19_01_d, sc_19_02_d, sc_19_01_d, sc_19_02_d; ----- Throws this error: ERROR: duplicate key value violates unique constraint "pg_statistic_relid_att_inh_index" DETAIL: Key (starelid, staattnum, stainherit)=(61056, 1, f) already exists.
-
Re: BUG #15946: "duplicate key" error on ANALYZE of table partitions in transaction
Tom Lane <tgl@sss.pgh.pa.us> — 2019-08-10T14:23:16Z
PG Bug reporting form <noreply@postgresql.org> writes: > Running this: > ... > Throws this error: > ERROR: duplicate key value violates unique constraint "pg_statistic_relid_att_inh_index" > DETAIL: Key (starelid, staattnum, stainherit)=(61056, 1, f) already exists. Hm, you don't need all the fancy partitioning stuff: regression=# create table t as select generate_series(1,10) x; SELECT 10 regression=# begin; BEGIN regression=# analyze t, t; ERROR: duplicate key value violates unique constraint "pg_statistic_relid_att_inh_index" DETAIL: Key (starelid, staattnum, stainherit)=(35836, 1, f) already exists. It appears to work fine without the BEGIN: regression=# analyze t, t; ANALYZE but then regression=# begin; BEGIN regression=# analyze t, t; ERROR: tuple already updated by self I think the conclusion is that if we aren't using per-table transactions we'd better do a CommandCounterIncrement between tables in vacuum()'s loop. regards, tom lane
-
Re: BUG #15946: "duplicate key" error on ANALYZE of table partitions in transaction
naveen mahadevuni <nmahadevuni@gmail.com> — 2019-08-13T17:35:39Z
hi Tom, I would like to start contributing to postgres, would like to fix this one if it hasn't already been done. Thanks, Naveen On Sat, Aug 10, 2019 at 7:53 PM Tom Lane <tgl@sss.pgh.pa.us> wrote: > PG Bug reporting form <noreply@postgresql.org> writes: > > Running this: > > ... > > Throws this error: > > ERROR: duplicate key value violates unique constraint > "pg_statistic_relid_att_inh_index" > > DETAIL: Key (starelid, staattnum, stainherit)=(61056, 1, f) already > exists. > > Hm, you don't need all the fancy partitioning stuff: > > regression=# create table t as select generate_series(1,10) x; > SELECT 10 > regression=# begin; > BEGIN > regression=# analyze t, t; > ERROR: duplicate key value violates unique constraint > "pg_statistic_relid_att_inh_index" > DETAIL: Key (starelid, staattnum, stainherit)=(35836, 1, f) already > exists. > > It appears to work fine without the BEGIN: > > regression=# analyze t, t; > ANALYZE > > but then > > regression=# begin; > BEGIN > regression=# analyze t, t; > ERROR: tuple already updated by self > > I think the conclusion is that if we aren't using per-table > transactions we'd better do a CommandCounterIncrement between > tables in vacuum()'s loop. > > regards, tom lane > > >
-
Re: BUG #15946: "duplicate key" error on ANALYZE of table partitions in transaction
Tom Lane <tgl@sss.pgh.pa.us> — 2019-08-13T18:52:18Z
naveen mahadevuni <nmahadevuni@gmail.com> writes: > I would like to start contributing to postgres, would like to fix this one > if it hasn't already been done. Already done - https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cabe0f298ea7efade11d8171c617e668934d0d09 regards, tom lane