* SubLink.  Act as though the Query returns its first output
                 * column, which indeed is what it does for EXPR_SUBLINK and
                 * 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.
                 */
                Query      *qtree = (Query *) node;
                TargetEntry *tent;
 
+               if (qtree->targetList == NIL)
+                   return false;
                tent = (TargetEntry *) linitial(qtree->targetList);
                Assert(IsA(tent, TargetEntry));
-               Assert(!tent->resjunk);
+               if (tent->resjunk)
+                   return false;
+
                collation = exprCollation((Node *) tent->expr);
                /* collation doesn't change if it's converted to array */
                strength = COLLATE_IMPLICIT;
 
                  One-Time Filter: ("*VALUES*".column1 = "*VALUES*".column1)
 (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)
+
 
 explain (verbose, costs off)
   select x, x from
     (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);