1: # 2010 November 30
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: #
12: # This file implements tests to verify that the "testable statements" in
13: # the lang_dropview.html document are correct.
14: #
15:
16: set testdir [file dirname $argv0]
17: source $testdir/tester.tcl
18: set ::testprefix e_dropview
19:
20: proc dropview_reopen_db {} {
21: db close
22: forcedelete test.db test.db2
23: sqlite3 db test.db
24:
25: db eval {
26: ATTACH 'test.db2' AS aux;
27: CREATE TABLE t1(a, b);
28: INSERT INTO t1 VALUES('a main', 'b main');
29: CREATE VIEW v1 AS SELECT * FROM t1;
30: CREATE VIEW v2 AS SELECT * FROM t1;
31:
32: CREATE TEMP TABLE t1(a, b);
33: INSERT INTO temp.t1 VALUES('a temp', 'b temp');
34: CREATE VIEW temp.v1 AS SELECT * FROM t1;
35:
36: CREATE TABLE aux.t1(a, b);
37: INSERT INTO aux.t1 VALUES('a aux', 'b aux');
38: CREATE VIEW aux.v1 AS SELECT * FROM t1;
39: CREATE VIEW aux.v2 AS SELECT * FROM t1;
40: CREATE VIEW aux.v3 AS SELECT * FROM t1;
41: }
42: }
43:
44: proc list_all_views {{db db}} {
45: set res [list]
46: $db eval { PRAGMA database_list } {
47: set tbl "$name.sqlite_master"
48: if {$name == "temp"} { set tbl sqlite_temp_master }
49:
50: set sql "SELECT '$name.' || name FROM $tbl WHERE type = 'view'"
51: lappend res {*}[$db eval $sql]
52: }
53: set res
54: }
55:
56: proc list_all_data {{db db}} {
57: set res [list]
58: $db eval { PRAGMA database_list } {
59: set tbl "$name.sqlite_master"
60: if {$name == "temp"} { set tbl sqlite_temp_master }
61:
62: db eval "SELECT '$name.' || name AS x FROM $tbl WHERE type = 'table'" {
63: lappend res [list $x [db eval "SELECT * FROM $x"]]
64: }
65: }
66: set res
67: }
68:
69: proc do_dropview_tests {nm args} {
70: uplevel do_select_tests $nm $args
71: }
72:
73: # EVIDENCE-OF: R-53136-36436 -- syntax diagram drop-view-stmt
74: #
75: # All paths in the syntax diagram for DROP VIEW are tested by tests 1.*.
76: #
77: do_dropview_tests 1 -repair {
78: dropview_reopen_db
79: } -tclquery {
80: list_all_views
81: } {
82: 1 "DROP VIEW v1" {main.v1 main.v2 aux.v1 aux.v2 aux.v3}
83: 2 "DROP VIEW v2" {main.v1 temp.v1 aux.v1 aux.v2 aux.v3}
84: 3 "DROP VIEW main.v1" {main.v2 temp.v1 aux.v1 aux.v2 aux.v3}
85: 4 "DROP VIEW main.v2" {main.v1 temp.v1 aux.v1 aux.v2 aux.v3}
86: 5 "DROP VIEW IF EXISTS v1" {main.v1 main.v2 aux.v1 aux.v2 aux.v3}
87: 6 "DROP VIEW IF EXISTS v2" {main.v1 temp.v1 aux.v1 aux.v2 aux.v3}
88: 7 "DROP VIEW IF EXISTS main.v1" {main.v2 temp.v1 aux.v1 aux.v2 aux.v3}
89: 8 "DROP VIEW IF EXISTS main.v2" {main.v1 temp.v1 aux.v1 aux.v2 aux.v3}
90: }
91:
92: # EVIDENCE-OF: R-27002-52307 The DROP VIEW statement removes a view
93: # created by the CREATE VIEW statement.
94: #
95: dropview_reopen_db
96: do_execsql_test 2.1 {
97: CREATE VIEW "new view" AS SELECT * FROM t1 AS x, t1 AS y;
98: SELECT * FROM "new view";
99: } {{a main} {b main} {a main} {b main}}
100: do_execsql_test 2.2 {;
101: SELECT * FROM sqlite_master WHERE name = 'new view';
102: } {
103: view {new view} {new view} 0
104: {CREATE VIEW "new view" AS SELECT * FROM t1 AS x, t1 AS y}
105: }
106: do_execsql_test 2.3 {
107: DROP VIEW "new view";
108: SELECT * FROM sqlite_master WHERE name = 'new view';
109: } {}
110: do_catchsql_test 2.4 {
111: SELECT * FROM "new view"
112: } {1 {no such table: new view}}
113:
114: # EVIDENCE-OF: R-00359-41639 The view definition is removed from the
115: # database schema, but no actual data in the underlying base tables is
116: # modified.
117: #
118: # For each view in the database, check that it can be queried. Then drop
119: # it. Check that it can no longer be queried and is no longer listed
120: # in any schema table. Then check that the contents of the db tables have
121: # not changed
122: #
123: set databasedata [list_all_data]
124:
125: do_execsql_test 3.1.0 { SELECT * FROM temp.v1 } {{a temp} {b temp}}
126: do_execsql_test 3.1.1 { DROP VIEW temp.v1 } {}
127: do_catchsql_test 3.1.2 { SELECT * FROM temp.v1 } {1 {no such table: temp.v1}}
128: do_test 3.1.3 { list_all_views } {main.v1 main.v2 aux.v1 aux.v2 aux.v3}
129: do_test 3.1.4 { list_all_data } $databasedata
130:
131: do_execsql_test 3.2.0 { SELECT * FROM v1 } {{a main} {b main}}
132: do_execsql_test 3.2.1 { DROP VIEW v1 } {}
133: do_catchsql_test 3.2.2 { SELECT * FROM main.v1 } {1 {no such table: main.v1}}
134: do_test 3.2.3 { list_all_views } {main.v2 aux.v1 aux.v2 aux.v3}
135: do_test 3.2.4 { list_all_data } $databasedata
136:
137: do_execsql_test 3.3.0 { SELECT * FROM v2 } {{a main} {b main}}
138: do_execsql_test 3.3.1 { DROP VIEW v2 } {}
139: do_catchsql_test 3.3.2 { SELECT * FROM main.v2 } {1 {no such table: main.v2}}
140: do_test 3.3.3 { list_all_views } {aux.v1 aux.v2 aux.v3}
141: do_test 3.3.4 { list_all_data } $databasedata
142:
143: do_execsql_test 3.4.0 { SELECT * FROM v1 } {{a aux} {b aux}}
144: do_execsql_test 3.4.1 { DROP VIEW v1 } {}
145: do_catchsql_test 3.4.2 { SELECT * FROM v1 } {1 {no such table: v1}}
146: do_test 3.4.3 { list_all_views } {aux.v2 aux.v3}
147: do_test 3.4.4 { list_all_data } $databasedata
148:
149: do_execsql_test 3.4.0 { SELECT * FROM aux.v2 } {{a aux} {b aux}}
150: do_execsql_test 3.4.1 { DROP VIEW aux.v2 } {}
151: do_catchsql_test 3.4.2 { SELECT * FROM aux.v2 } {1 {no such table: aux.v2}}
152: do_test 3.4.3 { list_all_views } {aux.v3}
153: do_test 3.4.4 { list_all_data } $databasedata
154:
155: do_execsql_test 3.5.0 { SELECT * FROM v3 } {{a aux} {b aux}}
156: do_execsql_test 3.5.1 { DROP VIEW v3 } {}
157: do_catchsql_test 3.5.2 { SELECT * FROM v3 } {1 {no such table: v3}}
158: do_test 3.5.3 { list_all_views } {}
159: do_test 3.5.4 { list_all_data } $databasedata
160:
161: # EVIDENCE-OF: R-25558-37487 If the specified view cannot be found and
162: # the IF EXISTS clause is not present, it is an error.
163: #
164: do_dropview_tests 4 -repair {
165: dropview_reopen_db
166: } -errorformat {
167: no such view: %s
168: } {
169: 1 "DROP VIEW xx" xx
170: 2 "DROP VIEW main.xx" main.xx
171: 3 "DROP VIEW temp.v2" temp.v2
172: }
173:
174: # EVIDENCE-OF: R-07490-32536 If the specified view cannot be found and
175: # an IF EXISTS clause is present in the DROP VIEW statement, then the
176: # statement is a no-op.
177: #
178: do_dropview_tests 5 -repair {
179: dropview_reopen_db
180: } -tclquery {
181: list_all_views
182: expr {[list_all_views] == "main.v1 main.v2 temp.v1 aux.v1 aux.v2 aux.v3"}
183: } {
184: 1 "DROP VIEW IF EXISTS xx" 1
185: 2 "DROP VIEW IF EXISTS main.xx" 1
186: 3 "DROP VIEW IF EXISTS temp.v2" 1
187: }
188:
189:
190:
191:
192: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>