1*1da57d55SToomas Soome# 2c5c4113dSnw141292# 2002 February 26 3c5c4113dSnw141292# 4c5c4113dSnw141292# The author disclaims copyright to this source code. In place of 5c5c4113dSnw141292# a legal notice, here is a blessing: 6c5c4113dSnw141292# 7c5c4113dSnw141292# May you do good and not evil. 8c5c4113dSnw141292# May you find forgiveness for yourself and forgive others. 9c5c4113dSnw141292# May you share freely, never taking more than you give. 10c5c4113dSnw141292# 11c5c4113dSnw141292#*********************************************************************** 12c5c4113dSnw141292# This file implements regression tests for SQLite library. The 13c5c4113dSnw141292# focus of this file is testing VIEW statements. 14c5c4113dSnw141292# 15c5c4113dSnw141292# $Id: view.test,v 1.16.2.1 2004/07/20 00:20:47 drh Exp $ 16c5c4113dSnw141292set testdir [file dirname $argv0] 17c5c4113dSnw141292source $testdir/tester.tcl 18c5c4113dSnw141292 19c5c4113dSnw141292do_test view-1.0 { 20c5c4113dSnw141292 execsql { 21c5c4113dSnw141292 CREATE TABLE t1(a,b,c); 22c5c4113dSnw141292 INSERT INTO t1 VALUES(1,2,3); 23c5c4113dSnw141292 INSERT INTO t1 VALUES(4,5,6); 24c5c4113dSnw141292 INSERT INTO t1 VALUES(7,8,9); 25c5c4113dSnw141292 SELECT * FROM t1; 26c5c4113dSnw141292 } 27c5c4113dSnw141292} {1 2 3 4 5 6 7 8 9} 28c5c4113dSnw141292 29c5c4113dSnw141292do_test view-1.1 { 30c5c4113dSnw141292 execsql { 31c5c4113dSnw141292 BEGIN; 32c5c4113dSnw141292 CREATE VIEW v1 AS SELECT a,b FROM t1; 33c5c4113dSnw141292 SELECT * FROM v1 ORDER BY a; 34c5c4113dSnw141292 } 35c5c4113dSnw141292} {1 2 4 5 7 8} 36c5c4113dSnw141292do_test view-1.2 { 37c5c4113dSnw141292 catchsql { 38c5c4113dSnw141292 ROLLBACK; 39c5c4113dSnw141292 SELECT * FROM v1 ORDER BY a; 40c5c4113dSnw141292 } 41c5c4113dSnw141292} {1 {no such table: v1}} 42c5c4113dSnw141292do_test view-1.3 { 43c5c4113dSnw141292 execsql { 44c5c4113dSnw141292 CREATE VIEW v1 AS SELECT a,b FROM t1; 45c5c4113dSnw141292 SELECT * FROM v1 ORDER BY a; 46c5c4113dSnw141292 } 47c5c4113dSnw141292} {1 2 4 5 7 8} 48c5c4113dSnw141292do_test view-1.3.1 { 49c5c4113dSnw141292 db close 50c5c4113dSnw141292 sqlite db test.db 51c5c4113dSnw141292 execsql { 52c5c4113dSnw141292 SELECT * FROM v1 ORDER BY a; 53c5c4113dSnw141292 } 54c5c4113dSnw141292} {1 2 4 5 7 8} 55c5c4113dSnw141292do_test view-1.4 { 56c5c4113dSnw141292 catchsql { 57c5c4113dSnw141292 DROP VIEW v1; 58c5c4113dSnw141292 SELECT * FROM v1 ORDER BY a; 59c5c4113dSnw141292 } 60c5c4113dSnw141292} {1 {no such table: v1}} 61c5c4113dSnw141292do_test view-1.5 { 62c5c4113dSnw141292 execsql { 63c5c4113dSnw141292 CREATE VIEW v1 AS SELECT a,b FROM t1; 64c5c4113dSnw141292 SELECT * FROM v1 ORDER BY a; 65c5c4113dSnw141292 } 66c5c4113dSnw141292} {1 2 4 5 7 8} 67c5c4113dSnw141292do_test view-1.6 { 68c5c4113dSnw141292 catchsql { 69c5c4113dSnw141292 DROP TABLE t1; 70c5c4113dSnw141292 SELECT * FROM v1 ORDER BY a; 71c5c4113dSnw141292 } 72c5c4113dSnw141292} {1 {no such table: main.t1}} 73c5c4113dSnw141292do_test view-1.7 { 74c5c4113dSnw141292 execsql { 75c5c4113dSnw141292 CREATE TABLE t1(x,a,b,c); 76c5c4113dSnw141292 INSERT INTO t1 VALUES(1,2,3,4); 77c5c4113dSnw141292 INSERT INTO t1 VALUES(4,5,6,7); 78c5c4113dSnw141292 INSERT INTO t1 VALUES(7,8,9,10); 79c5c4113dSnw141292 SELECT * FROM v1 ORDER BY a; 80c5c4113dSnw141292 } 81c5c4113dSnw141292} {2 3 5 6 8 9} 82c5c4113dSnw141292do_test view-1.8 { 83c5c4113dSnw141292 db close 84c5c4113dSnw141292 sqlite db test.db 85c5c4113dSnw141292 execsql { 86c5c4113dSnw141292 SELECT * FROM v1 ORDER BY a; 87c5c4113dSnw141292 } 88c5c4113dSnw141292} {2 3 5 6 8 9} 89c5c4113dSnw141292 90c5c4113dSnw141292do_test view-2.1 { 91c5c4113dSnw141292 execsql { 92c5c4113dSnw141292 CREATE VIEW v2 AS SELECT * FROM t1 WHERE a>5 93c5c4113dSnw141292 }; # No semicolon 94c5c4113dSnw141292 execsql2 { 95c5c4113dSnw141292 SELECT * FROM v2; 96c5c4113dSnw141292 } 97c5c4113dSnw141292} {x 7 a 8 b 9 c 10} 98c5c4113dSnw141292do_test view-2.2 { 99c5c4113dSnw141292 catchsql { 100c5c4113dSnw141292 INSERT INTO v2 VALUES(1,2,3,4); 101c5c4113dSnw141292 } 102c5c4113dSnw141292} {1 {cannot modify v2 because it is a view}} 103c5c4113dSnw141292do_test view-2.3 { 104c5c4113dSnw141292 catchsql { 105c5c4113dSnw141292 UPDATE v2 SET a=10 WHERE a=5; 106c5c4113dSnw141292 } 107c5c4113dSnw141292} {1 {cannot modify v2 because it is a view}} 108c5c4113dSnw141292do_test view-2.4 { 109c5c4113dSnw141292 catchsql { 110c5c4113dSnw141292 DELETE FROM v2; 111c5c4113dSnw141292 } 112c5c4113dSnw141292} {1 {cannot modify v2 because it is a view}} 113c5c4113dSnw141292do_test view-2.5 { 114c5c4113dSnw141292 execsql { 115c5c4113dSnw141292 INSERT INTO t1 VALUES(11,12,13,14); 116c5c4113dSnw141292 SELECT * FROM v2 ORDER BY x; 117c5c4113dSnw141292 } 118c5c4113dSnw141292} {7 8 9 10 11 12 13 14} 119c5c4113dSnw141292do_test view-2.6 { 120c5c4113dSnw141292 execsql { 121c5c4113dSnw141292 SELECT x FROM v2 WHERE a>10 122c5c4113dSnw141292 } 123c5c4113dSnw141292} {11} 124c5c4113dSnw141292 125c5c4113dSnw141292# Test that column name of views are generated correctly. 126c5c4113dSnw141292# 127c5c4113dSnw141292do_test view-3.1 { 128c5c4113dSnw141292 execsql2 { 129c5c4113dSnw141292 SELECT * FROM v1 LIMIT 1 130c5c4113dSnw141292 } 131c5c4113dSnw141292} {a 2 b 3} 132c5c4113dSnw141292do_test view-3.2 { 133c5c4113dSnw141292 execsql2 { 134c5c4113dSnw141292 SELECT * FROM v2 LIMIT 1 135c5c4113dSnw141292 } 136c5c4113dSnw141292} {x 7 a 8 b 9 c 10} 137c5c4113dSnw141292do_test view-3.3 { 138c5c4113dSnw141292 execsql2 { 139c5c4113dSnw141292 DROP VIEW v1; 140c5c4113dSnw141292 CREATE VIEW v1 AS SELECT a AS 'xyz', b+c AS 'pqr', c-b FROM t1; 141c5c4113dSnw141292 SELECT * FROM v1 LIMIT 1 142c5c4113dSnw141292 } 143c5c4113dSnw141292} {xyz 2 pqr 7 c-b 1} 144c5c4113dSnw141292do_test view-3.4 { 145c5c4113dSnw141292 execsql2 { 146c5c4113dSnw141292 CREATE VIEW v3 AS SELECT a FROM t1 UNION SELECT b FROM t1 ORDER BY b; 147c5c4113dSnw141292 SELECT * FROM v3 LIMIT 4; 148c5c4113dSnw141292 } 149c5c4113dSnw141292} {b 2 b 3 b 5 b 6} 150c5c4113dSnw141292do_test view-3.5 { 151c5c4113dSnw141292 execsql2 { 152c5c4113dSnw141292 CREATE VIEW v4 AS 153c5c4113dSnw141292 SELECT a, b FROM t1 154c5c4113dSnw141292 UNION 155c5c4113dSnw141292 SELECT b AS 'x', a AS 'y' FROM t1 156c5c4113dSnw141292 ORDER BY x, y; 157c5c4113dSnw141292 SELECT y FROM v4 ORDER BY y LIMIT 4; 158c5c4113dSnw141292 } 159c5c4113dSnw141292} {y 2 y 3 y 5 y 6} 160c5c4113dSnw141292 161c5c4113dSnw141292 162c5c4113dSnw141292do_test view-4.1 { 163c5c4113dSnw141292 catchsql { 164c5c4113dSnw141292 DROP VIEW t1; 165c5c4113dSnw141292 } 166c5c4113dSnw141292} {1 {use DROP TABLE to delete table t1}} 167c5c4113dSnw141292do_test view-4.2 { 168c5c4113dSnw141292 execsql { 169c5c4113dSnw141292 SELECT 1 FROM t1 LIMIT 1; 170c5c4113dSnw141292 } 171c5c4113dSnw141292} 1 172c5c4113dSnw141292do_test view-4.3 { 173c5c4113dSnw141292 catchsql { 174c5c4113dSnw141292 DROP TABLE v1; 175c5c4113dSnw141292 } 176c5c4113dSnw141292} {1 {use DROP VIEW to delete view v1}} 177c5c4113dSnw141292do_test view-4.4 { 178c5c4113dSnw141292 execsql { 179c5c4113dSnw141292 SELECT 1 FROM v1 LIMIT 1; 180c5c4113dSnw141292 } 181c5c4113dSnw141292} {1} 182c5c4113dSnw141292do_test view-4.5 { 183c5c4113dSnw141292 catchsql { 184c5c4113dSnw141292 CREATE INDEX i1v1 ON v1(xyz); 185c5c4113dSnw141292 } 186c5c4113dSnw141292} {1 {views may not be indexed}} 187c5c4113dSnw141292 188c5c4113dSnw141292do_test view-5.1 { 189c5c4113dSnw141292 execsql { 190c5c4113dSnw141292 CREATE TABLE t2(y,a); 191c5c4113dSnw141292 INSERT INTO t2 VALUES(22,2); 192c5c4113dSnw141292 INSERT INTO t2 VALUES(33,3); 193c5c4113dSnw141292 INSERT INTO t2 VALUES(44,4); 194c5c4113dSnw141292 INSERT INTO t2 VALUES(55,5); 195c5c4113dSnw141292 SELECT * FROM t2; 196c5c4113dSnw141292 } 197c5c4113dSnw141292} {22 2 33 3 44 4 55 5} 198c5c4113dSnw141292do_test view-5.2 { 199c5c4113dSnw141292 execsql { 200c5c4113dSnw141292 CREATE VIEW v5 AS 201c5c4113dSnw141292 SELECT t1.x AS v, t2.y AS w FROM t1 JOIN t2 USING(a); 202c5c4113dSnw141292 SELECT * FROM v5; 203c5c4113dSnw141292 } 204c5c4113dSnw141292} {1 22 4 55} 205c5c4113dSnw141292 206c5c4113dSnw141292# Verify that the view v5 gets flattened. see sqliteFlattenSubquery(). 207c5c4113dSnw141292# Ticket #272 208c5c4113dSnw141292do_test view-5.3 { 209c5c4113dSnw141292 lsearch [execsql { 210c5c4113dSnw141292 EXPLAIN SELECT * FROM v5; 211c5c4113dSnw141292 }] OpenTemp 212c5c4113dSnw141292} {-1} 213c5c4113dSnw141292do_test view-5.4 { 214c5c4113dSnw141292 execsql { 215c5c4113dSnw141292 SELECT * FROM v5 AS a, t2 AS b WHERE a.w=b.y; 216c5c4113dSnw141292 } 217c5c4113dSnw141292} {1 22 22 2 4 55 55 5} 218c5c4113dSnw141292do_test view-5.5 { 219c5c4113dSnw141292 lsearch [execsql { 220c5c4113dSnw141292 EXPLAIN SELECT * FROM v5 AS a, t2 AS b WHERE a.w=b.y; 221c5c4113dSnw141292 }] OpenTemp 222c5c4113dSnw141292} {-1} 223c5c4113dSnw141292do_test view-5.6 { 224c5c4113dSnw141292 execsql { 225c5c4113dSnw141292 SELECT * FROM t2 AS b, v5 AS a WHERE a.w=b.y; 226c5c4113dSnw141292 } 227c5c4113dSnw141292} {22 2 1 22 55 5 4 55} 228c5c4113dSnw141292do_test view-5.7 { 229c5c4113dSnw141292 lsearch [execsql { 230c5c4113dSnw141292 EXPLAIN SELECT * FROM t2 AS b, v5 AS a WHERE a.w=b.y; 231c5c4113dSnw141292 }] OpenTemp 232c5c4113dSnw141292} {-1} 233c5c4113dSnw141292do_test view-5.8 { 234c5c4113dSnw141292 execsql { 235c5c4113dSnw141292 SELECT * FROM t1 AS a, v5 AS b, t2 AS c WHERE a.x=b.v AND b.w=c.y; 236c5c4113dSnw141292 } 237c5c4113dSnw141292} {1 2 3 4 1 22 22 2 4 5 6 7 4 55 55 5} 238c5c4113dSnw141292do_test view-5.9 { 239c5c4113dSnw141292 lsearch [execsql { 240c5c4113dSnw141292 EXPLAIN SELECT * FROM t1 AS a, v5 AS b, t2 AS c WHERE a.x=b.v AND b.w=c.y; 241c5c4113dSnw141292 }] OpenTemp 242c5c4113dSnw141292} {-1} 243c5c4113dSnw141292 244c5c4113dSnw141292do_test view-6.1 { 245c5c4113dSnw141292 execsql { 246c5c4113dSnw141292 SELECT min(x), min(a), min(b), min(c), min(a+b+c) FROM v2; 247c5c4113dSnw141292 } 248c5c4113dSnw141292} {7 8 9 10 27} 249c5c4113dSnw141292do_test view-6.2 { 250c5c4113dSnw141292 execsql { 251c5c4113dSnw141292 SELECT max(x), max(a), max(b), max(c), max(a+b+c) FROM v2; 252c5c4113dSnw141292 } 253c5c4113dSnw141292} {11 12 13 14 39} 254c5c4113dSnw141292 255c5c4113dSnw141292do_test view-7.1 { 256c5c4113dSnw141292 execsql { 257c5c4113dSnw141292 CREATE TABLE test1(id integer primary key, a); 258c5c4113dSnw141292 CREATE TABLE test2(id integer, b); 259c5c4113dSnw141292 INSERT INTO test1 VALUES(1,2); 260c5c4113dSnw141292 INSERT INTO test2 VALUES(1,3); 261c5c4113dSnw141292 CREATE VIEW test AS 262c5c4113dSnw141292 SELECT test1.id, a, b 263c5c4113dSnw141292 FROM test1 JOIN test2 ON test2.id=test1.id; 264c5c4113dSnw141292 SELECT * FROM test; 265c5c4113dSnw141292 } 266c5c4113dSnw141292} {1 2 3} 267c5c4113dSnw141292do_test view-7.2 { 268c5c4113dSnw141292 db close 269c5c4113dSnw141292 sqlite db test.db 270c5c4113dSnw141292 execsql { 271c5c4113dSnw141292 SELECT * FROM test; 272c5c4113dSnw141292 } 273c5c4113dSnw141292} {1 2 3} 274c5c4113dSnw141292do_test view-7.3 { 275c5c4113dSnw141292 execsql { 276c5c4113dSnw141292 DROP VIEW test; 277c5c4113dSnw141292 CREATE VIEW test AS 278c5c4113dSnw141292 SELECT test1.id, a, b 279c5c4113dSnw141292 FROM test1 JOIN test2 USING(id); 280c5c4113dSnw141292 SELECT * FROM test; 281c5c4113dSnw141292 } 282c5c4113dSnw141292} {1 2 3} 283c5c4113dSnw141292do_test view-7.4 { 284c5c4113dSnw141292 db close 285c5c4113dSnw141292 sqlite db test.db 286c5c4113dSnw141292 execsql { 287c5c4113dSnw141292 SELECT * FROM test; 288c5c4113dSnw141292 } 289c5c4113dSnw141292} {1 2 3} 290c5c4113dSnw141292do_test view-7.5 { 291c5c4113dSnw141292 execsql { 292c5c4113dSnw141292 DROP VIEW test; 293c5c4113dSnw141292 CREATE VIEW test AS 294c5c4113dSnw141292 SELECT test1.id, a, b 295c5c4113dSnw141292 FROM test1 NATURAL JOIN test2; 296c5c4113dSnw141292 SELECT * FROM test; 297c5c4113dSnw141292 } 298c5c4113dSnw141292} {1 2 3} 299c5c4113dSnw141292do_test view-7.6 { 300c5c4113dSnw141292 db close 301c5c4113dSnw141292 sqlite db test.db 302c5c4113dSnw141292 execsql { 303c5c4113dSnw141292 SELECT * FROM test; 304c5c4113dSnw141292 } 305c5c4113dSnw141292} {1 2 3} 306c5c4113dSnw141292 307c5c4113dSnw141292do_test view-8.1 { 308c5c4113dSnw141292 execsql { 309c5c4113dSnw141292 CREATE VIEW v6 AS SELECT pqr, xyz FROM v1; 310c5c4113dSnw141292 SELECT * FROM v6 ORDER BY xyz; 311c5c4113dSnw141292 } 312c5c4113dSnw141292} {7 2 13 5 19 8 27 12} 313c5c4113dSnw141292do_test view-8.2 { 314c5c4113dSnw141292 db close 315c5c4113dSnw141292 sqlite db test.db 316c5c4113dSnw141292 execsql { 317c5c4113dSnw141292 SELECT * FROM v6 ORDER BY xyz; 318c5c4113dSnw141292 } 319c5c4113dSnw141292} {7 2 13 5 19 8 27 12} 320c5c4113dSnw141292do_test view-8.3 { 321c5c4113dSnw141292 execsql { 322c5c4113dSnw141292 CREATE VIEW v7 AS SELECT pqr+xyz AS a FROM v6; 323c5c4113dSnw141292 SELECT * FROM v7 ORDER BY a; 324c5c4113dSnw141292 } 325c5c4113dSnw141292} {9 18 27 39} 326c5c4113dSnw141292do_test view-8.4 { 327c5c4113dSnw141292 execsql { 328c5c4113dSnw141292 CREATE VIEW v8 AS SELECT max(cnt) AS mx FROM 329c5c4113dSnw141292 (SELECT a%2 AS eo, count(*) AS cnt FROM t1 GROUP BY eo); 330c5c4113dSnw141292 SELECT * FROM v8; 331c5c4113dSnw141292 } 332c5c4113dSnw141292} 3 333c5c4113dSnw141292do_test view-8.5 { 334c5c4113dSnw141292 execsql { 335c5c4113dSnw141292 SELECT mx+10, mx*2 FROM v8; 336c5c4113dSnw141292 } 337c5c4113dSnw141292} {13 6} 338c5c4113dSnw141292do_test view-8.6 { 339c5c4113dSnw141292 execsql { 340c5c4113dSnw141292 SELECT mx+10, pqr FROM v6, v8 WHERE xyz=2; 341c5c4113dSnw141292 } 342c5c4113dSnw141292} {13 7} 343c5c4113dSnw141292do_test view-8.7 { 344c5c4113dSnw141292 execsql { 345c5c4113dSnw141292 SELECT mx+10, pqr FROM v6, v8 WHERE xyz>2; 346c5c4113dSnw141292 } 347c5c4113dSnw141292} {13 13 13 19 13 27} 348c5c4113dSnw141292 349c5c4113dSnw141292# Tests for a bug found by Michiel de Wit involving ORDER BY in a VIEW. 350c5c4113dSnw141292# 351c5c4113dSnw141292do_test view-9.1 { 352c5c4113dSnw141292 execsql { 353c5c4113dSnw141292 INSERT INTO t2 SELECT * FROM t2 WHERE a<5; 354c5c4113dSnw141292 INSERT INTO t2 SELECT * FROM t2 WHERE a<4; 355c5c4113dSnw141292 INSERT INTO t2 SELECT * FROM t2 WHERE a<3; 356c5c4113dSnw141292 SELECT DISTINCT count(*) FROM t2 GROUP BY a ORDER BY 1; 357c5c4113dSnw141292 } 358c5c4113dSnw141292} {1 2 4 8} 359c5c4113dSnw141292do_test view-9.2 { 360c5c4113dSnw141292 execsql { 361c5c4113dSnw141292 SELECT DISTINCT count(*) FROM t2 GROUP BY a ORDER BY 1 LIMIT 3; 362c5c4113dSnw141292 } 363c5c4113dSnw141292} {1 2 4} 364c5c4113dSnw141292do_test view-9.3 { 365c5c4113dSnw141292 execsql { 366c5c4113dSnw141292 CREATE VIEW v9 AS 367c5c4113dSnw141292 SELECT DISTINCT count(*) FROM t2 GROUP BY a ORDER BY 1 LIMIT 3; 368c5c4113dSnw141292 SELECT * FROM v9; 369c5c4113dSnw141292 } 370c5c4113dSnw141292} {1 2 4} 371c5c4113dSnw141292do_test view-9.4 { 372c5c4113dSnw141292 execsql { 373c5c4113dSnw141292 SELECT * FROM v9 ORDER BY 1 DESC; 374c5c4113dSnw141292 } 375c5c4113dSnw141292} {4 2 1} 376c5c4113dSnw141292do_test view-9.5 { 377c5c4113dSnw141292 execsql { 378c5c4113dSnw141292 CREATE VIEW v10 AS 379c5c4113dSnw141292 SELECT DISTINCT a, count(*) FROM t2 GROUP BY a ORDER BY 2 LIMIT 3; 380c5c4113dSnw141292 SELECT * FROM v10; 381c5c4113dSnw141292 } 382c5c4113dSnw141292} {5 1 4 2 3 4} 383c5c4113dSnw141292do_test view-9.6 { 384c5c4113dSnw141292 execsql { 385c5c4113dSnw141292 SELECT * FROM v10 ORDER BY 1; 386c5c4113dSnw141292 } 387c5c4113dSnw141292} {3 4 4 2 5 1} 388c5c4113dSnw141292 389c5c4113dSnw141292# Tables with columns having peculiar quoted names used in views 390c5c4113dSnw141292# Ticket #756. 391c5c4113dSnw141292# 392c5c4113dSnw141292do_test view-10.1 { 393c5c4113dSnw141292 execsql { 394c5c4113dSnw141292 CREATE TABLE t3("9" integer, [4] text); 395c5c4113dSnw141292 INSERT INTO t3 VALUES(1,2); 396c5c4113dSnw141292 CREATE VIEW v_t3_a AS SELECT a.[9] FROM t3 AS a; 397c5c4113dSnw141292 CREATE VIEW v_t3_b AS SELECT "4" FROM t3; 398c5c4113dSnw141292 SELECT * FROM v_t3_a; 399c5c4113dSnw141292 } 400c5c4113dSnw141292} {1} 401c5c4113dSnw141292do_test view-10.2 { 402c5c4113dSnw141292 execsql { 403c5c4113dSnw141292 SELECT * FROM v_t3_b; 404c5c4113dSnw141292 } 405c5c4113dSnw141292} {2} 406c5c4113dSnw141292 407c5c4113dSnw141292 408c5c4113dSnw141292finish_test 409