mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 00:03:57 -04:00 
			
		
		
		
	Tweak trivial_subqueryscan() to consider a SubqueryScan's targetlist
trivial if it contains either Vars referencing the corresponding subplan columns, or Consts equaling the corresponding subplan columns. This lets the planner eliminate the SubqueryScan in some cases generated by generate_setop_tlist().
This commit is contained in:
		
							parent
							
								
									88b8110443
								
							
						
					
					
						commit
						fcba3b82e2
					
				| @ -9,7 +9,7 @@ | |||||||
|  * |  * | ||||||
|  * |  * | ||||||
|  * IDENTIFICATION |  * IDENTIFICATION | ||||||
|  *	  $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.124 2006/08/12 02:52:05 tgl Exp $ |  *	  $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.125 2006/08/28 14:32:41 tgl Exp $ | ||||||
|  * |  * | ||||||
|  *------------------------------------------------------------------------- |  *------------------------------------------------------------------------- | ||||||
|  */ |  */ | ||||||
| @ -448,16 +448,32 @@ trivial_subqueryscan(SubqueryScan *plan) | |||||||
| 	{ | 	{ | ||||||
| 		TargetEntry *ptle = (TargetEntry *) lfirst(lp); | 		TargetEntry *ptle = (TargetEntry *) lfirst(lp); | ||||||
| 		TargetEntry *ctle = (TargetEntry *) lfirst(lc); | 		TargetEntry *ctle = (TargetEntry *) lfirst(lc); | ||||||
| 		Var		   *var = (Var *) ptle->expr; |  | ||||||
| 
 | 
 | ||||||
| 		if (ptle->resjunk != ctle->resjunk) | 		if (ptle->resjunk != ctle->resjunk) | ||||||
| 			return false;		/* tlist doesn't match junk status */ | 			return false;		/* tlist doesn't match junk status */ | ||||||
| 		if (!var || !IsA(var, Var)) | 
 | ||||||
| 			return false;		/* tlist item not a Var */ | 		/*
 | ||||||
|  | 		 * We accept either a Var referencing the corresponding element of | ||||||
|  | 		 * the subplan tlist, or a Const equaling the subplan element. | ||||||
|  | 		 * See generate_setop_tlist() for motivation. | ||||||
|  | 		 */ | ||||||
|  | 		if (ptle->expr && IsA(ptle->expr, Var)) | ||||||
|  | 		{ | ||||||
|  | 			Var	   *var = (Var *) ptle->expr; | ||||||
|  | 
 | ||||||
| 			Assert(var->varno == plan->scan.scanrelid); | 			Assert(var->varno == plan->scan.scanrelid); | ||||||
| 			Assert(var->varlevelsup == 0); | 			Assert(var->varlevelsup == 0); | ||||||
| 			if (var->varattno != attrno) | 			if (var->varattno != attrno) | ||||||
| 				return false;	/* out of order */ | 				return false;	/* out of order */ | ||||||
|  | 		} | ||||||
|  | 		else if (ptle->expr && IsA(ptle->expr, Const)) | ||||||
|  | 		{ | ||||||
|  | 			if (!equal(ptle->expr, ctle->expr)) | ||||||
|  | 				return false; | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 			return false; | ||||||
|  | 
 | ||||||
| 		attrno++; | 		attrno++; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user