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