OLD | NEW |
(Empty) | |
| 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-21739-51207 -- 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 |
OLD | NEW |