intck2.test 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. # 2024 Feb 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. #
  12. # The focus of this file is testing the incremental integrity check
  13. # (intck) extension.
  14. #
  15. source [file join [file dirname [info script]] intck_common.tcl]
  16. set testprefix intck2
  17. return_if_no_intck
  18. do_execsql_test 1.0 {
  19. CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT);
  20. INSERT INTO t1 VALUES(1, 'one');
  21. INSERT INTO t1 VALUES(2, 'two');
  22. INSERT INTO t1 VALUES(3, 'three');
  23. CREATE INDEX i1 ON t1(b);
  24. }
  25. proc imposter_edit {obj create sql} {
  26. sqlite3 xdb test.db
  27. set pgno [xdb one {SELECT rootpage FROM sqlite_schema WHERE name=$obj}]
  28. sqlite3_test_control SQLITE_TESTCTRL_IMPOSTER xdb main 1 $pgno
  29. xdb eval $create
  30. sqlite3_test_control SQLITE_TESTCTRL_IMPOSTER xdb main 0 0
  31. xdb eval $sql
  32. xdb close
  33. }
  34. imposter_edit i1 {
  35. CREATE TABLE imp(b, a, PRIMARY KEY(b)) WITHOUT ROWID;
  36. } {
  37. DELETE FROM imp WHERE b='two';
  38. INSERT INTO imp(b, a) VALUES('four', 4);
  39. }
  40. do_intck_test 1.1 {
  41. {surplus entry ('four',4) in index i1}
  42. {entry ('two',2) missing from index i1}
  43. }
  44. #-------------------------------------------------------------------------
  45. reset_db
  46. do_execsql_test 2.0 {
  47. CREATE TABLE x1(a, b, "c d");
  48. CREATE INDEX x1a ON x1(a COLLATE nocase DESC , b ASC);
  49. CREATE INDEX x1b ON x1( a || b || ' "''" ' COLLATE binary ASC );
  50. CREATE INDEX x1c ON x1( format('%s', a)ASC, format('%d', "c d" ) );
  51. INSERT INTO x1 VALUES('one', 2, 3);
  52. INSERT INTO x1 VALUES('One', 4, 5);
  53. INSERT INTO x1 VALUES('ONE', 6, 7);
  54. INSERT INTO x1 VALUES(NULL, NULL, NULL);
  55. }
  56. do_intck_test 2.1 {}
  57. imposter_edit x1 {
  58. CREATE TABLE imp(a, b, c);
  59. } {
  60. DELETE FROM imp WHERE c=7;
  61. }
  62. do_intck_test 2.2 {
  63. {surplus entry ('ONE',6,3) in index x1a}
  64. {surplus entry ('ONE6 "''" ',3) in index x1b}
  65. {surplus entry ('ONE','7',3) in index x1c}
  66. }
  67. #-------------------------------------------------------------------------
  68. reset_db
  69. do_execsql_test 3.0 {
  70. CREATE TABLE x1(a, b, c);
  71. CREATE INDEX x1all ON x1(a DESC, b ASC, c DESC);
  72. INSERT INTO x1 VALUES(2, 1, 2);
  73. INSERT INTO x1 VALUES(2, 1, 1);
  74. INSERT INTO x1 VALUES(2, 2, 2);
  75. INSERT INTO x1 VALUES(2, 2, 1);
  76. INSERT INTO x1 VALUES(1, 1, 2);
  77. INSERT INTO x1 VALUES(1, 1, 1);
  78. INSERT INTO x1 VALUES(1, 2, 2);
  79. INSERT INTO x1 VALUES(1, 2, 1);
  80. }
  81. do_intck_test 3.1 {
  82. }
  83. imposter_edit x1 {
  84. CREATE TABLE imp(a, b, c);
  85. } {
  86. DELETE FROM imp WHERE 1;
  87. }
  88. db close
  89. sqlite3 db test.db
  90. do_intck_test 3.2 {
  91. {surplus entry (2,1,2,1) in index x1all}
  92. {surplus entry (2,1,1,2) in index x1all}
  93. {surplus entry (2,2,2,3) in index x1all}
  94. {surplus entry (2,2,1,4) in index x1all}
  95. {surplus entry (1,1,2,5) in index x1all}
  96. {surplus entry (1,1,1,6) in index x1all}
  97. {surplus entry (1,2,2,7) in index x1all}
  98. {surplus entry (1,2,1,8) in index x1all}
  99. }
  100. do_execsql_test 3.3 {
  101. DELETE FROM x1;
  102. INSERT INTO x1 VALUES(NULL, NULL, NULL);
  103. INSERT INTO x1 VALUES(NULL, NULL, NULL);
  104. INSERT INTO x1 VALUES(NULL, NULL, NULL);
  105. INSERT INTO x1 VALUES(NULL, NULL, NULL);
  106. }
  107. do_intck_test 3.4 {
  108. }
  109. imposter_edit x1 {
  110. CREATE TABLE imp(a, b, c);
  111. } {
  112. DELETE FROM imp WHERE 1;
  113. INSERT INTO imp(rowid) VALUES(-123);
  114. INSERT INTO imp(rowid) VALUES(456);
  115. }
  116. db close
  117. sqlite3 db test.db
  118. do_intck_test 3.5 {
  119. {entry (NULL,NULL,NULL,-123) missing from index x1all}
  120. {entry (NULL,NULL,NULL,456) missing from index x1all}
  121. {surplus entry (NULL,NULL,NULL,1) in index x1all}
  122. {surplus entry (NULL,NULL,NULL,2) in index x1all}
  123. {surplus entry (NULL,NULL,NULL,3) in index x1all}
  124. {surplus entry (NULL,NULL,NULL,4) in index x1all}
  125. }
  126. reset_db
  127. do_execsql_test 3.6 {
  128. CREATE TABLE w1(a PRIMARY KEY, b, c);
  129. INSERT INTO w1 VALUES(1.0, NULL, NULL);
  130. INSERT INTO w1 VALUES(33.0, NULL, NULL);
  131. INSERT INTO w1 VALUES(100.0, NULL, NULL);
  132. CREATE INDEX w1bc ON w1(b, c);
  133. }
  134. do_intck_test 3.7 {
  135. }
  136. imposter_edit w1 {
  137. CREATE TABLE imp(a, b, c);
  138. } {
  139. DELETE FROM imp WHERE a=33;
  140. INSERT INTO imp(a) VALUES(1234.5);
  141. INSERT INTO imp(a) VALUES(-1234.5);
  142. }
  143. do_intck_test 3.8 {
  144. {surplus entry (33.0,2) in index sqlite_autoindex_w1_1}
  145. {entry (1234.5,4) missing from index sqlite_autoindex_w1_1}
  146. {entry (NULL,NULL,4) missing from index w1bc}
  147. {entry (-1234.5,5) missing from index sqlite_autoindex_w1_1}
  148. {entry (NULL,NULL,5) missing from index w1bc}
  149. {surplus entry (NULL,NULL,2) in index w1bc}
  150. }
  151. finish_test