mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	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
This commit is contained in:
		@@ -378,8 +378,17 @@ expand_partitioned_rtentry(PlannerInfo *root, RelOptInfo *relinfo,
 | 
				
			|||||||
		Index		childRTindex;
 | 
							Index		childRTindex;
 | 
				
			||||||
		RelOptInfo *childrelinfo;
 | 
							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
 | 
							 * Temporary partitions belonging to other sessions should have been
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user