1# 2001 September 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# This file implements regression tests for SQLite library. The 12# focus of this script is page cache subsystem. 13# 14# $Id: pager2.test,v 1.9 2008/12/30 17:55:00 drh Exp $ 15 16 17set testdir [file dirname $argv0] 18source $testdir/tester.tcl 19 20# Don't run this test file if the pager test interface [pager_open] is not 21# available, or the library was compiled without in-memory database support. 22# 23if {[info commands pager_open]!=""} { 24ifcapable memorydb { 25db close 26 27# Basic sanity check. Open and close a pager. 28# 29do_test pager2-1.0 { 30 set v [catch { 31 set ::p1 [pager_open :memory: 10] 32 } msg] 33} {0} 34do_test pager2-1.1 { 35 pager_stats $::p1 36} {ref 0 page 0 max 10 size 0 state 4 err 0 hit 0 miss 0 ovfl 0} 37do_test pager2-1.2 { 38 pager_pagecount $::p1 39} {0} 40do_test pager2-1.3 { 41 pager_stats $::p1 42} {ref 0 page 0 max 10 size 0 state 4 err 0 hit 0 miss 0 ovfl 0} 43do_test pager2-1.4 { 44 pager_close $::p1 45} {} 46 47# Try to write a few pages. 48# 49do_test pager2-2.1 { 50 set v [catch { 51 set ::p1 [pager_open :memory: 10] 52 } msg] 53} {0} 54#do_test pager2-2.2 { 55# set v [catch { 56# set ::g1 [page_get $::p1 0] 57# } msg] 58# lappend v $msg 59#} {1 SQLITE_ERROR} 60do_test pager2-2.3.1 { 61 set ::gx [page_lookup $::p1 1] 62} {} 63do_test pager2-2.3.2 { 64 pager_stats $::p1 65} {ref 0 page 0 max 10 size 0 state 4 err 0 hit 0 miss 0 ovfl 0} 66do_test pager2-2.3.3 { 67 set v [catch { 68 set ::g1 [page_get $::p1 1] 69 } msg] 70 if {$v} {lappend v $msg} 71 set v 72} {0} 73do_test pager2-2.3.3 { 74 pager_stats $::p1 75} {ref 1 page 1 max 10 size 0 state 4 err 0 hit 0 miss 1 ovfl 0} 76do_test pager2-2.3.4 { 77 set ::gx [page_lookup $::p1 1] 78 page_unref $::gx 79 expr {$::gx!=""} 80} {1} 81do_test pager2-2.3.5 { 82 pager_stats $::p1 83} {ref 1 page 1 max 10 size 0 state 4 err 0 hit 0 miss 1 ovfl 0} 84do_test pager2-2.3.6 { 85 expr {$::g1==$::gx} 86} {1} 87do_test pager2-2.3.7 { 88 pager_stats $::p1 89} {ref 1 page 1 max 10 size 0 state 4 err 0 hit 0 miss 1 ovfl 0} 90do_test pager2-2.4 { 91 pager_stats $::p1 92} {ref 1 page 1 max 10 size 0 state 4 err 0 hit 0 miss 1 ovfl 0} 93do_test pager2-2.5 { 94 pager_pagecount $::p1 95} {0} 96do_test pager2-2.6 { 97 pager_stats $::p1 98} {ref 1 page 1 max 10 size 0 state 4 err 0 hit 0 miss 1 ovfl 0} 99do_test pager2-2.7 { 100 page_number $::g1 101} {1} 102do_test pager2-2.8 { 103 page_read $::g1 104} {} 105do_test pager2-2.9 { 106 page_unref $::g1 107} {} 108do_test pager2-2.10 { 109 pager_stats $::p1 110} {ref 0 page 1 max 10 size 0 state 4 err 0 hit 0 miss 1 ovfl 0} 111do_test pager2-2.11 { 112 set ::g1 [page_get $::p1 1] 113 expr {$::g1!=0} 114} {1} 115do_test pager2-2.12 { 116 page_number $::g1 117} {1} 118do_test pager2-2.13 { 119 pager_stats $::p1 120} {ref 1 page 1 max 10 size 0 state 4 err 0 hit 1 miss 1 ovfl 0} 121do_test pager2-2.14 { 122 set v [catch { 123 page_write $::g1 "Page-One" 124 } msg] 125 lappend v $msg 126} {0 {}} 127do_test pager2-2.15 { 128 pager_stats $::p1 129} {ref 1 page 1 max 10 size 1 state 4 err 0 hit 1 miss 1 ovfl 0} 130do_test pager2-2.16 { 131 page_read $::g1 132} {Page-One} 133do_test pager2-2.17 { 134 set v [catch { 135 pager_commit $::p1 136 } msg] 137 lappend v $msg 138} {0 {}} 139do_test pager2-2.20 { 140 pager_stats $::p1 141} {ref 1 page 1 max 10 size 1 state 4 err 0 hit 1 miss 1 ovfl 0} 142do_test pager2-2.19 { 143 pager_pagecount $::p1 144} {1} 145do_test pager2-2.21 { 146 pager_stats $::p1 147} {ref 1 page 1 max 10 size 1 state 4 err 0 hit 1 miss 1 ovfl 0} 148do_test pager2-2.22 { 149 page_unref $::g1 150} {} 151do_test pager2-2.23 { 152 pager_stats $::p1 153} {ref 0 page 1 max 10 size 1 state 4 err 0 hit 1 miss 1 ovfl 0} 154do_test pager2-2.24 { 155 set v [catch { 156 page_get $::p1 1 157 } ::g1] 158 if {$v} {lappend v $::g1} 159 set v 160} {0} 161do_test pager2-2.25 { 162 page_read $::g1 163} {Page-One} 164do_test pager2-2.26 { 165 set v [catch { 166 page_write $::g1 {page-one} 167 } msg] 168 lappend v $msg 169} {0 {}} 170do_test pager2-2.27 { 171 page_read $::g1 172} {page-one} 173do_test pager2-2.28 { 174 set v [catch { 175 pager_rollback $::p1 176 } msg] 177 lappend v $msg 178} {0 {}} 179do_test pager2-2.29 { 180 page_unref $::g1 181 set ::g1 [page_get $::p1 1] 182 page_read $::g1 183} {Page-One} 184do_test pager2-2.99 { 185 page_unref $::g1 186} {} 187 188#do_test pager2-3.1 { 189# set v [catch { 190# set ::p1 [pager_open :memory: 15] 191# } msg] 192# if {$v} {lappend v $msg} 193# set v 194#} {0} 195do_test pager2-3.2 { 196 pager_pagecount $::p1 197} {1} 198do_test pager2-3.3 { 199 set v [catch { 200 set ::g(1) [page_get $::p1 1] 201 } msg] 202 if {$v} {lappend v $msg} 203 set v 204} {0} 205do_test pager2-3.4 { 206 page_read $::g(1) 207} {Page-One} 208do_test pager2-3.5 { 209 for {set i 2} {$i<=20} {incr i} { 210 set gx [page_get $::p1 $i] 211 page_write $gx "Page-$i" 212 page_unref $gx 213 } 214 pager_commit $::p1 215 page_unref $::g(1) 216} {} 217for {set i 2} {$i<=20} {incr i} { 218 set page1 [page_get $::p1 1] 219 do_test pager2-3.6.[expr {$i-1}] [subst { 220 set gx \[page_get $::p1 $i\] 221 set v \[page_read \$gx\] 222 page_unref \$gx 223 set v 224 }] "Page-$i" 225 page_unref $page1 226} 227for {set i 1} {$i<=20} {incr i} { 228 set page1 [page_get $::p1 1] 229 regsub -all CNT { 230 set ::g1 [page_get $::p1 CNT] 231 set ::g2 [page_get $::p1 CNT] 232 set ::vx [page_read $::g2] 233 expr {$::g1==$::g2} 234 } $i body; 235 do_test pager2-3.7.$i.1 $body {1} 236 regsub -all CNT { 237 page_unref $::g2 238 set vy [page_read $::g1] 239 expr {$vy==$::vx} 240 } $i body; 241 do_test pager2-3.7.$i.2 $body {1} 242 regsub -all CNT { 243 page_unref $::g1 244 set gx [page_get $::p1 CNT] 245 set vy [page_read $gx] 246 page_unref $gx 247 expr {$vy==$::vx} 248 } $i body; 249 do_test pager2-3.7.$i.3 $body {1} 250 page_unref $page1 251} 252do_test pager2-3.99 { 253 pager_close $::p1 254} {} 255 256# tests of the checkpoint mechanism and api 257# 258do_test pager2-4.0 { 259 set v [catch { 260 set ::p1 [pager_open :memory: 15] 261 } msg] 262 if {$v} {lappend v $msg} 263 set v 264} {0} 265do_test pager2-4.1 { 266 set g1 [page_get $::p1 1] 267 page_write $g1 "Page-1 v0" 268 for {set i 2} {$i<=20} {incr i} { 269 set gx [page_get $::p1 $i] 270 page_write $gx "Page-$i v0" 271 page_unref $gx 272 } 273 pager_commit $::p1 274} {} 275for {set i 1} {$i<=20} {incr i} { 276 do_test pager2-4.2.$i { 277 set gx [page_get $p1 $i] 278 set v [page_read $gx] 279 page_unref $gx 280 set v 281 } "Page-$i v0" 282} 283do_test pager2-4.3 { 284 lrange [pager_stats $::p1] 0 1 285} {ref 1} 286do_test pager2-4.4 { 287 lrange [pager_stats $::p1] 8 9 288} {state 4} 289 290for {set i 1} {$i<20} {incr i} { 291 do_test pager2-4.5.$i.0 { 292 set res {} 293 for {set j 2} {$j<=20} {incr j} { 294 set gx [page_get $p1 $j] 295 set value [page_read $gx] 296 page_unref $gx 297 set shouldbe "Page-$j v[expr {$i-1}]" 298 if {$value!=$shouldbe} { 299 lappend res $value $shouldbe 300 } 301 } 302 set res 303 } {} 304 do_test pager2-4.5.$i.1 { 305 page_write $g1 "Page-1 v$i" 306 lrange [pager_stats $p1] 8 9 307 } {state 4} 308 do_test pager2-4.5.$i.2 { 309 for {set j 2} {$j<=20} {incr j} { 310 set gx [page_get $p1 $j] 311 page_write $gx "Page-$j v$i" 312 page_unref $gx 313 if {$j==$i} { 314 pager_stmt_begin $p1 315 } 316 } 317 } {} 318 do_test pager2-4.5.$i.3 { 319 set res {} 320 for {set j 2} {$j<=20} {incr j} { 321 set gx [page_get $p1 $j] 322 set value [page_read $gx] 323 page_unref $gx 324 set shouldbe "Page-$j v$i" 325 if {$value!=$shouldbe} { 326 lappend res $value $shouldbe 327 } 328 } 329 set res 330 } {} 331 do_test pager2-4.5.$i.4 { 332 pager_rollback $p1 333 set res {} 334 for {set j 2} {$j<=20} {incr j} { 335 set gx [page_get $p1 $j] 336 set value [page_read $gx] 337 page_unref $gx 338 set shouldbe "Page-$j v[expr {$i-1}]" 339 if {$value!=$shouldbe} { 340 lappend res $value $shouldbe 341 } 342 } 343 set res 344 } {} 345 do_test pager2-4.5.$i.5 { 346 page_write $g1 "Page-1 v$i" 347 lrange [pager_stats $p1] 8 9 348 } {state 4} 349 do_test pager2-4.5.$i.6 { 350 for {set j 2} {$j<=20} {incr j} { 351 set gx [page_get $p1 $j] 352 page_write $gx "Page-$j v$i" 353 page_unref $gx 354 if {$j==$i} { 355 pager_stmt_begin $p1 356 } 357 } 358 } {} 359 do_test pager2-4.5.$i.7 { 360 pager_stmt_rollback $p1 361 for {set j 2} {$j<=20} {incr j} { 362 set gx [page_get $p1 $j] 363 set value [page_read $gx] 364 page_unref $gx 365 if {$j<=$i || $i==1} { 366 set shouldbe "Page-$j v$i" 367 } else { 368 set shouldbe "Page-$j v[expr {$i-1}]" 369 } 370 if {$value!=$shouldbe} { 371 lappend res $value $shouldbe 372 } 373 } 374 set res 375 } {} 376 do_test pager2-4.5.$i.8 { 377 for {set j 2} {$j<=20} {incr j} { 378 set gx [page_get $p1 $j] 379 page_write $gx "Page-$j v$i" 380 page_unref $gx 381 if {$j==$i} { 382 pager_stmt_begin $p1 383 } 384 } 385 } {} 386 do_test pager2-4.5.$i.9 { 387 pager_stmt_commit $p1 388 for {set j 2} {$j<=20} {incr j} { 389 set gx [page_get $p1 $j] 390 set value [page_read $gx] 391 page_unref $gx 392 set shouldbe "Page-$j v$i" 393 if {$value!=$shouldbe} { 394 lappend res $value $shouldbe 395 } 396 } 397 set res 398 } {} 399 do_test pager2-4.5.$i.10 { 400 pager_commit $p1 401 lrange [pager_stats $p1] 8 9 402 } {state 4} 403} 404 405do_test pager2-4.99 { 406 page_unref $::g1 407 pager_close $::p1 408} {} 409 410} ;# ifcapable inmemory 411} ;# end if( has pager_open command ); 412 413 414finish_test 415