vacuum3.test 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. # 2007 March 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. # This file implements regression tests for SQLite library. The
  12. # focus of this file is changing the database page size using a
  13. # VACUUM statement.
  14. #
  15. # $Id: vacuum3.test,v 1.9 2008/08/26 21:07:27 drh Exp $
  16. set testdir [file dirname $argv0]
  17. source $testdir/tester.tcl
  18. # If the VACUUM statement is disabled in the current build, skip all
  19. # the tests in this file.
  20. #
  21. ifcapable !vacuum {
  22. finish_test
  23. return
  24. }
  25. #-------------------------------------------------------------------
  26. # Test cases vacuum3-1.* convert a simple 2-page database between a
  27. # few different page sizes.
  28. #
  29. do_test vacuum3-1.1 {
  30. execsql {
  31. PRAGMA auto_vacuum=OFF;
  32. PRAGMA page_size = 1024;
  33. CREATE TABLE t1(a, b, c);
  34. INSERT INTO t1 VALUES(1, 2, 3);
  35. }
  36. } {}
  37. do_test vacuum3-1.2 {
  38. execsql { PRAGMA page_size }
  39. } {1024}
  40. do_test vacuum3-1.3 {
  41. file size test.db
  42. } {2048}
  43. set I 4
  44. foreach {request actual database} [list \
  45. 2048 2048 4096 \
  46. 1024 1024 2048 \
  47. 1170 1024 2048 \
  48. 256 1024 2048 \
  49. 512 512 1024 \
  50. 4096 4096 8192 \
  51. 1024 1024 2048 \
  52. ] {
  53. do_test vacuum3-1.$I.1 {
  54. execsql "
  55. PRAGMA page_size = $request;
  56. VACUUM;
  57. "
  58. execsql { PRAGMA page_size }
  59. } $actual
  60. do_test vacuum3-1.$I.2 {
  61. file size test.db
  62. } $database
  63. do_test vacuum3-1.$I.3 {
  64. execsql { SELECT * FROM t1 }
  65. } {1 2 3}
  66. integrity_check vacuum3-1.$I.4
  67. incr I
  68. }
  69. #-------------------------------------------------------------------
  70. # Test cases vacuum3-2.* convert a simple 3-page database between a
  71. # few different page sizes.
  72. #
  73. do_test vacuum3-2.1 {
  74. execsql {
  75. PRAGMA page_size = 1024;
  76. VACUUM;
  77. ALTER TABLE t1 ADD COLUMN d;
  78. UPDATE t1 SET d = randomblob(1000);
  79. }
  80. file size test.db
  81. } {3072}
  82. do_test vacuum3-2.2 {
  83. execsql { PRAGMA page_size }
  84. } {1024}
  85. do_test vacuum3-2.3 {
  86. set blob [db one {select d from t1}]
  87. string length $blob
  88. } {1000}
  89. set I 4
  90. foreach {request actual database} [list \
  91. 2048 2048 4096 \
  92. 1024 1024 3072 \
  93. 1170 1024 3072 \
  94. 256 1024 3072 \
  95. 512 512 2048 \
  96. 4096 4096 8192 \
  97. 1024 1024 3072 \
  98. ] {
  99. do_test vacuum3-2.$I.1 {
  100. execsql "
  101. PRAGMA page_size = $request;
  102. VACUUM;
  103. "
  104. execsql { PRAGMA page_size }
  105. } $actual
  106. do_test vacuum3-2.$I.2 {
  107. file size test.db
  108. } $database
  109. do_test vacuum3-2.$I.3 {
  110. execsql { SELECT * FROM t1 }
  111. } [list 1 2 3 $blob]
  112. integrity_check vacuum3-1.$I.4
  113. incr I
  114. }
  115. #-------------------------------------------------------------------
  116. # Test cases vacuum3-3.* converts a database large enough to include
  117. # the locking page (in a test environment) between few different
  118. # page sizes.
  119. #
  120. proc signature {} {
  121. return [db eval {SELECT count(*), md5sum(a), md5sum(b), md5sum(c) FROM abc}]
  122. }
  123. do_test vacuum3-3.1 {
  124. execsql "
  125. PRAGMA page_size = 1024;
  126. BEGIN;
  127. CREATE TABLE abc(a PRIMARY KEY, b, c);
  128. INSERT INTO abc VALUES(randomblob(100), randomblob(200), randomblob(1000));
  129. INSERT INTO abc
  130. SELECT randomblob(1000), randomblob(200), randomblob(100)
  131. FROM abc;
  132. INSERT INTO abc
  133. SELECT randomblob(100), randomblob(200), randomblob(1000)
  134. FROM abc;
  135. INSERT INTO abc
  136. SELECT randomblob(100), randomblob(200), randomblob(1000)
  137. FROM abc;
  138. INSERT INTO abc
  139. SELECT randomblob(100), randomblob(200), randomblob(1000)
  140. FROM abc;
  141. INSERT INTO abc
  142. SELECT randomblob(100), randomblob(200), randomblob(1000)
  143. FROM abc;
  144. INSERT INTO abc
  145. SELECT randomblob(25), randomblob(45), randomblob(9456)
  146. FROM abc;
  147. INSERT INTO abc
  148. SELECT randomblob(100), randomblob(200), randomblob(1000)
  149. FROM abc;
  150. INSERT INTO abc
  151. SELECT randomblob(25), randomblob(45), randomblob(9456)
  152. FROM abc;
  153. COMMIT;
  154. "
  155. } {}
  156. do_test vacuum3-3.2 {
  157. execsql { PRAGMA page_size }
  158. } {1024}
  159. set ::sig [signature]
  160. set I 3
  161. foreach {request actual} [list \
  162. 2048 2048 \
  163. 1024 1024 \
  164. 1170 1024 \
  165. 256 1024 \
  166. 512 512 \
  167. 4096 4096 \
  168. 1024 1024 \
  169. ] {
  170. do_test vacuum3-3.$I.1 {
  171. execsql "
  172. PRAGMA page_size = $request;
  173. VACUUM;
  174. "
  175. execsql { PRAGMA page_size }
  176. } $actual
  177. do_test vacuum3-3.$I.2 {
  178. signature
  179. } $::sig
  180. integrity_check vacuum3-3.$I.3
  181. incr I
  182. }
  183. do_test vacuum3-4.1 {
  184. db close
  185. delete_file test.db
  186. sqlite3 db test.db
  187. execsql {
  188. PRAGMA page_size=1024;
  189. CREATE TABLE abc(a, b, c);
  190. INSERT INTO abc VALUES(1, 2, 3);
  191. INSERT INTO abc VALUES(4, 5, 6);
  192. }
  193. execsql { SELECT * FROM abc }
  194. } {1 2 3 4 5 6}
  195. do_test vacuum3-4.2 {
  196. sqlite3 db2 test.db
  197. execsql { SELECT * FROM abc } db2
  198. } {1 2 3 4 5 6}
  199. do_test vacuum3-4.3 {
  200. execsql {
  201. PRAGMA page_size = 2048;
  202. VACUUM;
  203. }
  204. execsql { SELECT * FROM abc }
  205. } {1 2 3 4 5 6}
  206. do_test vacuum3-4.4 {
  207. execsql { SELECT * FROM abc } db2
  208. } {1 2 3 4 5 6}
  209. do_test vacuum3-4.5 {
  210. execsql {
  211. PRAGMA page_size=16384;
  212. VACUUM;
  213. } db2
  214. execsql { SELECT * FROM abc } db2
  215. } {1 2 3 4 5 6}
  216. do_test vacuum3-4.6 {
  217. execsql {
  218. PRAGMA page_size=1024;
  219. VACUUM;
  220. }
  221. execsql { SELECT * FROM abc } db2
  222. } {1 2 3 4 5 6}
  223. # Unable to change the page-size of an in-memory using vacuum.
  224. db2 close
  225. sqlite3 db2 :memory:
  226. do_test vacuum3-5.1 {
  227. db2 eval {
  228. CREATE TABLE t1(x);
  229. INSERT INTO t1 VALUES(1234);
  230. PRAGMA page_size=4096;
  231. VACUUM;
  232. SELECT * FROM t1;
  233. }
  234. } {1234}
  235. do_test vacuum3-5.2 {
  236. db2 eval {
  237. PRAGMA page_size
  238. }
  239. } {1024}
  240. set create_database_sql {
  241. BEGIN;
  242. CREATE TABLE t1(a, b, c);
  243. INSERT INTO t1 VALUES(1, randstr(50,50), randstr(50,50));
  244. INSERT INTO t1 SELECT a+2, b||'-'||rowid, c||'-'||rowid FROM t1;
  245. INSERT INTO t1 SELECT a+4, b||'-'||rowid, c||'-'||rowid FROM t1;
  246. INSERT INTO t1 SELECT a+8, b||'-'||rowid, c||'-'||rowid FROM t1;
  247. INSERT INTO t1 SELECT a+16, b||'-'||rowid, c||'-'||rowid FROM t1;
  248. INSERT INTO t1 SELECT a+32, b||'-'||rowid, c||'-'||rowid FROM t1;
  249. INSERT INTO t1 SELECT a+64, b||'-'||rowid, c||'-'||rowid FROM t1;
  250. INSERT INTO t1 SELECT a+128, b||'-'||rowid, c||'-'||rowid FROM t1;
  251. INSERT INTO t1 VALUES(1, randstr(600,600), randstr(600,600));
  252. CREATE TABLE t2 AS SELECT * FROM t1;
  253. CREATE TABLE t3 AS SELECT * FROM t1;
  254. COMMIT;
  255. DROP TABLE t2;
  256. }
  257. do_ioerr_test vacuum3-ioerr-1 -cksum true -sqlprep "
  258. PRAGMA page_size = 1024;
  259. $create_database_sql
  260. " -sqlbody {
  261. PRAGMA page_size = 4096;
  262. VACUUM;
  263. }
  264. do_ioerr_test vacuum3-ioerr-2 -cksum true -sqlprep "
  265. PRAGMA page_size = 2048;
  266. $create_database_sql
  267. " -sqlbody {
  268. PRAGMA page_size = 512;
  269. VACUUM;
  270. }
  271. ifcapable autovacuum {
  272. do_ioerr_test vacuum3-ioerr-3 -cksum true -sqlprep "
  273. PRAGMA auto_vacuum = 0;
  274. $create_database_sql
  275. " -sqlbody {
  276. PRAGMA auto_vacuum = 1;
  277. VACUUM;
  278. }
  279. do_ioerr_test vacuum3-ioerr-4 -cksum true -sqlprep "
  280. PRAGMA auto_vacuum = 1;
  281. $create_database_sql
  282. " -sqlbody {
  283. PRAGMA auto_vacuum = 0;
  284. VACUUM;
  285. }
  286. }
  287. source $testdir/malloc_common.tcl
  288. if {$MEMDEBUG} {
  289. do_malloc_test vacuum3-malloc-1 -sqlprep {
  290. PRAGMA page_size = 2048;
  291. BEGIN;
  292. CREATE TABLE t1(a, b, c);
  293. INSERT INTO t1 VALUES(1, randstr(50,50), randstr(50,50));
  294. INSERT INTO t1 SELECT a+2, b||'-'||rowid, c||'-'||rowid FROM t1;
  295. INSERT INTO t1 SELECT a+4, b||'-'||rowid, c||'-'||rowid FROM t1;
  296. INSERT INTO t1 SELECT a+8, b||'-'||rowid, c||'-'||rowid FROM t1;
  297. INSERT INTO t1 SELECT a+16, b||'-'||rowid, c||'-'||rowid FROM t1;
  298. INSERT INTO t1 SELECT a+32, b||'-'||rowid, c||'-'||rowid FROM t1;
  299. INSERT INTO t1 SELECT a+64, b||'-'||rowid, c||'-'||rowid FROM t1;
  300. INSERT INTO t1 SELECT a+128, b||'-'||rowid, c||'-'||rowid FROM t1;
  301. INSERT INTO t1 VALUES(1, randstr(600,600), randstr(600,600));
  302. CREATE TABLE t2 AS SELECT * FROM t1;
  303. CREATE TABLE t3 AS SELECT * FROM t1;
  304. COMMIT;
  305. DROP TABLE t2;
  306. } -sqlbody {
  307. PRAGMA page_size = 512;
  308. VACUUM;
  309. }
  310. do_malloc_test vacuum3-malloc-2 -sqlprep {
  311. PRAGMA encoding=UTF16;
  312. CREATE TABLE t1(a, b, c);
  313. INSERT INTO t1 VALUES(1, 2, 3);
  314. CREATE TABLE t2(x,y,z);
  315. INSERT INTO t2 SELECT * FROM t1;
  316. } -sqlbody {
  317. VACUUM;
  318. }
  319. }
  320. finish_test