xref: /sqlite-3.40.0/ext/rbu/rbumisc.test (revision 90255b81)
1# 2014 August 30
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#
12
13source [file join [file dirname [info script]] rbu_common.tcl]
14set ::testprefix rbumisc
15
16db close
17sqlite3_shutdown
18sqlite3_config_uri 1
19reset_db
20
21proc populate_rbu_db {} {
22  forcedelete rbu.db
23  sqlite3 rbu rbu.db
24  rbu eval {
25    CREATE TABLE data_x1(a, b, c, rbu_control);
26    INSERT INTO data_x1 VALUES(1, 1, 1, 0);
27    INSERT INTO data_x1 VALUES(2, 2, 2, 0);
28
29    CREATE TABLE dat(a, b, c, rbu_control);
30    CREATE TABLE "data x1"(a, b, c, rbu_control);
31    CREATE TABLE datax1(a, b, c, rbu_control);
32    CREATE TABLE data_(a, b, c, rbu_control);
33
34    INSERT INTO "data x1" VALUES(3, 3, 3, 0);
35    INSERT INTO datax1 VALUES(3, 3, 3, 0);
36    INSERT INTO data_ VALUES(3, 3, 3, 0);
37    INSERT INTO dat VALUES(3, 3, 3, 0);
38  }
39  rbu close
40}
41
42#-------------------------------------------------------------------------
43# Ensure that RBU is not confused by oddly named tables in an RBU
44# database.
45#
46do_execsql_test 1.0 {
47  CREATE TABLE x1(a, b, c INTEGER PRIMARY KEY);
48}
49do_test 1.1 {
50  populate_rbu_db
51} {}
52
53do_test 1.2 {
54  step_rbu test.db rbu.db
55  db eval { SELECT * FROM x1 }
56} {1 1 1 2 2 2}
57
58do_test 1.3 {
59  db eval { DELETE FROM x1 }
60  sqlite3 rbu rbu.db
61  rbu eval { DELETE FROM rbu_state }
62  rbu close
63  step_rbu test.db rbu.db
64  db eval { SELECT * FROM x1 }
65} {1 1 1 2 2 2}
66
67do_test 1.4 {
68  db eval { DELETE FROM x1 }
69  populate_rbu_db
70
71  sqlite3rbu rbu test.db rbu.db
72  rbu step
73  rbu step
74  rbu close
75
76  forcecopy test.db-oal test.db-wal
77  sqlite3rbu rbu test.db rbu.db
78  rbu step
79  list [catch { rbu close } msg] $msg
80} {1 {SQLITE_ERROR - cannot update wal mode database}}
81
82#-------------------------------------------------------------------------
83# Test the effect of a wal file appearing after the target database has
84# been opened, but before it has been locked.
85#
86catch { db close }
87testvfs tvfs -default 1
88
89for {set N 1} {$N < 10} {incr N} {
90  reset_db
91  populate_rbu_db
92  do_execsql_test 2.$N.0 {
93    CREATE TABLE x1(a, b, c INTEGER PRIMARY KEY);
94  }
95
96  set nAccessCnt 0
97  do_test 2.$N.1 {
98    sqlite3rbu rbu test.db rbu.db
99    rbu step
100    rbu step
101    rbu close
102  } {SQLITE_OK}
103
104  tvfs script xAccess
105  tvfs filter xAccess
106  set nAccessCnt 0
107  proc xAccess {method file args} {
108    global nAccessCnt
109    if {[file tail $file]=="test.db-wal"} {
110      incr nAccessCnt -1
111      if {$nAccessCnt==0} {
112        set fd [open test.db-wal w]
113        puts -nonewline $fd [string repeat 0 2000]
114        close $fd
115      }
116    }
117    return SQLITE_OK
118  }
119
120  foreach r {
121     {1 {SQLITE_ERROR - cannot update wal mode database}}
122     {0 SQLITE_OK}
123     {1 {SQLITE_CANTOPEN - unable to open database file}}
124  } {
125    set RES($r) 1
126  }
127  do_test 2.$N.2 {
128    set ::nAccessCnt $N
129    set res [list [catch {
130      sqlite3rbu rbu test.db rbu.db
131      rbu step
132      rbu close
133    } msg ] $msg]
134    set RES($res)
135  } {1}
136  catch {rbu close}
137}
138catch {db close}
139catch {tvfs delete}
140
141#-------------------------------------------------------------------------
142testvfs tvfs -default 1
143reset_db
144populate_rbu_db
145do_execsql_test 3.0 {
146  CREATE TABLE x1(a, b, c INTEGER PRIMARY KEY);
147}
148
149tvfs script xFileControl
150tvfs filter xFileControl
151
152proc xFileControl {method file verb args} {
153  if {$verb=="ZIPVFS" && [info exists ::zipvfs_filecontrol]} {
154    return $::zipvfs_filecontrol
155  }
156  return "SQLITE_NOTFOUND"
157}
158
159breakpoint
160foreach {tn ret err} {
161  1 SQLITE_OK           0
162  2 SQLITE_ERROR        1
163  3 SQLITE_NOTFOUND     0
164  4 SQLITE_OMIT         1
165} {
166  set ::zipvfs_filecontrol $ret
167  do_test 3.$tn.1 {
168    catch {
169      sqlite3rbu rbu test.db rbu.db
170      rbu step
171      rbu close
172    }
173  } $err
174}
175catch {db close}
176catch {tvfs delete}
177
178#-------------------------------------------------------------------------
179
180finish_test
181