mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-04 00:02:52 -05:00 
			
		
		
		
	Fix PG 17 [NOT] NULL optimization bug for domains
A PG 17 optimization allowed columns with NOT NULL constraints to skip table scans for IS NULL queries, and to skip IS NOT NULL checks for IS NOT NULL queries. This didn't work for domain types, since domain types don't follow the IS NULL/IS NOT NULL constraint logic. To fix, disable this optimization for domains for PG 17+. Reported-by: Jan Behrens Diagnosed-by: Tom Lane Discussion: https://postgr.es/m/Z37p0paENWWUarj-@momjian.us Backpatch-through: 17
This commit is contained in:
		
							parent
							
								
									039549d70f
								
							
						
					
					
						commit
						46b4ba533c
					
				@ -283,7 +283,8 @@ CREATE TABLE us_snail_addy (
 | 
			
		||||
  <para>
 | 
			
		||||
   The syntax <literal>NOT NULL</literal> in this command is a
 | 
			
		||||
   <productname>PostgreSQL</productname> extension.  (A standard-conforming
 | 
			
		||||
   way to write the same would be <literal>CHECK (VALUE IS NOT
 | 
			
		||||
   way to write the same for non-composite data types would be
 | 
			
		||||
   <literal>CHECK (VALUE IS NOT
 | 
			
		||||
   NULL)</literal>.  However, per <xref linkend="sql-createdomain-notes"/>,
 | 
			
		||||
   such constraints are best avoided in practice anyway.)  The
 | 
			
		||||
   <literal>NULL</literal> <quote>constraint</quote> is a
 | 
			
		||||
 | 
			
		||||
@ -3109,6 +3109,13 @@ restriction_is_always_true(PlannerInfo *root,
 | 
			
		||||
		if (nulltest->nulltesttype != IS_NOT_NULL)
 | 
			
		||||
			return false;
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * Empty rows can appear NULL in some contexts and NOT NULL in others,
 | 
			
		||||
		 * so avoid this optimization for row expressions.
 | 
			
		||||
		 */
 | 
			
		||||
		if (nulltest->argisrow)
 | 
			
		||||
			return false;
 | 
			
		||||
 | 
			
		||||
		return expr_is_nonnullable(root, nulltest->arg);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -3167,6 +3174,13 @@ restriction_is_always_false(PlannerInfo *root,
 | 
			
		||||
		if (nulltest->nulltesttype != IS_NULL)
 | 
			
		||||
			return false;
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * Empty rows can appear NULL in some contexts and NOT NULL in others,
 | 
			
		||||
		 * so avoid this optimization for row expressions.
 | 
			
		||||
		 */
 | 
			
		||||
		if (nulltest->argisrow)
 | 
			
		||||
			return false;
 | 
			
		||||
 | 
			
		||||
		return expr_is_nonnullable(root, nulltest->arg);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user