------BEGIN PGP SIGNED MESSAGE-----
-Hash: SHA1
-
-C Fix\svarious\scompiler\swarnings.
-D 2010-11-26T16:49:59
+C Add\snew\stest\sfile\se_droptrigger.test.
+D 2010-11-29T12:06:45
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 4547616ad2286053af6ccccefa242dc925e49bf0
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
F test/distinctagg.test 1a6ef9c87a58669438fc771450d7a72577417376
F test/e_createtable.test b8f5286879315d5b7f4cc5ead1afda4846f0c0bb
F test/e_delete.test 55d868b647acc091c261a10b9b0cb0ab660a6acb
+F test/e_droptrigger.test 0b96c0df9b6390c728d9e15ff046419b678ddf44
F test/e_expr.test 4e004d1f5187d4bbc9ca3d55660a8d164dd59f4e
F test/e_fkey.test 38039b840ab19331000b0f0eb1d82baa7208a67a
F test/e_fts3.test 75bb0aee26384ef586165e21018a17f7cd843469
F test/fts2token.test d8070b241a15ff13592a9ae4a8b7c171af6f445a
F test/fts3.test 672a040ea57036fb4b6fdc09027c18d7d24ab654
F test/fts3_common.tcl 4d8eec9db565fed9098f45c378f28e1657802011
-F test/fts3aa.test 5327d4c1d9b6c61021696746cc9a6cdc5bf159c0
+F test/fts3aa.test 909d5f530d30a8e36b9328d67285eae6537c79c0
F test/fts3ab.test 09aeaa162aee6513d9ff336b6932211008b9d1f9
F test/fts3ac.test 636ed7486043055d4f126a0e385f2d5a82ebbf63
F test/fts3ad.test e40570cb6f74f059129ad48bcef3d7cbc20dda49
F test/mallocI.test a88c2b9627c8506bf4703d8397420043a786cdb6
F test/mallocJ.test b5d1839da331d96223e5f458856f8ffe1366f62e
F test/mallocK.test d79968641d1b70d88f6c01bdb9a7eb4a55582cc9
-F test/malloc_common.tcl 053003b3d925a4dbfd5159819a542266e5c8ed84
+F test/malloc_common.tcl 27087a2bfad8f695ca6f8b463ecac5d71b9b0712
F test/manydb.test b3d3bc4c25657e7f68d157f031eb4db7b3df0d3c
F test/memdb.test 0825155b2290e900264daaaf0334b6dfe69ea498
F test/memleak.test 10b9c6c57e19fc68c32941495e9ba1c50123f6e2
F test/tempdb.test 19d0f66e2e3eeffd68661a11c83ba5e6ace9128c
F test/temptable.test f42121a0d29a62f00f93274464164177ab1cc24a
F test/temptrigger.test b0273db072ce5f37cf19140ceb1f0d524bbe9f05
-F test/tester.tcl 45e8f7b56ef93c5c66886f1bbd05dda78d248d86
+F test/tester.tcl 0c8c0a7c4d5944026728f33a1c06e014b1648768
F test/thread001.test a3e6a7254d1cb057836cb3145b60c10bf5b7e60f
F test/thread002.test afd20095e6e845b405df4f2c920cb93301ca69db
F test/thread003.test b824d4f52b870ae39fc5bae4d8070eca73085dca
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P 3c3d076b42da36cd5413749ec022d0349325edfa
-R 6eb1d3796cc6e7f30b85a46219b5a41c
-U drh
-Z dad7028ef2a2e95ebd4d4284381d5339
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.6 (GNU/Linux)
-
-iD8DBQFM7+U6oxKgR168RlERArCCAJ9Ms95IkrYzcyhjnhaA4kTfC+owCwCdG6XU
-6RTdcghjuTo4XsP3zh0JwEk=
-=o/S3
------END PGP SIGNATURE-----
+P c412f61229b6ab1ac90b932afd56f7c5e3ba1cfe
+R f6821cb801bbf518113f282c058b1797
+U dan
+Z 0f3972e8a27cc6750e06c0fccb7d1885
-c412f61229b6ab1ac90b932afd56f7c5e3ba1cfe
\ No newline at end of file
+d23ef9b88c6705219e5138e50f0f351f6401c401
\ No newline at end of file
--- /dev/null
+# 2010 November 29
+#
+# 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_droptrigger.html document are correct.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+set ::testprefix e_createtable
+
+ifcapable !trigger { finish_test ; return }
+
+proc do_droptable_tests {nm args} {
+ uplevel do_select_tests [list e_createtable-$nm] $args
+}
+
+proc list_all_triggers {{db db}} {
+ set res [list]
+ $db eval { PRAGMA database_list } {
+ if {$name == "temp"} {
+ set tbl sqlite_temp_master
+ } else {
+ set tbl "$name.sqlite_master"
+ }
+ lappend res {*}[
+ db eval "SELECT '$name.' || name FROM $tbl WHERE type = 'trigger'"
+ ]
+ }
+ set res
+}
+
+
+proc droptrigger_reopen_db {{event INSERT}} {
+ db close
+ forcedelete test.db test.db2
+ sqlite3 db test.db
+
+ set ::triggers_fired [list]
+ proc r {x} { lappend ::triggers_fired $x }
+ db func r r
+
+ db eval "
+ ATTACH 'test.db2' AS aux;
+
+ CREATE TEMP TABLE t1(a, b);
+ INSERT INTO t1 VALUES('a', 'b');
+ CREATE TRIGGER tr1 AFTER $event ON t1 BEGIN SELECT r('temp.tr1') ; END;
+
+ CREATE TABLE t2(a, b);
+ INSERT INTO t2 VALUES('a', 'b');
+ CREATE TRIGGER tr1 BEFORE $event ON t2 BEGIN SELECT r('main.tr1') ; END;
+ CREATE TRIGGER tr2 AFTER $event ON t2 BEGIN SELECT r('main.tr2') ; END;
+
+ CREATE TABLE aux.t3(a, b);
+ INSERT INTO t3 VALUES('a', 'b');
+ CREATE TRIGGER aux.tr1 BEFORE $event ON t3 BEGIN SELECT r('aux.tr1') ; END;
+ CREATE TRIGGER aux.tr2 AFTER $event ON t3 BEGIN SELECT r('aux.tr2') ; END;
+ CREATE TRIGGER aux.tr3 AFTER $event ON t3 BEGIN SELECT r('aux.tr3') ; END;
+ "
+}
+
+
+# EVIDENCE-OF: R-52650-16855 -- syntax diagram drop-trigger-stmt
+#
+do_droptable_tests 1.1 -repair {
+ droptrigger_reopen_db
+} -tclquery {
+ list_all_triggers
+} {
+ 1 "DROP TRIGGER main.tr1"
+ {main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
+ 2 "DROP TRIGGER IF EXISTS main.tr1"
+ {main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
+ 3 "DROP TRIGGER tr1"
+ {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
+ 4 "DROP TRIGGER IF EXISTS tr1"
+ {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
+
+ 5 "DROP TRIGGER aux.tr1"
+ {main.tr1 main.tr2 temp.tr1 aux.tr2 aux.tr3}
+ 6 "DROP TRIGGER IF EXISTS aux.tr1"
+ {main.tr1 main.tr2 temp.tr1 aux.tr2 aux.tr3}
+
+ 7 "DROP TRIGGER IF EXISTS aux.xxx"
+ {main.tr1 main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
+ 8 "DROP TRIGGER IF EXISTS aux.xxx"
+ {main.tr1 main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
+}
+
+# EVIDENCE-OF: R-61172-15671 The DROP TRIGGER statement removes a
+# trigger created by the CREATE TRIGGER statement.
+#
+foreach {tn tbl droptrigger before after} {
+ 1 t1 "DROP TRIGGER tr1" {temp.tr1} {}
+ 2 t2 "DROP TRIGGER tr1" {main.tr1 main.tr2} {main.tr1 main.tr2}
+ 3 t3 "DROP TRIGGER tr1" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
+
+ 4 t1 "DROP TRIGGER tr2" {temp.tr1} {temp.tr1}
+ 5 t2 "DROP TRIGGER tr2" {main.tr1 main.tr2} {main.tr1}
+ 6 t3 "DROP TRIGGER tr2" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
+
+ 7 t1 "DROP TRIGGER tr3" {temp.tr1} {temp.tr1}
+ 8 t2 "DROP TRIGGER tr3" {main.tr1 main.tr2} {main.tr1 main.tr2}
+ 9 t3 "DROP TRIGGER tr3" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr2}
+} {
+
+ do_test 2.$tn.1 {
+ droptrigger_reopen_db
+ execsql " INSERT INTO $tbl VALUES('1', '2') "
+ set ::triggers_fired
+ } $before
+
+ do_test 2.$tn.2 {
+ droptrigger_reopen_db
+ execsql $droptrigger
+ execsql " INSERT INTO $tbl VALUES('1', '2') "
+ set ::triggers_fired
+ } $after
+}
+
+# EVIDENCE-OF: R-50239-29811 Once removed, the trigger definition is no
+# longer present in the sqlite_master (or sqlite_temp_master) table and
+# is not fired by any subsequent INSERT, UPDATE or DELETE statements.
+#
+# Test cases e_droptrigger-1.* test the first part of this statement
+# (that dropped triggers do not appear in the schema table), and tests
+# droptrigger-2.* test that dropped triggers are not fired by INSERT
+# statements. The following tests verify that they are not fired by
+# UPDATE or DELETE statements.
+#
+foreach {tn tbl droptrigger before after} {
+ 1 t1 "DROP TRIGGER tr1" {temp.tr1} {}
+ 2 t2 "DROP TRIGGER tr1" {main.tr1 main.tr2} {main.tr1 main.tr2}
+ 3 t3 "DROP TRIGGER tr1" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
+
+ 4 t1 "DROP TRIGGER tr2" {temp.tr1} {temp.tr1}
+ 5 t2 "DROP TRIGGER tr2" {main.tr1 main.tr2} {main.tr1}
+ 6 t3 "DROP TRIGGER tr2" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
+
+ 7 t1 "DROP TRIGGER tr3" {temp.tr1} {temp.tr1}
+ 8 t2 "DROP TRIGGER tr3" {main.tr1 main.tr2} {main.tr1 main.tr2}
+ 9 t3 "DROP TRIGGER tr3" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr2}
+} {
+
+ do_test 3.1.$tn.1 {
+ droptrigger_reopen_db UPDATE
+ execsql "UPDATE $tbl SET a = 'abc'"
+ set ::triggers_fired
+ } $before
+
+ do_test 3.1.$tn.2 {
+ droptrigger_reopen_db UPDATE
+ execsql $droptrigger
+ execsql "UPDATE $tbl SET a = 'abc'"
+ set ::triggers_fired
+ } $after
+}
+foreach {tn tbl droptrigger before after} {
+ 1 t1 "DROP TRIGGER tr1" {temp.tr1} {}
+ 2 t2 "DROP TRIGGER tr1" {main.tr1 main.tr2} {main.tr1 main.tr2}
+ 3 t3 "DROP TRIGGER tr1" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
+
+ 4 t1 "DROP TRIGGER tr2" {temp.tr1} {temp.tr1}
+ 5 t2 "DROP TRIGGER tr2" {main.tr1 main.tr2} {main.tr1}
+ 6 t3 "DROP TRIGGER tr2" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
+
+ 7 t1 "DROP TRIGGER tr3" {temp.tr1} {temp.tr1}
+ 8 t2 "DROP TRIGGER tr3" {main.tr1 main.tr2} {main.tr1 main.tr2}
+ 9 t3 "DROP TRIGGER tr3" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr2}
+} {
+
+ do_test 3.2.$tn.1 {
+ droptrigger_reopen_db DELETE
+ execsql "DELETE FROM $tbl"
+ set ::triggers_fired
+ } $before
+
+ do_test 3.2.$tn.2 {
+ droptrigger_reopen_db DELETE
+ execsql $droptrigger
+ execsql "DELETE FROM $tbl"
+ set ::triggers_fired
+ } $after
+}
+
+# EVIDENCE-OF: R-37808-62273 Note that triggers are automatically
+# dropped when the associated table is dropped.
+#
+do_test 4.1 {
+ droptrigger_reopen_db
+ list_all_triggers
+} {main.tr1 main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
+do_test 4.2 {
+ droptrigger_reopen_db
+ execsql "DROP TABLE t1"
+ list_all_triggers
+} {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
+do_test 4.3 {
+ droptrigger_reopen_db
+ execsql "DROP TABLE t1"
+ list_all_triggers
+} {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
+do_test 4.4 {
+ droptrigger_reopen_db
+ execsql "DROP TABLE t1"
+ list_all_triggers
+} {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
+
+finish_test
do_test fts3aa-6.3 {
execsql {SELECT content FROM t1 WHERE rowid = -1}
} {{three four}}
-breakpoint
do_test fts3aa-6.4 {
execsql {SELECT rowid FROM t1 WHERE t1 MATCH 'four'}
} {-1 0 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31}
+# Test creation of FTS3 and FTS4 tables with columns that contain
+# an "=" character.
+#
+do_execsql_test fts3aa-7.1 {
+ CREATE VIRTUAL TABLE t2 USING fts3(xyz=abc);
+ SELECT xyz FROM t2;
+} {}
+do_catchsql_test fts3aa-7.2 {
+ CREATE VIRTUAL TABLE t3 USING fts4(xyz=abc);
+} {1 {unrecognized parameter: xyz=abc}}
+do_catchsql_test fts3aa-7.3 {
+ CREATE VIRTUAL TABLE t3 USING fts4(xyz = abc);
+} {1 {unrecognized parameter: xyz = abc}}
+
+do_execsql_test fts3aa-7.4 {
+ CREATE VIRTUAL TABLE t3 USING fts3(tokenize=simple, tokenize=simple);
+ SELECT tokenize FROM t3;
+} {}
+do_catchsql_test fts3aa-7.5 {
+ CREATE VIRTUAL TABLE t4 USING fts4(tokenize=simple, tokenize=simple);
+} {1 {unrecognized parameter: tokenize=simple}}
+
+
finish_test
+
}
}
+
#-------------------------------------------------------------------------
# Procedures to save and restore the current file-system state:
#
# faultsim_restore_and_reopen
# faultsim_delete_and_reopen
#
-proc faultsim_save {} {
- foreach f [glob -nocomplain sv_test.db*] { forcedelete $f }
- foreach f [glob -nocomplain test.db*] {
- set f2 "sv_$f"
- file copy -force $f $f2
- }
-}
-proc faultsim_save_and_close {} {
- faultsim_save
- catch { db close }
- return ""
-}
-proc faultsim_restore {} {
- foreach f [glob -nocomplain test.db*] { forcedelete $f }
- foreach f2 [glob -nocomplain sv_test.db*] {
- set f [string range $f2 3 end]
- file copy -force $f2 $f
- }
+proc faultsim_save {args} { uplevel db_save $args }
+proc faultsim_save_and_close {args} { uplevel db_save_and_close $args }
+proc faultsim_restore {args} { uplevel db_restore $args }
+proc faultsim_restore_and_reopen {args} {
+ uplevel db_restore_and_reopen $args
+ sqlite3_extended_result_codes db 1
+ sqlite3_db_config_lookaside db 0 0 0
}
-proc faultsim_restore_and_reopen {{dbfile test.db}} {
- catch { db close }
- faultsim_restore
- sqlite3 db $dbfile
+proc faultsim_delete_and_reopen {args} {
+ uplevel db_delete_and_reopen $args
sqlite3_extended_result_codes db 1
sqlite3_db_config_lookaside db 0 0 0
}
if {$ic != "ok"} { error "Integrity check: $ic" }
}
-proc faultsim_delete_and_reopen {{file test.db}} {
- catch { db close }
- foreach f [glob -nocomplain test.db*] { file delete -force $f }
- sqlite3 db $file
-}
-
# The following procs are used as [do_one_faultsim_test] callbacks when
# injecting OOM faults into test cases.
return ""
}
+proc db_save {} {
+ foreach f [glob -nocomplain sv_test.db*] { forcedelete $f }
+ foreach f [glob -nocomplain test.db*] {
+ set f2 "sv_$f"
+ file copy -force $f $f2
+ }
+}
+proc db_save_and_close {} {
+ db_save
+ catch { db close }
+ return ""
+}
+proc db_restore {} {
+ foreach f [glob -nocomplain test.db*] { forcedelete $f }
+ foreach f2 [glob -nocomplain sv_test.db*] {
+ set f [string range $f2 3 end]
+ file copy -force $f2 $f
+ }
+}
+proc db_restore_and_reopen {{dbfile test.db}} {
+ catch { db close }
+ db_restore
+ sqlite3 db $dbfile
+}
+proc db_delete_and_reopen {{file test.db}} {
+ catch { db close }
+ foreach f [glob -nocomplain test.db*] { file delete -force $f }
+ sqlite3 db $file
+}
+
# If the library is compiled with the SQLITE_DEFAULT_AUTOVACUUM macro set
# to non-zero, then set the global variable $AUTOVACUUM to 1.
set AUTOVACUUM $sqlite_options(default_autovacuum)