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.5 2004/11/22 05:26:28 danielk1977 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 0 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 0 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 0 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 1 err 0 hit 0 miss 1 ovfl 0} 76do_test pager2-2.3.4 { 77 set ::gx [page_lookup $::p1 1] 78 expr {$::gx!=""} 79} {1} 80do_test pager2-2.3.5 { 81 pager_stats $::p1 82} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0} 83do_test pager2-2.3.6 { 84 expr {$::g1==$::gx} 85} {1} 86do_test pager2-2.3.7 { 87 page_unref $::gx 88 pager_stats $::p1 89} {ref 1 page 1 max 10 size 0 state 1 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 1 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 1 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 1 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 1 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 1 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 1 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 1 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} 184#do_test pager2-2.99 { 185# pager_close $::p1 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} {} 216for {set i 2} {$i<=20} {incr i} { 217 do_test pager2-3.6.[expr {$i-1}] [subst { 218 set gx \[page_get $::p1 $i\] 219 set v \[page_read \$gx\] 220 page_unref \$gx 221 set v 222 }] "Page-$i" 223} 224for {set i 1} {$i<=20} {incr i} { 225 regsub -all CNT { 226 set ::g1 [page_get $::p1 CNT] 227 set ::g2 [page_get $::p1 CNT] 228 set ::vx [page_read $::g2] 229 expr {$::g1==$::g2} 230 } $i body; 231 do_test pager2-3.7.$i.1 $body {1} 232 regsub -all CNT { 233 page_unref $::g2 234 set vy [page_read $::g1] 235 expr {$vy==$::vx} 236 } $i body; 237 do_test pager2-3.7.$i.2 $body {1} 238 regsub -all CNT { 239 page_unref $::g1 240 set gx [page_get $::p1 CNT] 241 set vy [page_read $gx] 242 page_unref $gx 243 expr {$vy==$::vx} 244 } $i body; 245 do_test pager2-3.7.$i.3 $body {1} 246} 247do_test pager2-3.99 { 248 pager_close $::p1 249} {} 250 251# tests of the checkpoint mechanism and api 252# 253do_test pager2-4.0 { 254 set v [catch { 255 set ::p1 [pager_open :memory: 15] 256 } msg] 257 if {$v} {lappend v $msg} 258 set v 259} {0} 260do_test pager2-4.1 { 261 set g1 [page_get $::p1 1] 262 page_write $g1 "Page-1 v0" 263 for {set i 2} {$i<=20} {incr i} { 264 set gx [page_get $::p1 $i] 265 page_write $gx "Page-$i v0" 266 page_unref $gx 267 } 268 pager_commit $::p1 269} {} 270for {set i 1} {$i<=20} {incr i} { 271 do_test pager2-4.2.$i { 272 set gx [page_get $p1 $i] 273 set v [page_read $gx] 274 page_unref $gx 275 set v 276 } "Page-$i v0" 277} 278do_test pager2-4.3 { 279 lrange [pager_stats $::p1] 0 1 280} {ref 1} 281do_test pager2-4.4 { 282 lrange [pager_stats $::p1] 8 9 283} {state 1} 284 285for {set i 1} {$i<20} {incr i} { 286 do_test pager2-4.5.$i.0 { 287 set res {} 288 for {set j 2} {$j<=20} {incr j} { 289 set gx [page_get $p1 $j] 290 set value [page_read $gx] 291 page_unref $gx 292 set shouldbe "Page-$j v[expr {$i-1}]" 293 if {$value!=$shouldbe} { 294 lappend res $value $shouldbe 295 } 296 } 297 set res 298 } {} 299 do_test pager2-4.5.$i.1 { 300 page_write $g1 "Page-1 v$i" 301 lrange [pager_stats $p1] 8 9 302 } {state 4} 303 do_test pager2-4.5.$i.2 { 304 for {set j 2} {$j<=20} {incr j} { 305 set gx [page_get $p1 $j] 306 page_write $gx "Page-$j v$i" 307 page_unref $gx 308 if {$j==$i} { 309 pager_stmt_begin $p1 310 } 311 } 312 } {} 313 do_test pager2-4.5.$i.3 { 314 set res {} 315 for {set j 2} {$j<=20} {incr j} { 316 set gx [page_get $p1 $j] 317 set value [page_read $gx] 318 page_unref $gx 319 set shouldbe "Page-$j v$i" 320 if {$value!=$shouldbe} { 321 lappend res $value $shouldbe 322 } 323 } 324 set res 325 } {} 326 do_test pager2-4.5.$i.4 { 327 pager_rollback $p1 328 set res {} 329 for {set j 2} {$j<=20} {incr j} { 330 set gx [page_get $p1 $j] 331 set value [page_read $gx] 332 page_unref $gx 333 set shouldbe "Page-$j v[expr {$i-1}]" 334 if {$value!=$shouldbe} { 335 lappend res $value $shouldbe 336 } 337 } 338 set res 339 } {} 340 do_test pager2-4.5.$i.5 { 341 page_write $g1 "Page-1 v$i" 342 lrange [pager_stats $p1] 8 9 343 } {state 4} 344 do_test pager2-4.5.$i.6 { 345 for {set j 2} {$j<=20} {incr j} { 346 set gx [page_get $p1 $j] 347 page_write $gx "Page-$j v$i" 348 page_unref $gx 349 if {$j==$i} { 350 pager_stmt_begin $p1 351 } 352 } 353 } {} 354 do_test pager2-4.5.$i.7 { 355 pager_stmt_rollback $p1 356 for {set j 2} {$j<=20} {incr j} { 357 set gx [page_get $p1 $j] 358 set value [page_read $gx] 359 page_unref $gx 360 if {$j<=$i || $i==1} { 361 set shouldbe "Page-$j v$i" 362 } else { 363 set shouldbe "Page-$j v[expr {$i-1}]" 364 } 365 if {$value!=$shouldbe} { 366 lappend res $value $shouldbe 367 } 368 } 369 set res 370 } {} 371 do_test pager2-4.5.$i.8 { 372 for {set j 2} {$j<=20} {incr j} { 373 set gx [page_get $p1 $j] 374 page_write $gx "Page-$j v$i" 375 page_unref $gx 376 if {$j==$i} { 377 pager_stmt_begin $p1 378 } 379 } 380 } {} 381 do_test pager2-4.5.$i.9 { 382 pager_stmt_commit $p1 383 for {set j 2} {$j<=20} {incr j} { 384 set gx [page_get $p1 $j] 385 set value [page_read $gx] 386 page_unref $gx 387 set shouldbe "Page-$j v$i" 388 if {$value!=$shouldbe} { 389 lappend res $value $shouldbe 390 } 391 } 392 set res 393 } {} 394 do_test pager2-4.5.$i.10 { 395 pager_commit $p1 396 lrange [pager_stats $p1] 8 9 397 } {state 1} 398} 399 400do_test pager2-4.99 { 401 pager_close $::p1 402} {} 403 404} ;# ifcapable inmemory 405} ;# end if( has pager_open command ); 406 407 408finish_test 409