postgres.git / summary / log / commit / refs
commit be73e7008558cef1f59b0f4a61cefb6ec53c45c5
Author: Alvaro Herrera <alvherre@alvh.no-ip.org>
Date: Mon Aug 19 20:09:10 2024 +0000
First released in: 18.0, 14.14, 15.9, 16.5, 17.0
Avoid failure to open dropped detached partition
When a partition is detached and immediately dropped, a prepared
statement could try to compute a new partition descriptor that includes
it. This leads to this kind of error:
ERROR: could not open relation with OID 457639
Avoid this by skipping the partition in expand_partitioned_rtentry if it
doesn't exist.
Noted by me while investigating bug #18559. Kuntal Gosh helped to
identify the exact failure.
Backpatch to 14, where DETACH CONCURRENTLY was introduced.
Author: Álvaro Herrera <alvherre@alvh.no-ip.org>
Reviewed-by: Kuntal Ghosh <kuntalghosh.2007@gmail.com>
Reviewed-by: Junwang Zhao <zhjwpku@gmail.com>
Discussion: https://postgr.es/m/202408122233.bo4adt3vh5bi@alvherre.pgsql
src/backend/optimizer/util/inherit.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/src/backend/optimizer/util/inherit.c b/src/backend/optimizer/util/inherit.c
index 3c11f5db5ad..d69b12855c6 100644
--- a/src/backend/optimizer/util/inherit.c
+++ b/src/backend/optimizer/util/inherit.c
@@ -378,8 +378,17 @@ expand_partitioned_rtentry(PlannerInfo *root, RelOptInfo *relinfo,
Index childRTindex;
RelOptInfo *childrelinfo;
- /* Open rel, acquiring required locks */
- childrel = table_open(childOID, lockmode);
+ /*
+ * Open rel, acquiring required locks. If a partition was recently
+ * detached and subsequently dropped, then opening it will fail. In
+ * this case, behave as though the partition had been pruned.
+ */
+ childrel = try_table_open(childOID, lockmode);
+ if (childrel == NULL)
+ {
+ relinfo->live_parts = bms_del_member(relinfo->live_parts, i);
+ continue;
+ }
/*
* Temporary partitions belonging to other sessions should have been
[parent: e498d22e2135]