pgsql: Detach constraints when partitions are detached

Started by Alvaro Herreraalmost 7 years ago4 messages
#1Alvaro Herrera
alvherre@alvh.no-ip.org

Detach constraints when partitions are detached

I (Álvaro) forgot to do this in eb7ed3f30634, leading to undroppable
constraints after partitions are detached. Repair.

Reported-by: Amit Langote
Author: Amit Langote
Discussion: /messages/by-id/c1c9b688-b886-84f7-4048-1e4ebe9b1d06@lab.ntt.co.jp

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/ae366aa57762ad0e6a1a0885a7644e79541afe39

Modified Files
--------------
src/backend/commands/tablecmds.c | 18 ++++++++++++++++++
src/test/regress/expected/indexing.out | 15 +++++++++++++++
src/test/regress/sql/indexing.sql | 14 ++++++++++++++
3 files changed, 47 insertions(+)

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#1)
Re: pgsql: Detach constraints when partitions are detached

Alvaro Herrera <alvherre@alvh.no-ip.org> writes:

Detach constraints when partitions are detached

Hm ... it looks like this fails under -DRELCACHE_FORCE_RELEASE:

https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=prion&amp;dt=2019-01-24%2003%3A58%3A02

Core was generated by `postgres: ec2-user regression [local] ALTER TABLE '.
Program terminated with signal 11, Segmentation fault.
#0 0x00000000005f9413 in ATExecDetachPartition (rel=rel@entry=0x7f20d6fab080, name=<optimized out>) at /home/ec2-user/bf/root/HEAD/pgsql.build/../pgsql/src/backend/commands/tablecmds.c:15116
15116 if (!idx->rd_index->indisprimary && !idx->rd_index->indisunique)
#0 0x00000000005f9413 in ATExecDetachPartition (rel=rel@entry=0x7f20d6fab080, name=<optimized out>) at /home/ec2-user/bf/root/HEAD/pgsql.build/../pgsql/src/backend/commands/tablecmds.c:15116
#1 0x0000000000605a95 in ATExecCmd (wqueue=wqueue@entry=0x7ffe1afaea28, tab=tab@entry=0x1591a10, rel=rel@entry=0x7f20d6fab080, cmd=0x155ee08, lockmode=lockmode@entry=8) at /home/ec2-user/bf/root/HEAD/pgsql.build/../pgsql/src/backend/commands/tablecmds.c:4314
#2 0x0000000000607faf in ATRewriteCatalogs (lockmode=8, wqueue=0x7ffe1afaea28) at /home/ec2-user/bf/root/HEAD/pgsql.build/../pgsql/src/backend/commands/tablecmds.c:4028
#3 ATController (parsetree=parsetree@entry=0x1542fc8, rel=<optimized out>, cmds=<optimized out>, recurse=<optimized out>, lockmode=lockmode@entry=8) at /home/ec2-user/bf/root/HEAD/pgsql.build/../pgsql/src/backend/commands/tablecmds.c:3694
#4 0x00000000006086cf in AlterTable (relid=relid@entry=32016, lockmode=lockmode@entry=8, stmt=stmt@entry=0x1542fc8) at /home/ec2-user/bf/root/HEAD/pgsql.build/../pgsql/src/backend/commands/tablecmds.c:3368
#5 0x0000000000792042 in ProcessUtilitySlow (pstate=pstate@entry=0x152ede8, pstmt=pstmt@entry=0x1470b18, queryString=queryString@entry=0x146fb78 "alter table idxpart detach partition idxpart1;", context=context@entry=PROCESS_UTILITY_TOPLEVEL, params=params@entry=0x0, queryEnv=queryEnv@entry=0x0, completionTag=completionTag@entry=0x7ffe1afaefe0 "", dest=0x1470c10) at /home/ec2-user/bf/root/HEAD/pgsql.build/../pgsql/src/backend/tcop/utility.c:1120
#6 0x00000000007904d6 in standard_ProcessUtility (pstmt=0x1470b18, queryString=0x146fb78 "alter table idxpart detach partition idxpart1;", context=PROCESS_UTILITY_TOPLEVEL, params=0x0, queryEnv=0x0, dest=0x1470c10, completionTag=0x7ffe1afaefe0 "") at /home/ec2-user/bf/root/HEAD/pgsql.build/../pgsql/src/backend/tcop/utility.c:923
#7 0x000000000078dae5 in PortalRunUtility (portal=0x14d5dd8, pstmt=0x1470b18, isTopLevel=<optimized out>, setHoldSnapshot=<optimized out>, dest=<optimized out>, completionTag=0x7ffe1afaefe0 "") at /home/ec2-user/bf/root/HEAD/pgsql.build/../pgsql/src/backend/tcop/pquery.c:1175
#8 0x000000000078e5f9 in PortalRunMulti (portal=portal@entry=0x14d5dd8, isTopLevel=isTopLevel@entry=true, setHoldSnapshot=setHoldSnapshot@entry=false, dest=dest@entry=0x1470c10, altdest=altdest@entry=0x1470c10, completionTag=completionTag@entry=0x7ffe1afaefe0 "") at /home/ec2-user/bf/root/HEAD/pgsql.build/../pgsql/src/backend/tcop/pquery.c:1328
#9 0x000000000078f292 in PortalRun (portal=portal@entry=0x14d5dd8, count=count@entry=9223372036854775807, isTopLevel=isTopLevel@entry=true, run_once=run_once@entry=true, dest=dest@entry=0x1470c10, altdest=altdest@entry=0x1470c10, completionTag=completionTag@entry=0x7ffe1afaefe0 "") at /home/ec2-user/bf/root/HEAD/pgsql.build/../pgsql/src/backend/tcop/pquery.c:796
#10 0x000000000078b02d in exec_simple_query (query_string=0x146fb78 "alter table idxpart detach partition idxpart1;") at /home/ec2-user/bf/root/HEAD/pgsql.build/../pgsql/src/backend/tcop/postgres.c:1215
#11 0x000000000078c362 in PostgresMain (argc=<optimized out>, argv=argv@entry=0x149a548, dbname=0x149a2d8 "regression", username=<optimized out>) at /home/ec2-user/bf/root/HEAD/pgsql.build/../pgsql/src/backend/tcop/postgres.c:4256
#12 0x00000000004805f8 in BackendRun (port=<optimized out>, port=<optimized out>) at /home/ec2-user/bf/root/HEAD/pgsql.build/../pgsql/src/backend/postmaster/postmaster.c:4378
#13 BackendStartup (port=0x1490320) at /home/ec2-user/bf/root/HEAD/pgsql.build/../pgsql/src/backend/postmaster/postmaster.c:4069
#14 ServerLoop () at /home/ec2-user/bf/root/HEAD/pgsql.build/../pgsql/src/backend/postmaster/postmaster.c:1699
#15 0x0000000000713f60 in PostmasterMain (argc=argc@entry=8, argv=argv@entry=0x146b6d0) at /home/ec2-user/bf/root/HEAD/pgsql.build/../pgsql/src/backend/postmaster/postmaster.c:1372
#16 0x0000000000481a63 in main (argc=8, argv=0x146b6d0) at /home/ec2-user/bf/root/HEAD/pgsql.build/../pgsql/src/backend/main/main.c:228

regards, tom lane

#3Amit Langote
Langote_Amit_f8@lab.ntt.co.jp
In reply to: Tom Lane (#2)
1 attachment(s)
Re: pgsql: Detach constraints when partitions are detached

On 2019/01/24 13:58, Tom Lane wrote:

Alvaro Herrera <alvherre@alvh.no-ip.org> writes:

Detach constraints when partitions are detached

Hm ... it looks like this fails under -DRELCACHE_FORCE_RELEASE:

Oops, sorry. This is why:

         index_close(idx, NoLock);
...
+        if (!idx->rd_index->indisprimary && !idx->rd_index->indisunique)
+            continue;

Attached a fix.

Thanks,
Amit

Attachments:

ae366aa577-fixup.patchtext/plain; charset=UTF-8; name=ae366aa577-fixup.patchDownload
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 738c178107..98366a2d5b 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -15095,6 +15095,7 @@ ATExecDetachPartition(Relation rel, RangeVar *name)
 	{
 		Oid			idxid = lfirst_oid(cell);
 		Relation	idx;
+		bool		detachConstraint = false;
 		Oid			constrOid;
 
 		if (!has_superclass(idxid))
@@ -15106,14 +15107,18 @@ ATExecDetachPartition(Relation rel, RangeVar *name)
 		idx = index_open(idxid, AccessExclusiveLock);
 		IndexSetParentIndex(idx, InvalidOid);
 		update_relispartition(classRel, idxid, false);
-		index_close(idx, NoLock);
 
 		/*
 		 * Detach any constraints associated with the index too.  Only UNIQUE
 		 * and PRIMARY KEY index constraints can be inherited, so no need
 		 * to check for others.
 		 */
-		if (!idx->rd_index->indisprimary && !idx->rd_index->indisunique)
+		if (idx->rd_index->indisprimary || idx->rd_index->indisunique)
+			detachConstraint = true;
+
+		index_close(idx, NoLock);
+
+		if (!detachConstraint)
 			continue;
 
 		constrOid = get_relation_idx_constraint_oid(RelationGetRelid(partRel),
#4Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Amit Langote (#3)
Re: pgsql: Detach constraints when partitions are detached

CC'ing -hackers.

On 2019-Jan-24, Amit Langote wrote:

On 2019/01/24 13:58, Tom Lane wrote:

Alvaro Herrera <alvherre@alvh.no-ip.org> writes:

Detach constraints when partitions are detached

Hm ... it looks like this fails under -DRELCACHE_FORCE_RELEASE:

Oops, sorry. This is why:

index_close(idx, NoLock);
...
+        if (!idx->rd_index->indisprimary && !idx->rd_index->indisunique)
+            continue;

Attached a fix.

Mumble. I changed course here and went for simpler coding instead.

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services