Fix relcache reference leak.
Reported by Kevin Grittner. Faulty commit identified by Tom Lane. Patch by Amit Langote, reviewed by Michael Paquier. Discussion: http://postgr.es/m/CACjxUsOHbH1=99u8mGxmLHfy5hov4ENEpvM6=3ARjos7wG7rtQ@mail.gmail.com
This commit is contained in:
parent
508dabaf39
commit
d88d06cd07
|
@ -1360,11 +1360,14 @@ acquire_inherited_sample_rows(Relation onerel, int elevel,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* ignore, but release the lock on it. could be a partitioned
|
* ignore, but release the lock on it. don't try to unlock the
|
||||||
* table.
|
* passed-in relation
|
||||||
*/
|
*/
|
||||||
|
Assert(childrel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
|
||||||
if (childrel != onerel)
|
if (childrel != onerel)
|
||||||
heap_close(childrel, AccessShareLock);
|
heap_close(childrel, AccessShareLock);
|
||||||
|
else
|
||||||
|
heap_close(childrel, NoLock);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -420,3 +420,9 @@ SELECT nextval('truncate_a_id1'); -- fail, seq should have been dropped
|
||||||
ERROR: relation "truncate_a_id1" does not exist
|
ERROR: relation "truncate_a_id1" does not exist
|
||||||
LINE 1: SELECT nextval('truncate_a_id1');
|
LINE 1: SELECT nextval('truncate_a_id1');
|
||||||
^
|
^
|
||||||
|
-- partitioned table
|
||||||
|
CREATE TABLE truncparted (a int, b char) PARTITION BY LIST (a);
|
||||||
|
CREATE TABLE truncparted1 PARTITION OF truncparted FOR VALUES IN (1);
|
||||||
|
INSERT INTO truncparted VALUES (1, 'a');
|
||||||
|
TRUNCATE truncparted;
|
||||||
|
DROP TABLE truncparted;
|
||||||
|
|
|
@ -82,3 +82,12 @@ VACUUM FULL vactst;
|
||||||
VACUUM (DISABLE_PAGE_SKIPPING) vaccluster;
|
VACUUM (DISABLE_PAGE_SKIPPING) vaccluster;
|
||||||
DROP TABLE vaccluster;
|
DROP TABLE vaccluster;
|
||||||
DROP TABLE vactst;
|
DROP TABLE vactst;
|
||||||
|
-- partitioned table
|
||||||
|
CREATE TABLE vacparted (a int, b char) PARTITION BY LIST (a);
|
||||||
|
CREATE TABLE vacparted1 PARTITION OF vacparted FOR VALUES IN (1);
|
||||||
|
INSERT INTO vacparted VALUES (1, 'a');
|
||||||
|
UPDATE vacparted SET b = 'b';
|
||||||
|
VACUUM (ANALYZE) vacparted;
|
||||||
|
VACUUM (FULL) vacparted;
|
||||||
|
VACUUM (FREEZE) vacparted;
|
||||||
|
DROP TABLE vacparted;
|
||||||
|
|
|
@ -215,3 +215,10 @@ SELECT * FROM truncate_a;
|
||||||
DROP TABLE truncate_a;
|
DROP TABLE truncate_a;
|
||||||
|
|
||||||
SELECT nextval('truncate_a_id1'); -- fail, seq should have been dropped
|
SELECT nextval('truncate_a_id1'); -- fail, seq should have been dropped
|
||||||
|
|
||||||
|
-- partitioned table
|
||||||
|
CREATE TABLE truncparted (a int, b char) PARTITION BY LIST (a);
|
||||||
|
CREATE TABLE truncparted1 PARTITION OF truncparted FOR VALUES IN (1);
|
||||||
|
INSERT INTO truncparted VALUES (1, 'a');
|
||||||
|
TRUNCATE truncparted;
|
||||||
|
DROP TABLE truncparted;
|
||||||
|
|
|
@ -64,3 +64,13 @@ VACUUM (DISABLE_PAGE_SKIPPING) vaccluster;
|
||||||
|
|
||||||
DROP TABLE vaccluster;
|
DROP TABLE vaccluster;
|
||||||
DROP TABLE vactst;
|
DROP TABLE vactst;
|
||||||
|
|
||||||
|
-- partitioned table
|
||||||
|
CREATE TABLE vacparted (a int, b char) PARTITION BY LIST (a);
|
||||||
|
CREATE TABLE vacparted1 PARTITION OF vacparted FOR VALUES IN (1);
|
||||||
|
INSERT INTO vacparted VALUES (1, 'a');
|
||||||
|
UPDATE vacparted SET b = 'b';
|
||||||
|
VACUUM (ANALYZE) vacparted;
|
||||||
|
VACUUM (FULL) vacparted;
|
||||||
|
VACUUM (FREEZE) vacparted;
|
||||||
|
DROP TABLE vacparted;
|
||||||
|
|
Loading…
Reference in New Issue