pgsql: Detach constraints when partitions are detached
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(+)
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&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
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),
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