blob: b0b6da2686f9ef24c6eac4e08053a4c3138f20b1 [file] [log] [blame]
drhff78bd22002-02-27 01:47:11 +00001# 2002 February 26
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 VIEW statements.
13#
danielk197701ecbee2008-12-14 14:45:20 +000014# $Id: view.test,v 1.39 2008/12/14 14:45:21 danielk1977 Exp $
drhff78bd22002-02-27 01:47:11 +000015set testdir [file dirname $argv0]
16source $testdir/tester.tcl
17
danielk19770fa8ddb2004-11-22 08:43:32 +000018# Omit this entire file if the library is not configured with views enabled.
19ifcapable !view {
20 finish_test
21 return
22}
23
drhff78bd22002-02-27 01:47:11 +000024do_test view-1.0 {
25 execsql {
26 CREATE TABLE t1(a,b,c);
27 INSERT INTO t1 VALUES(1,2,3);
28 INSERT INTO t1 VALUES(4,5,6);
29 INSERT INTO t1 VALUES(7,8,9);
30 SELECT * FROM t1;
31 }
32} {1 2 3 4 5 6 7 8 9}
33
34do_test view-1.1 {
35 execsql {
36 BEGIN;
drhfdd48a72006-09-11 23:45:48 +000037 CREATE VIEW IF NOT EXISTS v1 AS SELECT a,b FROM t1;
drhff78bd22002-02-27 01:47:11 +000038 SELECT * FROM v1 ORDER BY a;
39 }
40} {1 2 4 5 7 8}
drh11d88e62019-08-15 21:27:20 +000041do_test view-1.1.100 {
42 db config enable_view off
43 catchsql {
44 SELECT * FROM v1 ORDER BY a;
45 }
46} {1 {access to view "v1" prohibited}}
drh70149ba2021-03-05 18:33:01 +000047do_execsql_test view-1.1.101 {
48 CREATE TEMP VIEW v1temp AS SELECT a, b FROM t1;
49 SELECT * FROM v1temp ORDER BY a;
50} {1 2 4 5 7 8}
drh11d88e62019-08-15 21:27:20 +000051do_test view-1.1.110 {
52 db config enable_view on
53 catchsql {
54 SELECT * FROM v1 ORDER BY a;
drh70149ba2021-03-05 18:33:01 +000055 SELECT * FROM v1temp ORDER BY a;
drh11d88e62019-08-15 21:27:20 +000056 }
drh70149ba2021-03-05 18:33:01 +000057} {0 {1 2 4 5 7 8 1 2 4 5 7 8}}
dan37f3ac82021-10-01 20:39:50 +000058ifcapable vtab {
59 do_execsql_test view-1.1.120 {
60 SELECT name, type FROM pragma_table_list('v1');
61 } {v1 view}
62}
drhff78bd22002-02-27 01:47:11 +000063do_test view-1.2 {
64 catchsql {
65 ROLLBACK;
66 SELECT * FROM v1 ORDER BY a;
67 }
68} {1 {no such table: v1}}
69do_test view-1.3 {
70 execsql {
71 CREATE VIEW v1 AS SELECT a,b FROM t1;
72 SELECT * FROM v1 ORDER BY a;
73 }
74} {1 2 4 5 7 8}
drh417be792002-03-03 18:59:40 +000075do_test view-1.3.1 {
76 db close
drhef4ac8f2004-06-19 00:16:31 +000077 sqlite3 db test.db
drh417be792002-03-03 18:59:40 +000078 execsql {
79 SELECT * FROM v1 ORDER BY a;
80 }
81} {1 2 4 5 7 8}
drhff78bd22002-02-27 01:47:11 +000082do_test view-1.4 {
83 catchsql {
drhfdd48a72006-09-11 23:45:48 +000084 DROP VIEW IF EXISTS v1;
drhff78bd22002-02-27 01:47:11 +000085 SELECT * FROM v1 ORDER BY a;
86 }
87} {1 {no such table: v1}}
88do_test view-1.5 {
89 execsql {
90 CREATE VIEW v1 AS SELECT a,b FROM t1;
91 SELECT * FROM v1 ORDER BY a;
92 }
93} {1 2 4 5 7 8}
94do_test view-1.6 {
95 catchsql {
96 DROP TABLE t1;
97 SELECT * FROM v1 ORDER BY a;
98 }
drhf26e09c2003-05-31 16:21:12 +000099} {1 {no such table: main.t1}}
drhff78bd22002-02-27 01:47:11 +0000100do_test view-1.7 {
101 execsql {
102 CREATE TABLE t1(x,a,b,c);
103 INSERT INTO t1 VALUES(1,2,3,4);
104 INSERT INTO t1 VALUES(4,5,6,7);
105 INSERT INTO t1 VALUES(7,8,9,10);
106 SELECT * FROM v1 ORDER BY a;
107 }
108} {2 3 5 6 8 9}
drh417be792002-03-03 18:59:40 +0000109do_test view-1.8 {
110 db close
drhef4ac8f2004-06-19 00:16:31 +0000111 sqlite3 db test.db
drh417be792002-03-03 18:59:40 +0000112 execsql {
113 SELECT * FROM v1 ORDER BY a;
114 }
115} {2 3 5 6 8 9}
116
drhed06a132016-04-05 20:59:12 +0000117do_execsql_test view-1.10 {
118 CREATE TABLE t9(x INTEGER);
119 CREATE VIEW v9a AS SELECT x FROM t9;
120 CREATE VIEW v9b AS SELECT * FROM t9;
121 CREATE VIEW v9c(x) AS SELECT x FROM t9;
122 CREATE VIEW v9d(x) AS SELECT * FROM t9;
123} {}
124do_execsql_test view-1.11 {
125 PRAGMA table_info(v9a);
126} {0 x INTEGER 0 {} 0}
127do_execsql_test view-1.12 {
128 PRAGMA table_info(v9b);
129} {0 x INTEGER 0 {} 0}
130do_execsql_test view-1.13 {
131 PRAGMA table_info(v9c);
132} {0 x INTEGER 0 {} 0}
133do_execsql_test view-1.14 {
134 PRAGMA table_info(v9d);
135} {0 x INTEGER 0 {} 0}
136
drh4ff6dfa2002-03-03 23:06:00 +0000137do_test view-2.1 {
138 execsql {
139 CREATE VIEW v2 AS SELECT * FROM t1 WHERE a>5
140 }; # No semicolon
141 execsql2 {
142 SELECT * FROM v2;
143 }
144} {x 7 a 8 b 9 c 10}
145do_test view-2.2 {
146 catchsql {
147 INSERT INTO v2 VALUES(1,2,3,4);
148 }
drh5cf590c2003-04-24 01:45:04 +0000149} {1 {cannot modify v2 because it is a view}}
drh4ff6dfa2002-03-03 23:06:00 +0000150do_test view-2.3 {
151 catchsql {
152 UPDATE v2 SET a=10 WHERE a=5;
153 }
drh5cf590c2003-04-24 01:45:04 +0000154} {1 {cannot modify v2 because it is a view}}
drh4ff6dfa2002-03-03 23:06:00 +0000155do_test view-2.4 {
156 catchsql {
157 DELETE FROM v2;
158 }
drh5cf590c2003-04-24 01:45:04 +0000159} {1 {cannot modify v2 because it is a view}}
drh4ff6dfa2002-03-03 23:06:00 +0000160do_test view-2.5 {
161 execsql {
162 INSERT INTO t1 VALUES(11,12,13,14);
163 SELECT * FROM v2 ORDER BY x;
164 }
165} {7 8 9 10 11 12 13 14}
166do_test view-2.6 {
167 execsql {
168 SELECT x FROM v2 WHERE a>10
169 }
170} {11}
171
drh0bb28102002-05-08 11:54:14 +0000172# Test that column name of views are generated correctly.
173#
174do_test view-3.1 {
175 execsql2 {
176 SELECT * FROM v1 LIMIT 1
177 }
178} {a 2 b 3}
179do_test view-3.2 {
180 execsql2 {
181 SELECT * FROM v2 LIMIT 1
182 }
183} {x 7 a 8 b 9 c 10}
drh93a960a2008-07-10 00:32:42 +0000184do_test view-3.3.1 {
drh0bb28102002-05-08 11:54:14 +0000185 execsql2 {
186 DROP VIEW v1;
187 CREATE VIEW v1 AS SELECT a AS 'xyz', b+c AS 'pqr', c-b FROM t1;
188 SELECT * FROM v1 LIMIT 1
189 }
190} {xyz 2 pqr 7 c-b 1}
drh93a960a2008-07-10 00:32:42 +0000191do_test view-3.3.2 {
192 execsql2 {
193 CREATE VIEW v1b AS SELECT t1.a, b+c, t1.c FROM t1;
194 SELECT * FROM v1b LIMIT 1
195 }
196} {a 2 b+c 7 c 4}
drh8981b902015-08-24 17:42:49 +0000197do_test view-3.3.3 {
198 execsql2 {
199 CREATE VIEW v1c(x,y,z) AS SELECT a, b+c, c-b FROM t1;
200 SELECT * FROM v1c LIMIT 1;
201 }
202} {x 2 y 7 z 1}
203do_catchsql_test view-3.3.4 {
204 CREATE VIEW v1err(x,y DESC,z) AS SELECT a, b+c, c-b FROM t1;
205} {1 {syntax error after column name "y"}}
drh2679f142015-09-25 13:42:55 +0000206do_catchsql_test view-3.3.5 {
207 DROP VIEW IF EXISTS v1err;
208 CREATE VIEW v1err(x,y) AS SELECT a, b+c, c-b FROM t1;
209 SELECT * FROM v1err;
210} {1 {expected 2 columns for 'v1err' but got 3}}
211do_catchsql_test view-3.3.6 {
212 DROP VIEW IF EXISTS v1err;
213 CREATE VIEW v1err(w,x,y,z) AS SELECT a, b+c, c-b FROM t1;
214 SELECT * FROM v1err;
215} {1 {expected 4 columns for 'v1err' but got 3}}
danielk197727c77432004-11-22 13:35:41 +0000216
217ifcapable compound {
drh0bb28102002-05-08 11:54:14 +0000218do_test view-3.4 {
219 execsql2 {
220 CREATE VIEW v3 AS SELECT a FROM t1 UNION SELECT b FROM t1 ORDER BY b;
221 SELECT * FROM v3 LIMIT 4;
222 }
drh92378252006-03-26 01:21:22 +0000223} {a 2 a 3 a 5 a 6}
danielk1977b3bce662005-01-29 08:32:43 +0000224do_test view-3.5 {
drh0f18b452002-05-08 21:30:15 +0000225 execsql2 {
226 CREATE VIEW v4 AS
227 SELECT a, b FROM t1
228 UNION
229 SELECT b AS 'x', a AS 'y' FROM t1
230 ORDER BY x, y;
drh92378252006-03-26 01:21:22 +0000231 SELECT b FROM v4 ORDER BY b LIMIT 4;
drh0f18b452002-05-08 21:30:15 +0000232 }
drh92378252006-03-26 01:21:22 +0000233} {b 2 b 3 b 5 b 6}
danielk197727c77432004-11-22 13:35:41 +0000234} ;# ifcapable compound
drh4ff6dfa2002-03-03 23:06:00 +0000235
drhff78bd22002-02-27 01:47:11 +0000236
drh3b167c72002-06-28 12:18:47 +0000237do_test view-4.1 {
238 catchsql {
239 DROP VIEW t1;
240 }
241} {1 {use DROP TABLE to delete table t1}}
242do_test view-4.2 {
243 execsql {
244 SELECT 1 FROM t1 LIMIT 1;
245 }
246} 1
247do_test view-4.3 {
248 catchsql {
249 DROP TABLE v1;
250 }
251} {1 {use DROP VIEW to delete view v1}}
252do_test view-4.4 {
253 execsql {
254 SELECT 1 FROM v1 LIMIT 1;
255 }
256} {1}
257do_test view-4.5 {
258 catchsql {
259 CREATE INDEX i1v1 ON v1(xyz);
260 }
261} {1 {views may not be indexed}}
262
263do_test view-5.1 {
264 execsql {
265 CREATE TABLE t2(y,a);
266 INSERT INTO t2 VALUES(22,2);
267 INSERT INTO t2 VALUES(33,3);
268 INSERT INTO t2 VALUES(44,4);
269 INSERT INTO t2 VALUES(55,5);
270 SELECT * FROM t2;
271 }
272} {22 2 33 3 44 4 55 5}
273do_test view-5.2 {
274 execsql {
275 CREATE VIEW v5 AS
drhc31c2eb2003-05-02 16:04:17 +0000276 SELECT t1.x AS v, t2.y AS w FROM t1 JOIN t2 USING(a);
drh3b167c72002-06-28 12:18:47 +0000277 SELECT * FROM v5;
278 }
279} {1 22 4 55}
280
drhc31c2eb2003-05-02 16:04:17 +0000281# Verify that the view v5 gets flattened. see sqliteFlattenSubquery().
drh6bf89572004-11-03 16:27:01 +0000282# This will only work if EXPLAIN is enabled.
drhc31c2eb2003-05-02 16:04:17 +0000283# Ticket #272
drh6bf89572004-11-03 16:27:01 +0000284#
285ifcapable {explain} {
drhc31c2eb2003-05-02 16:04:17 +0000286do_test view-5.3 {
287 lsearch [execsql {
288 EXPLAIN SELECT * FROM v5;
drhb9bb7c12006-06-11 23:41:55 +0000289 }] OpenEphemeral
drhc31c2eb2003-05-02 16:04:17 +0000290} {-1}
291do_test view-5.4 {
292 execsql {
293 SELECT * FROM v5 AS a, t2 AS b WHERE a.w=b.y;
294 }
295} {1 22 22 2 4 55 55 5}
296do_test view-5.5 {
297 lsearch [execsql {
298 EXPLAIN SELECT * FROM v5 AS a, t2 AS b WHERE a.w=b.y;
drhb9bb7c12006-06-11 23:41:55 +0000299 }] OpenEphemeral
drhc31c2eb2003-05-02 16:04:17 +0000300} {-1}
301do_test view-5.6 {
302 execsql {
303 SELECT * FROM t2 AS b, v5 AS a WHERE a.w=b.y;
304 }
305} {22 2 1 22 55 5 4 55}
306do_test view-5.7 {
307 lsearch [execsql {
308 EXPLAIN SELECT * FROM t2 AS b, v5 AS a WHERE a.w=b.y;
drhb9bb7c12006-06-11 23:41:55 +0000309 }] OpenEphemeral
drhc31c2eb2003-05-02 16:04:17 +0000310} {-1}
311do_test view-5.8 {
312 execsql {
313 SELECT * FROM t1 AS a, v5 AS b, t2 AS c WHERE a.x=b.v AND b.w=c.y;
314 }
315} {1 2 3 4 1 22 22 2 4 5 6 7 4 55 55 5}
316do_test view-5.9 {
317 lsearch [execsql {
318 EXPLAIN SELECT * FROM t1 AS a, v5 AS b, t2 AS c WHERE a.x=b.v AND b.w=c.y;
drhb9bb7c12006-06-11 23:41:55 +0000319 }] OpenEphemeral
drhc31c2eb2003-05-02 16:04:17 +0000320} {-1}
drh6bf89572004-11-03 16:27:01 +0000321} ;# endif explain
drhc31c2eb2003-05-02 16:04:17 +0000322
drh2f2c01e2002-07-02 13:05:04 +0000323do_test view-6.1 {
324 execsql {
325 SELECT min(x), min(a), min(b), min(c), min(a+b+c) FROM v2;
326 }
327} {7 8 9 10 27}
328do_test view-6.2 {
329 execsql {
330 SELECT max(x), max(a), max(b), max(c), max(a+b+c) FROM v2;
331 }
332} {11 12 13 14 39}
333
drh0c36cbe2002-07-16 02:05:43 +0000334do_test view-7.1 {
335 execsql {
336 CREATE TABLE test1(id integer primary key, a);
337 CREATE TABLE test2(id integer, b);
338 INSERT INTO test1 VALUES(1,2);
339 INSERT INTO test2 VALUES(1,3);
340 CREATE VIEW test AS
341 SELECT test1.id, a, b
342 FROM test1 JOIN test2 ON test2.id=test1.id;
343 SELECT * FROM test;
344 }
345} {1 2 3}
346do_test view-7.2 {
347 db close
drhef4ac8f2004-06-19 00:16:31 +0000348 sqlite3 db test.db
drh0c36cbe2002-07-16 02:05:43 +0000349 execsql {
350 SELECT * FROM test;
351 }
352} {1 2 3}
353do_test view-7.3 {
354 execsql {
355 DROP VIEW test;
356 CREATE VIEW test AS
357 SELECT test1.id, a, b
358 FROM test1 JOIN test2 USING(id);
359 SELECT * FROM test;
360 }
361} {1 2 3}
362do_test view-7.4 {
363 db close
drhef4ac8f2004-06-19 00:16:31 +0000364 sqlite3 db test.db
drh0c36cbe2002-07-16 02:05:43 +0000365 execsql {
366 SELECT * FROM test;
367 }
368} {1 2 3}
369do_test view-7.5 {
370 execsql {
371 DROP VIEW test;
372 CREATE VIEW test AS
373 SELECT test1.id, a, b
374 FROM test1 NATURAL JOIN test2;
375 SELECT * FROM test;
376 }
377} {1 2 3}
378do_test view-7.6 {
379 db close
drhef4ac8f2004-06-19 00:16:31 +0000380 sqlite3 db test.db
drh0c36cbe2002-07-16 02:05:43 +0000381 execsql {
382 SELECT * FROM test;
383 }
384} {1 2 3}
drh2f2c01e2002-07-02 13:05:04 +0000385
drh4b59ab52002-08-24 18:24:51 +0000386do_test view-8.1 {
387 execsql {
388 CREATE VIEW v6 AS SELECT pqr, xyz FROM v1;
389 SELECT * FROM v6 ORDER BY xyz;
390 }
391} {7 2 13 5 19 8 27 12}
drh4b59ab52002-08-24 18:24:51 +0000392do_test view-8.2 {
393 db close
drhef4ac8f2004-06-19 00:16:31 +0000394 sqlite3 db test.db
drh4b59ab52002-08-24 18:24:51 +0000395 execsql {
396 SELECT * FROM v6 ORDER BY xyz;
397 }
398} {7 2 13 5 19 8 27 12}
399do_test view-8.3 {
400 execsql {
drh8981b902015-08-24 17:42:49 +0000401 CREATE VIEW v7(a) AS SELECT pqr+xyz FROM v6;
drh4b59ab52002-08-24 18:24:51 +0000402 SELECT * FROM v7 ORDER BY a;
403 }
404} {9 18 27 39}
danielk1977e61b9f42005-01-21 04:25:47 +0000405
406ifcapable subquery {
407 do_test view-8.4 {
408 execsql {
409 CREATE VIEW v8 AS SELECT max(cnt) AS mx FROM
410 (SELECT a%2 AS eo, count(*) AS cnt FROM t1 GROUP BY eo);
411 SELECT * FROM v8;
412 }
413 } 3
414 do_test view-8.5 {
415 execsql {
416 SELECT mx+10, mx*2 FROM v8;
417 }
418 } {13 6}
419 do_test view-8.6 {
420 execsql {
421 SELECT mx+10, pqr FROM v6, v8 WHERE xyz=2;
422 }
423 } {13 7}
424 do_test view-8.7 {
425 execsql {
426 SELECT mx+10, pqr FROM v6, v8 WHERE xyz>2;
427 }
428 } {13 13 13 19 13 27}
429} ;# ifcapable subquery
drh4b59ab52002-08-24 18:24:51 +0000430
drh174b6192002-12-03 02:22:52 +0000431# Tests for a bug found by Michiel de Wit involving ORDER BY in a VIEW.
432#
433do_test view-9.1 {
434 execsql {
435 INSERT INTO t2 SELECT * FROM t2 WHERE a<5;
436 INSERT INTO t2 SELECT * FROM t2 WHERE a<4;
437 INSERT INTO t2 SELECT * FROM t2 WHERE a<3;
438 SELECT DISTINCT count(*) FROM t2 GROUP BY a ORDER BY 1;
439 }
440} {1 2 4 8}
441do_test view-9.2 {
442 execsql {
443 SELECT DISTINCT count(*) FROM t2 GROUP BY a ORDER BY 1 LIMIT 3;
444 }
445} {1 2 4}
446do_test view-9.3 {
447 execsql {
448 CREATE VIEW v9 AS
449 SELECT DISTINCT count(*) FROM t2 GROUP BY a ORDER BY 1 LIMIT 3;
450 SELECT * FROM v9;
451 }
452} {1 2 4}
453do_test view-9.4 {
454 execsql {
455 SELECT * FROM v9 ORDER BY 1 DESC;
456 }
457} {4 2 1}
458do_test view-9.5 {
459 execsql {
460 CREATE VIEW v10 AS
461 SELECT DISTINCT a, count(*) FROM t2 GROUP BY a ORDER BY 2 LIMIT 3;
462 SELECT * FROM v10;
463 }
464} {5 1 4 2 3 4}
465do_test view-9.6 {
466 execsql {
467 SELECT * FROM v10 ORDER BY 1;
468 }
469} {3 4 4 2 5 1}
470
drh2c61c072004-07-20 00:20:23 +0000471# Tables with columns having peculiar quoted names used in views
472# Ticket #756.
473#
474do_test view-10.1 {
475 execsql {
476 CREATE TABLE t3("9" integer, [4] text);
477 INSERT INTO t3 VALUES(1,2);
478 CREATE VIEW v_t3_a AS SELECT a.[9] FROM t3 AS a;
479 CREATE VIEW v_t3_b AS SELECT "4" FROM t3;
480 SELECT * FROM v_t3_a;
481 }
482} {1}
483do_test view-10.2 {
484 execsql {
485 SELECT * FROM v_t3_b;
486 }
487} {2}
drh174b6192002-12-03 02:22:52 +0000488
danielk1977142bdf42005-01-30 11:11:44 +0000489do_test view-11.1 {
490 execsql {
491 CREATE TABLE t4(a COLLATE NOCASE);
492 INSERT INTO t4 VALUES('This');
493 INSERT INTO t4 VALUES('this');
494 INSERT INTO t4 VALUES('THIS');
495 SELECT * FROM t4 WHERE a = 'THIS';
496 }
497} {This this THIS}
danielk19771576cd92006-01-14 08:02:28 +0000498ifcapable subquery {
499 do_test view-11.2 {
500 execsql {
501 SELECT * FROM (SELECT * FROM t4) WHERE a = 'THIS';
502 }
503 } {This this THIS}
504}
danielk1977142bdf42005-01-30 11:11:44 +0000505do_test view-11.3 {
506 execsql {
507 CREATE VIEW v11 AS SELECT * FROM t4;
508 SELECT * FROM v11 WHERE a = 'THIS';
509 }
510} {This this THIS}
511
drh7c3d64f2005-06-06 15:32:08 +0000512# Ticket #1270: Do not allow parameters in view definitions.
513#
514do_test view-12.1 {
515 catchsql {
516 CREATE VIEW v12 AS SELECT a FROM t1 WHERE b=?
517 }
518} {1 {parameters are not allowed in views}}
drh32498f12015-09-26 11:15:44 +0000519do_test view-12.2 {
520 catchsql {
521 CREATE VIEW v12(x) AS SELECT a FROM t1 WHERE b=?
522 }
523} {1 {parameters are not allowed in views}}
drh7c3d64f2005-06-06 15:32:08 +0000524
danielk19775a8f9372007-10-09 08:29:32 +0000525ifcapable attach {
526 do_test view-13.1 {
mistachkinfda06be2011-08-02 00:57:34 +0000527 forcedelete test2.db
danielk19775a8f9372007-10-09 08:29:32 +0000528 catchsql {
529 ATTACH 'test2.db' AS two;
530 CREATE TABLE two.t2(x,y);
531 CREATE VIEW v13 AS SELECT y FROM two.t2;
532 }
533 } {1 {view v13 cannot reference objects in database two}}
534}
drh85c23c62005-08-20 03:03:04 +0000535
drhfb8de2d2006-02-05 18:55:20 +0000536# Ticket #1658
537#
538do_test view-14.1 {
539 catchsql {
540 CREATE TEMP VIEW t1 AS SELECT a,b FROM t1;
541 SELECT * FROM temp.t1;
542 }
543} {1 {view t1 is circularly defined}}
drhbfad7be2015-10-11 20:39:46 +0000544do_test view-14.2 {
545 catchsql {
546 DROP VIEW IF EXISTS temp.t1;
547 CREATE TEMP VIEW t1(a,b) AS SELECT a,b FROM t1;
548 SELECT * FROM temp.t1;
549 }
550} {1 {view t1 is circularly defined}}
drhfb8de2d2006-02-05 18:55:20 +0000551
drh643054c2006-03-09 17:28:12 +0000552# Tickets #1688, #1709
553#
554do_test view-15.1 {
555 execsql2 {
556 CREATE VIEW v15 AS SELECT a AS x, b AS y FROM t1;
557 SELECT * FROM v15 LIMIT 1;
558 }
559} {x 2 y 3}
560do_test view-15.2 {
561 execsql2 {
562 SELECT x, y FROM v15 LIMIT 1
563 }
564} {x 2 y 3}
565
drhfdd48a72006-09-11 23:45:48 +0000566do_test view-16.1 {
567 catchsql {
568 CREATE VIEW IF NOT EXISTS v1 AS SELECT * FROM t1;
569 }
570} {0 {}}
571do_test view-16.2 {
572 execsql {
573 SELECT sql FROM sqlite_master WHERE name='v1'
574 }
575} {{CREATE VIEW v1 AS SELECT a AS 'xyz', b+c AS 'pqr', c-b FROM t1}}
576do_test view-16.3 {
577 catchsql {
578 DROP VIEW IF EXISTS nosuchview
579 }
580} {0 {}}
drh643054c2006-03-09 17:28:12 +0000581
drhca424112008-01-25 15:04:48 +0000582# correct error message when attempting to drop a view that does not
583# exist.
584#
585do_test view-17.1 {
586 catchsql {
587 DROP VIEW nosuchview
588 }
589} {1 {no such view: nosuchview}}
590do_test view-17.2 {
591 catchsql {
592 DROP VIEW main.nosuchview
593 }
594} {1 {no such view: main.nosuchview}}
595
danielk1977daf79ac2008-06-30 18:12:28 +0000596do_test view-18.1 {
597 execsql {
598 DROP VIEW t1;
599 DROP TABLE t1;
600 CREATE TABLE t1(a, b, c);
601 INSERT INTO t1 VALUES(1, 2, 3);
602 INSERT INTO t1 VALUES(4, 5, 6);
603
604 CREATE VIEW vv1 AS SELECT * FROM t1;
605 CREATE VIEW vv2 AS SELECT * FROM vv1;
606 CREATE VIEW vv3 AS SELECT * FROM vv2;
607 CREATE VIEW vv4 AS SELECT * FROM vv3;
608 CREATE VIEW vv5 AS SELECT * FROM vv4;
609
610 SELECT * FROM vv5;
611 }
612} {1 2 3 4 5 6}
613
drhf0209f72008-08-21 14:54:28 +0000614# Ticket #3308
615# Make sure "rowid" columns in a view are named correctly.
616#
617do_test view-19.1 {
618 execsql {
619 CREATE VIEW v3308a AS SELECT rowid, * FROM t1;
620 }
621 execsql2 {
622 SELECT * FROM v3308a
623 }
624} {rowid 1 a 1 b 2 c 3 rowid 2 a 4 b 5 c 6}
625do_test view-19.2 {
626 execsql {
627 CREATE VIEW v3308b AS SELECT t1.rowid, t1.a, t1.b+t1.c FROM t1;
628 }
629 execsql2 {
630 SELECT * FROM v3308b
631 }
632} {rowid 1 a 1 t1.b+t1.c 5 rowid 2 a 4 t1.b+t1.c 11}
633do_test view-19.3 {
634 execsql {
635 CREATE VIEW v3308c AS SELECT t1.oid, A, t1.b+t1.c AS x FROM t1;
636 }
637 execsql2 {
638 SELECT * FROM v3308c
639 }
640} {rowid 1 a 1 x 5 rowid 2 a 4 x 11}
drhca424112008-01-25 15:04:48 +0000641
danielk197701ecbee2008-12-14 14:45:20 +0000642# Ticket #3539 had this crashing (see commit [5940]).
643do_test view-20.1 {
644 execsql {
645 DROP TABLE IF EXISTS t1;
646 DROP VIEW IF EXISTS v1;
647 CREATE TABLE t1(c1);
648 CREATE VIEW v1 AS SELECT c1 FROM (SELECT t1.c1 FROM t1);
649 }
650} {}
651
drh19c6d962014-03-04 21:19:51 +0000652db close
653sqlite3 db :memory:
654do_execsql_test view-22.1 {
655 CREATE VIEW x1 AS SELECT 123 AS '', 234 AS '', 345 AS '';
656 SELECT * FROM x1;
657} {123 234 345}
658do_test view-22.2 {
659 unset -nocomplain x
660 db eval {SELECT * FROM x1} x break
661 lsort [array names x]
662} {{} * :1 :2}
663
mistachkin0fc2da32018-07-20 20:56:22 +0000664do_test view-25.1 {
665 db eval {
666 CREATE TABLE t25 (x);
667 INSERT INTO t25 (x) VALUES (1);
668 ANALYZE;
669 }
670 proc authLogDelete {code arg1 arg2 arg3 arg4 args} {
671 if {$code=="SQLITE_DELETE" && [string match sqlite_stat* $arg1]} {
dan85c68922018-09-19 17:09:09 +0000672 # lappend ::log [list $code $arg1 $arg2 $arg3 $arg4 $args]
673 lappend ::log [list $code $arg1 $arg2 $arg3 $arg4]
mistachkin0fc2da32018-07-20 20:56:22 +0000674 }
675 return SQLITE_OK
676 }
677 set log ""
678 db authorizer ::authLogDelete
679 db eval {DROP VIEW x1;}
680 set log
681} {}
dan79e9d342018-08-21 17:03:25 +0000682
dan85c68922018-09-19 17:09:09 +0000683set res [list {SQLITE_DELETE sqlite_stat1 {} main {}}]
684ifcapable stat4 { lappend res {SQLITE_DELETE sqlite_stat4 {} main {}} }
mistachkin0fc2da32018-07-20 20:56:22 +0000685do_test view-25.2 {
686 set log ""
687 db eval {DROP TABLE t25;}
688 set log
dan79e9d342018-08-21 17:03:25 +0000689} $res
drh19c6d962014-03-04 21:19:51 +0000690
danac4085b2019-05-03 17:19:10 +0000691#-------------------------------------------------------------------------
692do_execsql_test view-26.0 {
693 CREATE TABLE t16(a, b, c UNIQUE);
694 INSERT INTO t16 VALUES(1, 1, 1);
695 INSERT INTO t16 VALUES(2, 2, 2);
696 INSERT INTO t16 VALUES(3, 3, 3);
697 CREATE VIEW v16 AS SELECT max(a) AS mx, min(b) AS mn FROM t16 GROUP BY c;
698
699 SELECT * FROM v16 AS one, v16 AS two WHERE one.mx=1;
700} {
701 1 1 1 1
702 1 1 2 2
703 1 1 3 3
704}
drh53e87092019-05-22 23:12:10 +0000705do_execsql_test view-26.1 {
706 WITH v17(x,y) AS (SELECT max(a), min(b) FROM t16 GROUP BY c)
707 SELECT * FROM v17 AS one, v17 AS two WHERE one.x=1;
708} {
709 1 1 1 1
710 1 1 2 2
711 1 1 3 3
712}
danac4085b2019-05-03 17:19:10 +0000713
dan0a8d06a2019-08-05 20:45:53 +0000714#-------------------------------------------------------------------------
715reset_db
716do_execsql_test view-27.0 {
717 CREATE TABLE t0(c0 TEXT, c1);
718 INSERT INTO t0(c0, c1) VALUES (-1, 0);
719 CREATE VIEW v0(c0, c1) AS SELECT t0.c0, AVG(t0.c1) FROM t0;
720}
721
722do_execsql_test view-27.1 {
dan679c9612019-08-07 19:57:21 +0000723 SELECT c0, typeof(c0), c1, typeof(c1) FROM v0;
dan0a8d06a2019-08-05 20:45:53 +0000724} {
dan679c9612019-08-07 19:57:21 +0000725 -1 text
726 0.0 real
dan0a8d06a2019-08-05 20:45:53 +0000727}
728
729do_execsql_test view-27.2 { SELECT c0<c1 FROM v0 } 1
730do_execsql_test view-27.3 { SELECT c1<c0 FROM v0 } 0
731do_execsql_test view-27.4 {
732 SELECT 1 FROM v0 WHERE c1<c0
733} {}
734do_execsql_test view-27.5 {
735 SELECT 1 FROM v0 WHERE c0<c1
736} {1}
737
738do_execsql_test view-27.6 {
739 SELECT c0<c1 FROM (SELECT t0.c0 AS c0, AVG(t0.c1) AS c1 FROM t0)
740} 1
741do_execsql_test view-27.7 {
742 SELECT c1<c0 FROM (SELECT t0.c0 AS c0, AVG(t0.c1) AS c1 FROM t0)
743} 0
744do_execsql_test view-27.8 {
745 SELECT 1 FROM (SELECT t0.c0 AS c0, AVG(t0.c1) AS c1 FROM t0) WHERE c1<c0
746} {}
747do_execsql_test view-27.9 {
748 SELECT 1 FROM (SELECT t0.c0 AS c0, AVG(t0.c1) AS c1 FROM t0) WHERE c0<c1
749} {1}
750
dan2712b022019-08-06 21:16:28 +0000751#-------------------------------------------------------------------------
752reset_db
753do_execsql_test view-28.0 {
754 CREATE TABLE t0(c0 TEXT);
755 CREATE VIEW v0(c0) AS SELECT t0.c0 FROM t0;
756 INSERT INTO t0(c0) VALUES ('0');
757}
758do_execsql_test view-28.1 {
759 SELECT 0 IN (c0) FROM t0;
760} {0}
761do_execsql_test view-28.2 {
762 SELECT 0 IN (c0) FROM (SELECT c0 FROM t0);
763} {0}
764
drhed7974d2020-10-26 18:14:12 +0000765#-------------------------------------------------------------------------
766# 2020-10-26. https://sqlite.org/forum/forumpost/daa2c728cc
767#
768reset_db
769do_catchsql_test view-29.0 {
770 CREATE TABLE t1(a,b,c);
771 CREATE VIEW IF NOT EXISTS IF AS SELECT null;
772} {1 {malformed database schema (IF) - near "AS": syntax error}}
773do_catchsql_test view-29.1 {
774 CREATE TABLE t2(c,d,e);
775 SELECT name FROM sqlite_schema ORDER BY name;
776} {0 {t1 t2}}
777
778
drhff78bd22002-02-27 01:47:11 +0000779finish_test