Fix relcache reference leak.
authorRobert Haas <rhaas@postgresql.org>
Tue, 7 Mar 2017 16:24:51 +0000 (11:24 -0500)
committerRobert Haas <rhaas@postgresql.org>
Tue, 7 Mar 2017 16:27:21 +0000 (11:27 -0500)
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

src/backend/commands/analyze.c
src/test/regress/expected/truncate.out
src/test/regress/expected/vacuum.out
src/test/regress/sql/truncate.sql
src/test/regress/sql/vacuum.sql

index a70c7603416b288a1868cc106f2af7355b157848..b91df986c54e821e30c56ecf667c9fd05d3704ab 100644 (file)
@@ -1360,11 +1360,14 @@ acquire_inherited_sample_rows(Relation onerel, int elevel,
        else
        {
            /*
-            * ignore, but release the lock on it.  could be a partitioned
-            * table.
+            * ignore, but release the lock on it.  don't try to unlock the
+            * passed-in relation
             */
+           Assert(childrel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
            if (childrel != onerel)
                heap_close(childrel, AccessShareLock);
+           else
+               heap_close(childrel, NoLock);
            continue;
        }
 
index 5c5277e0f1c27b2d0bb8934ef78328dc3dcb5c31..81612d8c88b3bd204befba42ab32cf9f2cc97967 100644 (file)
@@ -420,3 +420,9 @@ SELECT nextval('truncate_a_id1'); -- fail, seq should have been dropped
 ERROR:  relation "truncate_a_id1" does not exist
 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;
index 9b604be4b62e1b472bdc60a31b5c3b19b67f227c..6f686630875bc687a0cc87fd6973d02c4f41b306 100644 (file)
@@ -82,3 +82,12 @@ VACUUM FULL vactst;
 VACUUM (DISABLE_PAGE_SKIPPING) vaccluster;
 DROP TABLE vaccluster;
 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;
index a3d6f5368f42818332ee1b99a50c4a63d3b2e8f9..d61eea1a4247a8a2b0be259131e8cd138d579690 100644 (file)
@@ -215,3 +215,10 @@ SELECT * FROM truncate_a;
 DROP TABLE truncate_a;
 
 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;
index 7b819f654ddf51f0a53fb39de0726bc6bbc50d9f..7c5fb049176bbd12305099e36b96c1a25ed74dd4 100644 (file)
@@ -64,3 +64,13 @@ VACUUM (DISABLE_PAGE_SKIPPING) vaccluster;
 
 DROP TABLE vaccluster;
 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;