123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- # 2010 November 30
- #
- # The author disclaims copyright to this source code. In place of
- # a legal notice, here is a blessing:
- #
- # May you do good and not evil.
- # May you find forgiveness for yourself and forgive others.
- # May you share freely, never taking more than you give.
- #
- #***********************************************************************
- #
- # This file implements tests to verify that the "testable statements" in
- # the lang_dropview.html document are correct.
- #
- set testdir [file dirname $argv0]
- source $testdir/tester.tcl
- set ::testprefix e_dropview
- proc dropview_reopen_db {} {
- db close
- forcedelete test.db test.db2
- sqlite3 db test.db
- db eval {
- ATTACH 'test.db2' AS aux;
- CREATE TABLE t1(a, b);
- INSERT INTO t1 VALUES('a main', 'b main');
- CREATE VIEW v1 AS SELECT * FROM t1;
- CREATE VIEW v2 AS SELECT * FROM t1;
- CREATE TEMP TABLE t1(a, b);
- INSERT INTO temp.t1 VALUES('a temp', 'b temp');
- CREATE VIEW temp.v1 AS SELECT * FROM t1;
- CREATE TABLE aux.t1(a, b);
- INSERT INTO aux.t1 VALUES('a aux', 'b aux');
- CREATE VIEW aux.v1 AS SELECT * FROM t1;
- CREATE VIEW aux.v2 AS SELECT * FROM t1;
- CREATE VIEW aux.v3 AS SELECT * FROM t1;
- }
- }
- proc list_all_views {{db db}} {
- set res [list]
- $db eval { PRAGMA database_list } {
- set tbl "$name.sqlite_master"
- if {$name == "temp"} { set tbl sqlite_temp_master }
- set sql "SELECT '$name.' || name FROM $tbl WHERE type = 'view'"
- lappend res {*}[$db eval $sql]
- }
- set res
- }
- proc list_all_data {{db db}} {
- set res [list]
- $db eval { PRAGMA database_list } {
- set tbl "$name.sqlite_master"
- if {$name == "temp"} { set tbl sqlite_temp_master }
- db eval "SELECT '$name.' || name AS x FROM $tbl WHERE type = 'table'" {
- lappend res [list $x [db eval "SELECT * FROM $x"]]
- }
- }
- set res
- }
- proc do_dropview_tests {nm args} {
- uplevel do_select_tests $nm $args
- }
- # -- syntax diagram drop-view-stmt
- #
- # All paths in the syntax diagram for DROP VIEW are tested by tests 1.*.
- #
- do_dropview_tests 1 -repair {
- dropview_reopen_db
- } -tclquery {
- list_all_views
- } {
- 1 "DROP VIEW v1" {main.v1 main.v2 aux.v1 aux.v2 aux.v3}
- 2 "DROP VIEW v2" {main.v1 temp.v1 aux.v1 aux.v2 aux.v3}
- 3 "DROP VIEW main.v1" {main.v2 temp.v1 aux.v1 aux.v2 aux.v3}
- 4 "DROP VIEW main.v2" {main.v1 temp.v1 aux.v1 aux.v2 aux.v3}
- 5 "DROP VIEW IF EXISTS v1" {main.v1 main.v2 aux.v1 aux.v2 aux.v3}
- 6 "DROP VIEW IF EXISTS v2" {main.v1 temp.v1 aux.v1 aux.v2 aux.v3}
- 7 "DROP VIEW IF EXISTS main.v1" {main.v2 temp.v1 aux.v1 aux.v2 aux.v3}
- 8 "DROP VIEW IF EXISTS main.v2" {main.v1 temp.v1 aux.v1 aux.v2 aux.v3}
- }
- # EVIDENCE-OF: R-27002-52307 The DROP VIEW statement removes a view
- # created by the CREATE VIEW statement.
- #
- dropview_reopen_db
- do_execsql_test 2.1 {
- CREATE VIEW "new view" AS SELECT * FROM t1 AS x, t1 AS y;
- SELECT * FROM "new view";
- } {{a main} {b main} {a main} {b main}}
- do_execsql_test 2.2 {;
- SELECT * FROM sqlite_master WHERE name = 'new view';
- } {
- view {new view} {new view} 0
- {CREATE VIEW "new view" AS SELECT * FROM t1 AS x, t1 AS y}
- }
- do_execsql_test 2.3 {
- DROP VIEW "new view";
- SELECT * FROM sqlite_master WHERE name = 'new view';
- } {}
- do_catchsql_test 2.4 {
- SELECT * FROM "new view"
- } {1 {no such table: new view}}
- # EVIDENCE-OF: R-00359-41639 The view definition is removed from the
- # database schema, but no actual data in the underlying base tables is
- # modified.
- #
- # For each view in the database, check that it can be queried. Then drop
- # it. Check that it can no longer be queried and is no longer listed
- # in any schema table. Then check that the contents of the db tables have
- # not changed
- #
- set databasedata [list_all_data]
- do_execsql_test 3.1.0 { SELECT * FROM temp.v1 } {{a temp} {b temp}}
- do_execsql_test 3.1.1 { DROP VIEW temp.v1 } {}
- do_catchsql_test 3.1.2 { SELECT * FROM temp.v1 } {1 {no such table: temp.v1}}
- do_test 3.1.3 { list_all_views } {main.v1 main.v2 aux.v1 aux.v2 aux.v3}
- do_test 3.1.4 { list_all_data } $databasedata
- do_execsql_test 3.2.0 { SELECT * FROM v1 } {{a main} {b main}}
- do_execsql_test 3.2.1 { DROP VIEW v1 } {}
- do_catchsql_test 3.2.2 { SELECT * FROM main.v1 } {1 {no such table: main.v1}}
- do_test 3.2.3 { list_all_views } {main.v2 aux.v1 aux.v2 aux.v3}
- do_test 3.2.4 { list_all_data } $databasedata
- do_execsql_test 3.3.0 { SELECT * FROM v2 } {{a main} {b main}}
- do_execsql_test 3.3.1 { DROP VIEW v2 } {}
- do_catchsql_test 3.3.2 { SELECT * FROM main.v2 } {1 {no such table: main.v2}}
- do_test 3.3.3 { list_all_views } {aux.v1 aux.v2 aux.v3}
- do_test 3.3.4 { list_all_data } $databasedata
- do_execsql_test 3.4.0 { SELECT * FROM v1 } {{a aux} {b aux}}
- do_execsql_test 3.4.1 { DROP VIEW v1 } {}
- do_catchsql_test 3.4.2 { SELECT * FROM v1 } {1 {no such table: v1}}
- do_test 3.4.3 { list_all_views } {aux.v2 aux.v3}
- do_test 3.4.4 { list_all_data } $databasedata
- do_execsql_test 3.4.0 { SELECT * FROM aux.v2 } {{a aux} {b aux}}
- do_execsql_test 3.4.1 { DROP VIEW aux.v2 } {}
- do_catchsql_test 3.4.2 { SELECT * FROM aux.v2 } {1 {no such table: aux.v2}}
- do_test 3.4.3 { list_all_views } {aux.v3}
- do_test 3.4.4 { list_all_data } $databasedata
- do_execsql_test 3.5.0 { SELECT * FROM v3 } {{a aux} {b aux}}
- do_execsql_test 3.5.1 { DROP VIEW v3 } {}
- do_catchsql_test 3.5.2 { SELECT * FROM v3 } {1 {no such table: v3}}
- do_test 3.5.3 { list_all_views } {}
- do_test 3.5.4 { list_all_data } $databasedata
- # EVIDENCE-OF: R-25558-37487 If the specified view cannot be found and
- # the IF EXISTS clause is not present, it is an error.
- #
- do_dropview_tests 4 -repair {
- dropview_reopen_db
- } -errorformat {
- no such view: %s
- } {
- 1 "DROP VIEW xx" xx
- 2 "DROP VIEW main.xx" main.xx
- 3 "DROP VIEW temp.v2" temp.v2
- }
- # EVIDENCE-OF: R-07490-32536 If the specified view cannot be found and
- # an IF EXISTS clause is present in the DROP VIEW statement, then the
- # statement is a no-op.
- #
- do_dropview_tests 5 -repair {
- dropview_reopen_db
- } -tclquery {
- list_all_views
- expr {[list_all_views] == "main.v1 main.v2 temp.v1 aux.v1 aux.v2 aux.v3"}
- } {
- 1 "DROP VIEW IF EXISTS xx" 1
- 2 "DROP VIEW IF EXISTS main.xx" 1
- 3 "DROP VIEW IF EXISTS temp.v2" 1
- }
- finish_test
|