Index: third_party/sqlite/src/ext/rbu/rbuvacuum2.test |
diff --git a/third_party/sqlite/src/ext/rbu/rbuvacuum2.test b/third_party/sqlite/src/ext/rbu/rbuvacuum2.test |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0a1fe3da94a5674bd5adb973e39549968cff07b7 |
--- /dev/null |
+++ b/third_party/sqlite/src/ext/rbu/rbuvacuum2.test |
@@ -0,0 +1,235 @@ |
+# 2016 June 1 |
+# |
+# 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 contains tests for the RBU module. More specifically, it |
+# contains tests to ensure that the sqlite3rbu_vacuum() API works as |
+# expected. |
+# |
+ |
+source [file join [file dirname [info script]] rbu_common.tcl] |
+ |
+foreach step {0 1} { |
+ set ::testprefix rbuvacuum2-$step |
+ |
+ #------------------------------------------------------------------------- |
+ # Test that a database that contains fts3 tables can be vacuumed. |
+ # |
+ ifcapable fts3 { |
+ reset_db |
+ do_execsql_test 1.1 { |
+ CREATE VIRTUAL TABLE t1 USING fts3(z, y); |
+ INSERT INTO t1 VALUES('fix this issue', 'at some point'); |
+ } |
+ |
+ do_rbu_vacuum_test 1.2 $step |
+ |
+ do_execsql_test 1.3 { |
+ SELECT * FROM t1; |
+ } {{fix this issue} {at some point}} |
+ |
+ do_execsql_test 1.4 { |
+ SELECT rowid FROM t1 WHERE t1 MATCH 'fix'; |
+ } {1} |
+ |
+ do_execsql_test 1.5 { |
+ INSERT INTO t1 VALUES('a b c', 'd e f'); |
+ INSERT INTO t1 VALUES('l h i', 'd e f'); |
+ DELETE FROM t1 WHERE docid = 2; |
+ INSERT INTO t1 VALUES('a b c', 'x y z'); |
+ } |
+ |
+ do_rbu_vacuum_test 1.6 $step |
+ do_execsql_test 1.7 { |
+ INSERT INTO t1(t1) VALUES('integrity-check'); |
+ SELECT * FROM t1; |
+ } { |
+ {fix this issue} {at some point} |
+ {l h i} {d e f} |
+ {a b c} {x y z} |
+ } |
+ } |
+ |
+ #------------------------------------------------------------------------- |
+ # Test that a database that contains fts5 tables can be vacuumed. |
+ # |
+ ifcapable fts5 { |
+ reset_db |
+ do_execsql_test 2.1 { |
+ CREATE VIRTUAL TABLE t1 USING fts5(z, y); |
+ INSERT INTO t1 VALUES('fix this issue', 'at some point'); |
+ } |
+ |
+ do_rbu_vacuum_test 2.2 $step |
+ |
+ do_execsql_test 2.3 { |
+ SELECT * FROM t1; |
+ } {{fix this issue} {at some point}} |
+ |
+ do_execsql_test 2.4 { |
+ SELECT rowid FROM t1 ('fix'); |
+ } {1} |
+ |
+ do_execsql_test 2.5 { |
+ INSERT INTO t1 VALUES('a b c', 'd e f'); |
+ INSERT INTO t1 VALUES('l h i', 'd e f'); |
+ DELETE FROM t1 WHERE rowid = 2; |
+ INSERT INTO t1 VALUES('a b c', 'x y z'); |
+ } |
+ |
+ do_rbu_vacuum_test 2.6 $step |
+ do_execsql_test 2.7 { |
+ INSERT INTO t1(t1) VALUES('integrity-check'); |
+ SELECT * FROM t1; |
+ } { |
+ {fix this issue} {at some point} |
+ {l h i} {d e f} |
+ {a b c} {x y z} |
+ } |
+ } |
+ |
+ #------------------------------------------------------------------------- |
+ # Test that a database that contains an rtree table can be vacuumed. |
+ # |
+ ifcapable rtree { |
+ reset_db |
+ do_execsql_test 3.1 { |
+ CREATE VIRTUAL TABLE rt USING rtree(id, x1, x2); |
+ INSERT INTO rt VALUES(1, 45, 55); |
+ INSERT INTO rt VALUES(2, 50, 60); |
+ INSERT INTO rt VALUES(3, 55, 65); |
+ } |
+ |
+ do_rbu_vacuum_test 3.2 $step |
+ |
+ do_execsql_test 3.3 { |
+ SELECT * FROM rt; |
+ } {1 45.0 55.0 2 50.0 60.0 3 55.0 65.0} |
+ |
+ do_execsql_test 3.4.1 { |
+ SELECT rowid FROM rt WHERE x2>51 AND x1 < 51 |
+ } {1 2} |
+ do_execsql_test 3.4.2 { |
+ SELECT rowid FROM rt WHERE x2>59 AND x1 < 59 |
+ } {2 3} |
+ |
+ do_rbu_vacuum_test 3.5 $step |
+ |
+ do_execsql_test 3.6.1 { |
+ SELECT rowid FROM rt WHERE x2>51 AND x1 < 51 |
+ } {1 2} |
+ do_execsql_test 3.6.2 { |
+ SELECT rowid FROM rt WHERE x2>59 AND x1 < 59 |
+ } {2 3} |
+ } |
+ |
+ ifcapable trigger { |
+ reset_db |
+ do_execsql_test 4.1 { |
+ CREATE TABLE t1(a, b, c); |
+ INSERT INTO t1 VALUES(1, 2, 3); |
+ CREATE VIEW v1 AS SELECT * FROM t1; |
+ CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN SELECT 1; END; |
+ } |
+ |
+ do_execsql_test 4.2 { |
+ SELECT * FROM sqlite_master; |
+ } { |
+ table t1 t1 2 {CREATE TABLE t1(a, b, c)} |
+ view v1 v1 0 {CREATE VIEW v1 AS SELECT * FROM t1} |
+ trigger tr1 t1 0 {CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN SELECT 1; END} |
+ } |
+ |
+ do_rbu_vacuum_test 4.3 $step |
+ do_execsql_test 4.4 { |
+ SELECT * FROM sqlite_master; |
+ } { |
+ table t1 t1 2 {CREATE TABLE t1(a, b, c)} |
+ view v1 v1 0 {CREATE VIEW v1 AS SELECT * FROM t1} |
+ trigger tr1 t1 0 {CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN SELECT 1; END} |
+ } |
+ } |
+} |
+ |
+#------------------------------------------------------------------------- |
+# Test that passing a NULL value as the second argument to |
+# sqlite3rbu_vacuum() causes it to: |
+# |
+# * Use <database>-vacuum as the state db, and |
+# * Set the state db permissions to the same as those on the db file. |
+# |
+db close |
+if {$::tcl_platform(platform)=="unix"} { |
+ forcedelete test.db |
+ |
+ sqlite3 db test.db |
+ do_execsql_test 5.0 { |
+ CREATE TABLE t1(a, b); |
+ INSERT INTO t1 VALUES(1, 2); |
+ INSERT INTO t1 VALUES(3, 4); |
+ INSERT INTO t1 VALUES(5, 6); |
+ INSERT INTO t1 VALUES(7, 8); |
+ } |
+ db close |
+ |
+ foreach {tn perm} { |
+ 1 00755 |
+ 2 00666 |
+ 3 00644 |
+ 4 00444 |
+ } { |
+ forcedelete test.db-vacuum |
+ |
+ do_test 5.$tn.1 { |
+ file attributes test.db -permissions $perm |
+ sqlite3rbu_vacuum rbu test.db |
+ rbu step |
+ } {SQLITE_OK} |
+ |
+ do_test 5.$tn.2 { file exists test.db-vacuum } 1 |
+ do_test 5.$tn.3 { file attributes test.db-vacuum -permissions} $perm |
+ rbu close |
+ } |
+} |
+ |
+#------------------------------------------------------------------------- |
+# Test the outcome of some other connection running a checkpoint while |
+# the incremental checkpoint is suspended. |
+# |
+reset_db |
+do_execsql_test 6.0 { |
+ CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); |
+ CREATE INDEX i1b ON t1(b); |
+ CREATE INDEX i1c ON t1(c); |
+ INSERT INTO t1 VALUES(1, 2, 3); |
+ INSERT INTO t1 VALUES(4, 5, 6); |
+} |
+forcedelete test.db2 |
+ |
+do_test 6.1 { |
+ sqlite3rbu_vacuum rbu test.db test.db2 |
+ while {[rbu state]!="checkpoint"} { rbu step } |
+ rbu close |
+} {SQLITE_OK} |
+ |
+do_execsql_test 6.2 { |
+ SELECT 1 FROM sqlite_master LIMIT 1; |
+ PRAGMA wal_checkpoint; |
+} {1 0 4 4} |
+ |
+do_test 6.3 { |
+ sqlite3rbu_vacuum rbu test.db test.db2 |
+ while {[rbu step]!="SQLITE_DONE"} { rbu step } |
+ rbu close |
+ execsql { PRAGMA integrity_check } |
+} {ok} |
+ |
+finish_test |
+ |