lock5.test 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. # 2008 June 28
  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. The
  12. # focus of this script is database locks.
  13. #
  14. # $Id: lock5.test,v 1.6 2008/12/04 12:34:16 drh Exp $
  15. set testdir [file dirname $argv0]
  16. source $testdir/tester.tcl
  17. # This file is only run if using the unix backend compiled with the
  18. # SQLITE_ENABLE_LOCKING_STYLE macro.
  19. db close
  20. if {[catch {sqlite3 db test.db -vfs unix-none} msg]} {
  21. finish_test
  22. return
  23. }
  24. db close
  25. forcedelete test.db.lock
  26. ifcapable lock_proxy_pragmas {
  27. set ::using_proxy 0
  28. foreach {name value} [array get env SQLITE_FORCE_PROXY_LOCKING] {
  29. set ::using_proxy $value
  30. }
  31. # Disable the proxy locking for these tests
  32. set env(SQLITE_FORCE_PROXY_LOCKING) "0"
  33. }
  34. do_test lock5-dotfile.1 {
  35. sqlite3 db test.db -vfs unix-dotfile
  36. execsql {
  37. BEGIN;
  38. CREATE TABLE t1(a, b);
  39. }
  40. } {}
  41. do_test lock5-dotfile.2 {
  42. file exists test.db.lock
  43. } {1}
  44. do_test lock5-dotfile.3 {
  45. execsql COMMIT
  46. file exists test.db.lock
  47. } {0}
  48. do_test lock5-dotfile.4 {
  49. sqlite3 db2 test.db -vfs unix-dotfile
  50. execsql {
  51. INSERT INTO t1 VALUES('a', 'b');
  52. SELECT * FROM t1;
  53. } db2
  54. } {a b}
  55. do_test lock5-dotfile.5 {
  56. execsql {
  57. BEGIN;
  58. SELECT * FROM t1;
  59. } db2
  60. } {a b}
  61. do_test lock5-dotfile.6 {
  62. file exists test.db.lock
  63. } {1}
  64. do_test lock5-dotfile.7 {
  65. catchsql { SELECT * FROM t1; }
  66. } {1 {database is locked}}
  67. do_test lock5-dotfile.8 {
  68. execsql {
  69. SELECT * FROM t1;
  70. ROLLBACK;
  71. } db2
  72. } {a b}
  73. do_test lock5-dotfile.9 {
  74. catchsql { SELECT * FROM t1; }
  75. } {0 {a b}}
  76. do_test lock5-dotfile.10 {
  77. file exists test.db.lock
  78. } {0}
  79. do_test lock5-dotfile.X {
  80. db2 close
  81. execsql {BEGIN EXCLUSIVE}
  82. db close
  83. file exists test.db.lock
  84. } {0}
  85. #####################################################################
  86. forcedelete test.db
  87. if {[catch {sqlite3 db test.db -vfs unix-flock} msg]} {
  88. finish_test
  89. return
  90. }
  91. do_test lock5-flock.1 {
  92. sqlite3 db test.db -vfs unix-flock
  93. execsql {
  94. CREATE TABLE t1(a, b);
  95. BEGIN;
  96. INSERT INTO t1 VALUES(1, 2);
  97. }
  98. } {}
  99. # Make sure we are not accidentally using the dotfile locking scheme.
  100. do_test lock5-flock.2 {
  101. file exists test.db.lock
  102. } {0}
  103. do_test lock5-flock.3 {
  104. catch { sqlite3 db2 test.db -vfs unix-flock }
  105. catchsql { SELECT * FROM t1 } db2
  106. } {1 {database is locked}}
  107. do_test lock5-flock.4 {
  108. execsql COMMIT
  109. catchsql { SELECT * FROM t1 } db2
  110. } {0 {1 2}}
  111. do_test lock5-flock.5 {
  112. execsql BEGIN
  113. catchsql { SELECT * FROM t1 } db2
  114. } {0 {1 2}}
  115. do_test lock5-flock.6 {
  116. execsql {SELECT * FROM t1}
  117. catchsql { SELECT * FROM t1 } db2
  118. } {1 {database is locked}}
  119. do_test lock5-flock.7 {
  120. db close
  121. catchsql { SELECT * FROM t1 } db2
  122. } {0 {1 2}}
  123. do_test lock5-flock.8 {
  124. db2 close
  125. } {}
  126. #####################################################################
  127. do_test lock5-none.1 {
  128. sqlite3 db test.db -vfs unix-none
  129. sqlite3 db2 test.db -vfs unix-none
  130. execsql {
  131. BEGIN;
  132. INSERT INTO t1 VALUES(3, 4);
  133. }
  134. } {}
  135. do_test lock5-none.2 {
  136. execsql { SELECT * FROM t1 }
  137. } {1 2 3 4}
  138. do_test lock5-flock.3 {
  139. execsql { SELECT * FROM t1 } db2
  140. } {1 2}
  141. do_test lock5-none.4 {
  142. execsql {
  143. BEGIN;
  144. SELECT * FROM t1;
  145. } db2
  146. } {1 2}
  147. do_test lock5-none.5 {
  148. execsql COMMIT
  149. execsql {SELECT * FROM t1} db2
  150. } {1 2}
  151. ifcapable memorymanage {
  152. do_test lock5-none.6 {
  153. sqlite3_release_memory 1000000
  154. execsql {SELECT * FROM t1} db2
  155. } {1 2 3 4}
  156. }
  157. do_test lock5-flock.X {
  158. db close
  159. db2 close
  160. } {}
  161. ifcapable lock_proxy_pragmas {
  162. set env(SQLITE_FORCE_PROXY_LOCKING) $::using_proxy
  163. }
  164. finish_test