mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Fix crash in assign_collations_walker for EXISTS with empty SELECT list.
We (I think I, actually) forgot about this corner case while coding collation resolution. Per bug #8648 from Arjen Nienhuis.
This commit is contained in:
		@@ -484,16 +484,22 @@ assign_collations_walker(Node *node, assign_collations_context *context)
 | 
				
			|||||||
				 * SubLink.  Act as though the Query returns its first output
 | 
									 * SubLink.  Act as though the Query returns its first output
 | 
				
			||||||
				 * column, which indeed is what it does for EXPR_SUBLINK and
 | 
									 * column, which indeed is what it does for EXPR_SUBLINK and
 | 
				
			||||||
				 * ARRAY_SUBLINK cases.  In the cases where the SubLink
 | 
									 * ARRAY_SUBLINK cases.  In the cases where the SubLink
 | 
				
			||||||
				 * returns boolean, this info will be ignored.
 | 
									 * returns boolean, this info will be ignored.	Special case:
 | 
				
			||||||
 | 
									 * in EXISTS, the Query might return no columns, in which case
 | 
				
			||||||
 | 
									 * we need do nothing.
 | 
				
			||||||
				 *
 | 
									 *
 | 
				
			||||||
				 * We needn't recurse, since the Query is already processed.
 | 
									 * We needn't recurse, since the Query is already processed.
 | 
				
			||||||
				 */
 | 
									 */
 | 
				
			||||||
				Query	   *qtree = (Query *) node;
 | 
									Query	   *qtree = (Query *) node;
 | 
				
			||||||
				TargetEntry *tent;
 | 
									TargetEntry *tent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (qtree->targetList == NIL)
 | 
				
			||||||
 | 
										return false;
 | 
				
			||||||
				tent = (TargetEntry *) linitial(qtree->targetList);
 | 
									tent = (TargetEntry *) linitial(qtree->targetList);
 | 
				
			||||||
				Assert(IsA(tent, TargetEntry));
 | 
									Assert(IsA(tent, TargetEntry));
 | 
				
			||||||
				Assert(!tent->resjunk);
 | 
									if (tent->resjunk)
 | 
				
			||||||
 | 
										return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				collation = exprCollation((Node *) tent->expr);
 | 
									collation = exprCollation((Node *) tent->expr);
 | 
				
			||||||
				/* collation doesn't change if it's converted to array */
 | 
									/* collation doesn't change if it's converted to array */
 | 
				
			||||||
				strength = COLLATE_IMPLICIT;
 | 
									strength = COLLATE_IMPLICIT;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -700,3 +700,13 @@ explain (verbose, costs off)
 | 
				
			|||||||
                 One-Time Filter: ("*VALUES*".column1 = "*VALUES*".column1)
 | 
					                 One-Time Filter: ("*VALUES*".column1 = "*VALUES*".column1)
 | 
				
			||||||
(8 rows)
 | 
					(8 rows)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- Check we behave sanely in corner case of empty SELECT list (bug #8648)
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					create temp table nocolumns();
 | 
				
			||||||
 | 
					select exists(select * from nocolumns);
 | 
				
			||||||
 | 
					 exists 
 | 
				
			||||||
 | 
					--------
 | 
				
			||||||
 | 
					 f
 | 
				
			||||||
 | 
					(1 row)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -405,3 +405,9 @@ explain (verbose, costs off)
 | 
				
			|||||||
explain (verbose, costs off)
 | 
					explain (verbose, costs off)
 | 
				
			||||||
  select x, x from
 | 
					  select x, x from
 | 
				
			||||||
    (select (select random() where y=y) as x from (values(1),(2)) v(y)) ss;
 | 
					    (select (select random() where y=y) as x from (values(1),(2)) v(y)) ss;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- Check we behave sanely in corner case of empty SELECT list (bug #8648)
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					create temp table nocolumns();
 | 
				
			||||||
 | 
					select exists(select * from nocolumns);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user