summaryrefslogtreecommitdiffstats
path: root/test/pragma3.test
diff options
context:
space:
mode:
Diffstat (limited to 'test/pragma3.test')
-rw-r--r--test/pragma3.test287
1 files changed, 287 insertions, 0 deletions
diff --git a/test/pragma3.test b/test/pragma3.test
new file mode 100644
index 0000000..c4794c7
--- /dev/null
+++ b/test/pragma3.test
@@ -0,0 +1,287 @@
+# 2014-12-19
+#
+# 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 regression tests for SQLite library.
+#
+# This file implements tests for PRAGMA data_version command.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+if {[sqlite3 -has-codec]} {
+ finish_test
+ return
+}
+
+do_execsql_test pragma3-100 {
+ PRAGMA data_version;
+} {1}
+do_execsql_test pragma3-101 {
+ PRAGMA temp.data_version;
+} {1}
+
+# Writing to the pragma is a no-op
+do_execsql_test pragma3-102 {
+ PRAGMA main.data_version=1234;
+ PRAGMA main.data_version;
+} {1 1}
+
+# EVIDENCE-OF: R-27726-60934 The "PRAGMA data_version" command provides
+# an indication that the database file has been modified.
+#
+# EVIDENCE-OF: R-47505-58569 The "PRAGMA data_version" value is
+# unchanged for commits made on the same database connection.
+#
+do_execsql_test pragma3-110 {
+ PRAGMA data_version;
+ BEGIN IMMEDIATE;
+ PRAGMA data_version;
+ CREATE TABLE t1(a);
+ INSERT INTO t1 VALUES(100),(200),(300);
+ PRAGMA data_version;
+ COMMIT;
+ SELECT * FROM t1;
+ PRAGMA data_version;
+} {1 1 1 100 200 300 1}
+
+sqlite3 db2 test.db
+do_test pragma3-120 {
+ db2 eval {
+ SELECT * FROM t1;
+ PRAGMA data_version;
+ }
+} {100 200 300 1}
+
+do_execsql_test pragma3-130 {
+ PRAGMA data_version;
+ BEGIN IMMEDIATE;
+ PRAGMA data_version;
+ INSERT INTO t1 VALUES(400),(500);
+ PRAGMA data_version;
+ COMMIT;
+ SELECT * FROM t1;
+ PRAGMA data_version;
+ PRAGMA shrink_memory;
+} {1 1 1 100 200 300 400 500 1}
+
+# EVIDENCE-OF: R-63005-41812 The integer values returned by two
+# invocations of "PRAGMA data_version" from the same connection will be
+# different if changes were committed to the database by any other
+# connection in the interim.
+#
+# Value went from 1 in pragma3-120 to 2 here.
+#
+do_test pragma3-140 {
+ db2 eval {
+ SELECT * FROM t1;
+ PRAGMA data_version;
+ BEGIN IMMEDIATE;
+ PRAGMA data_version;
+ UPDATE t1 SET a=a+1;
+ COMMIT;
+ SELECT * FROM t1;
+ PRAGMA data_version;
+ }
+} {100 200 300 400 500 2 2 101 201 301 401 501 2}
+do_execsql_test pragma3-150 {
+ SELECT * FROM t1;
+ PRAGMA data_version;
+} {101 201 301 401 501 2}
+
+#
+do_test pragma3-160 {
+ db eval {
+ BEGIN;
+ PRAGMA data_version;
+ UPDATE t1 SET a=555 WHERE a=501;
+ PRAGMA data_version;
+ SELECT * FROM t1 ORDER BY a;
+ PRAGMA data_version;
+ }
+} {2 2 101 201 301 401 555 2}
+do_test pragma3-170 {
+ db2 eval {
+ PRAGMA data_version;
+ }
+} {2}
+do_test pragma3-180 {
+ db eval {
+ COMMIT;
+ PRAGMA data_version;
+ }
+} {2}
+do_test pragma3-190 {
+ db2 eval {
+ PRAGMA data_version;
+ }
+} {3}
+
+# EVIDENCE-OF: R-19326-44825 The "PRAGMA data_version" value is a local
+# property of each database connection and so values returned by two
+# concurrent invocations of "PRAGMA data_version" on separate database
+# connections are often different even though the underlying database is
+# identical.
+#
+do_test pragma3-195 {
+ expr {[db eval {PRAGMA data_version}]!=[db2 eval {PRAGMA data_version}]}
+} {1}
+
+# EVIDENCE-OF: R-54562-06892 The behavior of "PRAGMA data_version" is
+# the same for all database connections, including database connections
+# in separate processes and shared cache database connections.
+#
+# The next block checks the behavior for separate processes.
+#
+do_test pragma3-200 {
+ db eval {PRAGMA data_version; SELECT * FROM t1;}
+} {2 101 201 301 401 555}
+do_test pragma3-201 {
+ set fd [open pragma3.txt wb]
+ puts $fd {
+ sqlite3 db test.db;
+ db eval {DELETE FROM t1 WHERE a>300};
+ db close;
+ exit;
+ }
+ close $fd
+ exec [info nameofexec] pragma3.txt
+ forcedelete pragma3.txt
+ db eval {
+ PRAGMA data_version;
+ SELECT * FROM t1;
+ }
+} {3 101 201}
+db2 close
+db close
+
+# EVIDENCE-OF: R-54562-06892 The behavior of "PRAGMA data_version" is
+# the same for all database connections, including database connections
+# in separate processes and shared cache database connections.
+#
+# The next block checks that behavior is the same for shared-cache.
+#
+ifcapable shared_cache {
+ set ::enable_shared_cache [sqlite3_enable_shared_cache 1]
+ sqlite3 db test.db
+ sqlite3 db2 test.db
+ do_test pragma3-300 {
+ db eval {
+ PRAGMA data_version;
+ BEGIN;
+ CREATE TABLE t3(a,b,c);
+ CREATE TABLE t4(x,y,z);
+ INSERT INTO t4 VALUES(123,456,789);
+ PRAGMA data_version;
+ COMMIT;
+ PRAGMA data_version;
+ }
+ } {1 1 1}
+ do_test pragma3-310 {
+ db2 eval {
+ PRAGMA data_version;
+ BEGIN;
+ INSERT INTO t3(a,b,c) VALUES('abc','def','ghi');
+ SELECT * FROM t3;
+ PRAGMA data_version;
+ }
+ } {2 abc def ghi 2}
+ # The transaction in db2 has not yet committed, so the data_version in
+ # db is unchanged.
+ do_test pragma3-320 {
+ db eval {
+ PRAGMA data_version;
+ SELECT * FROM t4;
+ }
+ } {1 123 456 789}
+ do_test pragma3-330 {
+ db2 eval {
+ COMMIT;
+ PRAGMA data_version;
+ SELECT * FROM t4;
+ }
+ } {2 123 456 789}
+ do_test pragma3-340 {
+ db eval {
+ PRAGMA data_version;
+ SELECT * FROM t3;
+ SELECT * FROM t4;
+ }
+ } {2 abc def ghi 123 456 789}
+ db2 close
+ db close
+ sqlite3_enable_shared_cache $::enable_shared_cache
+}
+
+# Make sure this also works in WAL mode
+#
+# This will not work with the in-memory journal permutation, as opening
+# [db2] switches the journal mode back to "memory"
+#
+if {[wal_is_capable]} {
+if {[permutation]!="inmemory_journal"} {
+
+ sqlite3 db test.db
+ db eval {PRAGMA journal_mode=WAL}
+ sqlite3 db2 test.db
+ do_test pragma3-400 {
+ db eval {
+ PRAGMA data_version;
+ PRAGMA journal_mode;
+ SELECT * FROM t1;
+ }
+ } {2 wal 101 201}
+ do_test pragma3-410 {
+ db2 eval {
+ PRAGMA data_version;
+ PRAGMA journal_mode;
+ SELECT * FROM t1;
+ }
+ } {2 wal 101 201}
+ do_test pragma3-420 {
+ db eval {UPDATE t1 SET a=111*(a/100); PRAGMA data_version; SELECT * FROM t1}
+ } {2 111 222}
+ do_test pragma3-430 {
+ db2 eval {PRAGMA data_version; SELECT * FROM t1;}
+ } {3 111 222}
+ db2 close
+}
+}
+
+#-------------------------------------------------------------------------
+# Check that empty write transactions do not cause the return of "PRAGMA
+# data_version" to be decremented with journal_mode=PERSIST and
+# locking_mode=EXCLUSIVE
+#
+foreach {tn sql} {
+ A {
+ }
+ B {
+ PRAGMA journal_mode = PERSIST;
+ PRAGMA locking_mode = EXCLUSIVE;
+ }
+} {
+ reset_db
+ execsql $sql
+
+ do_execsql_test pragma3-510$tn {
+ CREATE TABLE t1(x, y);
+ INSERT INTO t1 VALUES(1, 2);
+ PRAGMA data_version;
+ } {1}
+
+ do_execsql_test pragma3-520$tn {
+ BEGIN EXCLUSIVE;
+ COMMIT;
+ PRAGMA data_version;
+ } {1}
+}
+
+finish_test