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