@@ -294,6 +294,26 @@ SELECT q2 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q1 FROM int8_tbl;
294294 4567890123456789
295295(3 rows)
296296
297+ SELECT q1 FROM int8_tbl EXCEPT SELECT q2 FROM int8_tbl;
298+ q1
299+ ----
300+ (0 rows)
301+
302+ SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q2 FROM int8_tbl;
303+ q1
304+ ------------------
305+ 123
306+ 4567890123456789
307+ (2 rows)
308+
309+ SELECT q1 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q2 FROM int8_tbl;
310+ q1
311+ ------------------
312+ 123
313+ 4567890123456789
314+ 4567890123456789
315+ (3 rows)
316+
297317--
298318-- Mixed types
299319--
@@ -312,3 +332,99 @@ SELECT f1 FROM float8_tbl EXCEPT SELECT f1 FROM int4_tbl;
312332 -1.2345678901234e-200
313333(4 rows)
314334
335+ --
336+ -- Operator precedence and (((((extra))))) parentheses
337+ --
338+ SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl;
339+ q1
340+ -------------------
341+ 123
342+ 4567890123456789
343+ 456
344+ 4567890123456789
345+ 123
346+ 4567890123456789
347+ -4567890123456789
348+ (7 rows)
349+
350+ SELECT q1 FROM int8_tbl INTERSECT (((SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl)));
351+ q1
352+ ------------------
353+ 123
354+ 4567890123456789
355+ (2 rows)
356+
357+ (((SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl))) UNION ALL SELECT q2 FROM int8_tbl;
358+ q1
359+ -------------------
360+ 123
361+ 4567890123456789
362+ 456
363+ 4567890123456789
364+ 123
365+ 4567890123456789
366+ -4567890123456789
367+ (7 rows)
368+
369+ SELECT q1 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl;
370+ q1
371+ -------------------
372+ -4567890123456789
373+ 456
374+ (2 rows)
375+
376+ SELECT q1 FROM int8_tbl UNION ALL (((SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl)));
377+ q1
378+ -------------------
379+ 123
380+ 123
381+ 4567890123456789
382+ 4567890123456789
383+ 4567890123456789
384+ -4567890123456789
385+ 456
386+ (7 rows)
387+
388+ (((SELECT q1 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl))) EXCEPT SELECT q1 FROM int8_tbl;
389+ q1
390+ -------------------
391+ -4567890123456789
392+ 456
393+ (2 rows)
394+
395+ --
396+ -- Subqueries with ORDER BY & LIMIT clauses
397+ --
398+ -- In this syntax, ORDER BY/LIMIT apply to the result of the EXCEPT
399+ SELECT q1,q2 FROM int8_tbl EXCEPT SELECT q2,q1 FROM int8_tbl
400+ ORDER BY q2,q1;
401+ q1 | q2
402+ ------------------+-------------------
403+ 4567890123456789 | -4567890123456789
404+ 123 | 456
405+ (2 rows)
406+
407+ -- This should fail, because q2 isn't a name of an EXCEPT output column
408+ SELECT q1 FROM int8_tbl EXCEPT SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1;
409+ ERROR: Attribute 'q2' not found
410+ -- But this should work:
411+ SELECT q1 FROM int8_tbl EXCEPT (((SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1)));
412+ q1
413+ ------------------
414+ 123
415+ 4567890123456789
416+ (2 rows)
417+
418+ --
419+ -- New syntaxes (7.1) permit new tests
420+ --
421+ (((((select * from int8_tbl)))));
422+ q1 | q2
423+ ------------------+-------------------
424+ 123 | 456
425+ 123 | 4567890123456789
426+ 4567890123456789 | 123
427+ 4567890123456789 | 4567890123456789
428+ 4567890123456789 | -4567890123456789
429+ (5 rows)
430+