xref: /sqlite-3.40.0/test/pragma3.test (revision dfe4e6bb)
1# 2014-12-19
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# This file implements regression tests for SQLite library.
12#
13# This file implements tests for PRAGMA data_version command.
14#
15
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18do_not_use_codec
19
20do_execsql_test pragma3-100 {
21  PRAGMA data_version;
22} {1}
23do_execsql_test pragma3-101 {
24  PRAGMA temp.data_version;
25} {1}
26
27# Writing to the pragma is a no-op
28do_execsql_test pragma3-102 {
29  PRAGMA main.data_version=1234;
30  PRAGMA main.data_version;
31} {1 1}
32
33# EVIDENCE-OF: R-27726-60934 The "PRAGMA data_version" command provides
34# an indication that the database file has been modified.
35#
36# EVIDENCE-OF: R-47505-58569 The "PRAGMA data_version" value is
37# unchanged for commits made on the same database connection.
38#
39do_execsql_test pragma3-110 {
40  PRAGMA data_version;
41  BEGIN IMMEDIATE;
42  PRAGMA data_version;
43  CREATE TABLE t1(a);
44  INSERT INTO t1 VALUES(100),(200),(300);
45  PRAGMA data_version;
46  COMMIT;
47  SELECT * FROM t1;
48  PRAGMA data_version;
49} {1 1 1 100 200 300 1}
50
51sqlite3 db2 test.db
52do_test pragma3-120 {
53  db2 eval {
54    SELECT * FROM t1;
55    PRAGMA data_version;
56  }
57} {100 200 300 1}
58
59do_execsql_test pragma3-130 {
60  PRAGMA data_version;
61  BEGIN IMMEDIATE;
62  PRAGMA data_version;
63  INSERT INTO t1 VALUES(400),(500);
64  PRAGMA data_version;
65  COMMIT;
66  SELECT * FROM t1;
67  PRAGMA data_version;
68  PRAGMA shrink_memory;
69} {1 1 1 100 200 300 400 500 1}
70
71# EVIDENCE-OF: R-63005-41812 The integer values returned by two
72# invocations of "PRAGMA data_version" from the same connection will be
73# different if changes were committed to the database by any other
74# connection in the interim.
75#
76# Value went from 1 in pragma3-120 to 2 here.
77#
78do_test pragma3-140 {
79  db2 eval {
80    SELECT * FROM t1;
81    PRAGMA data_version;
82    BEGIN IMMEDIATE;
83    PRAGMA data_version;
84    UPDATE t1 SET a=a+1;
85    COMMIT;
86    SELECT * FROM t1;
87    PRAGMA data_version;
88  }
89} {100 200 300 400 500 2 2 101 201 301 401 501 2}
90do_execsql_test pragma3-150 {
91  SELECT * FROM t1;
92  PRAGMA data_version;
93} {101 201 301 401 501 2}
94
95#
96do_test pragma3-160 {
97  db eval {
98    BEGIN;
99    PRAGMA data_version;
100    UPDATE t1 SET a=555 WHERE a=501;
101    PRAGMA data_version;
102    SELECT * FROM t1 ORDER BY a;
103    PRAGMA data_version;
104  }
105} {2 2 101 201 301 401 555 2}
106do_test pragma3-170 {
107  db2 eval {
108    PRAGMA data_version;
109  }
110} {2}
111do_test pragma3-180 {
112  db eval {
113    COMMIT;
114    PRAGMA data_version;
115  }
116} {2}
117do_test pragma3-190 {
118  db2 eval {
119    PRAGMA data_version;
120  }
121} {3}
122
123# EVIDENCE-OF: R-19326-44825 The "PRAGMA data_version" value is a local
124# property of each database connection and so values returned by two
125# concurrent invocations of "PRAGMA data_version" on separate database
126# connections are often different even though the underlying database is
127# identical.
128#
129do_test pragma3-195 {
130  expr {[db eval {PRAGMA data_version}]!=[db2 eval {PRAGMA data_version}]}
131} {1}
132
133# EVIDENCE-OF: R-54562-06892 The behavior of "PRAGMA data_version" is
134# the same for all database connections, including database connections
135# in separate processes and shared cache database connections.
136#
137# The next block checks the behavior for separate processes.
138#
139do_test pragma3-200 {
140  db eval {PRAGMA data_version; SELECT * FROM t1;}
141} {2 101 201 301 401 555}
142do_test pragma3-201 {
143  set fd [open pragma3.txt wb]
144  puts $fd {
145     sqlite3 db test.db;
146     db eval {DELETE FROM t1 WHERE a>300};
147     db close;
148     exit;
149  }
150  close $fd
151  exec [info nameofexec] pragma3.txt
152  forcedelete pragma3.txt
153  db eval {
154    PRAGMA data_version;
155    SELECT * FROM t1;
156  }
157} {3 101 201}
158db2 close
159db close
160
161# EVIDENCE-OF: R-54562-06892 The behavior of "PRAGMA data_version" is
162# the same for all database connections, including database connections
163# in separate processes and shared cache database connections.
164#
165# The next block checks that behavior is the same for shared-cache.
166#
167ifcapable shared_cache {
168  set ::enable_shared_cache [sqlite3_enable_shared_cache 1]
169  sqlite3 db test.db
170  sqlite3 db2 test.db
171  do_test pragma3-300 {
172    db eval {
173      PRAGMA data_version;
174      BEGIN;
175      CREATE TABLE t3(a,b,c);
176      CREATE TABLE t4(x,y,z);
177      INSERT INTO t4 VALUES(123,456,789);
178      PRAGMA data_version;
179      COMMIT;
180      PRAGMA data_version;
181    }
182  } {1 1 1}
183  do_test pragma3-310 {
184    db2 eval {
185      PRAGMA data_version;
186      BEGIN;
187      INSERT INTO t3(a,b,c) VALUES('abc','def','ghi');
188      SELECT * FROM t3;
189      PRAGMA data_version;
190    }
191  } {2 abc def ghi 2}
192  # The transaction in db2 has not yet committed, so the data_version in
193  # db is unchanged.
194  do_test pragma3-320 {
195    db eval {
196      PRAGMA data_version;
197      SELECT * FROM t4;
198    }
199  } {1 123 456 789}
200  do_test pragma3-330 {
201    db2 eval {
202      COMMIT;
203      PRAGMA data_version;
204      SELECT * FROM t4;
205    }
206  } {2 123 456 789}
207  do_test pragma3-340 {
208    db eval {
209      PRAGMA data_version;
210      SELECT * FROM t3;
211      SELECT * FROM t4;
212    }
213  } {2 abc def ghi 123 456 789}
214  db2 close
215  db close
216  sqlite3_enable_shared_cache $::enable_shared_cache
217}
218
219# Make sure this also works in WAL mode
220#
221# This will not work with the in-memory journal permutation, as opening
222# [db2] switches the journal mode back to "memory"
223#
224if {[wal_is_capable]} {
225if {[permutation]!="inmemory_journal"} {
226
227  sqlite3 db test.db
228  db eval {PRAGMA journal_mode=WAL}
229  sqlite3 db2 test.db
230  do_test pragma3-400 {
231    db eval {
232      PRAGMA data_version;
233      PRAGMA journal_mode;
234      SELECT * FROM t1;
235    }
236  } {2 wal 101 201}
237  do_test pragma3-410 {
238    db2 eval {
239      PRAGMA data_version;
240      PRAGMA journal_mode;
241      SELECT * FROM t1;
242    }
243  } {2 wal 101 201}
244  do_test pragma3-420 {
245    db eval {UPDATE t1 SET a=111*(a/100); PRAGMA data_version; SELECT * FROM t1}
246  } {2 111 222}
247  do_test pragma3-430 {
248    db2 eval {PRAGMA data_version; SELECT * FROM t1;}
249  } {3 111 222}
250  db2 close
251}
252}
253
254finish_test
255