xref: /sqlite-3.40.0/test/select7.test (revision 8da209b1)
18cdbf836Sdrh# The author disclaims copyright to this source code.  In place of
28cdbf836Sdrh# a legal notice, here is a blessing:
38cdbf836Sdrh#
48cdbf836Sdrh#    May you do good and not evil.
58cdbf836Sdrh#    May you find forgiveness for yourself and forgive others.
68cdbf836Sdrh#    May you share freely, never taking more than you give.
78cdbf836Sdrh#
88cdbf836Sdrh#***********************************************************************
98cdbf836Sdrh# This file implements regression tests for SQLite library.  The
108cdbf836Sdrh# focus of this file is testing compute SELECT statements and nested
118cdbf836Sdrh# views.
128cdbf836Sdrh#
134152e677Sdanielk1977# $Id: select7.test,v 1.11 2007/09/12 17:01:45 danielk1977 Exp $
148cdbf836Sdrh
158cdbf836Sdrh
168cdbf836Sdrhset testdir [file dirname $argv0]
178cdbf836Sdrhsource $testdir/tester.tcl
18923cadb1Sdanset testprefix select7
198cdbf836Sdrh
2027c77438Sdanielk1977ifcapable compound {
2127c77438Sdanielk1977
228cdbf836Sdrh# A 3-way INTERSECT.  Ticket #875
2353c0f748Sdanielk1977ifcapable tempdb {
248cdbf836Sdrh  do_test select7-1.1 {
258cdbf836Sdrh    execsql {
268cdbf836Sdrh      create temp table t1(x);
278cdbf836Sdrh      insert into t1 values('amx');
288cdbf836Sdrh      insert into t1 values('anx');
298cdbf836Sdrh      insert into t1 values('amy');
308cdbf836Sdrh      insert into t1 values('bmy');
318cdbf836Sdrh      select * from t1 where x like 'a__'
328cdbf836Sdrh        intersect select * from t1 where x like '_m_'
338cdbf836Sdrh        intersect select * from t1 where x like '__x';
348cdbf836Sdrh    }
358cdbf836Sdrh  } {amx}
3653c0f748Sdanielk1977}
378cdbf836Sdrh
388cdbf836Sdrh
398cdbf836Sdrh# Nested views do not handle * properly.  Ticket #826.
408cdbf836Sdrh#
410fa8ddbdSdanielk1977ifcapable view {
428cdbf836Sdrhdo_test select7-2.1 {
438cdbf836Sdrh  execsql {
448cdbf836Sdrh    CREATE TABLE x(id integer primary key, a TEXT NULL);
458cdbf836Sdrh    INSERT INTO x (a) VALUES ('first');
468cdbf836Sdrh    CREATE TABLE tempx(id integer primary key, a TEXT NULL);
478cdbf836Sdrh    INSERT INTO tempx (a) VALUES ('t-first');
488cdbf836Sdrh    CREATE VIEW tv1 AS SELECT x.id, tx.id FROM x JOIN tempx tx ON tx.id=x.id;
498cdbf836Sdrh    CREATE VIEW tv1b AS SELECT x.id, tx.id FROM x JOIN tempx tx on tx.id=x.id;
508cdbf836Sdrh    CREATE VIEW tv2 AS SELECT * FROM tv1 UNION SELECT * FROM tv1b;
518cdbf836Sdrh    SELECT * FROM tv2;
528cdbf836Sdrh  }
538cdbf836Sdrh} {1 1}
540fa8ddbdSdanielk1977} ;# ifcapable view
558cdbf836Sdrh
5627c77438Sdanielk1977} ;# ifcapable compound
5727c77438Sdanielk1977
5849d642dbSdrh# Do not allow GROUP BY without an aggregate. Ticket #1039.
5949d642dbSdrh#
60e257300fSdanielk1977# Change: force any query with a GROUP BY clause to be processed as
61e257300fSdanielk1977# an aggregate query, whether it contains aggregates or not.
62e257300fSdanielk1977#
633e8c37e7Sdanielk1977ifcapable subquery {
64e257300fSdanielk1977  # do_test select7-3.1 {
65e257300fSdanielk1977  #   catchsql {
66e257300fSdanielk1977  #     SELECT * FROM (SELECT * FROM sqlite_master) GROUP BY name
67e257300fSdanielk1977  #   }
68e257300fSdanielk1977  # } {1 {GROUP BY may only be used on aggregate queries}}
6949d642dbSdrh  do_test select7-3.1 {
7049d642dbSdrh    catchsql {
7149d642dbSdrh      SELECT * FROM (SELECT * FROM sqlite_master) GROUP BY name
7249d642dbSdrh    }
73e257300fSdanielk1977  } [list 0 [execsql {SELECT * FROM sqlite_master ORDER BY name}]]
743e8c37e7Sdanielk1977}
75e257300fSdanielk1977
76f6bbe022Sdrh# Ticket #2018 - Make sure names are resolved correctly on all
77f6bbe022Sdrh# SELECT statements of a compound subquery.
78f6bbe022Sdrh#
79f6bbe022Sdrhifcapable {subquery && compound} {
80f6bbe022Sdrh  do_test select7-4.1 {
81f6bbe022Sdrh    execsql {
82f6bbe022Sdrh      CREATE TABLE IF NOT EXISTS photo(pk integer primary key, x);
83f6bbe022Sdrh      CREATE TABLE IF NOT EXISTS tag(pk integer primary key, fk int, name);
84f6bbe022Sdrh
85f6bbe022Sdrh      SELECT P.pk from PHOTO P WHERE NOT EXISTS (
86f6bbe022Sdrh           SELECT T2.pk from TAG T2 WHERE T2.fk = P.pk
87f6bbe022Sdrh           EXCEPT
88f6bbe022Sdrh           SELECT T3.pk from TAG T3 WHERE T3.fk = P.pk AND T3.name LIKE '%foo%'
89f6bbe022Sdrh      );
90f6bbe022Sdrh    }
91f6bbe022Sdrh  } {}
92f6bbe022Sdrh  do_test select7-4.2 {
93f6bbe022Sdrh    execsql {
94f6bbe022Sdrh      INSERT INTO photo VALUES(1,1);
95f6bbe022Sdrh      INSERT INTO photo VALUES(2,2);
96f6bbe022Sdrh      INSERT INTO photo VALUES(3,3);
97f6bbe022Sdrh      INSERT INTO tag VALUES(11,1,'one');
98f6bbe022Sdrh      INSERT INTO tag VALUES(12,1,'two');
99f6bbe022Sdrh      INSERT INTO tag VALUES(21,1,'one-b');
100f6bbe022Sdrh      SELECT P.pk from PHOTO P WHERE NOT EXISTS (
101f6bbe022Sdrh           SELECT T2.pk from TAG T2 WHERE T2.fk = P.pk
102f6bbe022Sdrh           EXCEPT
103f6bbe022Sdrh           SELECT T3.pk from TAG T3 WHERE T3.fk = P.pk AND T3.name LIKE '%foo%'
104f6bbe022Sdrh      );
105f6bbe022Sdrh    }
106f6bbe022Sdrh  } {2 3}
107e305f43fSdrh}
108f6bbe022Sdrh
109e305f43fSdrh# ticket #2347
110e305f43fSdrh#
111e305f43fSdrhifcapable {subquery && compound} {
112e305f43fSdrh  do_test select7-5.1 {
113e305f43fSdrh    catchsql {
114e305f43fSdrh      CREATE TABLE t2(a,b);
115e305f43fSdrh      SELECT 5 IN (SELECT a,b FROM t2);
116e305f43fSdrh    }
117*8da209b1Sdan  } {1 {sub-select returns 2 columns - expected 1}}
118e305f43fSdrh  do_test select7-5.2 {
119e305f43fSdrh    catchsql {
120e305f43fSdrh      SELECT 5 IN (SELECT * FROM t2);
121e305f43fSdrh    }
122*8da209b1Sdan  } {1 {sub-select returns 2 columns - expected 1}}
123e305f43fSdrh  do_test select7-5.3 {
124e305f43fSdrh    catchsql {
125e305f43fSdrh      SELECT 5 IN (SELECT a,b FROM t2 UNION SELECT b,a FROM t2);
126e305f43fSdrh    }
127*8da209b1Sdan  } {1 {sub-select returns 2 columns - expected 1}}
128e305f43fSdrh  do_test select7-5.4 {
129e305f43fSdrh    catchsql {
130e305f43fSdrh      SELECT 5 IN (SELECT * FROM t2 UNION SELECT * FROM t2);
131e305f43fSdrh    }
132*8da209b1Sdan  } {1 {sub-select returns 2 columns - expected 1}}
133f6bbe022Sdrh}
134f6bbe022Sdrh
1350325d873Sdrh# Verify that an error occurs if you have too many terms on a
1360325d873Sdrh# compound select statement.
1370325d873Sdrh#
138afcf9bd8Sdanif {[clang_sanitize_address]==0} {
1394152e677Sdanielk1977  ifcapable compound {
1400325d873Sdrh    if {$SQLITE_MAX_COMPOUND_SELECT>0} {
1410325d873Sdrh      set sql {SELECT 0}
1420325d873Sdrh      set result 0
1430325d873Sdrh        for {set i 1} {$i<$SQLITE_MAX_COMPOUND_SELECT} {incr i} {
1440325d873Sdrh          append sql " UNION ALL SELECT $i"
1450325d873Sdrh            lappend result $i
1460325d873Sdrh        }
1470325d873Sdrh      do_test select7-6.1 {
1480325d873Sdrh        catchsql $sql
1490325d873Sdrh      } [list 0 $result]
1500325d873Sdrh      append sql { UNION ALL SELECT 99999999}
1510325d873Sdrh      do_test select7-6.2 {
1520325d873Sdrh        catchsql $sql
1530325d873Sdrh      } {1 {too many terms in compound SELECT}}
1540325d873Sdrh    }
1554152e677Sdanielk1977  }
156afcf9bd8Sdan}
1570325d873Sdrh
158b7dca7d7Sdan# This block of tests verifies that bug aa92c76cd4 is fixed.
159b7dca7d7Sdan#
160b7dca7d7Sdando_test select7-7.1 {
161b7dca7d7Sdan  execsql {
162b7dca7d7Sdan    CREATE TABLE t3(a REAL);
163b7dca7d7Sdan    INSERT INTO t3 VALUES(44.0);
164b7dca7d7Sdan    INSERT INTO t3 VALUES(56.0);
165b7dca7d7Sdan  }
166b7dca7d7Sdan} {}
167b7dca7d7Sdando_test select7-7.2 {
168b7dca7d7Sdan  execsql {
169b7dca7d7Sdan    pragma vdbe_trace = 0;
170b7dca7d7Sdan    SELECT (CASE WHEN a=0 THEN 0 ELSE (a + 25) / 50 END) AS categ, count(*)
171b7dca7d7Sdan    FROM t3 GROUP BY categ
172b7dca7d7Sdan  }
173b7dca7d7Sdan} {1.38 1 1.62 1}
174b7dca7d7Sdando_test select7-7.3 {
175b7dca7d7Sdan  execsql {
176b7dca7d7Sdan    CREATE TABLE t4(a REAL);
177b7dca7d7Sdan    INSERT INTO t4 VALUES( 2.0 );
178b7dca7d7Sdan    INSERT INTO t4 VALUES( 3.0 );
179b7dca7d7Sdan  }
180b7dca7d7Sdan} {}
181b7dca7d7Sdando_test select7-7.4 {
182b7dca7d7Sdan  execsql {
183b7dca7d7Sdan    SELECT (CASE WHEN a=0 THEN 'zero' ELSE a/2 END) AS t FROM t4 GROUP BY t;
184b7dca7d7Sdan  }
185b7dca7d7Sdan} {1.0 1.5}
186b7dca7d7Sdando_test select7-7.5 {
187b7dca7d7Sdan  execsql { SELECT a=0, typeof(a) FROM t4 }
188b7dca7d7Sdan} {0 real 0 real}
189b7dca7d7Sdando_test select7-7.6 {
190b7dca7d7Sdan  execsql { SELECT a=0, typeof(a) FROM t4 GROUP BY a }
191b7dca7d7Sdan} {0 real 0 real}
192b7dca7d7Sdan
193b7dca7d7Sdando_test select7-7.7 {
194b7dca7d7Sdan  execsql {
195b7dca7d7Sdan    CREATE TABLE t5(a TEXT, b INT);
196b7dca7d7Sdan    INSERT INTO t5 VALUES(123, 456);
197b7dca7d7Sdan    SELECT typeof(a), a FROM t5 GROUP BY a HAVING a<b;
198b7dca7d7Sdan  }
199b7dca7d7Sdan} {text 123}
200b7dca7d7Sdan
201923cadb1Sdando_execsql_test 8.0 {
202923cadb1Sdan  CREATE TABLE t01(x, y);
203923cadb1Sdan  CREATE TABLE t02(x, y);
204923cadb1Sdan}
205923cadb1Sdan
206923cadb1Sdando_catchsql_test 8.1 {
207923cadb1Sdan  SELECT * FROM (
208923cadb1Sdan    SELECT * FROM t01 UNION SELECT x FROM t02
209923cadb1Sdan  ) WHERE y=1
210923cadb1Sdan} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
211923cadb1Sdan
212923cadb1Sdando_catchsql_test 8.2 {
213923cadb1Sdan  CREATE VIEW v0 as SELECT x, y FROM t01 UNION SELECT x FROM t02;
214923cadb1Sdan  EXPLAIN QUERY PLAN SELECT * FROM v0 WHERE x='0' OR y;
215923cadb1Sdan} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
216923cadb1Sdan
217923cadb1Sdan
218f6bbe022Sdrhfinish_test
219