PageRenderTime 52ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/trunk/src/sqlite/test/savepoint4.test

#
Unknown | 169 lines | 145 code | 24 blank | 0 comment | 0 complexity | 4716fd47e0c243ee1966debc1182363a MD5 | raw file
Possible License(s): BSD-3-Clause
  1. # 2008 December 15
  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. # $Id: savepoint4.test,v 1.7 2009/06/09 15:25:33 danielk1977 Exp $
  13. set testdir [file dirname $argv0]
  14. source $testdir/tester.tcl
  15. ifcapable !crashtest {
  16. finish_test
  17. return
  18. }
  19. proc signature {} {
  20. return [db eval {SELECT count(*), md5sum(x) FROM t1}]
  21. }
  22. set ITERATIONS 25 ;# Number of iterations for savepoint4-1
  23. set ITERATIONS2 13 ;# Number of iterations for savepoint4-2
  24. expr srand(0)
  25. do_test savepoint4-1 {
  26. execsql {
  27. PRAGMA cache_size=10;
  28. BEGIN;
  29. CREATE TABLE t1(x TEXT);
  30. INSERT INTO t1 VALUES(randstr(10,400));
  31. INSERT INTO t1 VALUES(randstr(10,400));
  32. INSERT INTO t1 SELECT randstr(10,400) FROM t1;
  33. INSERT INTO t1 SELECT randstr(10,400) FROM t1;
  34. INSERT INTO t1 SELECT randstr(10,400) FROM t1;
  35. INSERT INTO t1 SELECT randstr(10,400) FROM t1;
  36. INSERT INTO t1 SELECT randstr(10,400) FROM t1;
  37. INSERT INTO t1 SELECT randstr(10,400) FROM t1;
  38. INSERT INTO t1 SELECT randstr(10,400) FROM t1;
  39. INSERT INTO t1 SELECT randstr(10,400) FROM t1;
  40. INSERT INTO t1 SELECT randstr(10,400) FROM t1;
  41. COMMIT;
  42. SELECT count(*) FROM t1;
  43. }
  44. } {1024}
  45. unset -nocomplain ::sig
  46. for {set ii 1} {$ii<=$ITERATIONS} {incr ii} {
  47. set ::sig [signature]
  48. for {set iDelay 1 ; set crashed 1} {$crashed} {incr iDelay} {
  49. do_test savepoint4-1.$ii.1.$iDelay {
  50. set ret [crashsql -delay $iDelay -file test.db-journal {
  51. PRAGMA cache_size = 20;
  52. SAVEPOINT one;
  53. DELETE FROM t1 WHERE random()%2==0;
  54. SAVEPOINT two;
  55. INSERT INTO t1 SELECT randstr(10,10)||x FROM t1;
  56. ROLLBACK TO two;
  57. UPDATE t1 SET x = randstr(10, 400) WHERE random()%10;
  58. RELEASE two;
  59. ROLLBACK TO one;
  60. RELEASE one;
  61. }]
  62. signature
  63. } $::sig
  64. set crashed [lindex $ret 0]
  65. integrity_check savepoint4-1.$ii.1.$iDelay.integrity
  66. }
  67. do_test savepoint4-1.$ii.2 {
  68. execsql {
  69. DELETE FROM t1 WHERE random()%10==0;
  70. INSERT INTO t1 SELECT randstr(10,10)||x FROM t1 WHERE random()%9==0;
  71. }
  72. } {}
  73. }
  74. do_test savepoint4-2 {
  75. execsql {
  76. PRAGMA cache_size=10;
  77. DROP TABLE IF EXISTS t1;
  78. BEGIN;
  79. CREATE TABLE t1(x TEXT);
  80. CREATE INDEX i1 ON t1(x);
  81. INSERT INTO t1 VALUES(randstr(10,400));
  82. INSERT INTO t1 VALUES(randstr(10,400));
  83. INSERT INTO t1 SELECT randstr(10,400) FROM t1;
  84. INSERT INTO t1 SELECT randstr(10,400) FROM t1;
  85. INSERT INTO t1 SELECT randstr(10,400) FROM t1;
  86. INSERT INTO t1 SELECT randstr(10,400) FROM t1;
  87. INSERT INTO t1 SELECT randstr(10,400) FROM t1;
  88. INSERT INTO t1 SELECT randstr(10,400) FROM t1;
  89. INSERT INTO t1 SELECT randstr(10,400) FROM t1;
  90. COMMIT;
  91. SELECT count(*) FROM t1;
  92. }
  93. } {256}
  94. for {set ii 1} {$ii<=$ITERATIONS2} {incr ii} {
  95. set ::sig [signature]
  96. set file test.db-journal
  97. for {set iDelay 1 ; set crashed 1} {$crashed} {incr iDelay} {
  98. do_test savepoint4-2.$ii.1.$iDelay {
  99. set ret [crashsql -delay $iDelay -file $file {
  100. SAVEPOINT one;
  101. INSERT INTO t1 SELECT * FROM t1 WHERE rowid<50;
  102. ROLLBACK TO one;
  103. INSERT INTO t1 SELECT * FROM t1 WHERE rowid<50;
  104. SAVEPOINT two;
  105. DELETE FROM t1 WHERE (random()%10)==0;
  106. SAVEPOINT three;
  107. DELETE FROM t1 WHERE (random()%10)==0;
  108. SAVEPOINT four;
  109. DELETE FROM t1 WHERE (random()%10)==0;
  110. RELEASE two;
  111. SAVEPOINT three;
  112. UPDATE t1 SET x = substr(x||x, 12, 100000) WHERE (rowid%12)==0;
  113. SAVEPOINT four;
  114. UPDATE t1 SET x = substr(x||x, 14, 100000) WHERE (rowid%14)==0;
  115. ROLLBACK TO three;
  116. UPDATE t1 SET x = substr(x||x, 13, 100000) WHERE (rowid%13)==0;
  117. RELEASE three;
  118. DELETE FROM t1 WHERE rowid > (
  119. SELECT rowid FROM t1 ORDER BY rowid ASC LIMIT 1 OFFSET 256
  120. );
  121. RELEASE one;
  122. }]
  123. set crashed [lindex $ret 0]
  124. if {$crashed} {
  125. signature
  126. } else {
  127. set ::sig
  128. }
  129. } $::sig
  130. integrity_check savepoint4-2.$ii.1.$iDelay.integrity
  131. if {$crashed == 0 && $file == "test.db-journal"} {
  132. set crashed 1
  133. set iDelay 0
  134. set file test.db
  135. set ::sig [signature]
  136. }
  137. }
  138. do_test savepoint4-2.$ii.2 {
  139. execsql {
  140. DELETE FROM t1 WHERE random()%10==0;
  141. INSERT INTO t1 SELECT randstr(10,10)||x FROM t1 WHERE random()%9==0;
  142. }
  143. } {}
  144. }
  145. finish_test