• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 2001 September 15
2#
3# The author disclaims copyright to this source code.  In place of
4# a legal notice, here is a blessing:
5#
6#    May you do good and not evil.
7#    May you find forgiveness for yourself and forgive others.
8#    May you share freely, never taking more than you give.
9#
10#***********************************************************************
11# This file implements regression tests for SQLite library.  The
12# focus of this file is testing UNION, INTERSECT and EXCEPT operators
13# in SELECT statements.
14#
15# $Id: select4.test,v 1.30 2009/04/16 00:24:24 drh Exp $
16
17set testdir [file dirname $argv0]
18source $testdir/tester.tcl
19
20# Most tests in this file depend on compound-select. But there are a couple
21# right at the end that test DISTINCT, so we cannot omit the entire file.
22#
23ifcapable compound {
24
25# Build some test data
26#
27execsql {
28  CREATE TABLE t1(n int, log int);
29  BEGIN;
30}
31for {set i 1} {$i<32} {incr i} {
32  for {set j 0} {(1<<$j)<$i} {incr j} {}
33  execsql "INSERT INTO t1 VALUES($i,$j)"
34}
35execsql {
36  COMMIT;
37}
38
39do_test select4-1.0 {
40  execsql {SELECT DISTINCT log FROM t1 ORDER BY log}
41} {0 1 2 3 4 5}
42
43# Union All operator
44#
45do_test select4-1.1a {
46  lsort [execsql {SELECT DISTINCT log FROM t1}]
47} {0 1 2 3 4 5}
48do_test select4-1.1b {
49  lsort [execsql {SELECT n FROM t1 WHERE log=3}]
50} {5 6 7 8}
51do_test select4-1.1c {
52  execsql {
53    SELECT DISTINCT log FROM t1
54    UNION ALL
55    SELECT n FROM t1 WHERE log=3
56    ORDER BY log;
57  }
58} {0 1 2 3 4 5 5 6 7 8}
59do_test select4-1.1d {
60  execsql {
61    CREATE TABLE t2 AS
62      SELECT DISTINCT log FROM t1
63      UNION ALL
64      SELECT n FROM t1 WHERE log=3
65      ORDER BY log;
66    SELECT * FROM t2;
67  }
68} {0 1 2 3 4 5 5 6 7 8}
69execsql {DROP TABLE t2}
70do_test select4-1.1e {
71  execsql {
72    CREATE TABLE t2 AS
73      SELECT DISTINCT log FROM t1
74      UNION ALL
75      SELECT n FROM t1 WHERE log=3
76      ORDER BY log DESC;
77    SELECT * FROM t2;
78  }
79} {8 7 6 5 5 4 3 2 1 0}
80execsql {DROP TABLE t2}
81do_test select4-1.1f {
82  execsql {
83    SELECT DISTINCT log FROM t1
84    UNION ALL
85    SELECT n FROM t1 WHERE log=2
86  }
87} {0 1 2 3 4 5 3 4}
88do_test select4-1.1g {
89  execsql {
90    CREATE TABLE t2 AS
91      SELECT DISTINCT log FROM t1
92      UNION ALL
93      SELECT n FROM t1 WHERE log=2;
94    SELECT * FROM t2;
95  }
96} {0 1 2 3 4 5 3 4}
97execsql {DROP TABLE t2}
98ifcapable subquery {
99  do_test select4-1.2 {
100    execsql {
101      SELECT log FROM t1 WHERE n IN
102        (SELECT DISTINCT log FROM t1 UNION ALL
103         SELECT n FROM t1 WHERE log=3)
104      ORDER BY log;
105    }
106  } {0 1 2 2 3 3 3 3}
107}
108do_test select4-1.3 {
109  set v [catch {execsql {
110    SELECT DISTINCT log FROM t1 ORDER BY log
111    UNION ALL
112    SELECT n FROM t1 WHERE log=3
113    ORDER BY log;
114  }} msg]
115  lappend v $msg
116} {1 {ORDER BY clause should come after UNION ALL not before}}
117
118# Union operator
119#
120do_test select4-2.1 {
121  execsql {
122    SELECT DISTINCT log FROM t1
123    UNION
124    SELECT n FROM t1 WHERE log=3
125    ORDER BY log;
126  }
127} {0 1 2 3 4 5 6 7 8}
128ifcapable subquery {
129  do_test select4-2.2 {
130    execsql {
131      SELECT log FROM t1 WHERE n IN
132        (SELECT DISTINCT log FROM t1 UNION
133         SELECT n FROM t1 WHERE log=3)
134      ORDER BY log;
135    }
136  } {0 1 2 2 3 3 3 3}
137}
138do_test select4-2.3 {
139  set v [catch {execsql {
140    SELECT DISTINCT log FROM t1 ORDER BY log
141    UNION
142    SELECT n FROM t1 WHERE log=3
143    ORDER BY log;
144  }} msg]
145  lappend v $msg
146} {1 {ORDER BY clause should come after UNION not before}}
147
148# Except operator
149#
150do_test select4-3.1.1 {
151  execsql {
152    SELECT DISTINCT log FROM t1
153    EXCEPT
154    SELECT n FROM t1 WHERE log=3
155    ORDER BY log;
156  }
157} {0 1 2 3 4}
158do_test select4-3.1.2 {
159  execsql {
160    CREATE TABLE t2 AS
161      SELECT DISTINCT log FROM t1
162      EXCEPT
163      SELECT n FROM t1 WHERE log=3
164      ORDER BY log;
165    SELECT * FROM t2;
166  }
167} {0 1 2 3 4}
168execsql {DROP TABLE t2}
169do_test select4-3.1.3 {
170  execsql {
171    CREATE TABLE t2 AS
172      SELECT DISTINCT log FROM t1
173      EXCEPT
174      SELECT n FROM t1 WHERE log=3
175      ORDER BY log DESC;
176    SELECT * FROM t2;
177  }
178} {4 3 2 1 0}
179execsql {DROP TABLE t2}
180ifcapable subquery {
181  do_test select4-3.2 {
182    execsql {
183      SELECT log FROM t1 WHERE n IN
184        (SELECT DISTINCT log FROM t1 EXCEPT
185         SELECT n FROM t1 WHERE log=3)
186      ORDER BY log;
187    }
188  } {0 1 2 2}
189}
190do_test select4-3.3 {
191  set v [catch {execsql {
192    SELECT DISTINCT log FROM t1 ORDER BY log
193    EXCEPT
194    SELECT n FROM t1 WHERE log=3
195    ORDER BY log;
196  }} msg]
197  lappend v $msg
198} {1 {ORDER BY clause should come after EXCEPT not before}}
199
200# Intersect operator
201#
202do_test select4-4.1.1 {
203  execsql {
204    SELECT DISTINCT log FROM t1
205    INTERSECT
206    SELECT n FROM t1 WHERE log=3
207    ORDER BY log;
208  }
209} {5}
210
211do_test select4-4.1.2 {
212  execsql {
213    SELECT DISTINCT log FROM t1
214    UNION ALL
215    SELECT 6
216    INTERSECT
217    SELECT n FROM t1 WHERE log=3
218    ORDER BY t1.log;
219  }
220} {5 6}
221
222do_test select4-4.1.3 {
223  execsql {
224    CREATE TABLE t2 AS
225      SELECT DISTINCT log FROM t1 UNION ALL SELECT 6
226      INTERSECT
227      SELECT n FROM t1 WHERE log=3
228      ORDER BY log;
229    SELECT * FROM t2;
230  }
231} {5 6}
232execsql {DROP TABLE t2}
233do_test select4-4.1.4 {
234  execsql {
235    CREATE TABLE t2 AS
236      SELECT DISTINCT log FROM t1 UNION ALL SELECT 6
237      INTERSECT
238      SELECT n FROM t1 WHERE log=3
239      ORDER BY log DESC;
240    SELECT * FROM t2;
241  }
242} {6 5}
243execsql {DROP TABLE t2}
244ifcapable subquery {
245  do_test select4-4.2 {
246    execsql {
247      SELECT log FROM t1 WHERE n IN
248        (SELECT DISTINCT log FROM t1 INTERSECT
249         SELECT n FROM t1 WHERE log=3)
250      ORDER BY log;
251    }
252  } {3}
253}
254do_test select4-4.3 {
255  set v [catch {execsql {
256    SELECT DISTINCT log FROM t1 ORDER BY log
257    INTERSECT
258    SELECT n FROM t1 WHERE log=3
259    ORDER BY log;
260  }} msg]
261  lappend v $msg
262} {1 {ORDER BY clause should come after INTERSECT not before}}
263
264# Various error messages while processing UNION or INTERSECT
265#
266do_test select4-5.1 {
267  set v [catch {execsql {
268    SELECT DISTINCT log FROM t2
269    UNION ALL
270    SELECT n FROM t1 WHERE log=3
271    ORDER BY log;
272  }} msg]
273  lappend v $msg
274} {1 {no such table: t2}}
275do_test select4-5.2 {
276  set v [catch {execsql {
277    SELECT DISTINCT log AS "xyzzy" FROM t1
278    UNION ALL
279    SELECT n FROM t1 WHERE log=3
280    ORDER BY xyzzy;
281  }} msg]
282  lappend v $msg
283} {0 {0 1 2 3 4 5 5 6 7 8}}
284do_test select4-5.2b {
285  set v [catch {execsql {
286    SELECT DISTINCT log AS xyzzy FROM t1
287    UNION ALL
288    SELECT n FROM t1 WHERE log=3
289    ORDER BY "xyzzy";
290  }} msg]
291  lappend v $msg
292} {0 {0 1 2 3 4 5 5 6 7 8}}
293do_test select4-5.2c {
294  set v [catch {execsql {
295    SELECT DISTINCT log FROM t1
296    UNION ALL
297    SELECT n FROM t1 WHERE log=3
298    ORDER BY "xyzzy";
299  }} msg]
300  lappend v $msg
301} {1 {1st ORDER BY term does not match any column in the result set}}
302do_test select4-5.2d {
303  set v [catch {execsql {
304    SELECT DISTINCT log FROM t1
305    INTERSECT
306    SELECT n FROM t1 WHERE log=3
307    ORDER BY "xyzzy";
308  }} msg]
309  lappend v $msg
310} {1 {1st ORDER BY term does not match any column in the result set}}
311do_test select4-5.2e {
312  set v [catch {execsql {
313    SELECT DISTINCT log FROM t1
314    UNION ALL
315    SELECT n FROM t1 WHERE log=3
316    ORDER BY n;
317  }} msg]
318  lappend v $msg
319} {0 {0 1 2 3 4 5 5 6 7 8}}
320do_test select4-5.2f {
321  catchsql {
322    SELECT DISTINCT log FROM t1
323    UNION ALL
324    SELECT n FROM t1 WHERE log=3
325    ORDER BY log;
326  }
327} {0 {0 1 2 3 4 5 5 6 7 8}}
328do_test select4-5.2g {
329  catchsql {
330    SELECT DISTINCT log FROM t1
331    UNION ALL
332    SELECT n FROM t1 WHERE log=3
333    ORDER BY 1;
334  }
335} {0 {0 1 2 3 4 5 5 6 7 8}}
336do_test select4-5.2h {
337  catchsql {
338    SELECT DISTINCT log FROM t1
339    UNION ALL
340    SELECT n FROM t1 WHERE log=3
341    ORDER BY 2;
342  }
343} {1 {1st ORDER BY term out of range - should be between 1 and 1}}
344do_test select4-5.2i {
345  catchsql {
346    SELECT DISTINCT 1, log FROM t1
347    UNION ALL
348    SELECT 2, n FROM t1 WHERE log=3
349    ORDER BY 2, 1;
350  }
351} {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}}
352do_test select4-5.2j {
353  catchsql {
354    SELECT DISTINCT 1, log FROM t1
355    UNION ALL
356    SELECT 2, n FROM t1 WHERE log=3
357    ORDER BY 1, 2 DESC;
358  }
359} {0 {1 5 1 4 1 3 1 2 1 1 1 0 2 8 2 7 2 6 2 5}}
360do_test select4-5.2k {
361  catchsql {
362    SELECT DISTINCT 1, log FROM t1
363    UNION ALL
364    SELECT 2, n FROM t1 WHERE log=3
365    ORDER BY n, 1;
366  }
367} {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}}
368do_test select4-5.3 {
369  set v [catch {execsql {
370    SELECT DISTINCT log, n FROM t1
371    UNION ALL
372    SELECT n FROM t1 WHERE log=3
373    ORDER BY log;
374  }} msg]
375  lappend v $msg
376} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
377do_test select4-5.3-3807-1 {
378  catchsql {
379    SELECT 1 UNION SELECT 2, 3 UNION SELECT 4, 5 ORDER BY 1;
380  }
381} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
382do_test select4-5.4 {
383  set v [catch {execsql {
384    SELECT log FROM t1 WHERE n=2
385    UNION ALL
386    SELECT log FROM t1 WHERE n=3
387    UNION ALL
388    SELECT log FROM t1 WHERE n=4
389    UNION ALL
390    SELECT log FROM t1 WHERE n=5
391    ORDER BY log;
392  }} msg]
393  lappend v $msg
394} {0 {1 2 2 3}}
395
396do_test select4-6.1 {
397  execsql {
398    SELECT log, count(*) as cnt FROM t1 GROUP BY log
399    UNION
400    SELECT log, n FROM t1 WHERE n=7
401    ORDER BY cnt, log;
402  }
403} {0 1 1 1 2 2 3 4 3 7 4 8 5 15}
404do_test select4-6.2 {
405  execsql {
406    SELECT log, count(*) FROM t1 GROUP BY log
407    UNION
408    SELECT log, n FROM t1 WHERE n=7
409    ORDER BY count(*), log;
410  }
411} {0 1 1 1 2 2 3 4 3 7 4 8 5 15}
412
413# NULLs are indistinct for the UNION operator.
414# Make sure the UNION operator recognizes this
415#
416do_test select4-6.3 {
417  execsql {
418    SELECT NULL UNION SELECT NULL UNION
419    SELECT 1 UNION SELECT 2 AS 'x'
420    ORDER BY x;
421  }
422} {{} 1 2}
423do_test select4-6.3.1 {
424  execsql {
425    SELECT NULL UNION ALL SELECT NULL UNION ALL
426    SELECT 1 UNION ALL SELECT 2 AS 'x'
427    ORDER BY x;
428  }
429} {{} {} 1 2}
430
431# Make sure the DISTINCT keyword treats NULLs as indistinct.
432#
433ifcapable subquery {
434  do_test select4-6.4 {
435    execsql {
436      SELECT * FROM (
437         SELECT NULL, 1 UNION ALL SELECT NULL, 1
438      );
439    }
440  } {{} 1 {} 1}
441  do_test select4-6.5 {
442    execsql {
443      SELECT DISTINCT * FROM (
444         SELECT NULL, 1 UNION ALL SELECT NULL, 1
445      );
446    }
447  } {{} 1}
448  do_test select4-6.6 {
449    execsql {
450      SELECT DISTINCT * FROM (
451         SELECT 1,2  UNION ALL SELECT 1,2
452      );
453    }
454  } {1 2}
455}
456
457# Test distinctness of NULL in other ways.
458#
459do_test select4-6.7 {
460  execsql {
461    SELECT NULL EXCEPT SELECT NULL
462  }
463} {}
464
465
466# Make sure column names are correct when a compound select appears as
467# an expression in the WHERE clause.
468#
469do_test select4-7.1 {
470  execsql {
471    CREATE TABLE t2 AS SELECT log AS 'x', count(*) AS 'y' FROM t1 GROUP BY log;
472    SELECT * FROM t2 ORDER BY x;
473  }
474} {0 1 1 1 2 2 3 4 4 8 5 15}
475ifcapable subquery {
476  do_test select4-7.2 {
477    execsql2 {
478      SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 INTERSECT SELECT x FROM t2)
479      ORDER BY n
480    }
481  } {n 1 log 0 n 2 log 1 n 3 log 2 n 4 log 2 n 5 log 3}
482  do_test select4-7.3 {
483    execsql2 {
484      SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 EXCEPT SELECT x FROM t2)
485      ORDER BY n LIMIT 2
486    }
487  } {n 6 log 3 n 7 log 3}
488  do_test select4-7.4 {
489    execsql2 {
490      SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 UNION SELECT x FROM t2)
491      ORDER BY n LIMIT 2
492    }
493  } {n 1 log 0 n 2 log 1}
494} ;# ifcapable subquery
495
496} ;# ifcapable compound
497
498# Make sure DISTINCT works appropriately on TEXT and NUMERIC columns.
499do_test select4-8.1 {
500  execsql {
501    BEGIN;
502    CREATE TABLE t3(a text, b float, c text);
503    INSERT INTO t3 VALUES(1, 1.1, '1.1');
504    INSERT INTO t3 VALUES(2, 1.10, '1.10');
505    INSERT INTO t3 VALUES(3, 1.10, '1.1');
506    INSERT INTO t3 VALUES(4, 1.1, '1.10');
507    INSERT INTO t3 VALUES(5, 1.2, '1.2');
508    INSERT INTO t3 VALUES(6, 1.3, '1.3');
509    COMMIT;
510  }
511  execsql {
512    SELECT DISTINCT b FROM t3 ORDER BY c;
513  }
514} {1.1 1.2 1.3}
515do_test select4-8.2 {
516  execsql {
517    SELECT DISTINCT c FROM t3 ORDER BY c;
518  }
519} {1.1 1.10 1.2 1.3}
520
521# Make sure the names of columns are taken from the right-most subquery
522# right in a compound query.  Ticket #1721
523#
524ifcapable compound {
525
526do_test select4-9.1 {
527  execsql2 {
528    SELECT x, y FROM t2 UNION SELECT a, b FROM t3 ORDER BY x LIMIT 1
529  }
530} {x 0 y 1}
531do_test select4-9.2 {
532  execsql2 {
533    SELECT x, y FROM t2 UNION ALL SELECT a, b FROM t3 ORDER BY x LIMIT 1
534  }
535} {x 0 y 1}
536do_test select4-9.3 {
537  execsql2 {
538    SELECT x, y FROM t2 EXCEPT SELECT a, b FROM t3 ORDER BY x LIMIT 1
539  }
540} {x 0 y 1}
541do_test select4-9.4 {
542  execsql2 {
543    SELECT x, y FROM t2 INTERSECT SELECT 0 AS a, 1 AS b;
544  }
545} {x 0 y 1}
546do_test select4-9.5 {
547  execsql2 {
548    SELECT 0 AS x, 1 AS y
549    UNION
550    SELECT 2 AS p, 3 AS q
551    UNION
552    SELECT 4 AS a, 5 AS b
553    ORDER BY x LIMIT 1
554  }
555} {x 0 y 1}
556
557ifcapable subquery {
558do_test select4-9.6 {
559  execsql2 {
560    SELECT * FROM (
561      SELECT 0 AS x, 1 AS y
562      UNION
563      SELECT 2 AS p, 3 AS q
564      UNION
565      SELECT 4 AS a, 5 AS b
566    ) ORDER BY 1 LIMIT 1;
567  }
568} {x 0 y 1}
569do_test select4-9.7 {
570  execsql2 {
571    SELECT * FROM (
572      SELECT 0 AS x, 1 AS y
573      UNION
574      SELECT 2 AS p, 3 AS q
575      UNION
576      SELECT 4 AS a, 5 AS b
577    ) ORDER BY x LIMIT 1;
578  }
579} {x 0 y 1}
580} ;# ifcapable subquery
581
582do_test select4-9.8 {
583  execsql {
584    SELECT 0 AS x, 1 AS y
585    UNION
586    SELECT 2 AS y, -3 AS x
587    ORDER BY x LIMIT 1;
588  }
589} {0 1}
590
591do_test select4-9.9.1 {
592  execsql2 {
593    SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a
594  }
595} {a 1 b 2 a 3 b 4}
596
597ifcapable subquery {
598do_test select4-9.9.2 {
599  execsql2 {
600    SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a)
601     WHERE b=3
602  }
603} {}
604do_test select4-9.10 {
605  execsql2 {
606    SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a)
607     WHERE b=2
608  }
609} {a 1 b 2}
610do_test select4-9.11 {
611  execsql2 {
612    SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS e, 4 AS b)
613     WHERE b=2
614  }
615} {a 1 b 2}
616do_test select4-9.12 {
617  execsql2 {
618    SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS e, 4 AS b)
619     WHERE b>0
620  }
621} {a 1 b 2 a 3 b 4}
622} ;# ifcapable subquery
623
624# Try combining DISTINCT, LIMIT, and OFFSET.  Make sure they all work
625# together.
626#
627do_test select4-10.1 {
628  execsql {
629    SELECT DISTINCT log FROM t1 ORDER BY log
630  }
631} {0 1 2 3 4 5}
632do_test select4-10.2 {
633  execsql {
634    SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 4
635  }
636} {0 1 2 3}
637do_test select4-10.3 {
638  execsql {
639    SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 0
640  }
641} {}
642do_test select4-10.4 {
643  execsql {
644    SELECT DISTINCT log FROM t1 ORDER BY log LIMIT -1
645  }
646} {0 1 2 3 4 5}
647do_test select4-10.5 {
648  execsql {
649    SELECT DISTINCT log FROM t1 ORDER BY log LIMIT -1 OFFSET 2
650  }
651} {2 3 4 5}
652do_test select4-10.6 {
653  execsql {
654    SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 3 OFFSET 2
655  }
656} {2 3 4}
657do_test select4-10.7 {
658  execsql {
659    SELECT DISTINCT log FROM t1 ORDER BY +log LIMIT 3 OFFSET 20
660  }
661} {}
662do_test select4-10.8 {
663  execsql {
664    SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 0 OFFSET 3
665  }
666} {}
667do_test select4-10.9 {
668  execsql {
669    SELECT DISTINCT max(n), log FROM t1 ORDER BY +log; -- LIMIT 2 OFFSET 1
670  }
671} {31 5}
672
673# Make sure compound SELECTs with wildly different numbers of columns
674# do not cause assertion faults due to register allocation issues.
675#
676do_test select4-11.1 {
677  catchsql {
678    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
679    UNION
680    SELECT x FROM t2
681  }
682} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
683do_test select4-11.2 {
684  catchsql {
685    SELECT x FROM t2
686    UNION
687    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
688  }
689} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
690do_test select4-11.3 {
691  catchsql {
692    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
693    UNION ALL
694    SELECT x FROM t2
695  }
696} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
697do_test select4-11.4 {
698  catchsql {
699    SELECT x FROM t2
700    UNION ALL
701    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
702  }
703} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
704do_test select4-11.5 {
705  catchsql {
706    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
707    EXCEPT
708    SELECT x FROM t2
709  }
710} {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}}
711do_test select4-11.6 {
712  catchsql {
713    SELECT x FROM t2
714    EXCEPT
715    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
716  }
717} {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}}
718do_test select4-11.7 {
719  catchsql {
720    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
721    INTERSECT
722    SELECT x FROM t2
723  }
724} {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}}
725do_test select4-11.8 {
726  catchsql {
727    SELECT x FROM t2
728    INTERSECT
729    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
730  }
731} {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}}
732
733do_test select4-11.11 {
734  catchsql {
735    SELECT x FROM t2
736    UNION
737    SELECT x FROM t2
738    UNION ALL
739    SELECT x FROM t2
740    EXCEPT
741    SELECT x FROM t2
742    INTERSECT
743    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
744  }
745} {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}}
746do_test select4-11.12 {
747  catchsql {
748    SELECT x FROM t2
749    UNION
750    SELECT x FROM t2
751    UNION ALL
752    SELECT x FROM t2
753    EXCEPT
754    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
755    EXCEPT
756    SELECT x FROM t2
757  }
758} {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}}
759do_test select4-11.13 {
760  catchsql {
761    SELECT x FROM t2
762    UNION
763    SELECT x FROM t2
764    UNION ALL
765    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
766    UNION ALL
767    SELECT x FROM t2
768    EXCEPT
769    SELECT x FROM t2
770  }
771} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
772do_test select4-11.14 {
773  catchsql {
774    SELECT x FROM t2
775    UNION
776    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
777    UNION
778    SELECT x FROM t2
779    UNION ALL
780    SELECT x FROM t2
781    EXCEPT
782    SELECT x FROM t2
783  }
784} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
785do_test select4-11.15 {
786  catchsql {
787    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
788    UNION
789    SELECT x FROM t2
790    INTERSECT
791    SELECT x FROM t2
792    UNION ALL
793    SELECT x FROM t2
794    EXCEPT
795    SELECT x FROM t2
796  }
797} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
798
799do_test select4-12.1 {
800  sqlite3 db2 :memory:
801  catchsql {
802    SELECT 1 UNION SELECT 2,3 UNION SELECT 4,5 ORDER BY 1;
803  } db2
804} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
805
806} ;# ifcapable compound
807
808finish_test
809