1
0

memsubsys1.test 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. # 2008 June 18
  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. # This file contains tests of the memory allocation subsystem
  13. #
  14. set testdir [file dirname $argv0]
  15. source $testdir/tester.tcl
  16. sqlite3_reset_auto_extension
  17. # This test assumes that no page-cache or scratch buffers are installed
  18. # by default when a new database connection is opened. As a result, it
  19. # will not work with the "memsubsys1" permutation.
  20. #
  21. if {[permutation] == "memsubsys1"} {
  22. finish_test
  23. return
  24. }
  25. # This procedure constructs a new database in test.db. It fills
  26. # this database with many small records (enough to force multiple
  27. # rebalance operations in the btree-layer and to require a large
  28. # page cache), verifies correct results, then returns.
  29. #
  30. proc build_test_db {testname pragmas} {
  31. catch {db close}
  32. forcedelete test.db test.db-journal
  33. sqlite3 db test.db
  34. sqlite3_db_config_lookaside db 0 0 0
  35. db eval $pragmas
  36. db eval {
  37. CREATE TABLE t1(x, y);
  38. CREATE TABLE t2(a, b);
  39. CREATE INDEX i1 ON t1(x,y);
  40. INSERT INTO t1 VALUES(1, 100);
  41. INSERT INTO t1 VALUES(2, 200);
  42. }
  43. for {set i 2} {$i<5000} {incr i $i} {
  44. db eval {INSERT INTO t2 SELECT * FROM t1}
  45. db eval {INSERT INTO t1 SELECT a+$i, a+b*100 FROM t2}
  46. db eval {DELETE FROM t2}
  47. }
  48. do_test $testname.1 {
  49. db eval {SELECT count(*) FROM t1}
  50. } 8192
  51. integrity_check $testname.2
  52. }
  53. # Reset all of the highwater marks.
  54. #
  55. proc reset_highwater_marks {} {
  56. sqlite3_status SQLITE_STATUS_MEMORY_USED 1
  57. sqlite3_status SQLITE_STATUS_MALLOC_SIZE 1
  58. sqlite3_status SQLITE_STATUS_PAGECACHE_USED 1
  59. sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 1
  60. sqlite3_status SQLITE_STATUS_PAGECACHE_SIZE 1
  61. sqlite3_status SQLITE_STATUS_SCRATCH_USED 1
  62. sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 1
  63. sqlite3_status SQLITE_STATUS_SCRATCH_SIZE 1
  64. sqlite3_status SQLITE_STATUS_PARSER_STACK 1
  65. }
  66. set xtra_size 290
  67. # Test 1: Both PAGECACHE and SCRATCH are shut down.
  68. #
  69. db close
  70. sqlite3_shutdown
  71. sqlite3_config_lookaside 0 0
  72. sqlite3_initialize
  73. reset_highwater_marks
  74. build_test_db memsubsys1-1 {PRAGMA page_size=1024}
  75. do_test memsubsys1-1.3 {
  76. set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
  77. } 0
  78. do_test memsubsys1-1.4 {
  79. set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
  80. } 0
  81. set max_pagecache [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2]
  82. #show_memstats
  83. # Test 2: Activate PAGECACHE with 20 pages
  84. #
  85. db close
  86. sqlite3_shutdown
  87. sqlite3_config_pagecache [expr 1024+$xtra_size] 20
  88. sqlite3_initialize
  89. reset_highwater_marks
  90. build_test_db memsubsys1-2 {PRAGMA page_size=1024; PRAGMA mmap_size=0}
  91. #show_memstats
  92. set MEMORY_MANAGEMENT $sqlite_options(memorymanage)
  93. ifcapable !malloc_usable_size {
  94. do_test memsubsys1-2.3 {
  95. set pg_ovfl [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2]
  96. } [expr ($TEMP_STORE>1 || $MEMORY_MANAGEMENT==0)*1024]
  97. }
  98. do_test memsubsys1-2.4 {
  99. set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
  100. } 20
  101. do_test memsubsys1-2.5 {
  102. set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
  103. } 0
  104. # Test 3: Activate PAGECACHE with 20 pages but use the wrong page size
  105. # so that PAGECACHE is not used.
  106. #
  107. db close
  108. sqlite3_shutdown
  109. sqlite3_config_pagecache [expr 512+$xtra_size] 20
  110. sqlite3_initialize
  111. reset_highwater_marks
  112. build_test_db memsubsys1-3.1 {PRAGMA page_size=1024}
  113. #show_memstats
  114. do_test memsubsys1-3.1.3 {
  115. set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
  116. } 0
  117. do_test memsubsys1-3.1.4 {
  118. set overflow [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2]
  119. } $max_pagecache
  120. do_test memsubsys1-3.1.5 {
  121. set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
  122. } 0
  123. db close
  124. sqlite3_shutdown
  125. sqlite3_config_pagecache [expr 2048+$xtra_size] 20
  126. sqlite3_initialize
  127. reset_highwater_marks
  128. build_test_db memsubsys1-3.2 {PRAGMA page_size=2048}
  129. #show_memstats
  130. do_test memsubsys1-3.2.3 {
  131. db eval {PRAGMA page_size}
  132. } 2048
  133. do_test memsubsys1-3.2.4 {
  134. set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
  135. } 20
  136. do_test memsubsys1-3.2.5 {
  137. set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
  138. } 0
  139. # Test 4: Activate both PAGECACHE and SCRATCH.
  140. #
  141. db close
  142. sqlite3_shutdown
  143. sqlite3_config_pagecache [expr 1024+$xtra_size] 50
  144. sqlite3_config_scratch 6000 2
  145. sqlite3_initialize
  146. reset_highwater_marks
  147. build_test_db memsubsys1-4 {PRAGMA page_size=1024}
  148. #show_memstats
  149. do_test memsubsys1-4.3 {
  150. set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
  151. expr {$pg_used>=45 && $pg_used<=50}
  152. } 1
  153. do_test memsubsys1-4.4 {
  154. set pg_ovfl [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2]
  155. } 0
  156. do_test memsubsys1-4.5 {
  157. set maxreq [lindex [sqlite3_status SQLITE_STATUS_MALLOC_SIZE 0] 2]
  158. expr {$maxreq<7000}
  159. } 1
  160. do_test memsubsys1-4.6 {
  161. set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
  162. } 1
  163. # Test 5: Activate both PAGECACHE and SCRATCH. But make the page size
  164. # such that the SCRATCH allocations are too small.
  165. #
  166. db close
  167. sqlite3_shutdown
  168. sqlite3_config_pagecache [expr 4096+$xtra_size] 24
  169. sqlite3_config_scratch 6000 2
  170. sqlite3_initialize
  171. reset_highwater_marks
  172. build_test_db memsubsys1-5 {PRAGMA page_size=4096}
  173. #show_memstats
  174. do_test memsubsys1-5.3 {
  175. set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
  176. } 24
  177. do_test memsubsys1-5.4 {
  178. set maxreq [lindex [sqlite3_status SQLITE_STATUS_MALLOC_SIZE 0] 2]
  179. expr {$maxreq>4096}
  180. } 1
  181. do_test memsubsys1-5.5 {
  182. set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
  183. } 0
  184. do_test memsubsys1-5.6 {
  185. set s_ovfl [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 0] 2]
  186. expr {$s_ovfl>6000}
  187. } 1
  188. # Test 6: Activate both PAGECACHE and SCRATCH with a 4k page size.
  189. # Make it so that SCRATCH is large enough
  190. #
  191. db close
  192. sqlite3_shutdown
  193. sqlite3_config_pagecache [expr 4096+$xtra_size] 24
  194. sqlite3_config_scratch 25300 1
  195. sqlite3_initialize
  196. reset_highwater_marks
  197. build_test_db memsubsys1-6 {PRAGMA page_size=4096}
  198. #show_memstats
  199. do_test memsubsys1-6.3 {
  200. set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
  201. } 24
  202. #do_test memsubsys1-6.4 {
  203. # set maxreq [lindex [sqlite3_status SQLITE_STATUS_MALLOC_SIZE 0] 2]
  204. # expr {$maxreq>4096 && $maxreq<=(4096+$xtra_size)}
  205. #} 1
  206. do_test memsubsys1-6.5 {
  207. set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
  208. } 1
  209. do_test memsubsys1-6.6 {
  210. set s_ovfl [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 0] 2]
  211. } 0
  212. # Test 7: Activate both PAGECACHE and SCRATCH with a 4k page size.
  213. # Set cache_size small so that no PAGECACHE overflow occurs. Verify
  214. # that maximum allocation size is small.
  215. #
  216. db close
  217. sqlite3_shutdown
  218. sqlite3_config_pagecache [expr 4096+$xtra_size] 24
  219. sqlite3_config_scratch 25300 1
  220. sqlite3_initialize
  221. reset_highwater_marks
  222. build_test_db memsubsys1-7 {
  223. PRAGMA page_size=4096;
  224. PRAGMA cache_size=10;
  225. PRAGMA temp_store=memory;
  226. }
  227. #show_memstats
  228. do_test memsubsys1-7.3 {
  229. set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
  230. expr {$pg_used<24}
  231. } 1
  232. do_test memsubsys1-7.4 {
  233. set pg_ovfl [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2]
  234. } 0
  235. do_test memsubsys1-7.5 {
  236. set maxreq [lindex [sqlite3_status SQLITE_STATUS_MALLOC_SIZE 0] 2]
  237. expr {$maxreq<4100}
  238. } 1
  239. do_test memsubsys1-7.6 {
  240. set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
  241. } 1
  242. do_test memsubsys1-7.7 {
  243. set s_ovfl [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 0] 2]
  244. } 0
  245. # Test 8: Disable PAGECACHE. Make available SCRATCH zero. Verify that
  246. # the SCRATCH overflow logic works.
  247. #
  248. db close
  249. sqlite3_shutdown
  250. sqlite3_config_pagecache 0 0
  251. sqlite3_config_scratch 25000 0
  252. sqlite3_initialize
  253. reset_highwater_marks
  254. do_test memsubsys1-8.1 {
  255. set pg_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
  256. } 0
  257. do_test memsubsys1-8.2 {
  258. set s_ovfl [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 0] 2]
  259. } 0
  260. do_test memsubsys1-8.3 {
  261. sqlite3 db :memory:
  262. db eval {
  263. CREATE TABLE t1(x);
  264. INSERT INTO t1 VALUES(zeroblob(400));
  265. INSERT INTO t1 VALUES(zeroblob(400));
  266. INSERT INTO t1 SELECT * FROM t1;
  267. INSERT INTO t1 SELECT * FROM t1;
  268. INSERT INTO t1 SELECT * FROM t1;
  269. }
  270. expr {[lindex [sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 0] 2]>0}
  271. } 1
  272. db close
  273. sqlite3_shutdown
  274. sqlite3_config_memstatus 0
  275. sqlite3_initialize
  276. do_test memsubsys1-8.4 {
  277. sqlite3 db :memory:
  278. db eval {
  279. CREATE TABLE t1(x);
  280. INSERT INTO t1 VALUES(zeroblob(400));
  281. INSERT INTO t1 VALUES(zeroblob(400));
  282. INSERT INTO t1 SELECT * FROM t1;
  283. INSERT INTO t1 SELECT * FROM t1;
  284. INSERT INTO t1 SELECT * FROM t1;
  285. SELECT rowid FROM t1;
  286. }
  287. } {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16}
  288. db close
  289. sqlite3_shutdown
  290. sqlite3_config_memstatus 1
  291. sqlite3_config_pagecache 0 0
  292. sqlite3_config_scratch 0 0
  293. sqlite3_config_lookaside 100 500
  294. sqlite3_initialize
  295. autoinstall_test_functions
  296. finish_test