rbuexlock.test 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. # 2021 November 06
  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. source [file join [file dirname [info script]] rbu_common.tcl]
  13. if_no_rbu_support { finish_test ; return }
  14. set ::testprefix rbuexlock
  15. db close
  16. set journalmode delete
  17. if {[permutation]=="inmemory_journal"} {
  18. set journalmode memory
  19. }
  20. # Create a simple RBU database. That expects to write to a table:
  21. #
  22. # CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
  23. #
  24. proc create_rbu {filename} {
  25. forcedelete $filename
  26. sqlite3 rbu1 $filename
  27. rbu1 eval {
  28. CREATE TABLE data_t1(a, b, c, rbu_control);
  29. INSERT INTO data_t1 VALUES(10, random(), random(), 0);
  30. INSERT INTO data_t1 VALUES(20, random(), random(), 0);
  31. INSERT INTO data_t1 VALUES(30, random(), random(), 0);
  32. INSERT INTO data_t1 VALUES(40, random(), random(), 0);
  33. INSERT INTO data_t1 VALUES(50, random(), random(), 0);
  34. INSERT INTO data_t1 VALUES(60, random(), random(), 0);
  35. INSERT INTO data_t1 VALUES(70, random(), random(), 0);
  36. INSERT INTO data_t1 VALUES(80, random(), random(), 0);
  37. }
  38. rbu1 close
  39. return $filename
  40. }
  41. reset_db
  42. do_execsql_test 1.0 {
  43. CREATE TABLE t1(a PRIMARY KEY, b INT, c INT);
  44. CREATE INDEX t1b ON t1(b);
  45. CREATE INDEX t1c ON t1(c);
  46. INSERT INTO t1 VALUES(1, 2, 3);
  47. }
  48. create_rbu rbu1.db
  49. do_test 1.1.0 {
  50. sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db
  51. rbu step
  52. } SQLITE_OK
  53. do_catchsql_test 1.1.1 { SELECT * FROM t1 } {0 {1 2 3}}
  54. do_test 1.2.0 {
  55. for {set ii 0} {$ii < 10} {incr ii} {
  56. rbu step
  57. }
  58. rbu step
  59. } SQLITE_OK
  60. do_catchsql_test 1.2.1 { SELECT * FROM t1 } {0 {1 2 3}}
  61. do_test 1.2.2 {
  62. db eval {PRAGMA journal_mode}
  63. } $journalmode
  64. do_test 1.3.0 {
  65. while {[file exists test.db-wal]==0} {
  66. rbu step
  67. }
  68. } {}
  69. do_catchsql_test 1.3.1 { SELECT * FROM t1 } {1 {database is locked}}
  70. do_test 1.3.2 {
  71. db eval {PRAGMA journal_mode}
  72. } $journalmode
  73. do_test 1.4.0 {
  74. rbu step
  75. } SQLITE_OK
  76. do_catchsql_test 1.4.1 { SELECT * FROM t1 } {1 {database is locked}}
  77. do_test 1.4.2 {
  78. db eval {PRAGMA journal_mode}
  79. } $journalmode
  80. rbu close
  81. do_test 1.5.0 {
  82. file exists test.db-wal
  83. } {1}
  84. do_test 1.5.1 {
  85. sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db
  86. file exists test.db-wal
  87. } 1
  88. do_catchsql_test 1.5.2 { SELECT * FROM t1 } {1 {database is locked}}
  89. do_test 1.5.2 {
  90. db eval {PRAGMA journal_mode}
  91. } $journalmode
  92. do_test 1.6.0 {
  93. rbu step
  94. } SQLITE_OK
  95. do_catchsql_test 1.6.1 { SELECT * FROM t1 } {1 {database is locked}}
  96. do_test 1.6.2 {
  97. db eval {PRAGMA journal_mode}
  98. } $journalmode
  99. do_test 1.7.0 {
  100. while {[rbu step]=="SQLITE_OK"} {}
  101. rbu close
  102. } SQLITE_DONE
  103. do_catchsql_test 1.7.2 { SELECT count(*) FROM t1 } {0 9}
  104. do_test 1.7.2 {
  105. db eval {PRAGMA journal_mode}
  106. } $journalmode
  107. reset_db
  108. do_execsql_test 2.0 {
  109. CREATE TABLE t1(a PRIMARY KEY, b INT, c INT);
  110. CREATE INDEX t1b ON t1(b);
  111. CREATE INDEX t1c ON t1(c);
  112. INSERT INTO t1 VALUES(1, 2, 3);
  113. }
  114. create_rbu rbu1.db
  115. do_test 2.1.0 {
  116. sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
  117. rbu step
  118. } SQLITE_OK
  119. do_catchsql_test 2.1.1 { SELECT * FROM t1 } {0 {1 2 3}}
  120. do_test 2.2.0 {
  121. for {set ii 0} {$ii < 10} {incr ii} {
  122. rbu step
  123. }
  124. rbu step
  125. } SQLITE_OK
  126. do_catchsql_test 2.2.1 { SELECT * FROM t1 } {0 {1 2 3}}
  127. do_test 2.3.0 {
  128. while {[file exists test.db-wal]==0} {
  129. rbu step
  130. }
  131. } {}
  132. do_test 2.3.1 {
  133. llength [db eval {SELECT * FROM t1}]
  134. } {27}
  135. do_test 2.3.2 {
  136. db eval {PRAGMA journal_mode}
  137. } {wal}
  138. do_test 2.4.0 {
  139. rbu step
  140. } SQLITE_OK
  141. do_test 2.4.1 {
  142. llength [db eval {SELECT * FROM t1}]
  143. } {27}
  144. do_test 2.4.2 {
  145. db eval {PRAGMA journal_mode}
  146. } {wal}
  147. rbu close
  148. do_test 2.5.0 {
  149. db eval {PRAGMA journal_mode}
  150. } {wal}
  151. do_execsql_test 2.5.1 {
  152. DELETE FROM t1;
  153. } {}
  154. create_rbu rbu1.db
  155. do_test 3.1.0 {
  156. sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
  157. rbu step
  158. } SQLITE_ERROR
  159. do_test 3.1.1 {
  160. set rc [catch {rbu close} msg]
  161. lappend rc $msg
  162. } {1 {SQLITE_ERROR - cannot update wal mode database}}
  163. db eval {PRAGMA journal_mode=DELETE}
  164. create_rbu rbu1.db
  165. do_test 3.2.0 {
  166. sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
  167. rbu step
  168. } SQLITE_OK
  169. do_test 3.3.1 {
  170. set rc [catch {rbu close} msg]
  171. lappend rc $msg
  172. } {0 SQLITE_OK}
  173. db close
  174. create_rbu rbu1.db
  175. do_test 3.4.0 {
  176. sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=0 rbu1.db
  177. rbu step
  178. } SQLITE_OK
  179. rbu close
  180. #-------------------------------------------------------------------------
  181. reset_db
  182. forcedelete rbu1.db
  183. forcedelete rbu2.db
  184. sqlite3 rbu rbu1.db
  185. do_execsql_test -db rbu 4.1 {
  186. CREATE TABLE data_t1(a, b, rbu_control);
  187. INSERT INTO data_t1 VALUES(1, 'one', 0);
  188. }
  189. rbu close
  190. sqlite3 rbu rbu2.db
  191. do_execsql_test -db rbu 4.2 {
  192. CREATE TABLE data_t1(a, b, rbu_control);
  193. INSERT INTO data_t1 VALUES(2, 'two', 0);
  194. }
  195. rbu close
  196. do_execsql_test 4.3 {
  197. CREATE TABLE t1(a PRIMARY KEY, b);
  198. }
  199. db close
  200. do_test 4.4 {
  201. sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu1.db
  202. rbu step
  203. rbu state
  204. } {oal}
  205. sqlite3 cons test.db
  206. do_execsql_test -db cons 4.5 {
  207. SELECT * FROM t1
  208. } {}
  209. do_test 4.6 { rbu step ; rbu state } {oal}
  210. do_test 4.7 { rbu step ; rbu state } {move}
  211. do_execsql_test -db cons 4.8 {
  212. SELECT * FROM t1
  213. } {}
  214. do_test 4.9 { rbu step ; rbu state } {checkpoint}
  215. do_test 4.10 {
  216. catchsql { SELECT * FROM t1 } cons
  217. } {1 {database is locked}}
  218. do_test 4.11 { rbu step ; rbu state } {checkpoint}
  219. do_test 4.11 { rbu step ; rbu state } {done}
  220. rbu close
  221. do_test 4.12 {
  222. catchsql { SELECT * FROM t1 } cons
  223. } {0 {1 one}}
  224. do_test 4.13 {
  225. sqlite3rbu rbu file:test.db?rbu_exclusive_checkpoint=1 rbu2.db
  226. rbu step
  227. rbu state
  228. } {oal}
  229. do_test 4.14 {
  230. catchsql { SELECT * FROM t1 } cons
  231. } {0 {1 one}}
  232. do_test 4.15 { rbu step ; rbu state } {oal}
  233. do_test 4.16 { rbu step ; rbu state } {move}
  234. do_test 4.17 {
  235. catchsql { SELECT * FROM t1 } cons
  236. } {0 {1 one}}
  237. do_test 4.18 { rbu step ; rbu state } {checkpoint}
  238. do_test 4.19 {
  239. catchsql { SELECT * FROM t1 } cons
  240. } {1 {database is locked}}
  241. do_test 4.20 { rbu step ; rbu state } {checkpoint}
  242. do_test 4.21 { rbu step ; rbu state } {done}
  243. rbu close
  244. do_test 4.22 {
  245. catchsql { SELECT * FROM t1 } cons
  246. } {0 {1 one 2 two}}
  247. cons close
  248. finish_test